DeleteHookModal.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { parseAsString, useQueryState } from 'nuqs'
  2. import { useEffect } from 'react'
  3. import { toast } from 'sonner'
  4. import { TextConfirmModal } from '@/components/ui/TextConfirmModalWrapper'
  5. import { useDatabaseTriggerDeleteMutation } from '@/data/database-triggers/database-trigger-delete-mutation'
  6. import { useDatabaseHooksQuery } from '@/data/database-triggers/database-triggers-query'
  7. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  8. export const DeleteHookModal = () => {
  9. const { data: project } = useSelectedProjectQuery()
  10. const { data: hooks = [], isSuccess } = useDatabaseHooksQuery({
  11. projectRef: project?.ref,
  12. connectionString: project?.connectionString,
  13. })
  14. const [selectedHookIdToDelete, setSelectedHookIdToDelete] = useQueryState(
  15. 'delete',
  16. parseAsString.withDefault('')
  17. )
  18. const selectedHook = hooks.find((hook) => hook.id.toString() === selectedHookIdToDelete)
  19. const { name, schema } = selectedHook ?? {}
  20. const {
  21. mutate: deleteDatabaseTrigger,
  22. isPending: isDeleting,
  23. isSuccess: isSuccessDelete,
  24. } = useDatabaseTriggerDeleteMutation({
  25. onSuccess: () => {
  26. toast.success(`Successfully deleted ${name}`)
  27. setSelectedHookIdToDelete(null)
  28. },
  29. })
  30. async function handleDelete() {
  31. if (!project) return console.error('Project ref is required')
  32. if (!selectedHook) return toast.error('Unable to find selected hook')
  33. deleteDatabaseTrigger({
  34. trigger: selectedHook,
  35. projectRef: project.ref,
  36. connectionString: project.connectionString,
  37. })
  38. }
  39. useEffect(() => {
  40. if (isSuccess && !!selectedHookIdToDelete && !selectedHook && !isSuccessDelete) {
  41. toast('Webhook not found')
  42. setSelectedHookIdToDelete(null)
  43. }
  44. }, [isSuccess, isSuccessDelete, selectedHook, selectedHookIdToDelete, setSelectedHookIdToDelete])
  45. return (
  46. <TextConfirmModal
  47. variant="destructive"
  48. visible={!!selectedHook}
  49. size="small"
  50. onCancel={() => setSelectedHookIdToDelete(null)}
  51. onConfirm={handleDelete}
  52. title="Delete database webhook"
  53. loading={isDeleting}
  54. confirmLabel={`Delete ${name}`}
  55. confirmPlaceholder="Type in name of webhook"
  56. confirmString={name || ''}
  57. text={
  58. <>
  59. This will delete the webhook <span className="text-bold text-foreground">{name}</span>{' '}
  60. from the schema <span className="text-bold text-foreground">{schema}</span>
  61. </>
  62. }
  63. alert={{ title: 'You cannot recover this webhook once deleted.' }}
  64. />
  65. )
  66. }