DropAllReplicasConfirmationModal.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { useQueryClient } from '@tanstack/react-query'
  2. import { useParams } from 'common'
  3. import { toast } from 'sonner'
  4. import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal'
  5. import { replicaKeys } from '@/data/read-replicas/keys'
  6. import { useReadReplicaRemoveMutation } from '@/data/read-replicas/replica-remove-mutation'
  7. import { useReadReplicasQuery } from '@/data/read-replicas/replicas-query'
  8. interface DropAllReplicasConfirmationModalProps {
  9. visible: boolean
  10. onSuccess: () => void
  11. onCancel: () => void
  12. }
  13. const DropAllReplicasConfirmationModal = ({
  14. visible,
  15. onSuccess,
  16. onCancel,
  17. }: DropAllReplicasConfirmationModalProps) => {
  18. const { ref: projectRef } = useParams()
  19. const queryClient = useQueryClient()
  20. const { data: databases } = useReadReplicasQuery({ projectRef })
  21. const { mutateAsync: removeReadReplica, isPending: isRemoving } = useReadReplicaRemoveMutation()
  22. const onConfirmRemove = async () => {
  23. if (!projectRef) return console.error('Project is required')
  24. if (databases === undefined) return console.error('Unable to retrieve replicas')
  25. if (databases.length === 1) toast('Your project has no read replicas')
  26. const replicas = databases.filter((db) => db.identifier !== projectRef)
  27. try {
  28. await Promise.all(
  29. replicas.map((db) =>
  30. removeReadReplica({
  31. projectRef,
  32. identifier: db.identifier,
  33. invalidateReplicaQueries: false,
  34. })
  35. )
  36. )
  37. toast.success(`Tearing down all read replicas`)
  38. await Promise.all([
  39. queryClient.invalidateQueries({ queryKey: replicaKeys.list(projectRef) }),
  40. queryClient.invalidateQueries({ queryKey: replicaKeys.loadBalancers(projectRef) }),
  41. ])
  42. onSuccess()
  43. onCancel()
  44. } catch (error) {
  45. toast.error('Failed to drop all replicas')
  46. }
  47. }
  48. return (
  49. <ConfirmationModal
  50. variant={'destructive'}
  51. size="medium"
  52. loading={isRemoving}
  53. visible={visible}
  54. title="Confirm to drop all read replicas?"
  55. confirmLabel="Drop all replicas"
  56. confirmLabelLoading="Dropping all replicas"
  57. onCancel={() => onCancel()}
  58. onConfirm={() => onConfirmRemove()}
  59. alert={{
  60. title: 'This action cannot be undone',
  61. description: 'You may still deploy new replicas in this region thereafter',
  62. }}
  63. >
  64. <p className="text-sm">Before deleting all replicas, consider:</p>
  65. <ul className="text-sm text-foreground-light list-disc pl-6">
  66. <li>Network traffic from this region may slow down</li>
  67. </ul>
  68. </ConfirmationModal>
  69. )
  70. }
  71. export default DropAllReplicasConfirmationModal