import { useMemo } from 'react' import type { UseFormReturn } from 'react-hook-form' import { useParams } from 'common' import { InlineLink } from 'components/ui/InlineLink' import { useCheckPrimaryKeysExists } from 'data/database/primary-keys-exists-query' import { useReplicationPublicationsQuery } from 'data/replication/publications-query' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { FormControl_Shadcn_, FormField_Shadcn_ } from 'ui' import { Admonition } from 'ui-patterns' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { PublicationsComboBox } from '../PublicationsComboBox' import type { DestinationPanelSchemaType } from './DestinationPanel.schema' type PublicationSelectionProps = { form: UseFormReturn sourceId?: number visible: boolean onSelectNewPublication: () => void } export const PublicationSelection = ({ form, sourceId, visible, onSelectNewPublication, }: PublicationSelectionProps) => { const { ref: projectRef } = useParams() const { data: project } = useSelectedProjectQuery() const { publicationName } = form.watch() const { data: publications = [], isPending: isLoadingPublications, isSuccess: isSuccessPublications, } = useReplicationPublicationsQuery({ projectRef, sourceId }) const publicationNames = useMemo(() => publications?.map((pub) => pub.name) ?? [], [publications]) const selectedPublication = publications.find((pub) => pub.name === publicationName) const isSelectedPublicationMissing = isSuccessPublications && !!publicationName && !publicationNames.includes(publicationName) const { data: checkPrimaryKeysExistsData, isPending: isLoadingCheck } = useCheckPrimaryKeysExists( { projectRef: project?.ref, connectionString: project?.connectionString, tables: selectedPublication?.tables ?? [], }, { enabled: visible && !!selectedPublication } ) const hasTablesWithNoPrimaryKeys = (checkPrimaryKeysExistsData?.offendingTables ?? []).length > 0 return ( <> ( onSelectNewPublication()} /> {isSelectedPublicationMissing ? (

The publication {publicationName} was not found, it may have been renamed or deleted, please select another one.

) : hasTablesWithNoPrimaryKeys ? (

Replication requires every table in the publication to have a primary key to work, which these tables are missing:

    {(checkPrimaryKeysExistsData?.offendingTables ?? []).map((x) => { const value = `${x.schema}.${x.name}` return (
  • {value}
  • ) })}

Ensure that these tables have primary keys first.

) : null}
)} /> ) }