import React, { useState, useEffect } from ‘react’; import { Home, ShoppingCart, User, Bell, Search, MapPin, Star, ChevronRight, ChevronLeft, Plus, Minus, Check, X, Radar, Navigation, Box, ShoppingBag, Send, Wallet, QrCode, Lock, Edit3, Trash2, PackageSearch, Loader2, MessageSquare, Truck, Package, Clock, Map, Phone, CheckCircle2, ShieldCheck, Receipt, Heart, Ticket, Store, HelpCircle, Shield, Settings, Share2, CreditCard, Banknote, CalendarDays, FileText } from ‘lucide-react’; const CATEGORIES = [ { id: ‘all’, label: ‘แนะนำ’, icon: Star, color: ‘bg-gradient-to-r from-orange-400 to-red-500’ }, { id: ‘food’, label: ‘อาหาร’, icon: ShoppingCart, color: ‘bg-gradient-to-r from-orange-500 to-amber-500’ }, { id: ‘general’, label: ‘ของใช้ทั่วไป’, icon: Package, color: ‘bg-gradient-to-r from-blue-500 to-cyan-600’ }, { id: ‘poompuang’, label: ‘รถพุ่มพวง’, icon: Truck, color: ‘bg-gradient-to-r from-green-500 to-emerald-600’ }, ]; const MOCK_PRODUCTS = [ { id: 101, name: ‘แว่นกันแดด Ray-Ban Wayfarer คลาสสิก’, price: 4500, rating: 4.9, category: ‘general’, image: ‘https://images.unsplash.com/photo-1572635196237-14b3f281503f?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80’, seller: ‘OpticSquare’, shippingFee: 40, sold: 1250, originalPrice: 5500, desc: ‘แว่นกันแดด Ray-Ban Wayfarer รุ่นคลาสสิกที่ได้รับความนิยมตลอดกาล ปกป้องดวงตาของคุณจากรังสี UV 100% พร้อมดีไซน์ที่เข้าได้กับทุกสไตล์การแต่งตัว\n\n- เลนส์กันแดดคุณภาพสูง G-15\n- กรอบพลาสติกอะซิเตท น้ำหนักเบา ทนทาน\n- สินค้าของแท้ 100% รับประกันศูนย์ 1 ปี\n- อุปกรณ์ครบชุด: กล่องแว่น, ผ้าเช็ดแว่น, คู่มือ’, specs: { ‘แบรนด์’: ‘Ray-Ban’, ‘วัสดุกรอบ’: ‘Acetate’, ‘รูปทรง’: ‘Wayfarer’, ‘การรับประกัน’: ‘1 ปี’ }, reviews: [ { user: ‘คุณสมชาย’, rating: 5, comment: ‘ของแท้แน่นอนครับ ใส่สบายตามาก แพ็คของมาอย่างดี’, date: ’12 พ.ค. 2026′ }, { user: ‘K***’, rating: 5, comment: ‘สวยมากกกก จัดส่งเร็วมาก สั่งเมื่อวาน วันนี้ได้ของแล้ว’, date: ’05 พ.ค. 2026′ } ] }, { id: 102, name: ‘แว่นกรองแสงสีฟ้า ถนอมสายตา ทรงหยดน้ำ’, price: 890, rating: 4.8, category: ‘general’, image: ‘https://images.unsplash.com/photo-1511499767150-a48a237f0083?ixlib=rb-4.0.3&auto=format&fit=crop&w=800&q=80’, seller: ‘OpticSquare’, shippingFee: 40, sold: 856, originalPrice: 1290, desc: ‘แว่นกรองแสงสีฟ้าคุณภาพสูง ดีไซน์ทรงหยดน้ำสไตล์เกาหลี ช่วยลดอาการล้าของดวงตาจากการจ้องหน้าจอคอมพิวเตอร์และมือถือเป็นเวลานาน’, specs: { ‘แบรนด์’: ‘OpticSquare’, ‘วัสดุ’: ‘โลหะผสมไทเทเนียม’, ‘คุณสมบัติเลนส์’: ‘Anti-Blue Light / UV400’ }, reviews: [ { user: ‘N***’, rating: 4, comment: ‘น้ำหนักเบา ใส่สบาย ไม่บีบขมับค่ะ’, date: ’15 พ.ค. 2026′ } ] }, { id: 1, name: ‘กะเพราหมูกรอบไข่ดาว’, price: 50, rating: 4.8, category: ‘food’, image: ‘https://images.unsplash.com/photo-1594833215982-f5c225a0a382?ixlib=rb-4.0.3&w=800&q=80’, seller: ‘ร้านป้าศรี’, shippingFee: 15, sold: 8400, desc: ‘ผัดกะเพราหมูกรอบสูตรเด็ดของร้านป้าศรี หมูกรอบชิ้นโต ทอดกรอบนอกนุ่มใน ผัดกับใบกะเพราป่ากลิ่นหอม รสชาติจัดจ้านถึงใจ เสิร์ฟพร้อมข้าวสวยร้อนๆ และไข่ดาวเยิ้มๆ (สามารถระบุความเผ็ดได้ในหมายเหตุ)’, specs: { ‘ระดับความเผ็ด’: ‘ปานกลาง (สั่งได้)’, ‘เนื้อสัตว์’: ‘หมูกรอบ’, ‘ท็อปปิ้ง’: ‘ไข่ดาว’ }, reviews: [ { user: ‘S***’, rating: 5, comment: ‘หมูกรอบอร่อยมากกกกกก ไม่เหนียวเลย รสชาติกะเพราแท้ๆ’, date: ’30 พ.ค. 2026′ }, { user: ‘A***’, rating: 4, comment: ‘ได้เยอะ คุ้มราคาครับ แต่ไข่ดาวสุกไปนิดนึง’, date: ’28 พ.ค. 2026′ } ] }, { id: 2, name: ‘ข้าวมันไก่ตอน สูตรไหหลำ’, price: 45, rating: 4.6, category: ‘food’, image: ‘https://images.unsplash.com/photo-1626804475297-41607ea0d5eb?ixlib=rb-4.0.3&w=300&q=80’, seller: ‘ข้าวมันไก่เจ๊อ้วน’, shippingFee: 15 }, { id: 3, name: ‘ชาเย็น หวานน้อย (แก้วโอ่ง)’, price: 30, rating: 4.9, category: ‘food’, image: ‘https://images.unsplash.com/photo-1556679343-c7306c1976bc?ixlib=rb-4.0.3&w=300&q=80’, seller: ‘สมุย คาเฟ่’, shippingFee: 15 }, { id: 6, name: ‘หมูปิ้งนมสด (ไม้ละ)’, price: 10, rating: 4.9, category: ‘poompuang’, image: ‘https://images.unsplash.com/photo-1625938146369-adc83368bda7?ixlib=rb-4.0.3&w=300&q=80’, seller: ‘พี่ชัย หมูปิ้ง’, shippingFee: 10 }, { id: 402, name: ‘เสื้อยืดสไตล์มินิมอล ใส่สบาย’, price: 150, rating: 4.7, category: ‘general’, seller: ‘Basic Store’, image: ‘https://images.unsplash.com/photo-1521572163474-6864f9cf17ab?w=800&q=80’, shippingFee: 30, sold: 340, originalPrice: 250, desc: ‘เสื้อยืดคอกลมผ้าฝ้าย 100% สไตล์มินิมอล เนื้อผ้านุ่ม ระบายอากาศได้ดี ไม่ย้วยง่าย เหมาะสำหรับใส่ในวันสบายๆ หรือแมตช์กับลุคต่างๆ ได้อย่างลงตัว’, specs: { ‘วัสดุ’: ‘Cotton 100%’, ‘ทรงเสื้อ’: ‘Regular Fit’, ‘การดูแลรักษา’: ‘ซักเครื่องได้ / รีดไฟอ่อน’ }, reviews: [ { user: ‘W***’, rating: 5, comment: ‘ผ้านิ่มมากก สั่งมา 3 สีเลยค่ะ’, date: ’20 พ.ค. 2026′ } ] }, ]; const MOCK_ORDERS = [ { id: ‘ORD-2605-001’, store: ‘ร้านป้าศรี’, status: ‘unpaid’, total: 115, shipping: 15, items: [{name: ‘กะเพราหมูกรอบไข่ดาว’, qty: 2, price: 50, image: ‘https://images.unsplash.com/photo-1594833215982-f5c225a0a382?ixlib=rb-4.0.3&w=100&q=80′}], date: ’30 พ.ค. 2026 14:20’ }, { id: ‘ORD-2605-002’, store: ‘Shopee Express (SPX)’, status: ‘to_receive’, total: 4500, shipping: 0, tracking: ‘TH068696108585’, items: [{name: ‘แว่นกันแดด Ray-Ban Wayfarer คลาสสิก’, qty: 1, price: 4500, image: ‘https://images.unsplash.com/photo-1572635196237-14b3f281503f?ixlib=rb-4.0.3&w=100&q=80′}], date: ’28 พ.ค. 2026 09:15’ }, ]; const MOCK_RIDER = { name: ‘พี่สมคิด ขับไว’, phone: ‘089-123-4567’, plate: ‘1กข 1234 กทม.’, rating: 4.9, avatar: ‘https://images.unsplash.com/photo-1552058544-f2b08422138a?w=100&q=80’ }; const MOCK_MOBILE_VENDORS = [ { id: ‘v1’, name: ‘ลุงเดช (ผักสด/หมู)’, type: ‘รถพุ่มพวง’, distance: ‘150 ม.’, time: ‘2 นาที’, items: [‘ผักสด’, ‘เนื้อหมู’, ‘ไข่ไก่’], rating: 4.8, lat: -60, lng: 80 }, { id: ‘v2’, name: ‘ป้าศรี (ผลไม้ตามฤดูกาล)’, type: ‘รถเข็น’, distance: ‘300 ม.’, time: ‘5 นาที’, items: [‘มะม่วง’, ‘ทุเรียน’, ‘ฝรั่ง’], rating: 4.5, lat: 120, lng: -90 }, { id: ‘v3’, name: ‘พี่ชัย หมูปิ้งนมสด’, type: ‘พ่วงข้าง’, distance: ‘450 ม.’, time: ‘8 นาที’, items: [‘หมูปิ้ง’, ‘ข้าวเหนียว’], rating: 4.9, lat: -100, lng: -120 }, { id: ‘v4’, name: ‘เจ๊ณี (น้ำเต้าหู้/ชาไข่มุก)’, type: ‘พ่วงข้าง’, distance: ‘600 ม.’, time: ’12 นาที’, items: [‘น้ำเต้าหู้’, ‘ปาท่องโก๋’], rating: 4.7, lat: 140, lng: 50 }, ]; export default function App() { const [activeTab, setActiveTab] = useState(‘Home’); const [homeCategory, setHomeCategory] = useState(‘all’); const [cartItems, setCartItems] = useState([ { id: 1, name: ‘กะเพราหมูกรอบไข่ดาว’, price: 50, qty: 2, image: ‘https://images.unsplash.com/photo-1594833215982-f5c225a0a382?ixlib=rb-4.0.3&w=100&q=80’, seller: ‘ร้านป้าศรี’, shippingFee: 15 }, ]); const [paymentMethod, setPaymentMethod] = useState(‘wallet’); const [deliveryMethod, setDeliveryMethod] = useState(‘standard’); // General UI States const [showNotifications, setShowNotifications] = useState(false); const [notifications, setNotifications] = useState([ { id: 1, title: ‘โปรโมชันพิเศษ 0% GP’, desc: ‘สั่งอาหารวันนี้ ค่าส่งให้ไรเดอร์เต็มๆ 100%’, time: ’10 นาทีที่แล้ว’ } ]); const [selectedProduct, setSelectedProduct] = useState(null); // Radar States const [showRadar, setShowRadar] = useState(false); const [isScanningRadar, setIsScanningRadar] = useState(true); const [selectedRadarVendor, setSelectedRadarVendor] = useState(null); // Billing & Orders const [walletBalance, setWalletBalance] = useState(12500.50); const [payLaterBalance, setPayLaterBalance] = useState(24500.00); const [payLaterLimit, setPayLaterLimit] = useState(25000.00); const [installmentMonths, setInstallmentMonths] = useState(1); const [orders, setOrders] = useState(MOCK_ORDERS); const [showOrderHistory, setShowOrderHistory] = useState(false); const [orderTab, setOrderTab] = useState(‘all’); const [showOrderSuccessModal, setShowOrderSuccessModal] = useState(false); const [showConfirmOrderModal, setShowConfirmOrderModal] = useState(false); // Tracking API const [showTrackingModal, setShowTrackingModal] = useState(false); const [isTrackingLoading, setIsTrackingLoading] = useState(false); const [trackingInfo, setTrackingInfo] = useState(null); // PayLater Dashboard States const [showPayLaterModal, setShowPayLaterModal] = useState(false); const [payLaterPhase, setPayLaterPhase] = useState(‘dashboard’); // dashboard, pay_bill, success const [currentBillAmount, setCurrentBillAmount] = useState(500.00); const [payLaterTransactions, setPayLaterTransactions] = useState([ { id: ‘PL-TX001’, name: ‘หม้อทอดไร้น้ำมัน รุ่น Pro’, date: ’15 พ.ค. 2026′, plan: ‘ผ่อน 3 เดือน’, currentInstallment: 1, amount: 500, total: 1500, status: ‘billed’ } ]); // Rider Tracking const [showRiderModal, setShowRiderModal] = useState(false); const [activeTrackingOrder, setActiveTrackingOrder] = useState(null); // Top-up const [showTopupModal, setShowTopupModal] = useState(false); const [topupPhase, setTopupPhase] = useState(‘select’); const [topupAmount, setTopupAmount] = useState(500); // Shipping Address const [showAddressModal, setShowAddressModal] = useState(false); const [addressPhase, setAddressPhase] = useState(‘list’); const [addresses, setAddresses] = useState([ { id: ‘addr1’, name: ‘คุณสมชาย ใจดี’, phone: ‘081-234-5678’, detail: ‘123/45 หมู่ 5 ต.บ่อผุด’, province: ‘สุราษฎร์ธานี’, district: ‘เกาะสมุย’, zip: ‘84320’, isDefault: true }, ]); const [addressForm, setAddressForm] = useState({ id: ”, name: ”, phone: ”, detail: ”, province: ”, district: ”, zip: ”, isDefault: false }); // Rating Shop const [showRatingModal, setShowRatingModal] = useState(false); const [selectedOrderToRate, setSelectedOrderToRate] = useState(null); const [ratingScore, setRatingScore] = useState(0); const [ratingComment, setRatingComment] = useState(”); // Privileges and Interests States const [showCouponsModal, setShowCouponsModal] = useState(false); const [showLikedProductsModal, setShowLikedProductsModal] = useState(false); const [showFollowedShopsModal, setShowFollowedShopsModal] = useState(false); const [likedProductIds, setLikedProductIds] = useState([101, 1]); const [followedShops, setFollowedShops] = useState([{ name: ‘ร้านป้าศรี’, type: ‘อาหาร’ }, { name: ‘OpticSquare’, type: ‘ของใช้ทั่วไป’ }]); const [couponTab, setCouponTab] = useState(‘active’); const [couponCodeInput, setCouponCodeInput] = useState(”); const [coupons, setCoupons] = useState([ { id: 1, title: ‘ส่งฟรีทั่วไทย’, desc: ‘ส่วนลดค่าจัดส่ง 30 บาท’, type: ‘shipping’, minSpend: 150, expiry: ’30 มิ.ย. 2026′, status: ‘active’ }, { id: 2, title: ‘ส่วนลดร้านค้าชุมชน’, desc: ‘ลดทันที 50 บาท’, type: ‘discount’, minSpend: 200, expiry: ’15 มิ.ย. 2026′, status: ‘active’ }, { id: 3, title: ‘โปรลดค่า GP’, desc: ‘รับเงินคืน 10% เข้ากระเป๋า’, type: ‘cashback’, minSpend: 100, expiry: ’31 พ.ค. 2026′, status: ‘active’ }, { id: 4, title: ‘ส่วนลดลูกค้าใหม่’, desc: ‘ลดทันที 100 บาท’, type: ‘discount’, minSpend: 0, expiry: ’15 พ.ค. 2026′, status: ‘used’ }, { id: 5, title: ‘โปรส่งฟรี วันแรงงาน’, desc: ‘ส่วนลดค่าจัดส่ง 40 บาท’, type: ‘shipping’, minSpend: 300, expiry: ‘1 พ.ค. 2026’, status: ‘expired’ } ]); useEffect(() => { const findingRiderOrders = orders.filter(o => o.status === ‘finding_rider’); if (findingRiderOrders.length > 0) { const timer = setTimeout(() => { setOrders(prev => prev.map(o => { if (o.status === ‘finding_rider’) { triggerNotification(‘ไรเดอร์รับงานแล้ว!’, `${MOCK_RIDER.name} กำลังเดินทางไปรับสินค้าที่ร้าน ${o.store} ค่ะ`); return { …o, status: ‘rider_delivering’, rider: MOCK_RIDER, eta: ’12 นาที’ }; } return o; })); }, 4000); return () => clearTimeout(timer); } }, [orders]); const triggerNotification = (title, desc) => { const newNotif = { id: Date.now(), title, desc, time: ‘เมื่อสักครู่’ }; setNotifications(prev => [newNotif, …prev]); setShowNotifications(true); setTimeout(() => setShowNotifications(false), 4000); }; const addToCart = (product) => { setCartItems(prev => { const existing = prev.find(item => item.id === product.id); if (existing) return prev.map(item => item.id === product.id ? { …item, qty: item.qty + 1 } : item); return […prev, { id: product.id, name: product.name, price: product.price, qty: 1, image: product.image, seller: product.seller || ‘ร้านค้าทั่วไป’, shippingFee: product.shippingFee || 15 }]; }); triggerNotification(‘เพิ่มลงตะกร้าสำเร็จ’, `เพิ่ม ${product.name} ลงตะกร้าแล้วค่ะ`); setSelectedProduct(null); }; const updateCartQty = (id, delta) => { setCartItems(prev => prev.map(item => { if (item.id === id) { const newQty = item.qty + delta; return newQty > 0 ? { …item, qty: newQty } : item; } return item; })); }; const removeFromCart = (id) => { setCartItems(prev => prev.filter(item => item.id !== id)); triggerNotification(‘ลบสินค้าออกจากตะกร้า’, ‘ลบสินค้าสำเร็จแล้วค่ะ’); }; const handlePrePlaceOrder = () => { const selectedAddress = addresses.find(a => a.isDefault) || addresses[0]; if (!selectedAddress) { triggerNotification(‘แจ้งเตือน’, ‘กรุณาเพิ่มที่อยู่สำหรับจัดส่งสินค้าก่อนค่ะ’); setShowAddressModal(true); setAddressPhase(‘list’); return; } const subtotal = cartItems.reduce((sum, item) => sum + (item.price * item.qty), 0); const uniqueSellers = Array.from(new Set(cartItems.map(item => item.seller))); const baseShipping = uniqueSellers.reduce((sum, seller) => { const item = cartItems.find(i => i.seller === seller); return sum + (item.shippingFee || 15); }, 0); const totalShipping = deliveryMethod === ‘rider’ ? baseShipping + 25 : baseShipping; const totalCost = subtotal + totalShipping; if (paymentMethod === ‘wallet’ && walletBalance < totalCost) { triggerNotification('ยอดเงินไม่พอ', 'ยอดเงินคงเหลือใน ThaiMall Pay ไม่เพียงพอ กรุณาเติมเงินก่อนชำระเงินค่ะ'); setShowTopupModal(true); setTopupPhase('select'); return; } else if (paymentMethod === 'paylater' && payLaterBalance < totalCost) { triggerNotification('วงเงินไม่พอ', 'วงเงิน ThaiMall ผ่อนสบาย ของคุณไม่เพียงพอค่ะ'); return; } setShowConfirmOrderModal(true); }; const handlePlaceOrder = () => { const subtotal = cartItems.reduce((sum, item) => sum + (item.price * item.qty), 0); const uniqueSellers = Array.from(new Set(cartItems.map(item => item.seller))); const baseShipping = uniqueSellers.reduce((sum, seller) => { const item = cartItems.find(i => i.seller === seller); return sum + (item.shippingFee || 15); }, 0); const totalShipping = deliveryMethod === ‘rider’ ? baseShipping + 25 : baseShipping; const totalCost = subtotal + totalShipping; if (paymentMethod === ‘wallet’) setWalletBalance(prev => prev – totalCost); if (paymentMethod === ‘paylater’) { setPayLaterBalance(prev => prev – totalCost); // เพิ่มประวัติลงใน PayLater Dashboard const newTransaction = { id: `PL-TX${Date.now().toString().slice(-4)}`, name: cartItems.length > 1 ? `คำสั่งซื้อ ${cartItems.length} รายการ` : cartItems[0].name, date: new Date().toLocaleDateString(‘th-TH’, { day: ‘numeric’, month: ‘short’, year: ‘numeric’ }), plan: installmentMonths === 1 ? ‘จ่ายเดือนหน้า’ : `ผ่อน ${installmentMonths} เดือน`, currentInstallment: 1, amount: Math.ceil(totalCost / installmentMonths), total: totalCost, status: ‘upcoming’ }; setPayLaterTransactions(prev => [newTransaction, …prev]); } const newOrders = uniqueSellers.map(seller => { const sellerItems = cartItems.filter(item => item.seller === seller); const sellerSubtotal = sellerItems.reduce((sum, item) => sum + (item.price * item.qty), 0); const itemFee = sellerItems[0].shippingFee || 15; const sellerShipping = deliveryMethod === ‘rider’ ? itemFee + 25 : itemFee; const sellerTotal = sellerSubtotal + sellerShipping; let orderStatus = (paymentMethod === ‘wallet’ || paymentMethod === ‘paylater’ || paymentMethod === ‘cod’) ? ‘to_receive’ : ‘unpaid’; if (deliveryMethod === ‘rider’ && (paymentMethod === ‘wallet’ || paymentMethod === ‘paylater’ || paymentMethod === ‘cod’)) { orderStatus = ‘finding_rider’; } return { id: `ORD-${Date.now().toString().slice(-4)}-${Math.floor(Math.random() * 1000)}`, store: seller, status: orderStatus, total: sellerTotal, shipping: sellerShipping, deliveryMethod: deliveryMethod, paymentMethod: paymentMethod, installment: paymentMethod === ‘paylater’ ? installmentMonths : 0, items: sellerItems.map(item => ({ name: item.name, qty: item.qty, price: item.price, image: item.image })), date: new Date().toLocaleDateString(‘th-TH’, { day: ‘numeric’, month: ‘short’, year: ‘numeric’, hour: ‘2-digit’, minute: ‘2-digit’ }) }; }); setOrders(prev => […newOrders, …prev]); setCartItems([]); setShowConfirmOrderModal(false); setShowOrderSuccessModal(true); }; const handleRiderArrived = () => { if(!activeTrackingOrder) return; const orderToComplete = activeTrackingOrder; setOrders(prev => prev.map(o => o.id === orderToComplete.id ? { …o, status: ‘completed’ } : o)); setShowRiderModal(false); setActiveTrackingOrder(null); triggerNotification(‘จัดส่งสำเร็จ!’, `พัสดุของคุณถูกจัดส่งเรียบร้อยโดย ${MOCK_RIDER.name} ค่ะ`); setTimeout(() => { setSelectedOrderToRate(orderToComplete); setRatingScore(0); setRatingComment(”); setShowOrderHistory(true); setOrderTab(‘completed’); setShowRatingModal(true); }, 1500); }; const fetchTrackingInfo = async (trackingNumber) => { setShowTrackingModal(true); setIsTrackingLoading(true); setTimeout(() => { setTrackingInfo({ number: trackingNumber, events: [ { time: new Date().toISOString().replace(‘T’, ‘ ‘).slice(0, 16), status: ‘พัสดุถึงสาขาปลายทาง กำลังรอนำจ่าย’, location: ‘ปลายทาง’ }, { time: new Date(Date.now() – 43200000).toISOString().replace(‘T’, ‘ ‘).slice(0, 16), status: ‘พัสดุอยู่ระหว่างการขนส่งข้ามภูมิภาค’, location: ‘ศูนย์คัดแยกสินค้าหลัก กทม.’ }, { time: new Date(Date.now() – 86400000).toISOString().replace(‘T’, ‘ ‘).slice(0, 16), status: ‘รับพัสดุเข้าศูนย์คัดแยกแล้ว’, location: ‘สาขาต้นทาง’ }, { time: new Date(Date.now() – 172800000).toISOString().replace(‘T’, ‘ ‘).slice(0, 16), status: ‘บริษัทขนส่งเข้ารับพัสดุเรียบร้อย’, location: ‘ร้านค้า’ }, ] }); setIsTrackingLoading(false); }, 1500); }; const handleTopupSuccess = () => { setTopupPhase(‘processing’); setTimeout(() => { setWalletBalance(prev => prev + topupAmount); setTopupPhase(‘success’); triggerNotification(‘เติมเงินสำเร็จ’, `ยอดเงินเข้า ThaiMall Pay จำนวน ฿${topupAmount.toLocaleString()}`); }, 1500); }; const handleSelectDefaultAddress = (id) => { setAddresses(prev => prev.map(addr => ({ …addr, isDefault: addr.id === id }))); triggerNotification(‘เปลี่ยนที่อยู่เริ่มต้น’, ‘ระบบได้เปลี่ยนที่อยู่หลักสำหรับการจัดส่งเรียบร้อยแล้วค่ะ’); }; const handleDeleteAddress = (id, e) => { e.stopPropagation(); const addressToDelete = addresses.find(a => a.id === id); if (addressToDelete?.isDefault && addresses.length > 1) { triggerNotification(‘แจ้งเตือน’, ‘ไม่สามารถลบที่อยู่เริ่มต้นได้ค่ะ กรุณาตั้งที่อยู่อื่นเป็นที่อยู่หลักก่อน’); return; } setAddresses(prev => prev.filter(addr => addr.id !== id)); triggerNotification(‘ลบที่อยู่สำเร็จ’, ‘ที่อยู่ดังกล่าวถูกลบออกจากบัญชีของคุณเรียบร้อยแล้ว’); }; const handleSaveAddress = () => { if (!addressForm.name.trim() || !addressForm.phone.trim() || !addressForm.detail.trim() || !addressForm.province.trim() || !addressForm.district.trim() || !addressForm.zip.trim()) { triggerNotification(‘กรอกข้อมูลไม่ครบ’, ‘กรุณาระบุข้อมูลที่อยู่จัดส่งให้ครบถ้วนทุกช่องค่ะ’); return; } if (addressPhase === ‘add’) { const newAddress = { …addressForm, id: `addr_${Date.now()}`, isDefault: addresses.length === 0 ? true : addressForm.isDefault }; if (newAddress.isDefault) { setAddresses(prev => prev.map(a => ({ …a, isDefault: false })).concat(newAddress)); } else { setAddresses(prev => […prev, newAddress]); } triggerNotification(‘เพิ่มที่อยู่สำเร็จ’, ‘ที่อยู่จัดส่งใหม่ได้รับการบันทึกแล้วค่ะ’); } else if (addressPhase === ‘edit’) { setAddresses(prev => prev.map(addr => { if (addr.id === addressForm.id) return { …addressForm }; if (addressForm.isDefault && addr.id !== addressForm.id) return { …addr, isDefault: false }; return addr; })); triggerNotification(‘แก้ไขที่อยู่สำเร็จ’, ‘ข้อมูลที่อยู่ของคุณอัปเดตเรียบร้อยแล้วค่ะ’); } setAddressPhase(‘list’); }; const renderHomeContent = () => { let displayedItems = MOCK_PRODUCTS; if (homeCategory !== ‘all’) { displayedItems = displayedItems.filter(item => item.category === homeCategory); } const activeCatObj = CATEGORIES.find(c => c.id === homeCategory) || CATEGORIES[0]; return (
สุราษฎร์ธานี

{activeCatObj.label}

พบกับสินค้าปกติและอาหารในพื้นที่ของคุณ (0% GP)

{CATEGORIES.map(cat => ( ))}
{homeCategory === ‘all’ && (

ฟีเจอร์เด่น

setShowRadar(true)} className=”w-full bg-gradient-to-br from-green-500 to-emerald-600 p-4 rounded-2xl text-white shadow-md flex items-center cursor-pointer active:scale-95 transition”>

เรดาร์รถพุ่มพวง

ค้นหารถขายกับข้าว รถผลไม้ ที่อยู่ใกล้คุณ

)}

สินค้าแนะนำ

{displayedItems.map((item, idx) => (
setSelectedProduct(item)} className=”bg-white rounded-lg overflow-hidden shadow-sm border border-gray-100 flex flex-col cursor-pointer hover:shadow-md transition relative”> {item.image && (
e.target.src = ‘https://images.unsplash.com/photo-1546069901-ba9599a7e63c?w=100&q=80’} className=”w-full h-full object-cover”/> {item.category === ‘poompuang’ && (
RADAR
)}
)}

{item.name}

{item.seller}

฿{item.price?.toLocaleString()}
))}
); }; const renderCartAndCheckout = () => { const subtotal = cartItems.reduce((sum, item) => sum + (item.price * item.qty), 0); const uniqueSellers = Array.from(new Set(cartItems.map(item => item.seller))); const baseShipping = uniqueSellers.reduce((sum, seller) => { const item = cartItems.find(i => i.seller === seller); return sum + (item.shippingFee || 15); }, 0); const totalShipping = deliveryMethod === ‘rider’ ? baseShipping + 25 : baseShipping; const grandTotal = subtotal + totalShipping; const selectedAddress = addresses.find(a => a.isDefault) || addresses[0]; const groupedCart = cartItems.reduce((acc, item) => { if (!acc[item.seller]) acc[item.seller] = []; acc[item.seller].push(item); return acc; }, {}); return (

ตะกร้าสินค้า ({cartItems.length})

{cartItems.length > 0 && }
{cartItems.length === 0 ? (

ตะกร้าสินค้าว่างเปล่า

เลือกซื้อสินค้าชุมชนและอาหารอร่อยได้เลยค่ะ

) : (

ที่อยู่สำหรับจัดส่ง

{selectedAddress ? (

{selectedAddress.name} ({selectedAddress.phone})

{selectedAddress.detail} จ.{selectedAddress.province} {selectedAddress.zip}

) : (
)}
{Object.keys(groupedCart).map(seller => (
{seller}
{groupedCart[seller].map(item => (

{item.name}

฿{item.price}

{item.qty}
))}
))}

เลือกวิธีการจัดส่ง

setDeliveryMethod(‘standard’)} className={`p-3 rounded-xl border-2 cursor-pointer transition flex items-center justify-between ${deliveryMethod === ‘standard’ ? ‘border-orange-500 bg-orange-50/50’ : ‘border-gray-100 hover:border-orange-100’}`}>

จัดส่งพัสดุธรรมดา

รอรับสินค้า 1-3 วันทำการ

{deliveryMethod === ‘standard’ &&
}
setDeliveryMethod(‘rider’)} className={`p-3 rounded-xl border-2 cursor-pointer transition flex items-center justify-between ${deliveryMethod === ‘rider’ ? ‘border-orange-500 bg-orange-50/50’ : ‘border-gray-100 hover:border-orange-100’}`}>

จัดส่งทันทีผ่านไรเดอร์

ด่วน

รอรับภายใน 30-45 นาที (+฿25)

{deliveryMethod === ‘rider’ &&
}

ช่องทางการชำระเงิน

setPaymentMethod(‘wallet’)} className={`p-3 rounded-xl border-2 cursor-pointer transition flex items-center justify-between ${paymentMethod === ‘wallet’ ? ‘border-blue-500 bg-blue-50/30’ : ‘border-gray-100 hover:border-blue-100’}`}>

ThaiMall Pay (฿{walletBalance.toLocaleString()})

ชำระเงินทันใจ ปลอดภัยด้วยรหัส PIN

{paymentMethod === ‘wallet’ &&
}
setPaymentMethod(‘paylater’)} className=”p-3 cursor-pointer flex items-center justify-between”>

