DeleteWrapperModal.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { useParams } from 'common'
  2. import { parseAsString, useQueryState } from 'nuqs'
  3. import { useEffect, useMemo } from 'react'
  4. import { toast } from 'sonner'
  5. import { Modal } from 'ui'
  6. import { INTEGRATIONS } from '../Landing/Integrations.constants'
  7. import { getWrapperMetaForWrapper, wrapperMetaComparator } from './Wrappers.utils'
  8. import { useFDWDeleteMutation } from '@/data/fdw/fdw-delete-mutation'
  9. import { useFDWsQuery } from '@/data/fdw/fdws-query'
  10. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  11. export const DeleteWrapperModal = () => {
  12. const { id, ref } = useParams()
  13. const { data: project } = useSelectedProjectQuery()
  14. const integration = INTEGRATIONS.find((i) => i.id === id)
  15. const { data, isSuccess } = useFDWsQuery({
  16. projectRef: ref,
  17. connectionString: project?.connectionString,
  18. })
  19. const wrappers = useMemo(
  20. () =>
  21. integration && integration.type === 'wrapper' && data
  22. ? data.filter((wrapper) => wrapperMetaComparator(integration.meta, wrapper))
  23. : [],
  24. [data, integration]
  25. )
  26. const [selectedWrapperIdToDelete, setSelectedWrapperToDelete] = useQueryState(
  27. 'delete',
  28. parseAsString
  29. )
  30. const selectedWrapper = wrappers.find((x) => x.id.toString() === selectedWrapperIdToDelete)
  31. const {
  32. mutate: deleteFDW,
  33. isPending: isDeleting,
  34. isSuccess: isSuccessDelete,
  35. } = useFDWDeleteMutation({
  36. onSuccess: () => {
  37. toast.success(`Successfully disabled ${selectedWrapper?.name} foreign data wrapper`)
  38. setSelectedWrapperToDelete(null)
  39. },
  40. })
  41. const wrapperMeta = getWrapperMetaForWrapper(selectedWrapper)
  42. const onConfirmDelete = async () => {
  43. if (!project?.ref) return console.error('Project ref is required')
  44. if (!selectedWrapper) return console.error('Wrapper is required')
  45. if (!wrapperMeta) return console.error('Wrapper meta is required')
  46. deleteFDW({
  47. projectRef: project?.ref,
  48. connectionString: project?.connectionString,
  49. wrapper: selectedWrapper,
  50. wrapperMeta: wrapperMeta,
  51. })
  52. }
  53. useEffect(() => {
  54. if (isSuccess && !!selectedWrapperIdToDelete && !selectedWrapper && !isSuccessDelete) {
  55. toast('Wrapper not found')
  56. setSelectedWrapperToDelete(null)
  57. }
  58. }, [
  59. isSuccess,
  60. isSuccessDelete,
  61. selectedWrapper,
  62. selectedWrapperIdToDelete,
  63. setSelectedWrapperToDelete,
  64. ])
  65. return (
  66. <Modal
  67. size="medium"
  68. variant="danger"
  69. alignFooter="right"
  70. loading={isDeleting}
  71. visible={selectedWrapper !== undefined}
  72. onCancel={() => setSelectedWrapperToDelete(null)}
  73. onConfirm={() => onConfirmDelete()}
  74. header={`Confirm to disable ${selectedWrapper?.name}`}
  75. >
  76. <Modal.Content>
  77. <p className="text-sm">
  78. Are you sure you want to disable {selectedWrapper?.name}? This will also remove all tables
  79. created with this wrapper.
  80. </p>
  81. </Modal.Content>
  82. </Modal>
  83. )
  84. }