import { zodResolver } from '@hookform/resolvers/zod' import { X } from 'lucide-react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { z } from 'zod' import { useParams } from 'common' import { useCreatePublicationMutation } from 'data/replication/publication-create-mutation' import { useReplicationTablesQuery } from 'data/replication/tables-query' import { Button, cn, Form_Shadcn_, FormControl_Shadcn_, FormField_Shadcn_, Input_Shadcn_, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetSection, SheetTitle, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { MultiSelector } from 'ui-patterns/multi-select' interface NewPublicationPanelProps { visible: boolean sourceId?: number onClose: () => void } export const NewPublicationPanel = ({ visible, sourceId, onClose }: NewPublicationPanelProps) => { const { ref: projectRef } = useParams() const { mutateAsync: createPublication, isPending: creatingPublication } = useCreatePublicationMutation() const { data: tables } = useReplicationTablesQuery({ projectRef, sourceId, }) 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), defaultValues, }) const onSubmit = async (data: z.infer) => { if (!projectRef) return console.error('Project ref is required') if (!sourceId) return console.error('Source id is required') try { await createPublication({ projectRef, sourceId, name: data.name, tables: data.tables.map((table) => { const [schema, name] = table.split('.') return { schema, name } }), }) toast.success('Successfully created publication') onClose() } catch (error) { toast.error('Failed to create publication') } form.reset(defaultValues) } return ( <>
New Publication Create a new publication to replicate table changes to destinations
Close
( )} /> ( {tables?.map((table) => ( {`${table.schema}.${table.name}`} ))} )} />
) }