ThaiMall ผ่อนสบาย ใหม่

วงเงินคงเหลือ ฿{payLaterBalance.toLocaleString()}

{paymentMethod === ‘paylater’ &&
}
{paymentMethod === ‘paylater’ && (

เลือกระยะเวลาผ่อนชำระ (ดอกเบี้ย 0%):

{[1, 3, 6].map(m => ( ))}
)}
setPaymentMethod(‘cod’)} className={`p-3 rounded-xl border-2 cursor-pointer transition flex items-center justify-between ${paymentMethod === ‘cod’ ? ‘border-orange-500 bg-orange-50/50’ : ‘border-gray-100 hover:border-orange-100’}`}>

ชำระเงินปลายทาง (COD)

จ่ายเงินเมื่อได้รับสินค้า

{paymentMethod === ‘cod’ &&
}

สรุปยอดรายการ

ยอดรวมค่าสินค้า฿{subtotal.toLocaleString()}
ค่าจัดส่งรวม ({uniqueSellers.length} ร้านค้า)฿{baseShipping.toLocaleString()}
{deliveryMethod === ‘rider’ &&
ค่าเรียกไรเดอร์ด่วน+ ฿25
}
ยอดชำระสุทธิ฿{grandTotal.toLocaleString()}

Total

฿{grandTotal.toLocaleString()}

)}
); }; const renderProfile = () => { return (
{/* Header Section */}

คุณสมชาย ใจดี

สมาชิกระดับ ทั่วไป
{/* Wallet Section (Floating) */}
ThaiMall Pay

ยอดเงินคงเหลือ

฿

{walletBalance.toLocaleString(‘th-TH’, { minimumFractionDigits: 2 })}

{/* PayLater Card */}
setShowPayLaterModal(true)}>
ThaiMall ผ่อนสบาย
ดิวถัดไป 5 มิ.ย.

วงเงินคงเหลือ (฿)

{payLaterBalance.toLocaleString(‘th-TH’, { minimumFractionDigits: 2 })}

วงเงินอนุมัติรวม

฿{payLaterLimit.toLocaleString()}

{/* Orders Section */}

คำสั่งซื้อของฉัน

{ setShowOrderHistory(true); setOrderTab(‘all’); }} className=”text-[10px] font-bold text-gray-500 flex items-center cursor-pointer hover:text-orange-500 transition”>ดูประวัติทั้งหมด
{ setShowOrderHistory(true); setOrderTab(‘unpaid’); }} className=”flex flex-col items-center relative cursor-pointer active:scale-95 transition group”>
รอชำระ
{ setShowOrderHistory(true); setOrderTab(‘to_receive’); }} className=”flex flex-col items-center relative cursor-pointer active:scale-95 transition group”>
รอรับสินค้า {orders.filter(o => o.status === ‘to_receive’ || o.status === ‘finding_rider’ || o.status === ‘rider_delivering’).length > 0 && {orders.filter(o => o.status === ‘to_receive’ || o.status === ‘finding_rider’ || o.status === ‘rider_delivering’).length} }
{ setShowOrderHistory(true); setOrderTab(‘completed’); }} className=”flex flex-col items-center relative cursor-pointer active:scale-95 transition group”>
ให้คะแนน
{/* My Stuff Section */}

