PublicationSelection.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { useParams } from 'common'
  2. import { useMemo } from 'react'
  3. import type { UseFormReturn } from 'react-hook-form'
  4. import { FormControl, FormField } from 'ui'
  5. import { Admonition } from 'ui-patterns'
  6. import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
  7. import type { DestinationPanelSchemaType } from './DestinationForm.schema'
  8. import { PublicationsComboBox } from './PublicationsComboBox'
  9. import { useReplicationPublicationsQuery } from '@/data/replication/publications-query'
  10. type PublicationSelectionProps = {
  11. form: UseFormReturn<DestinationPanelSchemaType>
  12. sourceId?: number
  13. visible: boolean
  14. onSelectNewPublication: () => void
  15. }
  16. export const PublicationSelection = ({
  17. form,
  18. sourceId,
  19. onSelectNewPublication,
  20. }: PublicationSelectionProps) => {
  21. const { ref: projectRef } = useParams()
  22. const { publicationName } = form.watch()
  23. const {
  24. data: publications = [],
  25. isPending: isLoadingPublications,
  26. isSuccess: isSuccessPublications,
  27. } = useReplicationPublicationsQuery({ projectRef, sourceId })
  28. const publicationNames = useMemo(() => publications?.map((pub) => pub.name) ?? [], [publications])
  29. const isSelectedPublicationMissing =
  30. isSuccessPublications && !!publicationName && !publicationNames.includes(publicationName)
  31. return (
  32. <FormField
  33. control={form.control}
  34. name="publicationName"
  35. render={({ field }) => (
  36. <FormItemLayout
  37. layout="horizontal"
  38. label="Publication"
  39. description="Tables in the selected publication will be replicated to this destination"
  40. >
  41. <FormControl>
  42. <PublicationsComboBox
  43. publications={publications}
  44. isLoadingPublications={isLoadingPublications}
  45. field={field}
  46. onNewPublicationClick={() => onSelectNewPublication()}
  47. />
  48. </FormControl>
  49. {isSelectedPublicationMissing && (
  50. <Admonition type="warning" className="mt-2">
  51. <p className="leading-normal!">
  52. The publication <strong className="text-foreground">{publicationName}</strong> was
  53. not found, it may have been renamed or deleted, please select another one.
  54. </p>
  55. </Admonition>
  56. )}
  57. </FormItemLayout>
  58. )}
  59. />
  60. )
  61. }