@implements IAsyncDisposable @using Microsoft.AspNetCore.Components.WebAssembly.Authentication @using RobotNet.WebApp.Clients @inject RobotHubClient RobotHub @inject ISnackbar Snackbar @inject IHttpClientFactory HttpFactory Test @* No items found *@ 1 ? "s have" : " has")} been selected")"> @foreach (var node in Nodes) { @node.Name } Add @foreach (var node in SelectedNodes) { @(node.Name) } Run Cancel @code { [Parameter, EditorRequired] public RobotDto Robot { get; set; } = new(); // private NodeDto? SelectedNode; private List Nodes = []; private bool IsWorking = false; private List SelectedNodes = []; private IEnumerable PreSelectedNodes = new HashSet(); protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (!firstRender) return; await RobotHub.StartAsync(); } public void UpdateState(bool isOnline, bool isWorking) { Robot.Online = isOnline; IsWorking = isWorking; StateHasChanged(); } public async Task LoadNodes() { try { using var Http = HttpFactory.CreateClient("MapManagerAPI"); var result = await Http.GetFromJsonAsync($"api/Nodes/{Robot.MapId}"); if (result is not null) Nodes = result.Where(n => !string.IsNullOrEmpty(n.Name)).ToList(); } catch (AccessTokenNotAvailableException ex) { ex.Redirect(); } } private async Task> NodeSearch(string value, CancellationToken token) { await Task.Delay(5, token); if (string.IsNullOrEmpty(value)) { return Nodes.Select(n => n); } return Nodes.Where(x => x.Name.Contains(value, StringComparison.InvariantCultureIgnoreCase)).Select(n => n); } // private void NodeChanged(List value) // { // if (SelectedNode is null || value.Id != SelectedNode.Id) SelectedNode = value; // } private void AddNode() { // if (SelectedNode is not null && !SelectedNodes.Contains(SelectedNode)) // { // SelectedNodes.Add(SelectedNode); // StateHasChanged(); // } if (PreSelectedNodes.Any()) { SelectedNodes.Clear(); SelectedNodes.AddRange(PreSelectedNodes); StateHasChanged(); } } private async Task Cancel() { var result = await RobotHub.CancelNavigation(Robot.RobotId); if (result.IsSuccess) Snackbar.Add("Ra lệnh thành công", Severity.Success); else Snackbar.Add($"Ra lệnh không thành công: {result.Message}", Severity.Warning); StateHasChanged(); } private async Task Run() { var result = await RobotHub.MoveRandom(Robot.RobotId, [.. SelectedNodes.Select(n => n.Name)]); if (result.IsSuccess) Snackbar.Add("Ra lệnh thành công", Severity.Success); else Snackbar.Add($"Ra lệnh không thành công: {result.Message}", Severity.Warning); StateHasChanged(); } public async ValueTask DisposeAsync() { await RobotHub.StopAsync(); } }