Files
I150/srcs/RobotNet10/Components/RobotNet10.ScriptEditor/Components/TaskItem.razor
2026-07-03 16:37:12 +07:00

121 lines
3.5 KiB
Plaintext

@implements IDisposable
@using RobotNet10.ScriptEditor.Clients
@using RobotNet10.ScriptEngine.Shared
@using RobotNet10.Shared
@using MudBlazor
@inject ScriptManagerHubClient ScriptManagerClient
@inject ISnackbar Snackbar
<div class="task-item">
<div class="task-info">
<div class="task-name">@Task.Name</div>
<div class="task-interval">@Task.Interval ms</div>
<div class="task-executions">@Task.ExecutionCount</div>
</div>
<MudSwitch T="bool"
@bind-Value="@_isChecked"
@bind-Value:after="@HandleToggle"
Disabled="@IsDisabled"
Color="Color.Primary"
Size="Size.Small" />
</div>
@code {
[Parameter, EditorRequired]
public ScriptTaskDto Task { get; set; } = null!;
private bool _isChecked;
private bool _isToggling = false;
protected override void OnParametersSet()
{
_isChecked = Task.Enabled;
}
private bool IsDisabled => ScriptManagerClient.State != ScriptEngineState.Running || _isToggling;
protected override void OnAfterRender(bool firstRender)
{
base.OnAfterRender(firstRender);
if (firstRender)
{
ScriptManagerClient.StateChanged += OnEngineStateChanged;
}
}
private void OnEngineStateChanged(ScriptEngineState _)
{
StateHasChanged();
}
private async Task HandleToggle()
{
if (!ScriptManagerClient.IsConnected)
{
Snackbar.Add($"Cannot toggle task: Not connected to server", Severity.Warning);
// Revert switch state
_isChecked = Task.Enabled;
StateHasChanged();
return;
}
if (_isToggling)
{
return;
}
try
{
_isToggling = true;
StateHasChanged();
var isEnabled = _isChecked;
MessageResult result;
if (isEnabled)
{
result = await ScriptManagerClient.EnableTaskAsync(Task.Name);
}
else
{
result = await ScriptManagerClient.DisableTaskAsync(Task.Name);
}
if (result != null && result.IsSuccess)
{
Snackbar.Add($"Task '{Task.Name}' {(isEnabled ? "enabled" : "disabled")} successfully", Severity.Success);
// Update local state - no need to reload
// The state will be updated when TaskManager reloads on state change
}
else
{
var errorMessage = result?.Message ?? "Unknown error";
Snackbar.Add($"Failed to {(isEnabled ? "enable" : "disable")} task: {errorMessage}", Severity.Error);
// Revert the switch state
_isChecked = Task.Enabled;
StateHasChanged();
}
}
catch (Exception ex)
{
var wasEnabled = _isChecked;
Snackbar.Add($"Error {(wasEnabled ? "enabling" : "disabling")} task '{Task.Name}': {ex.Message}", Severity.Error);
// Revert the switch state
_isChecked = Task.Enabled;
StateHasChanged();
}
finally
{
_isToggling = false;
StateHasChanged();
}
}
public void Dispose()
{
ScriptManagerClient.StateChanged -= OnEngineStateChanged;
}
}