@using RobotNet10.ScriptEditor.Clients @using RobotNet10.ScriptEditor.Components @using RobotNet10.ScriptEngine.Shared @using MudBlazor @inject ScriptManagerHubClient ScriptManagerClient @inject ISnackbar Snackbar @implements IDisposable @if (_missions == null || _missions.Count == 0) {
@if (_isLoading) { Loading missions... } else if (_currentState == ScriptEngineState.Ready || _currentState == ScriptEngineState.Running) { No missions available } else { Missions available when engine is Ready or Running }
} else {
@foreach (var mission in _missions) { }
}
@code { private List _missions = new(); private ScriptEngineState _currentState = ScriptEngineState.Initializing; private bool _isLoading = false; protected override void OnInitialized() { // Subscribe to state changes ScriptManagerClient.StateChanged += OnStateChanged; _currentState = ScriptManagerClient.State; // Load missions if state is already Ready or Running if (_currentState == ScriptEngineState.Ready || _currentState == ScriptEngineState.Running) { _ = LoadMissionsAsync(); } } protected override void OnAfterRender(bool firstRender) { if (firstRender) { // Ensure we have the latest state _currentState = ScriptManagerClient.State; if (_currentState == ScriptEngineState.Ready || _currentState == ScriptEngineState.Running) { _ = LoadMissionsAsync(); } } } private async void OnStateChanged(ScriptEngineState newState) { _currentState = newState; if (newState == ScriptEngineState.Ready || newState == ScriptEngineState.Running) { await LoadMissionsAsync(); } else { // Clear missions when not in Ready or Running state _missions.Clear(); StateHasChanged(); } } private async Task LoadMissionsAsync() { if (!ScriptManagerClient.IsConnected) return; try { _isLoading = true; StateHasChanged(); var missions = await ScriptManagerClient.GetScriptMissionsAsync(); _missions = missions?.ToList() ?? new List(); } catch (Exception ex) { Snackbar.Add($"Failed to load missions: {ex.Message}", Severity.Error); _missions = new List(); } finally { _isLoading = false; StateHasChanged(); } } private async Task HandleRefresh(MouseEventArgs e) { if (_currentState == ScriptEngineState.Ready || _currentState == ScriptEngineState.Running) { await LoadMissionsAsync(); } } public void Dispose() { ScriptManagerClient.StateChanged -= OnStateChanged; } }