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, Form, FormControl, FormField, Input, Modal, Textarea } from 'ui' import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout' import * as z from 'zod' import { Content } from '@/data/content/content-query' import { useContentUpsertMutation } from '@/data/content/content-upsert-mutation' const formSchema = z.object({ name: z.string().min(1, 'Required'), description: z.string().optional(), }) type CustomReport = z.infer export interface UpdateCustomReportProps { selectedReport?: Content initialValues: CustomReport onCancel: () => void } export const UpdateCustomReportModal = ({ selectedReport, initialValues, onCancel, }: UpdateCustomReportProps) => { const { ref } = useParams() const { mutate: updateReport, isPending: isUpdating } = useContentUpsertMutation({ onSuccess: () => { toast.success('Successfully updated report') onCancel() }, onError: (error) => { toast.error(`Failed to update report: ${error.message}`) }, }) const onConfirmUpdateReport: SubmitHandler = (newVals) => { if (!ref) return console.error('Project ref is required') if (!selectedReport) return if (!selectedReport.id) return if (!selectedReport.project_id) return updateReport({ projectRef: ref, payload: { ...selectedReport, owner_id: selectedReport.owner_id!, project_id: selectedReport.project_id, id: selectedReport.id, name: newVals.name, description: newVals.description || '', }, }) } const handleCancel = () => { onCancel() form.reset() } const form = useForm({ resolver: zodResolver(formSchema as any), defaultValues: initialValues, }) const { formState, reset } = form const { isDirty } = formState useEffect(() => { if (isDirty) return reset(initialValues) }, [initialValues, isDirty, reset]) return (
( )} /> (