roles-delete-dialog.tsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { useState } from 'react'
  2. import { type Role } from '@/types/roles.types'
  3. import { AlertTriangle } from 'lucide-react'
  4. import { toast } from 'sonner'
  5. import { getApiErrorMessage } from '@/lib/api-error'
  6. import { useDeleteRole } from '@/hooks/roles/useDeleteRole'
  7. import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
  8. import { Input } from '@/components/ui/input'
  9. import { Label } from '@/components/ui/label'
  10. import { ConfirmDialog } from '@/components/confirm-dialog'
  11. interface Props {
  12. open: boolean
  13. onOpenChange: (open: boolean) => void
  14. currentRow: Role | null
  15. }
  16. export function RolesDeleteDialog({ open, onOpenChange, currentRow }: Props) {
  17. const [value, setValue] = useState('')
  18. const { mutate, isPending } = useDeleteRole()
  19. if (!currentRow) return null
  20. const handleDelete = () => {
  21. mutate(currentRow.id, {
  22. onSuccess: () => {
  23. toast.success('نقش با موفقیت حذف شد')
  24. setValue('')
  25. onOpenChange(false)
  26. },
  27. onError: (error) => {
  28. toast.error(getApiErrorMessage(error, 'خطا در حذف نقش'))
  29. },
  30. })
  31. }
  32. return (
  33. <ConfirmDialog
  34. open={open}
  35. onOpenChange={(state) => {
  36. if (!state) setValue('')
  37. onOpenChange(state)
  38. }}
  39. form='roles-delete-form'
  40. disabled={value.trim() !== currentRow.name}
  41. title={
  42. <span className='text-destructive'>
  43. <AlertTriangle
  44. className='me-1 inline-block stroke-destructive'
  45. size={18}
  46. />{' '}
  47. حذف نقش
  48. </span>
  49. }
  50. desc={
  51. <form
  52. id='roles-delete-form'
  53. onSubmit={(event) => {
  54. event.preventDefault()
  55. handleDelete()
  56. }}
  57. className='space-y-4'
  58. >
  59. <p className='mb-2'>
  60. آیا از حذف نقش <span className='font-bold'>{currentRow.name}</span>{' '}
  61. مطمئن هستید؟
  62. </p>
  63. <Label>
  64. نام نقش:
  65. <Input
  66. value={value}
  67. onChange={(event) => setValue(event.target.value)}
  68. placeholder='نام نقش را برای تایید حذف وارد کنید.'
  69. autoFocus
  70. />
  71. </Label>
  72. <Alert variant='destructive'>
  73. <AlertTitle>هشدار!</AlertTitle>
  74. <AlertDescription>
  75. این عملیات قابل برگشت نیست و دسترسی مدیران دارای این نقش تغییر
  76. می‌کند.
  77. </AlertDescription>
  78. </Alert>
  79. </form>
  80. }
  81. confirmText='حذف'
  82. cancelBtnText='انصراف'
  83. isLoading={isPending}
  84. destructive
  85. />
  86. )
  87. }