"use client"; import type { CommissionCustomCardImageItem } from "@/actions/commissions/customCards/images"; import { createCommissionCustomCard } from "@/actions/commissions/customCards/newCard"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Switch } from "@/components/ui/switch"; import type { CommissionExtra, CommissionOption, Tag } from "@/generated/prisma/client"; import { commissionCustomCardSchema, type CommissionCustomCardValues, } from "@/schemas/commissionCustomCard"; import { zodResolver } from "@hookform/resolvers/zod"; import { useRouter } from "next/navigation"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { CommissionExtraField } from "../types/form/CommissionExtraField"; import { CommissionOptionField } from "../types/form/CommissionOptionField"; import { CustomCardImagePicker } from "./CustomCardImagePicker"; import MultipleSelector from "@/components/ui/multiselect"; type Props = { options: CommissionOption[]; extras: CommissionExtra[]; images: CommissionCustomCardImageItem[]; tags: Tag[]; }; export default function NewCustomCardForm({ options, extras, images, tags }: Props) { const router = useRouter(); const form = useForm({ resolver: zodResolver(commissionCustomCardSchema), defaultValues: { name: "", description: "", isVisible: true, isSpecialOffer: false, referenceImageUrl: null, tagIds: [], options: [], extras: [], }, }); async function onSubmit(values: CommissionCustomCardValues) { try { const created = await createCommissionCustomCard(values); console.log("Commission custom card created:", created); toast("Custom commission card created."); router.push("/commissions/custom-cards"); } catch (err) { console.error(err); toast("Failed to create custom commission card."); } } return (
( Name The name of the custom commission card. )} /> ( Description Optional description. )} /> (
Visible on app Controls whether the card is shown.
)} /> (
Special offer Adds a special offer badge on the app.
)} /> } /> { const selectedIds = field.value ?? []; const selectedOptions = tags .filter((t) => selectedIds.includes(t.id)) .map((t) => ({ label: t.name, value: t.id })); return ( Tags ({ label: t.name, value: t.id }))} placeholder="Select tags for this custom card" hidePlaceholderWhenSelected selectFirstItem value={selectedOptions} onChange={(options) => field.onChange(options.map((o) => o.value))} /> Used to link this custom card to tagged artworks. ); }} />
); }