"use client"; import { useState, useTransition } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { toast } from "sonner"; import { Plus } from "lucide-react"; import { kickstarterSchema, type KickstarterInput } from "@/schemas/kickstarter.schema"; import { createKickstarter, updateKickstarter, createHost } from "../actions"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; interface HostOption { id: string; name: string; _count: { kickstarters: number }; } interface KickstarterFormProps { kickstarter?: { id: string; name: string; link: string | null; filesUrl: string | null; deliveryStatus: "NOT_DELIVERED" | "PARTIAL" | "DELIVERED"; paymentStatus: "PAID" | "UNPAID"; hostId: string | null; notes: string | null; }; hosts: HostOption[]; onSuccess: () => void; } export function KickstarterForm({ kickstarter, hosts, onSuccess }: KickstarterFormProps) { const [isPending, startTransition] = useTransition(); const [hostList, setHostList] = useState(hosts); const [showNewHost, setShowNewHost] = useState(false); const [newHostName, setNewHostName] = useState(""); const isEditing = !!kickstarter; const form = useForm({ resolver: zodResolver(kickstarterSchema), defaultValues: { name: kickstarter?.name ?? "", link: kickstarter?.link ?? "", filesUrl: kickstarter?.filesUrl ?? "", deliveryStatus: kickstarter?.deliveryStatus ?? "NOT_DELIVERED", paymentStatus: kickstarter?.paymentStatus ?? "UNPAID", hostId: kickstarter?.hostId ?? "", notes: kickstarter?.notes ?? "", }, }); function onSubmit(values: KickstarterInput) { startTransition(async () => { const result = isEditing ? await updateKickstarter(kickstarter!.id, values) : await createKickstarter(values); if (!result.success) { toast.error(result.error); return; } toast.success(isEditing ? "Kickstarter updated" : "Kickstarter created"); form.reset(); onSuccess(); }); } function handleAddHost() { if (!newHostName.trim()) return; startTransition(async () => { const result = await createHost({ name: newHostName.trim() }); if (!result.success) { toast.error(result.error); return; } toast.success(`Host "${result.data!.name}" created`); setHostList((prev) => [ ...prev, { id: result.data!.id, name: result.data!.name, _count: { kickstarters: 0 } }, ]); form.setValue("hostId", result.data!.id); setNewHostName(""); setShowNewHost(false); }); } return (
( Name )} /> ( Link )} /> ( Files URL )} />
( Delivery Status )} /> ( Payment Status )} />
( Host {!showNewHost ? (
) : (
setNewHostName(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") { e.preventDefault(); handleAddHost(); } if (e.key === "Escape") { setShowNewHost(false); setNewHostName(""); } }} autoFocus className="flex-1" />
)}
)} /> ( Notes