"use client" import { z } from "zod" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import { Button } from "@/components/ui/button" import { toast } from "@/components/ui/use-toast" import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover" import { Calendar } from "@/components/ui/calendar" import { CalendarIcon } from "@radix-ui/react-icons" import { cn } from "@/lib/utils" import { format } from "date-fns" import { Form, FormItem, FormLabel, FormField, FormControl, FormDescription, FormMessage } from "@/components/ui/form" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { useState } from "react" import { editSubmission } from "app/lib/edit" export const formSchema = z.object({ id: z.number().optional(), storyId: z.coerce.number(), pubId: z.coerce.number(), submitted: z.coerce.date().transform((date) => date.toString()), responded: z.coerce.date().transform((date) => { if (date.toString() !== new Date(null).toString()) { return date.toString() } return null }).optional(), responseId: z.coerce.number() }) .refine(object => { const submitted = new Date(object.submitted) const responded = object.responded ? new Date(object.responded) : null return responded >= submitted || responded === null }, { path: ["responded"], message: "'Responded' must be a later date than 'submitted'" }) .refine(object => { if (object.responded) { //there is a 'responded' date and the response is not 'pending' return object.responseId !== 7 } if (!object.responded) { //there is not a 'responded' date and the response is pending return object.responseId === 7 } }, { path: ["responseId"], message: "A pending response cannot have a date, and a non-pending response must have a date" } ) export type SubForm = z.infer export default function SubmissionForm({ stories, pubs, responses, createSub, defaults }) { const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { responseId: responses[0].id, ...defaults } }) const [isSubCalendarOpen, setIsSubCalendarOpen] = useState(false); const [isRespCalendarOpen, setIsRespCalendarOpen] = useState(false); const storiesSelectItems = stories.map(e => ( {e.title} )) const pubsSelectItems = pubs.map(e => ( {e.title} )) const reponsesSelectItems = responses.map(e => ( {e.response} )) // 2. Define a submit handler. function onSubmit(values: z.infer) { // Do something with the form values. // ✅ This will be type-safe and validated. toast({ title: "You submitted the following values:", description: (
					{JSON.stringify(values, null, 2)}
				
), }) if (values.id) { editSubmission(values) } else { createSub(values) } console.log(values) } function onErrors(errors) { toast({ title: "You have errors", description: (
					{JSON.stringify(errors, null, 2)}
				
), }) console.log(JSON.stringify(errors)) } return (
( Story The piece you submitted )} /> ( Publication The market you sent it to )} /> ( Date of submission { field.onChange(e); setIsSubCalendarOpen(false); }} disabled={(date) => date > new Date() || date < new Date("1900-01-01") } initialFocus /> The date you sent it )} /> ( Date of response { field.onChange(e); setIsRespCalendarOpen(false); }} disabled={(date) => date > new Date() || date < new Date("1900-01-01") } initialFocus /> The date they wrote back )} /> ( Response The market you sent it to )} /> ) }