const { useState, useEffect, useCallback, useRef } = React; const CheckoutPage = ({ onBack, onSuccess }) => { const { cart, products, user, clearCart } = useApp(); const [loading, setLoading] = useState(false); const [form, setForm] = useState({ customer_name: user?.displayName || '', customer_phone: '', customer_email: '', shipping_address: '', payment_method: 'transfer', pickup_store: '', notes: '' }); useEffect(() => { if (!user?._authenticated) return; api.getProfile().then(profile => { if (!profile) return; setForm(prev => ({ ...prev, customer_name: prev.customer_name || profile.name || '', customer_phone: prev.customer_phone || profile.mobile || profile.phone || '', shipping_address: prev.shipping_address || profile.address || '', })); }).catch(() => {}); }, [user]); const isStorePickup = form.payment_method === 'store_pickup'; const subtotal = cart.reduce((sum, item) => { const latestProduct = products.find(p => p.id === item.id); const currentPrice = latestProduct?.price ?? item.price; return sum + (currentPrice * item.quantity); }, 0); const shippingFee = isStorePickup ? 0 : (subtotal >= 50000 ? 0 : 150); const total = subtotal + shippingFee; const handleChange = (e) => { const { name, value } = e.target; if (name === 'payment_method') { if (value === 'store_pickup') { setForm(prev => ({ ...prev, payment_method: value, pickup_store: '', shipping_address: '' })); } else { setForm(prev => ({ ...prev, payment_method: value, pickup_store: '', shipping_address: prev.payment_method === 'store_pickup' ? '' : prev.shipping_address, })); } return; } if (name === 'pickup_store') { const store = PICKUP_STORES.find(s => s.id === value); setForm(prev => ({ ...prev, pickup_store: value, shipping_address: store ? `【${store.name}】${store.address}` : '' })); return; } setForm({ ...form, [name]: value }); }; const handleSubmit = async (e) => { e.preventDefault(); if (!form.customer_name || !form.customer_phone) { alert('請填寫必填欄位'); return; } if (isStorePickup && !form.pickup_store) { alert('請選擇取貨門市'); return; } if (!isStorePickup && !form.shipping_address) { alert('請填寫收件地址'); return; } setLoading(true); try { const { pickup_store, ...formData } = form; const orderData = { ...formData, line_user_id: user?.userId || 'guest', line_display_name: user?.displayName, line_picture_url: user?.pictureUrl, items: cart.map(item => ({ product_id: item.id, quantity: item.quantity })), shipping_fee: shippingFee }; const result = await api.createOrder(orderData); if (result.success) { clearCart(); onSuccess(result.order); if (liffService.liff?.isInClient()) { liffService.sendMessage( `訂單已送出\n訂單編號: ${result.order.order_number}\n總金額: NT$ ${total.toLocaleString()}` ); } } else { alert(result.error || '訂單建立失敗'); } } catch (error) { console.error('Order error:', error); alert('訂單建立失敗,請稍後再試'); } finally { setLoading(false); } }; return (

收件資訊

{!isStorePickup && (