@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(); } } }