import { Plus, X } from "lucide-react"; import { MutableRefObject, useEffect, useState } from "react"; import type { Product, ProductInput } from "@/api"; import { AdminDisclosure } from "@/components/admin/AdminDisclosure"; import { SingleImageUploader } from "@/components/admin/SingleImageUploader"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Switch } from "@/components/ui/switch"; import { Textarea } from "@/components/ui/textarea"; type QuickRouteDraft = { title: string; summary: string; destinationName: string; priceAmount: number | null; priceUnit: string; tags: string[]; coverImage: string; published: boolean; sortWeight: number; }; function createEmptyDraft(): QuickRouteDraft { return { title: "", summary: "", destinationName: "", priceAmount: null, priceUnit: "起/人", tags: ["", ""], coverImage: "", published: true, sortWeight: 0, }; } function createDraftFromProduct(product?: Product | null): QuickRouteDraft { if (!product) return createEmptyDraft(); const tags = product.tags.length ? product.tags.slice(0, 3) : ["", ""]; return { title: product.title, summary: product.summary ?? "", destinationName: product.subtitle ?? product.destination?.name ?? "", priceAmount: product.priceAmount ?? null, priceUnit: product.priceUnit || "起/人", tags: tags.length === 1 ? [...tags, ""] : tags, coverImage: product.coverImage ?? "", published: product.status === "published", sortWeight: product.sortWeight ?? 0, }; } export function RouteProductQuickCreateForm({ product, onCreate, onUpdate, onSubmitRef, }: { product?: Product | null; onCreate: (input: ProductInput) => Promise; onUpdate: (productId: string, input: ProductInput) => Promise; onSubmitRef: MutableRefObject<(() => Promise) | null>; }) { const [draft, setDraft] = useState(() => createDraftFromProduct(product)); const editing = Boolean(product); const submit = async () => { const title = draft.title.trim(); if (!title) return; const input: ProductInput = { title, subtitle: draft.destinationName.trim(), destinationId: null, priceAmount: draft.priceAmount, priceUnit: draft.priceUnit.trim() || "起/人", tags: draft.tags.map((tag) => tag.trim()).filter(Boolean).slice(0, 3), coverImage: draft.coverImage.trim() || null, summary: draft.summary.trim(), images: product?.images ?? [], detailSections: product?.detailSections ?? [], status: draft.published ? "published" : "draft", sortWeight: draft.sortWeight, }; if (editing && product) { await onUpdate(product.id, input); return; } await onCreate(input); setDraft(createEmptyDraft()); }; useEffect(() => { setDraft(createDraftFromProduct(product)); }, [product?.id, product?.updatedAt]); useEffect(() => { onSubmitRef.current = submit; return () => { onSubmitRef.current = null; }; }, [draft, product?.id, product?.updatedAt, onSubmitRef]); return (