import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' import { useCreatePublicationMutation } from 'data/replication/create-publication-mutation' import { useReplicationTablesQuery } from 'data/replication/tables-query' import { X } from 'lucide-react' import { useForm } from 'react-hook-form' import { toast } from 'sonner' import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetClose, cn, Button, SheetFooter, SheetSection, Form_Shadcn_, FormField_Shadcn_, FormControl_Shadcn_, Input_Shadcn_, SheetDescription, } from 'ui' import { MultiSelector } from 'ui-patterns/multi-select' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import { z } from 'zod' interface NewPublicationPanelProps { visible: boolean sourceId?: number onClose: () => void } const NewPublicationPanel = ({ visible, sourceId, onClose }: NewPublicationPanelProps) => { const { ref: projectRef } = useParams() const { mutateAsync: createPublication, isLoading: 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 share table changes for replication
Close
( )} /> ( {tables?.tables.map((table) => ( {`${table.schema}.${table.name}`} ))} )} />
) } export default NewPublicationPanel