import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Form, FormControl, FormField, Input, Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetSection, SheetTitle, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { MultiSelector } from 'ui-patterns/multi-select' import { z } from 'zod' import { useCreatePublicationMutation } from '@/data/replication/publication-create-mutation' import { useReplicationTablesQuery } from '@/data/replication/tables-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface NewPublicationPanelProps { visible: boolean sourceId?: number onClose: () => void } export const NewPublicationPanel = ({ visible, sourceId, onClose }: NewPublicationPanelProps) => { const { ref: projectRef } = useParams() const { data: project } = useSelectedProjectQuery() const { data: tables } = useReplicationTablesQuery({ projectRef, sourceId }) const { mutate: createPublication, isPending: creatingPublication } = useCreatePublicationMutation({ onSuccess: () => { toast.success('Successfully created publication') form.reset(defaultValues) onClose() }, }) const formId = 'publication-editor' const FormSchema = z.object({ name: z.string().min(1, 'Name is required'), tables: z.array(z.string()).min(1, 'At least one table is required'), }) const defaultValues = { name: '', tables: [], } const form = useForm>({ mode: 'onBlur', reValidateMode: 'onBlur', resolver: zodResolver(FormSchema as any), defaultValues, }) const onSubmit = async (data: z.infer) => { if (!projectRef) return console.error('Project ref is required') if (!project) return console.error('Project is required') if (!sourceId) return console.error('Source id is required') const tables = data.tables.map((table) => { const [schema, name] = table.split('.') return { schema, name } }) createPublication({ projectRef, sourceId, name: data.name, tables, connectionString: project.connectionString, }) } return ( <>
Create a new Publication Replicate table changes to destinations
( )} /> ( {tables?.map((table) => ( {`${table.schema}.${table.name}`} ))} )} />
) }