@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
Move
CancelOrder
No items found
Send
CancelAction
@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();
}
}