@implements IAsyncDisposable @using Microsoft.AspNetCore.Components.WebAssembly.Authentication @using RobotNet.WebApp.Clients @inject RobotHubClient RobotHub @inject ISnackbar Snackbar @inject IHttpClientFactory HttpFactory Setting @Robot.Name
No items found
SetMap
No items found Move
CancelOrder
No items found Send
CancelAction
InitPose
@code { [Parameter, EditorRequired] public RobotDto Robot { get; set; } = new(); private MapInfoDto MapSelected = default!; private string SelectedNode = ""; private List Nodes = []; private List Maps = []; private (double X, double Y, double Theta) InitPosition = new(); private bool IsWorking = false; private bool OverlayIsVisible; private List Actions = []; private ActionDto? ActionSelected = null; protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (!firstRender) return; await RobotHub.StartAsync(); await LoadMaps(); } public void UpdateState(bool isOnline, bool isWorking) { Robot.Online = isOnline; IsWorking = isWorking; StateHasChanged(); } private async Task MoveToNode() { if (string.IsNullOrEmpty(SelectedNode)) { Snackbar.Add("Vui lòng chọn node", Severity.Warning); } else { OverlayIsVisible = true; StateHasChanged(); var result = await RobotHub.MoveToNode(Robot.RobotId, SelectedNode); 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); OverlayIsVisible = false; } StateHasChanged(); } private async Task CancelOrder() { OverlayIsVisible = true; StateHasChanged(); 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); OverlayIsVisible = false; StateHasChanged(); } private async Task SetMap() { OverlayIsVisible = true; StateHasChanged(); var result = await RobotHub.SetMap(Robot.RobotId, MapSelected.Id); if (result.IsSuccess) { Robot.MapId = MapSelected.Id; await LoadNodes(); await LoadActionAsync(); 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); OverlayIsVisible = false; StateHasChanged(); } private async Task InitPose() { OverlayIsVisible = true; StateHasChanged(); var result = await RobotHub.SetInitialPose(Robot.RobotId, InitPosition.X, InitPosition.Y, InitPosition.Theta * Math.PI / 180); 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); OverlayIsVisible = false; StateHasChanged(); } private async Task SendAction() { if (ActionSelected is null) { Snackbar.Add("Vui lòng chọn action", Severity.Warning); } else { OverlayIsVisible = true; StateHasChanged(); var result = await RobotHub.SendAction(Robot.RobotId, ActionSelected); 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); OverlayIsVisible = false; } StateHasChanged(); } private async Task CancelAction() { OverlayIsVisible = true; StateHasChanged(); var result = await RobotHub.CancelAction(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); OverlayIsVisible = false; StateHasChanged(); } public async Task LoadActionAsync() { Actions.Clear(); using var Http = HttpFactory.CreateClient("MapManagerAPI"); var result = await Http.GetFromJsonAsync>($"api/Actions/{Robot.MapId}"); if (result is not null && result.Any()) { Actions.AddRange(result); } if (Actions.Any()) ActionSelected = Actions.First(); 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 LoadMaps() { try { Maps.Clear(); using var Http = HttpFactory.CreateClient("MapManagerAPI"); var maps = await Http.GetFromJsonAsync>($"api/MapsManager?txtSearch="); Maps.AddRange(maps ?? []); StateHasChanged(); } catch (AccessTokenNotAvailableException ex) { ex.Redirect(); return; } } private async Task> MapSearch(string value, CancellationToken token) { await Task.Delay(5, token); if (string.IsNullOrEmpty(value)) { return Maps; } return Maps.Where(x => x.Name.Contains(value, StringComparison.InvariantCultureIgnoreCase)); } private async Task> NodeSearch(string value, CancellationToken token) { await Task.Delay(5, token); if (string.IsNullOrEmpty(value)) { return Nodes.Select(n => n.Name); } return Nodes.Where(x => x.Name.Contains(value, StringComparison.InvariantCultureIgnoreCase)).Select(n => n.Name); } private async Task> ActionSearch(string value, CancellationToken token) { await Task.Delay(5, token); if (string.IsNullOrEmpty(value)) { return Actions; } return Actions.Where(x => x.Name.Contains(value, StringComparison.InvariantCultureIgnoreCase)); } private void NodeChanged(string value) { if (string.IsNullOrEmpty(SelectedNode) || value != SelectedNode) SelectedNode = value; } private void ActionChanged(ActionDto value) { if (ActionSelected is null || value.Id != ActionSelected.Id) ActionSelected = value; } private void MapChanged(MapInfoDto value) { if (MapSelected is null || value.Id != MapSelected.Id) MapSelected = value; } public async ValueTask DisposeAsync() { await RobotHub.StopAsync(); } }