'use client' import { useState, useEffect } from 'react' import { Button } from '@/components/ui/button' import { cn } from '@/lib/utils' import { DialogContent, DialogTitle } from '@/components/ui/dialog' import { Checkbox } from '@/components/ui/checkbox' import { Label } from '@/components/ui/label' import { Input } from '@/components/ui/input' import { submitOrder, getUserSubmission, getSessionUser, getOrderDetail } from '@/app/actions' import { PlusCircle, MinusCircle, CheckCircle2 } from 'lucide-react' export function OrderFormModal({ order, onSuccess }: { order: any; onSuccess: () => void }) { const [liveOrder, setLiveOrder] = useState(order) const [userId, setUserId] = useState('') const [items, setItems] = useState< Record >({}) const [customItems, setCustomItems] = useState< Array<{ id: string; name: string; qty: number; note?: string }> >([]) const [loading, setLoading] = useState(false) const [error, setError] = useState('') useEffect(() => { const init = async () => { const freshOrder = await getOrderDetail(order.id) if (freshOrder) setLiveOrder(freshOrder) const user = await getSessionUser() if (user?.id) { setUserId(user.id) loadExistingSubmission(user.id, freshOrder || order) } } init() }, [order.id]) const loadExistingSubmission = async (uid: string, currentOrder: any) => { const sub = await getUserSubmission(currentOrder.id, uid) if (sub) { const freshItems: any = {} const newCustoms: any[] = [] sub.items.forEach((item: any) => { if (!item.is_custom) { const stdItem = currentOrder.available_items.find((ai: any) => ai.name === item.name) if (stdItem) { freshItems[stdItem.id] = { selected: true, qty: item.qty, note: item.note || '' } } } else { newCustoms.push({ id: Math.random().toString(36).substr(2, 9), name: item.name, qty: item.qty, note: item.note || '', }) } }) setItems(freshItems) setCustomItems(newCustoms) } } const handleStandardItemToggle = (id: string, checked: boolean) => { setItems((prev) => ({ ...prev, [id]: { selected: checked, qty: checked ? 1 : 0, note: prev[id]?.note || '' }, })) } const handleStandardItemQty = (id: string, qty: number) => { if (qty < 1) { handleStandardItemToggle(id, false) return } setItems((prev) => ({ ...prev, [id]: { ...prev[id], qty }, })) } const handleStandardItemNote = (id: string, note: string) => { setItems((prev) => ({ ...prev, [id]: { ...prev[id], note }, })) } const addCustomItem = () => { setCustomItems((prev) => [ ...prev, { id: Math.random().toString(36).substr(2, 9), name: '', qty: 1, note: '' }, ]) } const handleCustomItemChange = ( id: string, field: 'name' | 'qty' | 'note', value: string | number ) => { setCustomItems((prev) => prev.map((item) => { if (item.id === id) { return { ...item, [field]: value } } return item }) ) } const handleCustomItemQty = (id: string, qty: number) => { if (qty < 1) return handleCustomItemChange(id, 'qty', qty) } const removeCustomItem = (id: string) => { setCustomItems(customItems.filter((c) => c.id !== id)) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setError('') setLoading(true) const payloadItems: any[] = [] liveOrder.available_items.forEach((ai: any) => { const selectedItem = items[ai.id] if (selectedItem?.selected && selectedItem.qty > 0) { payloadItems.push({ name: ai.name, qty: selectedItem.qty, is_custom: false, note: selectedItem.note?.trim() || undefined, }) } }) customItems.forEach((ci) => { if (ci.name.trim() && ci.qty > 0) { payloadItems.push({ name: ci.name.trim(), qty: ci.qty, is_custom: true, note: ci.note?.trim() || undefined, }) } }) if (payloadItems.length === 0) { setError('Harap pilih minimal 1 item atau tambahkan item lainnya.') setLoading(false) return } const res = await submitOrder({ order_id: liveOrder.id, user_id: userId, items: payloadItems, }) if (res.success) { onSuccess() } else { setError(res.error || 'Gagal menyimpan pesanan.') } setLoading(false) } return (
Form Titipan {liveOrder.title}

Pilih menu yang tersedia di bawah atau tambahkan item khusus jika diizinkan.

{/* Standard Items */}
{liveOrder.available_items.map((item: any) => { const isSelected = items[item.id]?.selected || false const qty = items[item.id]?.qty || 0 return (
!item.is_sold_out && handleStandardItemToggle(item.id, c as boolean) } className="rounded-lg disabled:opacity-50 data-[state=checked]:border-[#1B2CC1] data-[state=checked]:bg-[#1B2CC1]" />
{isSelected && (
{qty}
)}
{isSelected && (
handleStandardItemNote(item.id, e.target.value)} />
)}
) })} {liveOrder.available_items.length === 0 && (

Tidak ada menu standar yang ditentukan.

)}
{/* Custom Items */} {liveOrder.allow_custom && (
{customItems.length > 0 ? (
{customItems.map((ci, idx) => (
{idx + 1}. handleCustomItemChange(ci.id, 'name', e.target.value)} className="h-9 flex-1 rounded-lg bg-white text-xs font-medium dark:bg-slate-900" /> handleCustomItemChange(ci.id, 'qty', parseInt(e.target.value) || 1) } className="h-9 w-16 rounded-lg bg-white text-center text-xs font-bold dark:bg-slate-900" />
))}
) : (

Klik untuk Tambah Item Custom

Ingin titip menu lain? Masukkan nama dan kuantitasnya di sini.

)}
)} {error && (
{error}
)}
) }