AddServiceComponent.razor 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. @using RackPeek.Domain.Resources.Services
  2. @using RackPeek.Domain.Resources.Services.UseCases
  3. @inject AddServiceUseCase AddService
  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. private string _name = string.Empty;
  31. private string? _error;
  32. private bool _isSubmitting;
  33. private async Task CreateAsync()
  34. {
  35. _error = null;
  36. if (string.IsNullOrWhiteSpace(_name))
  37. {
  38. _error = "name is required";
  39. return;
  40. }
  41. try
  42. {
  43. _isSubmitting = true;
  44. var name = _name.Trim();
  45. await AddService.ExecuteAsync(name);
  46. _name = string.Empty;
  47. await OnCreated.InvokeAsync(name);
  48. }
  49. catch (Exception ex)
  50. {
  51. _error = ex.Message;
  52. }
  53. finally
  54. {
  55. _isSubmitting = false;
  56. }
  57. }
  58. }