"use client"; import { useState, useTransition, type FormEvent } from "react"; import { CustomerChips } from "./CustomerChips"; import { ItemTable } from "./ItemTable"; import { SummaryPanel } from "./SummaryPanel"; import type { OrderItemData, OrderWithDetails, OrderStatus, FormState, } from "@/lib/types"; interface OrderFormProps { mode: "create" | "edit"; initialData?: OrderWithDetails; serverAction: ( prevState: FormState | undefined, formData: FormData, ) => Promise; disabled?: boolean; } export function OrderForm({ mode, initialData, serverAction, disabled = false, }: OrderFormProps) { const isClosed = initialData?.status === "closed"; const isDisabled = disabled || isClosed; const [title, setTitle] = useState(initialData?.title ?? ""); const [status, setStatus] = useState( initialData?.status ?? "pending", ); const [notes, setNotes] = useState(initialData?.notes ?? ""); const [customers, setCustomers] = useState<{ id: string; name: string }[]>( initialData?.customers.map((c) => ({ id: c.customer.id, name: c.customer.name, })) ?? [], ); const [items, setItems] = useState( initialData?.items ?? [], ); const [customerInput, setCustomerInput] = useState(""); const [actionMessage, setActionMessage] = useState(null); const [actionSuccess, setActionSuccess] = useState(false); const [isPending, startTransition] = useTransition(); function handleAddCustomer() { const name = customerInput.trim(); if (!name) return; if (customers.some((c) => c.name.toLowerCase() === name.toLowerCase())) return; setCustomers((prev) => [...prev, { id: crypto.randomUUID(), name }]); setCustomerInput(""); } function handleRemoveCustomer(id: string) { setCustomers((prev) => prev.filter((c) => c.id !== id)); setItems((prev) => prev.map((item) => item.customerId === id ? { ...item, customerId: null, customerName: null } : item, ), ); } function handleSubmit(e: FormEvent) { e.preventDefault(); const formData = new FormData(e.currentTarget); formData.set("title", title); formData.set("status", status); formData.set("notes", notes); formData.set( "customers", JSON.stringify(customers.map((c) => ({ id: c.id, name: c.name }))), ); formData.set( "items", JSON.stringify( items.map((i) => ({ id: i.id, customerId: i.customerId, itemName: i.itemName, initPrice: i.initPrice, myPrice: i.myPrice, taxRatio: i.taxRatio, quantity: i.quantity, })), ), ); startTransition(async () => { const result = await serverAction(undefined, formData); if (result?.message) { setActionMessage(result.message); setActionSuccess(result.success ?? false); } }); } const inputClass = "border-2 border-border rounded-xl px-3 py-2 text-sm bg-bg text-fg focus:outline-none focus:border-accent disabled:opacity-50 disabled:cursor-not-allowed"; const labelClass = "text-sm font-medium text-fg mb-1"; const submitClass = "bg-accent text-accent-on font-bold px-6 py-3 rounded-xl border-b-4 border-accent-active hover:bg-accent-hover active:translate-y-0.5 active:border-b-0 transition-all disabled:opacity-50 disabled:cursor-not-allowed"; return (
{/* Closed order lock banner */} {isClosed && (
This order is closed and read-only. Editing is disabled.
)}
{/* Main content — left 2/3 on desktop */}
{/* Title + Status row */}
setTitle(e.target.value)} placeholder="Order title" className={inputClass} disabled={isDisabled} />
{/* Customer section */}
setCustomerInput(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") { e.preventDefault(); handleAddCustomer(); } }} placeholder="Customer name" className={`flex-1 ${inputClass}`} disabled={isDisabled} />
{/* Items section */}
{/* Notes */}