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