AddServiceComponent.razor 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. @using RackPeek.Domain.Resources.Services.UseCases
  2. @inject AddServiceUseCase AddService
  3. @inject NavigationManager Nav
  4. <div class="border border-zinc-800 rounded p-4 bg-zinc-900">
  5. <div class="text-zinc-100 mb-3">
  6. Add service
  7. </div>
  8. <div class="flex gap-2">
  9. <input
  10. class="flex-1 bg-zinc-950 border border-zinc-800 rounded px-3 py-2 text-sm text-zinc-200 placeholder-zinc-600 focus:outline-none focus:border-zinc-600"
  11. placeholder="service name"
  12. @bind="_name"
  13. @bind:event="oninput"/>
  14. <button
  15. class="px-4 py-2 text-sm rounded bg-zinc-800 hover:bg-zinc-700 text-zinc-100 disabled:opacity-50"
  16. disabled="@_isSubmitting"
  17. @onclick="CreateAsync">
  18. add
  19. </button>
  20. </div>
  21. @if (_error is not null)
  22. {
  23. <div class="mt-2 text-sm text-red-400">
  24. @_error
  25. </div>
  26. }
  27. </div>
  28. @code {
  29. [Parameter] public EventCallback<string> OnCreated { get; set; }
  30. [Parameter] public string? RunsOn { get; set; }
  31. private string _name = string.Empty;
  32. private string? _error;
  33. private bool _isSubmitting;
  34. private async Task CreateAsync()
  35. {
  36. _error = null;
  37. var name = _name.Trim();
  38. if (string.IsNullOrWhiteSpace(_name))
  39. {
  40. _error = "name is required";
  41. return;
  42. }
  43. try
  44. {
  45. _isSubmitting = true;
  46. await AddService.ExecuteAsync(name, RunsOn);
  47. _name = string.Empty;
  48. await OnCreated.InvokeAsync(name);
  49. Nav.NavigateTo($"resources/services/{name}");
  50. }
  51. catch (Exception ex)
  52. {
  53. _error = ex.Message;
  54. }
  55. finally
  56. {
  57. _isSubmitting = false;
  58. }
  59. }
  60. }