import { zodResolver } from '@hookform/resolvers/zod' import { useParams } from 'common' import { useEffect } from 'react' import { SubmitHandler, useForm } from 'react-hook-form' import { toast } from 'sonner' import { Button, Dialog, DialogContent, DialogFooter, DialogHeader, DialogSection, DialogSectionSeparator, DialogTitle, Form, FormControl, FormField, InputGroup, InputGroupAddon, InputGroupInput, InputGroupText, } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import z from 'zod' import CodeEditor from '@/components/ui/CodeEditor/CodeEditor' import { useDatabaseQueueMessageSendMutation } from '@/data/database-queues/database-queue-messages-send-mutation' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface SendMessageModalProps { visible: boolean onClose: () => void } const FormSchema = z.object({ delay: z.coerce.number().int().gte(0).default(5), payload: z.string().refine( (val) => { try { JSON.parse(val) return true } catch { return false } }, { message: 'The payload should be a JSON object', } ), }) export type SendMessageForm = z.infer const FORM_ID = 'QUEUES_SEND_MESSAGE_FORM' export const SendMessageModal = ({ visible, onClose }: SendMessageModalProps) => { const { childId: queueName } = useParams() const { data: project } = useSelectedProjectQuery() const form = useForm({ resolver: zodResolver(FormSchema), defaultValues: { delay: 1, payload: '{}', }, }) const { isPending, mutate } = useDatabaseQueueMessageSendMutation({ onSuccess: () => { toast.success(`Successfully added a message to the queue.`) onClose() }, }) const onSubmit: SubmitHandler = (values) => { mutate({ projectRef: project?.ref!, connectionString: project?.connectionString, queueName: queueName!, payload: values.payload, delay: values.delay, }) } useEffect(() => { if (visible) { form.reset({ delay: 1, payload: '{}' }) } }, [visible]) return ( Add a message to the queue
( sec )} /> ( field.onChange(e)} options={{ wordWrap: 'off', contextmenu: false }} value={field.value} /> )} />
) }