@using RobotNet.VDA5050
@using RobotNet.VDA5050.Type
@using System.Net.Http.Json
@using RobotNet10.FleetManager.Shared.Models
@using RobotNet10.Shared
@inject HttpClient HttpClient
@inject ISnackbar Snackbar
Manual Actions
@foreach (ActionType actionType in Enum.GetValues())
{
@actionType.ToString()
}
@foreach (BlockingType blockingType in Enum.GetValues())
{
@blockingType.ToString()
}
Action Parameters
@foreach (var param in actionParameters)
{
}
Add Parameter
@if (isSending)
{
Sending...
}
else
{
Send Action
}
Recent Actions
@if (actionHistory.Count > 0)
{
@foreach (var action in actionHistory.Take(10))
{
@action.ActionType - @action.Timestamp.ToString("g")
}
}
else
{
No actions sent yet
}
@code {
[Parameter]
public string RobotId { get; set; } = string.Empty;
private ActionType selectedActionType = ActionType.STATE_REQUEST;
private BlockingType selectedBlockingType = BlockingType.HARD;
private List actionParameters = new();
private List actionHistory = new();
private bool isSending = false;
private class SentAction
{
public ActionType ActionType { get; set; }
public DateTime Timestamp { get; set; }
}
private void AddParameter()
{
actionParameters.Add(new RobotNet.VDA5050.InstantAction.ActionParameter());
}
private void RemoveParameter(RobotNet.VDA5050.InstantAction.ActionParameter param)
{
actionParameters.Remove(param);
}
private async Task SendAction()
{
if (string.IsNullOrWhiteSpace(RobotId))
{
Snackbar.Add("Robot ID is required", Severity.Warning);
return;
}
isSending = true;
StateHasChanged();
try
{
// Build action request
var actionRequest = new RobotInstantActionModel
{
RobotId = RobotId,
Action = new RobotNet.VDA5050.InstantAction.Action
{
ActionId = Guid.NewGuid().ToString(),
BlockingType = selectedBlockingType,
ActionType = selectedActionType.ToJsonString(),
ActionParameters = [.. actionParameters.Where(p => !string.IsNullOrWhiteSpace(p.Key))],
}
};
// Call API endpoint (TODO: Create this endpoint in Phase 10)
var response = await HttpClient.PostAsJsonAsync($"/api/robotManager/InstantActions", actionRequest);
if (response.IsSuccessStatusCode)
{
var result = await response.Content.ReadFromJsonAsync();
if(result is null)
{
Snackbar.Add($"Sending action is failed", Severity.Warning);
}
else if (!result.IsSuccess)
{
Snackbar.Add($"{result.Message}", Severity.Warning);
}
else
{
Snackbar.Add($"Action '{selectedActionType}' sent successfully", Severity.Success);
// Add to history
actionHistory.Insert(0, new SentAction
{
ActionType = selectedActionType,
Timestamp = DateTime.UtcNow
});
// Clear parameters
actionParameters.Clear();
}
}
else if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
{
Snackbar.Add($"Robot with ID '{RobotId}' not found", Severity.Error);
}
else if (response.StatusCode == System.Net.HttpStatusCode.BadRequest)
{
var error = await response.Content.ReadAsStringAsync();
Snackbar.Add($"Invalid action request: {error}", Severity.Warning);
}
else
{
var error = await response.Content.ReadAsStringAsync();
Snackbar.Add($"Error sending action: {error}", Severity.Error);
}
}
catch (Exception ex)
{
Snackbar.Add($"Error sending action: {ex.Message}", Severity.Error);
}
finally
{
isSending = false;
StateHasChanged();
}
}
}