สิทธิพิเศษและสิ่งที่ฉันสนใจ

triggerNotification(‘คูปอง’, ‘กำลังโหลดคูปองส่วนลด…’)} className=”p-4 flex flex-col items-center justify-center cursor-pointer hover:bg-gray-50 transition”> คูปองของฉัน
triggerNotification(‘สินค้าที่ถูกใจ’, ‘ไม่มีสินค้าในรายการโปรด’)} className=”p-4 flex flex-col items-center justify-center cursor-pointer hover:bg-gray-50 transition”> สินค้าที่ถูกใจ
triggerNotification(‘ร้านที่ติดตาม’, ‘ไม่มีร้านค้าที่ติดตาม’)} className=”p-4 flex flex-col items-center justify-center cursor-pointer hover:bg-gray-50 transition”> ร้านที่ติดตาม
{/* Account Settings */}

การตั้งค่าและความช่วยเหลือ

); } const renderBottomNav = () => (
{[ { id: ‘Home’, icon: Home, label: ‘หน้าแรก’ }, { id: ‘Radar’, icon: Radar, label: ‘รถพุ่มพวง’ }, { id: ‘Cart’, icon: ShoppingCart, label: ‘ตะกร้า’, badge: cartItems.length }, { id: ‘Profile’, icon: User, label: ‘ฉัน’ } ].map((item) => ( ))}
); const renderRadarModal = () => { if (!showRadar) return null; return (

Smart Radar

สุราษฎร์ธานี (จำลองรัศมี 5 กม.)

{!isScanningRadar && MOCK_MOBILE_VENDORS.map((vendor) => (
setSelectedRadarVendor(vendor)} className={`absolute w-10 h-10 -ml-5 -mt-5 flex items-center justify-center cursor-pointer transition-transform hover:scale-110 z-20 ${selectedRadarVendor?.id === vendor.id ? ‘scale-125 z-30’ : ”}`} style={{ top: `calc(50% + ${vendor.lat}px)`, left: `calc(50% + ${vendor.lng}px)` }} >
{vendor.type === ‘รถพุ่มพวง’ ? : }
))}
{isScanningRadar ? (

กำลังสแกนหารถพุ่มพวง…

ระบุตำแหน่ง GPS ในรัศมีทำการ

) : selectedRadarVendor ? (
{selectedRadarVendor.type} {selectedRadarVendor.rating}

{selectedRadarVendor.name}

ห่างออกไป {selectedRadarVendor.distance} • ถึงใน {selectedRadarVendor.time}

สินค้าบนรถตอนนี้:

{selectedRadarVendor.items.map(item => ( {item} ))}
) : (

พบ {MOCK_MOBILE_VENDORS.length} คันใกล้ตัวคุณ

{MOCK_MOBILE_VENDORS.map(vendor => (
setSelectedRadarVendor(vendor)} className=”bg-slate-800/50 hover:bg-slate-800 border border-slate-700 rounded-xl p-3 flex items-center cursor-pointer transition active:scale-95″>
{vendor.type === ‘รถพุ่มพวง’ ? : }

{vendor.name}

{vendor.items.join(‘, ‘)}

{vendor.distance}

{vendor.time}

))}
)}
); }; const renderProductModal = () => { if (!selectedProduct) return null; // Fallback values for products without rich data const soldCount = selectedProduct.sold || Math.floor(Math.random() * 500) + 50; const desc = selectedProduct.desc || ‘สินค้าคุณภาพดีจากร้านค้าชุมชน รับประกันความพึงพอใจ จัดส่งรวดเร็ว สนับสนุนพ่อค้าแม่ค้าท้องถิ่นผ่าน ThaiMall’; const originalPrice = selectedProduct.originalPrice || Math.floor(selectedProduct.price * 1.2); return (
{/* Header – Fixed & Transparent Overlay */}
{/* Content – Scrollable */}
{/* Main Image */}
e.target.src = ‘https://images.unsplash.com/photo-1546069901-ba9599a7e63c?w=800&q=80’} className=”w-full h-full object-cover” />
1/1
{/* Title, Price, and Stats Card */}
฿{selectedProduct.price?.toLocaleString()} {originalPrice > selectedProduct.price && ฿{originalPrice.toLocaleString()}}
{/* PayLater Badge */}
ผ่อน 0% นานสูงสุด 6 เดือน ชำระเพียง ฿{Math.ceil(selectedProduct.price / 6).toLocaleString()}/ด.

{selectedProduct.name}

{selectedProduct.rating} (ขายแล้ว {soldCount.toLocaleString()} ชิ้น)
{/* Shop Information Card */}

{selectedProduct.seller}

ร้านค้าแนะนำ ออนไลน์
{/* Detailed Description */}

รายละเอียดสินค้า

{selectedProduct.specs && (
{Object.entries(selectedProduct.specs).map(([key, value]) => (
{key} {value}
))}
)}
{desc}
{/* Ratings & Reviews */}

คะแนนรีวิว ({selectedProduct.reviews?.length || 0})

ดูทั้งหมด
{selectedProduct.reviews ? (
{selectedProduct.reviews.map((rev, idx) => (
{rev.user.charAt(0)}
{rev.user}
{rev.date}
{[…Array(5)].map((_, i) => ( ))}

{rev.comment}

))}
) : (
ยังไม่มีรีวิวสำหรับสินค้านี้ มารีวิวเป็นคนแรกกันเถอะ
)}
{/* Trust Policy */}

ช้อปปลอดภัย 100% กับ ThaiMall
การันตีได้รับสินค้าตรงปก สามารถขอคืนเงินคืนสินค้าได้ภายใน 7 วัน นับจากวันที่ได้รับสินค้า

{/* Bottom Action Bar (Sticky) */}
); }; const renderOrderHistoryModal = () => { if (!showOrderHistory) return null; const ORDER_TABS = [ { id: ‘all’, label: ‘ทั้งหมด’ }, { id: ‘unpaid’, label: ‘รอชำระ’ }, { id: ‘to_receive’, label: ‘กำลังจัดส่ง’ }, { id: ‘completed’, label: ‘สำเร็จแล้ว’ } ]; const displayedOrders = orderTab === ‘all’ ? orders : orders.filter(o => o.status === orderTab || (orderTab === ‘to_receive’ && (o.status === ‘finding_rider’ || o.status === ‘rider_delivering’))); return (

การสั่งซื้อของฉัน

{ORDER_TABS.map(tab => ( ))}
{displayedOrders.length === 0 ? (

ไม่มีคำสั่งซื้อ

) : ( displayedOrders.map(order => (
{order.store}
{order.status === ‘unpaid’ ? ‘รอชำระเงิน’ : order.status === ‘finding_rider’ ? ‘ค้นหาไรเดอร์…’ : order.status === ‘rider_delivering’ ? ‘ไรเดอร์กำลังส่ง’ : order.status === ‘completed’ ? ‘จัดส่งสำเร็จ’ : ‘จัดส่งทางพัสดุ’}
{order.items.map((item, idx) => (

{item.name}

x{item.qty}฿{item.price}
))}
ยอดรวมสุทธิ:฿{order.total.toLocaleString()}
{(order.status === ‘finding_rider’ || order.status === ‘rider_delivering’) && ( )} {order.status === ‘to_receive’ && ( <> )} {order.status === ‘completed’ && ( )}
)) )}
); }; const renderRiderTrackingModal = () => { if (!showRiderModal || !activeTrackingOrder) return null; const isFinding = activeTrackingOrder.status === ‘finding_rider’; const rider = activeTrackingOrder.rider || MOCK_RIDER; return (

สถานะการจัดส่ง

{activeTrackingOrder.store}
{isFinding ? (
) : (
)}
{isFinding ? (

กำลังค้นหาไรเดอร์…

) : (

{activeTrackingOrder.eta || ’12 นาที’}

กำลังไปรับสินค้า

{rider.name}

{rider.plate}

)}
); }; const renderOtherModals = () => ( <> {/* Confirm Order Modal */} {showConfirmOrderModal && (

ยืนยันคำสั่งซื้อ

ยอดชำระสุทธิ ฿{(cartItems.reduce((s, i) => s + i.price * i.qty, 0) + (deliveryMethod === ‘rider’ ? 40 : 15)).toLocaleString()}
)} {/* Success Modal */} {showOrderSuccessModal && (

สั่งซื้อสินค้าสำเร็จ!

)} {/* Tracking Modal */} {showTrackingModal && (

สถานะการจัดส่ง

{isTrackingLoading ? (
) : (
{trackingInfo?.events.map((ev, i) => (

{ev.status}

{ev.time}

))}
)}
)} {/* Address Modal */} {showAddressModal && (

{addressPhase === ‘list’ ? ‘ที่อยู่สำหรับจัดส่ง’ : ‘จัดการที่อยู่’}

{addressPhase === ‘list’ && (
{addresses.map(addr => (
handleSelectDefaultAddress(addr.id)} className={`bg-white rounded-2xl p-4 border cursor-pointer relative ${addr.isDefault ? ‘border-orange-500 shadow-md ring-1 ring-orange-400/20’ : ‘border-gray-100’}`} >
{addr.name}{addr.phone}

{addr.detail} จ.{addr.province} {addr.zip}

))}
)} {addressPhase === ‘add’ && (
setAddressForm({ …addressForm, name: e.target.value })} className=”w-full border border-gray-200 rounded-xl py-3 px-4 text-xs focus:border-orange-500 focus:outline-none” />
setAddressForm({ …addressForm, phone: e.target.value })} className=”w-full border border-gray-200 rounded-xl py-3 px-4 text-xs focus:border-orange-500 focus:outline-none” />
setAddressForm({ …addressForm, district: e.target.value })} className=”w-full border border-gray-200 rounded-xl py-3 px-4 text-xs focus:border-orange-500 focus:outline-none” />
setAddressForm({ …addressForm, province: e.target.value })} className=”w-full border border-gray-200 rounded-xl py-3 px-4 text-xs focus:border-orange-500 focus:outline-none” />
setAddressForm({ …addressForm, zip: e.target.value })} className=”w-full border border-gray-200 rounded-xl py-3 px-4 text-xs focus:border-orange-500 focus:outline-none” />
)}
)} {/* Topup Modal */} {showTopupModal && (
{topupPhase === ‘select’ && (

เติมเงิน ThaiMall Pay

{[100, 300, 500, 1000, 2000, 5000].map(amt => ( ))}
)} {topupPhase === ‘qr’ && (

แสกนเพื่อเติมเงิน

ยอดที่ต้องชำระ

฿{topupAmount.toLocaleString(‘th-TH’, {minimumFractionDigits: 2})}

)} {topupPhase === ‘processing’ && (
)} {topupPhase === ‘success’ && (

เติมเงินสำเร็จ!

)}
)} {/* Rating Modal */} {showRatingModal && selectedOrderToRate && (

ให้คะแนนร้านค้า

{[1, 2, 3, 4, 5].map(star => ( ))}
)} {/* Notifications Overlay */} {showNotifications && (

แจ้งเตือน

{notifications.map(n => (

{n.title}

{n.desc}

))}
)} {/* Coupons Modal */} {showCouponsModal && (
{/* Sticky Header with Input */}

คูปองส่วนลดของฉัน

setCouponCodeInput(e.target.value)} className=”flex-1 bg-gray-100 border border-gray-200 rounded-xl px-4 py-2.5 text-sm font-bold text-gray-800 focus:outline-none focus:border-orange-500 focus:bg-white transition” />
{/* Filter Tabs */}
{[ {id:’active’, label:’ใช้งานได้’}, {id:’used’, label:’ใช้แล้ว’}, {id:’expired’, label:’หมดอายุ’} ].map(tab => ( ))}
{/* Coupons List */}
{coupons.filter(c => c.status === couponTab).length === 0 ? (

ไม่มีคูปองในหมวดหมู่นี้

) : ( coupons.filter(c => c.status === couponTab).map(coupon => (
{/* Left Side – Colored Ticket */}
{coupon.type === ‘shipping’ ? ‘โค้ดส่งฟรี’ : coupon.type === ‘discount’ ? ‘โค้ดส่วนลด’ : ‘รับเงินคืน’} {/* Ticket Edge Cutouts */}
{/* Sawtooth / Perforated line */}
{/* Right Side – Details */}

{coupon.title}

{coupon.desc}

ช้อปขั้นต่ำ ฿{coupon.minSpend}

{coupon.status === ‘active’ ? `หมดเขต ${coupon.expiry}` : (coupon.status === ‘used’ ? ‘ถูกใช้งานแล้ว’ : ‘หมดอายุแล้ว’)} {coupon.status === ‘active’ && ( )}
)) )}
)} {/* Liked Products Modal */} {showLikedProductsModal && (

สินค้าที่ถูกใจ

{likedProductIds.length === 0 ? (

ยังไม่มีสินค้าที่ถูกใจ

) : (
{MOCK_PRODUCTS.filter(p => likedProductIds.includes(p.id)).map(item => (
setSelectedProduct(item)} className=”bg-white rounded-lg overflow-hidden shadow-sm border border-gray-100 flex flex-col cursor-pointer hover:shadow-md transition relative”> {item.image && (
e.target.src = ‘https://images.unsplash.com/photo-1546069901-ba9599a7e63c?w=100&q=80’} className=”w-full h-full object-cover”/>
)}

{item.name}

฿{item.price?.toLocaleString()}
))}
)}
)} {/* Followed Shops Modal */} {showFollowedShopsModal && (

ร้านที่ติดตาม

{followedShops.length === 0 ? (

ยังไม่ได้ติดตามร้านค้าใด

) : ( followedShops.map((shop, index) => (

{shop.name}

{shop.type}

)) )}
)} {/* PayLater Dashboard Modal */} {showPayLaterModal && (
{/* Header */}

ThaiMall ผ่อนสบาย

{payLaterPhase === ‘dashboard’ && (

วงเงินที่สามารถใช้ได้

฿

{payLaterBalance.toLocaleString(‘th-TH’, {minimumFractionDigits: 2})}

วงเงินอนุมัติรวม ฿{payLaterLimit.toLocaleString()}

{/* Progress Ring */}
ใช้ไป {Math.round(((payLaterLimit – payLaterBalance) / payLaterLimit) * 100)}%
)}
{payLaterPhase === ‘dashboard’ && (
{/* Current Bill Section */}

ยอดที่ต้องชำระรอบบิลนี้

ครบกำหนดชำระวันที่ 5 มิ.ย. 2026

ยังไม่ชำระ

฿{currentBillAmount.toLocaleString(‘th-TH’, {minimumFractionDigits: 2})}

{/* Utilities */}

บิลย้อนหลัง

ดูใบเสร็จรับเงิน

ขอเพิ่มวงเงิน

ยื่นเอกสารเพิ่ม

{/* Transaction History */}

รายการที่ต้องชำระ / ผ่อนชำระ

{payLaterTransactions.length === 0 ? (

ยังไม่มีประวัติการใช้วงเงิน

) : (
{payLaterTransactions.map(tx => (

{tx.name}

{tx.date} • {tx.plan}

{tx.status === ‘billed’ ? ‘เรียกเก็บรอบนี้’ : ‘รอบบิลถัดไป’} {tx.plan.includes(‘ผ่อน’) && งวดที่ {tx.currentInstallment}}

฿{tx.amount.toLocaleString()}

))}
)}
)} {/* Pay Bill Flow */} {payLaterPhase === ‘pay_bill’ && (

ชำระบิล ThaiMall ผ่อนสบาย

ยอดที่ต้องชำระรอบนี้

฿{currentBillAmount.toLocaleString(‘th-TH’, {minimumFractionDigits: 2})}

เงินต้น฿{currentBillAmount.toLocaleString()}
ดอกเบี้ย (โปรโมชัน 0%)฿0.00
ยอดรวม฿{currentBillAmount.toLocaleString()}

เลือกช่องทางชำระเงิน

ThaiMall Pay

ยอดเงินคงเหลือ: ฿{walletBalance.toLocaleString()}

)} {/* Success Flow */} {payLaterPhase === ‘success’ && (

ชำระบิลสำเร็จ!

วงเงินเครดิตของคุณถูกคืนกลับเข้าสู่ระบบเรียบร้อยแล้ว ขอบคุณที่ชำระเงินตรงเวลาค่ะ

)}
)} ); return (
{activeTab === ‘Home’ && renderHomeContent()} {activeTab === ‘Cart’ && renderCartAndCheckout()} {activeTab === ‘Profile’ && renderProfile()} {renderBottomNav()} {renderRadarModal()} {renderProductModal()} {renderOrderHistoryModal()} {renderRiderTrackingModal()} {renderOtherModals()}