AddResourceComponent.razor 1.8 KB

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