"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { useState, useTransition } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { saveDetailsStepAction } from "../actions/draft"; const guestFormSchema = z.object({ firstName: z.string().trim().min(1, "First name is required"), lastName: z.string().trim().min(1, "Last name is required"), email: z.email("Enter a valid email address"), phone: z.string().trim().min(1, "Phone number is required"), notes: z.string().max(2000).optional(), policyAcknowledged: z.literal(true, { error: "Please acknowledge the cancellation policy" }), }); const authenticatedFormSchema = z.object({ notes: z.string().max(2000).optional(), policyAcknowledged: z.literal(true, { error: "Please acknowledge the cancellation policy" }), }); export function DetailsForm(props: { businessId: string; cancellationPolicy?: string; isAuthenticated: boolean; prefill?: { firstName: string; lastName: string; email: string; phone: string }; initialNotes?: string; }) { const { businessId, cancellationPolicy, isAuthenticated, prefill, initialNotes } = props; const [serverError, setServerError] = useState(null); const [isPending, startTransition] = useTransition(); const schema = isAuthenticated ? authenticatedFormSchema : guestFormSchema; const { register, handleSubmit, setError, formState: { errors }, // eslint-disable-next-line @typescript-eslint/no-explicit-any } = useForm({ resolver: zodResolver(schema), defaultValues: { firstName: prefill?.firstName ?? "", lastName: prefill?.lastName ?? "", email: prefill?.email ?? "", phone: prefill?.phone ?? "", notes: initialNotes ?? "", policyAcknowledged: false, }, }); // eslint-disable-next-line @typescript-eslint/no-explicit-any const onSubmit = (data: any) => { setServerError(null); startTransition(async () => { const result = await saveDetailsStepAction({ businessId, ...data }); if (!result.success) { setServerError(result.error ?? "Please check the highlighted fields."); if (result.fieldErrors) { for (const [field, messages] of Object.entries(result.fieldErrors)) { if (messages?.[0]) setError(field, { message: messages[0] }); } } } }); }; return (
{!isAuthenticated && (
)} {isAuthenticated && prefill && (

Booking as

{prefill.firstName} {prefill.lastName}

{prefill.email} {prefill.phone ? ` · ${prefill.phone}` : ""}

)}