@burdenoff/microfe-adaptercloud 2026.614.1 → 2026.624.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adaptercloud/components/EmptyState.js +3 -3
- package/dist/adaptercloud/components/EmptyState.js.map +1 -1
- package/dist/adaptercloud/components/InvestmentCard.js +9 -9
- package/dist/adaptercloud/components/InvestmentCard.js.map +1 -1
- package/dist/adaptercloud/components/MetricsCard.js +5 -5
- package/dist/adaptercloud/components/MetricsCard.js.map +1 -1
- package/dist/adaptercloud/components/PageLayout.js +3 -3
- package/dist/adaptercloud/components/PageLayout.js.map +1 -1
- package/dist/adaptercloud/components/RatingDisplay.js +3 -3
- package/dist/adaptercloud/components/RatingDisplay.js.map +1 -1
- package/dist/adaptercloud/components/StatusBadge.js +2 -2
- package/dist/adaptercloud/components/StatusBadge.js.map +1 -1
- package/dist/adaptercloud/pages/HomePage.js +54 -54
- package/dist/adaptercloud/pages/HomePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +60 -60
- package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminDashboard.js +77 -77
- package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +43 -43
- package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +85 -85
- package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js +34 -34
- package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +40 -40
- package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/CartManagementPage.js +86 -86
- package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/admin/UserManagementPage.js +80 -80
- package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +100 -100
- package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +29 -29
- package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +81 -81
- package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +100 -100
- package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +67 -67
- package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +94 -94
- package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +57 -57
- package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +75 -75
- package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/HelpSupportPage.js +102 -102
- package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js +35 -35
- package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/adaptercloud/pages/common/SettingsPage.js +109 -109
- package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +60 -60
- package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDetailPage.js +71 -71
- package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +54 -54
- package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CheckoutPage.js +75 -75
- package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js +69 -69
- package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +72 -72
- package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +75 -75
- package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/FavoritesPage.js +30 -30
- package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +41 -41
- package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +53 -53
- package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +51 -51
- package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/ReviewsPage.js +33 -33
- package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +33 -33
- package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +108 -108
- package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +76 -76
- package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +69 -69
- package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js +53 -53
- package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +32 -32
- package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +55 -55
- package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +138 -138
- package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +65 -65
- package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js +74 -74
- package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +49 -49
- package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +92 -92
- package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +55 -55
- package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/dist/adaptercloud/utils/cn.js +2 -2
- package/dist/node_modules/{.bun/clsx@2.1.1/node_modules/clsx → clsx}/dist/clsx.js +1 -1
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/{.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge → tailwind-merge}/dist/bundle-mjs.js +212 -170
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +1 -1
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckoutPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/customer/CheckoutPage.tsx"],"sourcesContent":["/**\n * Checkout Page\n * @module adaptercloud/pages/customer\n *\n * Full checkout flow with delivery address form, payment method selection,\n * tip selection, special instructions, price breakdown, and Place Order CTA.\n */\n\nimport { useState, useEffect, useMemo } from 'react';\nimport {\n ArrowLeft,\n MapPin,\n CreditCard,\n Wallet,\n Banknote,\n Smartphone,\n CheckCircle2,\n ShoppingBag,\n Heart,\n AlertCircle,\n Loader2,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { useOrders, usePlaceOrder } from '../../hooks/useAdapterCloudApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\ntype PaymentMethod = 'cash' | 'card' | 'upi' | 'wallet';\n\ninterface DeliveryAddress {\n addressLine1: string;\n addressLine2: string;\n city: string;\n state: string;\n pincode: string;\n}\n\ninterface PaymentDetails {\n cardNumber: string;\n expiryDate: string;\n cvv: string;\n upiId: string;\n}\n\nconst paymentMethods: Array<{\n id: PaymentMethod;\n label: string;\n icon: typeof CreditCard;\n description: string;\n}> = [\n { id: 'cash', label: 'Cash on Delivery', icon: Banknote, description: 'Pay when you receive' },\n {\n id: 'card',\n label: 'Credit / Debit Card',\n icon: CreditCard,\n description: 'Visa, Mastercard, RuPay',\n },\n { id: 'upi', label: 'UPI', icon: Smartphone, description: 'Google Pay, PhonePe, Paytm' },\n { id: 'wallet', label: 'Digital Wallet', icon: Wallet, description: 'AdapterCloud Wallet Balance' },\n];\n\nconst quickTips = [0, 10, 20, 30];\n\nexport function CheckoutPage() {\n const { navigateTo, currentUser } = useAdapterCloud();\n const { data: allOrders = [], isLoading } = useOrders({ customerId: currentUser?.id });\n const placeOrderMutation = usePlaceOrder();\n\n // Use the first pending order as the \"current order\" being placed, or most recent\n const order = useMemo(() => {\n return allOrders.find((o) => o.status === 'pending') || allOrders[0];\n }, [allOrders]);\n\n const [deliveryAddress, setDeliveryAddress] = useState<DeliveryAddress>({\n addressLine1: '',\n addressLine2: '',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '',\n });\n\n const [selectedPayment, setSelectedPayment] = useState<PaymentMethod>('cash');\n const [paymentDetails, setPaymentDetails] = useState<PaymentDetails>({\n cardNumber: '',\n expiryDate: '',\n cvv: '',\n upiId: '',\n });\n\n const [tip, setTip] = useState(0);\n const [customTipInput, setCustomTipInput] = useState('');\n const [specialInstructions, setSpecialInstructions] = useState('');\n const [isPlacing, setIsPlacing] = useState(false);\n\n // Calculate order summary dynamically\n const orderSummary = useMemo(() => {\n if (!order) return { subtotal: 0, deliveryFee: 0, tax: 0, total: 0 };\n const subtotal = order.subtotal;\n const deliveryFee = order.deliveryFee;\n const tax = order.taxes;\n const discount = order.discount ?? 0;\n const total = subtotal + deliveryFee + tax + tip - discount;\n return { subtotal, deliveryFee, tax, discount, total };\n }, [order, tip]);\n\n const totalItems = useMemo(() => {\n if (!order) return 0;\n return order.items.reduce((sum, item) => sum + item.quantity, 0);\n }, [order]);\n\n const handleAddressChange = (field: keyof DeliveryAddress, value: string) => {\n setDeliveryAddress((prev) => ({ ...prev, [field]: value }));\n };\n\n const handlePaymentDetailsChange = (field: keyof PaymentDetails, value: string) => {\n setPaymentDetails((prev) => ({ ...prev, [field]: value }));\n };\n\n const validateForm = (): boolean => {\n if (!deliveryAddress.addressLine1.trim()) {\n alert('Please enter delivery address');\n return false;\n }\n if (!deliveryAddress.pincode.trim() || deliveryAddress.pincode.length !== 6) {\n alert('Please enter a valid 6-digit pincode');\n return false;\n }\n if (selectedPayment === 'card') {\n if (!paymentDetails.cardNumber || paymentDetails.cardNumber.length < 16) {\n alert('Please enter a valid 16-digit card number');\n return false;\n }\n if (!paymentDetails.expiryDate) {\n alert('Please enter card expiry date');\n return false;\n }\n if (!paymentDetails.cvv || paymentDetails.cvv.length < 3) {\n alert('Please enter a valid 3-digit CVV');\n return false;\n }\n }\n if (selectedPayment === 'upi' && !paymentDetails.upiId.trim()) {\n alert('Please enter UPI ID');\n return false;\n }\n return true;\n };\n\n const handlePlaceOrder = async () => {\n if (!validateForm() || !order) return;\n\n try {\n const result = await placeOrderMutation.mutateAsync({\n providerId: order.cartId,\n customerId: currentUser?.id,\n items: order.items.map((i) => ({\n offeringId: i.id,\n quantity: i.quantity,\n customizations: i.customizations,\n })),\n deliveryAddress: `${deliveryAddress.addressLine1}, ${deliveryAddress.addressLine2}, ${deliveryAddress.city}, ${deliveryAddress.state} - ${deliveryAddress.pincode}`,\n paymentMethod: selectedPayment.toUpperCase(),\n notes: specialInstructions,\n deliveryFee: orderSummary.deliveryFee,\n tax: orderSummary.tax,\n tip: tip,\n total: orderSummary.total,\n });\n\n alert('Order placed successfully!');\n navigateTo(`/customer/order/${result.id}`);\n } catch (err) {\n alert('Failed to place order. Please try again.');\n }\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Checkout\">\n <div className=\"flex h-[60vh] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!order) {\n return (\n <PageLayout title=\"Checkout\">\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <ShoppingBag className=\"h-16 w-16 text-muted-foreground/40 mb-4\" />\n <h3 className=\"text-lg font-semibold text-foreground mb-2\">Your cart is empty</h3>\n <p className=\"text-sm text-muted-foreground mb-6\">\n Add some items to proceed with checkout\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-lg bg-foreground px-6 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Browse Carts\n </button>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-md p-1 text-muted-foreground hover:bg-accent hover:text-foreground transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Checkout</span>\n </div>\n }\n description=\"Review your order and complete payment\"\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Checkout Form */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Delivery Address */}\n <section className=\"rounded-lg border border-border bg-card p-5\">\n <h2 className=\"text-base font-semibold text-foreground mb-4 flex items-center gap-2\">\n <MapPin className=\"h-4 w-4 text-muted-foreground\" />\n Delivery Address\n </h2>\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Address Line 1 <span className=\"text-destructive\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"Building, Street, Area\"\n value={deliveryAddress.addressLine1}\n onChange={(e) => handleAddressChange('addressLine1', e.target.value)}\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Address Line 2\n </label>\n <input\n type=\"text\"\n placeholder=\"Apartment, Suite, Floor (Optional)\"\n value={deliveryAddress.addressLine2}\n onChange={(e) => handleAddressChange('addressLine2', e.target.value)}\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n City <span className=\"text-destructive\">*</span>\n </label>\n <input\n type=\"text\"\n value={deliveryAddress.city}\n onChange={(e) => handleAddressChange('city', e.target.value)}\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n State <span className=\"text-destructive\">*</span>\n </label>\n <input\n type=\"text\"\n value={deliveryAddress.state}\n onChange={(e) => handleAddressChange('state', e.target.value)}\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Pincode <span className=\"text-destructive\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"560001\"\n maxLength={6}\n value={deliveryAddress.pincode}\n onChange={(e) =>\n handleAddressChange('pincode', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n </div>\n </section>\n\n {/* Payment Method */}\n <section className=\"rounded-lg border border-border bg-card p-5\">\n <h2 className=\"text-base font-semibold text-foreground mb-4 flex items-center gap-2\">\n <CreditCard className=\"h-4 w-4 text-muted-foreground\" />\n Payment Method\n </h2>\n <div className=\"space-y-2\">\n {paymentMethods.map((method) => {\n const Icon = method.icon;\n return (\n <button\n key={method.id}\n type=\"button\"\n onClick={() => setSelectedPayment(method.id)}\n className={cn(\n 'flex w-full items-center gap-4 rounded-lg border p-3 transition-colors text-left',\n selectedPayment === method.id\n ? 'border-foreground bg-accent'\n : 'border-border bg-card hover:bg-accent'\n )}\n >\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-muted\">\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-foreground\">{method.label}</p>\n <p className=\"text-xs text-muted-foreground\">{method.description}</p>\n </div>\n {selectedPayment === method.id && (\n <CheckCircle2 className=\"h-5 w-5 text-foreground shrink-0\" />\n )}\n </button>\n );\n })}\n </div>\n\n {/* Card Payment Details */}\n {selectedPayment === 'card' && (\n <div className=\"mt-4 space-y-4 border-t border-border pt-4\">\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Card Number <span className=\"text-destructive\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"1234 5678 9012 3456\"\n maxLength={16}\n value={paymentDetails.cardNumber}\n onChange={(e) =>\n handlePaymentDetailsChange('cardNumber', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n Expiry Date <span className=\"text-destructive\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"MM/YY\"\n maxLength={5}\n value={paymentDetails.expiryDate}\n onChange={(e) => {\n let value = e.target.value.replace(/\\D/g, '');\n if (value.length >= 2) {\n value = value.slice(0, 2) + '/' + value.slice(2, 4);\n }\n handlePaymentDetailsChange('expiryDate', value);\n }}\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n CVV <span className=\"text-destructive\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"123\"\n maxLength={3}\n value={paymentDetails.cvv}\n onChange={(e) =>\n handlePaymentDetailsChange('cvv', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n </div>\n </div>\n )}\n\n {/* UPI ID */}\n {selectedPayment === 'upi' && (\n <div className=\"mt-4 border-t border-border pt-4\">\n <label className=\"block text-sm font-medium text-foreground mb-1.5\">\n UPI ID <span className=\"text-destructive\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"user@paytm\"\n value={paymentDetails.upiId}\n onChange={(e) => handlePaymentDetailsChange('upiId', e.target.value)}\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n )}\n\n {/* Wallet notice */}\n {selectedPayment === 'wallet' && (\n <div className=\"mt-4 flex items-start gap-3 rounded-lg bg-blue-500/10 p-4 border border-blue-500/20\">\n <AlertCircle className=\"h-4 w-4 text-blue-600 dark:text-blue-400 mt-0.5 shrink-0\" />\n <p className=\"text-sm text-blue-600 dark:text-blue-400\">\n Digital wallet integration coming soon. Please choose another payment method.\n </p>\n </div>\n )}\n </section>\n\n {/* Tip and Special Instructions */}\n <section className=\"rounded-lg border border-border bg-card p-5\">\n <h2 className=\"text-base font-semibold text-foreground mb-4 flex items-center gap-2\">\n <Heart className=\"h-4 w-4 text-muted-foreground\" />\n Additional Options\n </h2>\n <div className=\"space-y-5\">\n {/* Tip Selection */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Tip for delivery partner\n </label>\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {quickTips.map((amount) => (\n <button\n key={amount}\n type=\"button\"\n onClick={() => {\n setTip(amount);\n setCustomTipInput('');\n }}\n className={cn(\n 'flex-1 min-w-[64px] rounded-lg px-3 py-2.5 text-sm font-medium transition-colors',\n tip === amount && customTipInput === ''\n ? 'bg-foreground text-background'\n : 'bg-muted text-muted-foreground hover:bg-accent hover:text-foreground'\n )}\n >\n {amount === 0 ? 'No Tip' : `₹${amount}`}\n </button>\n ))}\n </div>\n <input\n type=\"number\"\n placeholder=\"Custom tip amount\"\n value={customTipInput}\n onChange={(e) => {\n const val = e.target.value;\n setCustomTipInput(val);\n setTip(parseInt(val) || 0);\n }}\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n </div>\n\n {/* Special Instructions */}\n <div>\n <label className=\"block text-sm font-medium text-foreground mb-2\">\n Special Instructions\n </label>\n <textarea\n rows={3}\n placeholder=\"Any special requests for your order...\"\n value={specialInstructions}\n onChange={(e) => setSpecialInstructions(e.target.value)}\n className=\"w-full rounded-lg border border-border bg-background px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring resize-none\"\n />\n </div>\n </div>\n </section>\n </div>\n\n {/* Right: Order Summary & Place Order */}\n <div className=\"lg:col-span-1\">\n <div className=\"sticky top-6 rounded-lg border border-border bg-card p-5\">\n <h2 className=\"text-base font-semibold text-foreground mb-4\">Order Summary</h2>\n\n {/* Cart Info */}\n <div className=\"flex items-center gap-3 mb-4 pb-4 border-b border-border\">\n <div className=\"h-12 w-12 rounded-md bg-muted overflow-hidden\">\n <img\n src={order.cartImage}\n alt={order.cartName}\n className=\"h-full w-full object-cover\"\n />\n </div>\n <div>\n <p className=\"text-sm font-medium text-foreground\">{order.cartName}</p>\n <p className=\"text-xs text-muted-foreground\">\n {order.items.length} item{order.items.length !== 1 ? 's' : ''}\n </p>\n </div>\n </div>\n\n {/* Cart Items */}\n <div className=\"space-y-2 mb-4\">\n {order.items.map((item) => (\n <div key={item.id} className=\"flex justify-between items-start\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-foreground\">{item.name}</p>\n {item.customizations && item.customizations.length > 0 && (\n <p className=\"text-xs text-muted-foreground mt-0.5\">\n {item.customizations.join(', ')}\n </p>\n )}\n <p className=\"text-xs text-muted-foreground\">\n {formatCurrency(item.price, { minimumFractionDigits: 0 })} x {item.quantity}\n </p>\n </div>\n <span className=\"text-sm font-medium text-foreground\">\n {formatCurrency(item.price * item.quantity, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n\n {/* Price Breakdown */}\n <div className=\"border-t border-border pt-4 space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Subtotal ({totalItems} items)</span>\n <span className=\"text-foreground\">\n {formatCurrency(orderSummary.subtotal, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Delivery Fee</span>\n <span className=\"text-foreground\">\n {orderSummary.deliveryFee === 0\n ? 'FREE'\n : formatCurrency(orderSummary.deliveryFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Tax</span>\n <span className=\"text-foreground\">\n {formatCurrency(orderSummary.tax, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {tip > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Tip</span>\n <span className=\"text-foreground\">\n {formatCurrency(tip, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n {orderSummary.discount && orderSummary.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-green-600 dark:text-green-400\">Discount</span>\n <span className=\"text-green-600 dark:text-green-400\">\n -{formatCurrency(orderSummary.discount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"mt-4 flex justify-between border-t border-border pt-4\">\n <span className=\"text-base font-semibold text-foreground\">Total</span>\n <span className=\"text-base font-bold text-foreground\">\n {formatCurrency(orderSummary.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n\n <button\n type=\"button\"\n onClick={handlePlaceOrder}\n disabled={placeOrderMutation.isPending}\n className={cn(\n 'mt-6 flex w-full items-center justify-center gap-2 rounded-lg py-3 text-sm font-medium transition-opacity',\n 'bg-foreground text-background',\n placeOrderMutation.isPending ? 'opacity-60 cursor-not-allowed' : 'hover:opacity-90'\n )}\n >\n {placeOrderMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <ShoppingBag className=\"h-4 w-4\" />\n )}\n {placeOrderMutation.isPending\n ? 'Placing Order...'\n : `Place Order - ${formatCurrency(orderSummary.total, { minimumFractionDigits: 0 })}`}\n </button>\n\n <p className=\"mt-3 text-center text-xs text-muted-foreground\">\n By placing this order, you agree to our Terms of Service and Privacy Policy\n </p>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CheckoutPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/customer/CheckoutPage.tsx"],"sourcesContent":["/**\n * Checkout Page\n * @module adaptercloud/pages/customer\n *\n * Full checkout flow with delivery address form, payment method selection,\n * tip selection, special instructions, price breakdown, and Place Order CTA.\n */\n\nimport { useState, useEffect, useMemo } from 'react';\nimport {\n ArrowLeft,\n MapPin,\n CreditCard,\n Wallet,\n Banknote,\n Smartphone,\n CheckCircle2,\n ShoppingBag,\n Heart,\n AlertCircle,\n Loader2,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useAdapterCloud } from '../../context/AdapterCloudContext';\nimport { useOrders, usePlaceOrder } from '../../hooks/useAdapterCloudApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\n\ntype PaymentMethod = 'cash' | 'card' | 'upi' | 'wallet';\n\ninterface DeliveryAddress {\n addressLine1: string;\n addressLine2: string;\n city: string;\n state: string;\n pincode: string;\n}\n\ninterface PaymentDetails {\n cardNumber: string;\n expiryDate: string;\n cvv: string;\n upiId: string;\n}\n\nconst paymentMethods: Array<{\n id: PaymentMethod;\n label: string;\n icon: typeof CreditCard;\n description: string;\n}> = [\n { id: 'cash', label: 'Cash on Delivery', icon: Banknote, description: 'Pay when you receive' },\n {\n id: 'card',\n label: 'Credit / Debit Card',\n icon: CreditCard,\n description: 'Visa, Mastercard, RuPay',\n },\n { id: 'upi', label: 'UPI', icon: Smartphone, description: 'Google Pay, PhonePe, Paytm' },\n { id: 'wallet', label: 'Digital Wallet', icon: Wallet, description: 'AdapterCloud Wallet Balance' },\n];\n\nconst quickTips = [0, 10, 20, 30];\n\nexport function CheckoutPage() {\n const { navigateTo, currentUser } = useAdapterCloud();\n const { data: allOrders = [], isLoading } = useOrders({ customerId: currentUser?.id });\n const placeOrderMutation = usePlaceOrder();\n\n // Use the first pending order as the \"current order\" being placed, or most recent\n const order = useMemo(() => {\n return allOrders.find((o) => o.status === 'pending') || allOrders[0];\n }, [allOrders]);\n\n const [deliveryAddress, setDeliveryAddress] = useState<DeliveryAddress>({\n addressLine1: '',\n addressLine2: '',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '',\n });\n\n const [selectedPayment, setSelectedPayment] = useState<PaymentMethod>('cash');\n const [paymentDetails, setPaymentDetails] = useState<PaymentDetails>({\n cardNumber: '',\n expiryDate: '',\n cvv: '',\n upiId: '',\n });\n\n const [tip, setTip] = useState(0);\n const [customTipInput, setCustomTipInput] = useState('');\n const [specialInstructions, setSpecialInstructions] = useState('');\n const [isPlacing, setIsPlacing] = useState(false);\n\n // Calculate order summary dynamically\n const orderSummary = useMemo(() => {\n if (!order) return { subtotal: 0, deliveryFee: 0, tax: 0, total: 0 };\n const subtotal = order.subtotal;\n const deliveryFee = order.deliveryFee;\n const tax = order.taxes;\n const discount = order.discount ?? 0;\n const total = subtotal + deliveryFee + tax + tip - discount;\n return { subtotal, deliveryFee, tax, discount, total };\n }, [order, tip]);\n\n const totalItems = useMemo(() => {\n if (!order) return 0;\n return order.items.reduce((sum, item) => sum + item.quantity, 0);\n }, [order]);\n\n const handleAddressChange = (field: keyof DeliveryAddress, value: string) => {\n setDeliveryAddress((prev) => ({ ...prev, [field]: value }));\n };\n\n const handlePaymentDetailsChange = (field: keyof PaymentDetails, value: string) => {\n setPaymentDetails((prev) => ({ ...prev, [field]: value }));\n };\n\n const validateForm = (): boolean => {\n if (!deliveryAddress.addressLine1.trim()) {\n alert('Please enter delivery address');\n return false;\n }\n if (!deliveryAddress.pincode.trim() || deliveryAddress.pincode.length !== 6) {\n alert('Please enter a valid 6-digit pincode');\n return false;\n }\n if (selectedPayment === 'card') {\n if (!paymentDetails.cardNumber || paymentDetails.cardNumber.length < 16) {\n alert('Please enter a valid 16-digit card number');\n return false;\n }\n if (!paymentDetails.expiryDate) {\n alert('Please enter card expiry date');\n return false;\n }\n if (!paymentDetails.cvv || paymentDetails.cvv.length < 3) {\n alert('Please enter a valid 3-digit CVV');\n return false;\n }\n }\n if (selectedPayment === 'upi' && !paymentDetails.upiId.trim()) {\n alert('Please enter UPI ID');\n return false;\n }\n return true;\n };\n\n const handlePlaceOrder = async () => {\n if (!validateForm() || !order) return;\n\n try {\n const result = await placeOrderMutation.mutateAsync({\n providerId: order.cartId,\n customerId: currentUser?.id,\n items: order.items.map((i) => ({\n offeringId: i.id,\n quantity: i.quantity,\n customizations: i.customizations,\n })),\n deliveryAddress: `${deliveryAddress.addressLine1}, ${deliveryAddress.addressLine2}, ${deliveryAddress.city}, ${deliveryAddress.state} - ${deliveryAddress.pincode}`,\n paymentMethod: selectedPayment.toUpperCase(),\n notes: specialInstructions,\n deliveryFee: orderSummary.deliveryFee,\n tax: orderSummary.tax,\n tip: tip,\n total: orderSummary.total,\n });\n\n alert('Order placed successfully!');\n navigateTo(`/customer/order/${result.id}`);\n } catch (err) {\n alert('Failed to place order. Please try again.');\n }\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Checkout\">\n <div className=\"flex h-[60vh] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!order) {\n return (\n <PageLayout title=\"Checkout\">\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <ShoppingBag className=\"h-16 w-16 text-text-secondary/40 mb-4\" />\n <h3 className=\"text-lg font-semibold text-text-primary mb-2\">Your cart is empty</h3>\n <p className=\"text-sm text-text-secondary mb-6\">\n Add some items to proceed with checkout\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-lg bg-foreground px-6 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Browse Carts\n </button>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Checkout</span>\n </div>\n }\n description=\"Review your order and complete payment\"\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Checkout Form */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Delivery Address */}\n <section className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <MapPin className=\"h-4 w-4 text-text-secondary\" />\n Delivery Address\n </h2>\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Address Line 1 <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"Building, Street, Area\"\n value={deliveryAddress.addressLine1}\n onChange={(e) => handleAddressChange('addressLine1', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Address Line 2\n </label>\n <input\n type=\"text\"\n placeholder=\"Apartment, Suite, Floor (Optional)\"\n value={deliveryAddress.addressLine2}\n onChange={(e) => handleAddressChange('addressLine2', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n City <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n value={deliveryAddress.city}\n onChange={(e) => handleAddressChange('city', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n State <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n value={deliveryAddress.state}\n onChange={(e) => handleAddressChange('state', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Pincode <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"560001\"\n maxLength={6}\n value={deliveryAddress.pincode}\n onChange={(e) =>\n handleAddressChange('pincode', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n </div>\n </section>\n\n {/* Payment Method */}\n <section className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <CreditCard className=\"h-4 w-4 text-text-secondary\" />\n Payment Method\n </h2>\n <div className=\"space-y-2\">\n {paymentMethods.map((method) => {\n const Icon = method.icon;\n return (\n <button\n key={method.id}\n type=\"button\"\n onClick={() => setSelectedPayment(method.id)}\n className={cn(\n 'flex w-full items-center gap-4 rounded-lg border p-3 transition-colors text-left',\n selectedPayment === method.id\n ? 'border-foreground bg-accent'\n : 'border-border-subtle bg-bg-surface hover:bg-accent'\n )}\n >\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-bg-sunken\">\n <Icon className=\"h-4 w-4 text-text-secondary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">{method.label}</p>\n <p className=\"text-xs text-text-secondary\">{method.description}</p>\n </div>\n {selectedPayment === method.id && (\n <CheckCircle2 className=\"h-5 w-5 text-text-primary shrink-0\" />\n )}\n </button>\n );\n })}\n </div>\n\n {/* Card Payment Details */}\n {selectedPayment === 'card' && (\n <div className=\"mt-4 space-y-4 border-t border-border-subtle pt-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Card Number <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"1234 5678 9012 3456\"\n maxLength={16}\n value={paymentDetails.cardNumber}\n onChange={(e) =>\n handlePaymentDetailsChange('cardNumber', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Expiry Date <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"MM/YY\"\n maxLength={5}\n value={paymentDetails.expiryDate}\n onChange={(e) => {\n let value = e.target.value.replace(/\\D/g, '');\n if (value.length >= 2) {\n value = value.slice(0, 2) + '/' + value.slice(2, 4);\n }\n handlePaymentDetailsChange('expiryDate', value);\n }}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n CVV <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"123\"\n maxLength={3}\n value={paymentDetails.cvv}\n onChange={(e) =>\n handlePaymentDetailsChange('cvv', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n </div>\n </div>\n )}\n\n {/* UPI ID */}\n {selectedPayment === 'upi' && (\n <div className=\"mt-4 border-t border-border-subtle pt-4\">\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n UPI ID <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"user@paytm\"\n value={paymentDetails.upiId}\n onChange={(e) => handlePaymentDetailsChange('upiId', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n )}\n\n {/* Wallet notice */}\n {selectedPayment === 'wallet' && (\n <div className=\"mt-4 flex items-start gap-3 rounded-lg bg-blue-500/10 p-4 border border-blue-500/20\">\n <AlertCircle className=\"h-4 w-4 text-blue-600 dark:text-blue-400 mt-0.5 shrink-0\" />\n <p className=\"text-sm text-blue-600 dark:text-blue-400\">\n Digital wallet integration coming soon. Please choose another payment method.\n </p>\n </div>\n )}\n </section>\n\n {/* Tip and Special Instructions */}\n <section className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Heart className=\"h-4 w-4 text-text-secondary\" />\n Additional Options\n </h2>\n <div className=\"space-y-5\">\n {/* Tip Selection */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-2\">\n Tip for delivery partner\n </label>\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {quickTips.map((amount) => (\n <button\n key={amount}\n type=\"button\"\n onClick={() => {\n setTip(amount);\n setCustomTipInput('');\n }}\n className={cn(\n 'flex-1 min-w-[64px] rounded-lg px-3 py-2.5 text-sm font-medium transition-colors',\n tip === amount && customTipInput === ''\n ? 'bg-foreground text-background'\n : 'bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary'\n )}\n >\n {amount === 0 ? 'No Tip' : `₹${amount}`}\n </button>\n ))}\n </div>\n <input\n type=\"number\"\n placeholder=\"Custom tip amount\"\n value={customTipInput}\n onChange={(e) => {\n const val = e.target.value;\n setCustomTipInput(val);\n setTip(parseInt(val) || 0);\n }}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n\n {/* Special Instructions */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-2\">\n Special Instructions\n </label>\n <textarea\n rows={3}\n placeholder=\"Any special requests for your order...\"\n value={specialInstructions}\n onChange={(e) => setSpecialInstructions(e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none\"\n />\n </div>\n </div>\n </section>\n </div>\n\n {/* Right: Order Summary & Place Order */}\n <div className=\"lg:col-span-1\">\n <div className=\"sticky top-6 rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Order Summary</h2>\n\n {/* Cart Info */}\n <div className=\"flex items-center gap-3 mb-4 pb-4 border-b border-border-subtle\">\n <div className=\"h-12 w-12 rounded-md bg-bg-sunken overflow-hidden\">\n <img\n src={order.cartImage}\n alt={order.cartName}\n className=\"h-full w-full object-cover\"\n />\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{order.cartName}</p>\n <p className=\"text-xs text-text-secondary\">\n {order.items.length} item{order.items.length !== 1 ? 's' : ''}\n </p>\n </div>\n </div>\n\n {/* Cart Items */}\n <div className=\"space-y-2 mb-4\">\n {order.items.map((item) => (\n <div key={item.id} className=\"flex justify-between items-start\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-text-primary\">{item.name}</p>\n {item.customizations && item.customizations.length > 0 && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {item.customizations.join(', ')}\n </p>\n )}\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(item.price, { minimumFractionDigits: 0 })} x {item.quantity}\n </p>\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(item.price * item.quantity, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n\n {/* Price Breakdown */}\n <div className=\"border-t border-border-subtle pt-4 space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Subtotal ({totalItems} items)</span>\n <span className=\"text-text-primary\">\n {formatCurrency(orderSummary.subtotal, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Delivery Fee</span>\n <span className=\"text-text-primary\">\n {orderSummary.deliveryFee === 0\n ? 'FREE'\n : formatCurrency(orderSummary.deliveryFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tax</span>\n <span className=\"text-text-primary\">\n {formatCurrency(orderSummary.tax, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {tip > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tip</span>\n <span className=\"text-text-primary\">\n {formatCurrency(tip, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n {orderSummary.discount && orderSummary.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-green-600 dark:text-green-400\">Discount</span>\n <span className=\"text-green-600 dark:text-green-400\">\n -{formatCurrency(orderSummary.discount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"mt-4 flex justify-between border-t border-border-subtle pt-4\">\n <span className=\"text-base font-semibold text-text-primary\">Total</span>\n <span className=\"text-base font-bold text-text-primary\">\n {formatCurrency(orderSummary.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n\n <button\n type=\"button\"\n onClick={handlePlaceOrder}\n disabled={placeOrderMutation.isPending}\n className={cn(\n 'mt-6 flex w-full items-center justify-center gap-2 rounded-lg py-3 text-sm font-medium transition-opacity',\n 'bg-foreground text-background',\n placeOrderMutation.isPending ? 'opacity-60 cursor-not-allowed' : 'hover:opacity-90'\n )}\n >\n {placeOrderMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <ShoppingBag className=\"h-4 w-4\" />\n )}\n {placeOrderMutation.isPending\n ? 'Placing Order...'\n : `Place Order - ${formatCurrency(orderSummary.total, { minimumFractionDigits: 0 })}`}\n </button>\n\n <p className=\"mt-3 text-center text-xs text-text-secondary\">\n By placing this order, you agree to our Terms of Service and Privacy Policy\n </p>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -53,7 +53,7 @@ function E() {
|
|
|
53
53
|
case "out_for_delivery": return "bg-blue-500/20 text-blue-600 dark:text-blue-400";
|
|
54
54
|
case "confirmed": return "bg-blue-500/20 text-blue-600 dark:text-blue-400";
|
|
55
55
|
case "cancelled": return "bg-red-500/20 text-red-600 dark:text-red-400";
|
|
56
|
-
default: return "bg-
|
|
56
|
+
default: return "bg-bg-sunken text-text-secondary";
|
|
57
57
|
}
|
|
58
58
|
}, U = (e) => {
|
|
59
59
|
switch (e) {
|
|
@@ -67,7 +67,7 @@ function E() {
|
|
|
67
67
|
case "suggestion": return "bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/20";
|
|
68
68
|
case "opportunity": return "bg-green-500/10 text-green-600 dark:text-green-400 border-green-500/20";
|
|
69
69
|
case "trend": return "bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/20";
|
|
70
|
-
default: return "bg-
|
|
70
|
+
default: return "bg-bg-sunken text-text-secondary border-border-subtle";
|
|
71
71
|
}
|
|
72
72
|
};
|
|
73
73
|
return F ? /* @__PURE__ */ C(n, {
|
|
@@ -77,7 +77,7 @@ function E() {
|
|
|
77
77
|
children: /* @__PURE__ */ w("div", {
|
|
78
78
|
className: "text-center",
|
|
79
79
|
children: [/* @__PURE__ */ C("div", { className: "mx-auto mb-4 h-12 w-12 animate-spin rounded-full border-b-2 border-foreground" }), /* @__PURE__ */ C("p", {
|
|
80
|
-
className: "text-sm text-
|
|
80
|
+
className: "text-sm text-text-secondary",
|
|
81
81
|
children: I("adaptercloud.customerDashboard.loading", "Loading your dashboard...")
|
|
82
82
|
})]
|
|
83
83
|
})
|
|
@@ -89,65 +89,65 @@ function E() {
|
|
|
89
89
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
90
90
|
children: [
|
|
91
91
|
/* @__PURE__ */ C("div", {
|
|
92
|
-
className: "rounded-lg border border-border bg-
|
|
92
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
93
93
|
children: /* @__PURE__ */ w("div", {
|
|
94
94
|
className: "flex items-center gap-3",
|
|
95
95
|
children: [/* @__PURE__ */ C("div", {
|
|
96
|
-
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-
|
|
97
|
-
children: /* @__PURE__ */ C(g, { className: "h-5 w-5 text-
|
|
96
|
+
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken",
|
|
97
|
+
children: /* @__PURE__ */ C(g, { className: "h-5 w-5 text-text-secondary" })
|
|
98
98
|
}), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
99
|
-
className: "text-2xl font-bold text-
|
|
99
|
+
className: "text-2xl font-bold text-text-primary",
|
|
100
100
|
children: V.totalOrders
|
|
101
101
|
}), /* @__PURE__ */ C("p", {
|
|
102
|
-
className: "text-xs text-
|
|
102
|
+
className: "text-xs text-text-secondary",
|
|
103
103
|
children: I("adaptercloud.customerDashboard.totalOrders", "Total Orders")
|
|
104
104
|
})] })]
|
|
105
105
|
})
|
|
106
106
|
}),
|
|
107
107
|
/* @__PURE__ */ C("div", {
|
|
108
|
-
className: "rounded-lg border border-border bg-
|
|
108
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
109
109
|
children: /* @__PURE__ */ w("div", {
|
|
110
110
|
className: "flex items-center gap-3",
|
|
111
111
|
children: [/* @__PURE__ */ C("div", {
|
|
112
|
-
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-
|
|
113
|
-
children: /* @__PURE__ */ C(d, { className: "h-5 w-5 text-
|
|
112
|
+
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken",
|
|
113
|
+
children: /* @__PURE__ */ C(d, { className: "h-5 w-5 text-text-secondary" })
|
|
114
114
|
}), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
115
|
-
className: "text-2xl font-bold text-
|
|
115
|
+
className: "text-2xl font-bold text-text-primary",
|
|
116
116
|
children: o(V.totalSpent, { minimumFractionDigits: 0 })
|
|
117
117
|
}), /* @__PURE__ */ C("p", {
|
|
118
|
-
className: "text-xs text-
|
|
118
|
+
className: "text-xs text-text-secondary",
|
|
119
119
|
children: I("adaptercloud.customerDashboard.totalSpent", "Total Spent")
|
|
120
120
|
})] })]
|
|
121
121
|
})
|
|
122
122
|
}),
|
|
123
123
|
/* @__PURE__ */ C("div", {
|
|
124
|
-
className: "rounded-lg border border-border bg-
|
|
124
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
125
125
|
children: /* @__PURE__ */ w("div", {
|
|
126
126
|
className: "flex items-center gap-3",
|
|
127
127
|
children: [/* @__PURE__ */ C("div", {
|
|
128
|
-
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-
|
|
129
|
-
children: /* @__PURE__ */ C(f, { className: "h-5 w-5 text-
|
|
128
|
+
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken",
|
|
129
|
+
children: /* @__PURE__ */ C(f, { className: "h-5 w-5 text-text-secondary" })
|
|
130
130
|
}), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
131
|
-
className: "text-2xl font-bold text-
|
|
131
|
+
className: "text-2xl font-bold text-text-primary",
|
|
132
132
|
children: V.favoriteCount
|
|
133
133
|
}), /* @__PURE__ */ C("p", {
|
|
134
|
-
className: "text-xs text-
|
|
134
|
+
className: "text-xs text-text-secondary",
|
|
135
135
|
children: I("adaptercloud.customerDashboard.favoriteCarts", "Favorite Carts")
|
|
136
136
|
})] })]
|
|
137
137
|
})
|
|
138
138
|
}),
|
|
139
139
|
/* @__PURE__ */ C("div", {
|
|
140
|
-
className: "rounded-lg border border-border bg-
|
|
140
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
141
141
|
children: /* @__PURE__ */ w("div", {
|
|
142
142
|
className: "flex items-center gap-3",
|
|
143
143
|
children: [/* @__PURE__ */ C("div", {
|
|
144
|
-
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-
|
|
145
|
-
children: /* @__PURE__ */ C(y, { className: "h-5 w-5 text-
|
|
144
|
+
className: "flex h-10 w-10 items-center justify-center rounded-lg bg-bg-sunken",
|
|
145
|
+
children: /* @__PURE__ */ C(y, { className: "h-5 w-5 text-text-secondary" })
|
|
146
146
|
}), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
|
|
147
|
-
className: "text-2xl font-bold text-
|
|
147
|
+
className: "text-2xl font-bold text-text-primary",
|
|
148
148
|
children: V.avgRating.toFixed(1)
|
|
149
149
|
}), /* @__PURE__ */ C("p", {
|
|
150
|
-
className: "text-xs text-
|
|
150
|
+
className: "text-xs text-text-secondary",
|
|
151
151
|
children: I("adaptercloud.customerDashboard.avgRatingGiven", "Avg Rating Given")
|
|
152
152
|
})] })]
|
|
153
153
|
})
|
|
@@ -159,7 +159,7 @@ function E() {
|
|
|
159
159
|
className: "lg:col-span-2 space-y-8",
|
|
160
160
|
children: [
|
|
161
161
|
/* @__PURE__ */ w("section", { children: [/* @__PURE__ */ C("h2", {
|
|
162
|
-
className: "text-lg font-semibold text-
|
|
162
|
+
className: "text-lg font-semibold text-text-primary mb-4",
|
|
163
163
|
children: I("adaptercloud.customerDashboard.quickActions", "Quick Actions")
|
|
164
164
|
}), /* @__PURE__ */ w("div", {
|
|
165
165
|
className: "grid grid-cols-1 gap-3 sm:grid-cols-3",
|
|
@@ -167,17 +167,17 @@ function E() {
|
|
|
167
167
|
/* @__PURE__ */ w("button", {
|
|
168
168
|
type: "button",
|
|
169
169
|
onClick: () => E("/customer/carts"),
|
|
170
|
-
className: t("flex items-center gap-3 rounded-lg border border-border bg-
|
|
170
|
+
className: t("flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left", "hover:bg-accent hover:shadow-md"),
|
|
171
171
|
children: [/* @__PURE__ */ C("div", {
|
|
172
172
|
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-blue-500/10",
|
|
173
173
|
children: /* @__PURE__ */ C(_, { className: "h-5 w-5 text-blue-600 dark:text-blue-400" })
|
|
174
174
|
}), /* @__PURE__ */ w("div", {
|
|
175
175
|
className: "min-w-0",
|
|
176
176
|
children: [/* @__PURE__ */ C("p", {
|
|
177
|
-
className: "text-sm font-semibold text-
|
|
177
|
+
className: "text-sm font-semibold text-text-primary",
|
|
178
178
|
children: I("adaptercloud.customerDashboard.discoverCarts", "Discover Carts")
|
|
179
179
|
}), /* @__PURE__ */ C("p", {
|
|
180
|
-
className: "text-xs text-
|
|
180
|
+
className: "text-xs text-text-secondary",
|
|
181
181
|
children: I("adaptercloud.customerDashboard.findNearbyCarts", "Find nearby carts")
|
|
182
182
|
})]
|
|
183
183
|
})]
|
|
@@ -185,17 +185,17 @@ function E() {
|
|
|
185
185
|
/* @__PURE__ */ w("button", {
|
|
186
186
|
type: "button",
|
|
187
187
|
onClick: () => E("/customer/orders"),
|
|
188
|
-
className: t("flex items-center gap-3 rounded-lg border border-border bg-
|
|
188
|
+
className: t("flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left", "hover:bg-accent hover:shadow-md"),
|
|
189
189
|
children: [/* @__PURE__ */ C("div", {
|
|
190
190
|
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-green-500/10",
|
|
191
191
|
children: /* @__PURE__ */ C(u, { className: "h-5 w-5 text-green-600 dark:text-green-400" })
|
|
192
192
|
}), /* @__PURE__ */ w("div", {
|
|
193
193
|
className: "min-w-0",
|
|
194
194
|
children: [/* @__PURE__ */ C("p", {
|
|
195
|
-
className: "text-sm font-semibold text-
|
|
195
|
+
className: "text-sm font-semibold text-text-primary",
|
|
196
196
|
children: I("adaptercloud.customerDashboard.orderHistory", "Order History")
|
|
197
197
|
}), /* @__PURE__ */ C("p", {
|
|
198
|
-
className: "text-xs text-
|
|
198
|
+
className: "text-xs text-text-secondary",
|
|
199
199
|
children: I("adaptercloud.customerDashboard.viewPastOrders", "View past orders")
|
|
200
200
|
})]
|
|
201
201
|
})]
|
|
@@ -203,17 +203,17 @@ function E() {
|
|
|
203
203
|
/* @__PURE__ */ w("button", {
|
|
204
204
|
type: "button",
|
|
205
205
|
onClick: () => E("/customer/favorites"),
|
|
206
|
-
className: t("flex items-center gap-3 rounded-lg border border-border bg-
|
|
206
|
+
className: t("flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 shadow-sm transition-colors text-left", "hover:bg-accent hover:shadow-md"),
|
|
207
207
|
children: [/* @__PURE__ */ C("div", {
|
|
208
208
|
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-red-500/10",
|
|
209
209
|
children: /* @__PURE__ */ C(f, { className: "h-5 w-5 text-red-600 dark:text-red-400" })
|
|
210
210
|
}), /* @__PURE__ */ w("div", {
|
|
211
211
|
className: "min-w-0",
|
|
212
212
|
children: [/* @__PURE__ */ C("p", {
|
|
213
|
-
className: "text-sm font-semibold text-
|
|
213
|
+
className: "text-sm font-semibold text-text-primary",
|
|
214
214
|
children: I("adaptercloud.customerDashboard.favorites", "Favorites")
|
|
215
215
|
}), /* @__PURE__ */ C("p", {
|
|
216
|
-
className: "text-xs text-
|
|
216
|
+
className: "text-xs text-text-secondary",
|
|
217
217
|
children: I("adaptercloud.customerDashboard.savedCarts", "Saved carts")
|
|
218
218
|
})]
|
|
219
219
|
})]
|
|
@@ -223,18 +223,18 @@ function E() {
|
|
|
223
223
|
/* @__PURE__ */ w("section", { children: [/* @__PURE__ */ w("div", {
|
|
224
224
|
className: "flex items-center justify-between mb-4",
|
|
225
225
|
children: [/* @__PURE__ */ C("h2", {
|
|
226
|
-
className: "text-lg font-semibold text-
|
|
226
|
+
className: "text-lg font-semibold text-text-primary",
|
|
227
227
|
children: I("adaptercloud.customerDashboard.recentOrders", "Recent Orders")
|
|
228
228
|
}), /* @__PURE__ */ w("button", {
|
|
229
229
|
type: "button",
|
|
230
230
|
onClick: () => E("/customer/orders"),
|
|
231
|
-
className: "flex items-center gap-1 text-sm font-medium text-
|
|
231
|
+
className: "flex items-center gap-1 text-sm font-medium text-text-secondary hover:text-text-primary transition-colors",
|
|
232
232
|
children: [I("adaptercloud.common.viewAll", "View All"), /* @__PURE__ */ C(l, { className: "h-4 w-4" })]
|
|
233
233
|
})]
|
|
234
234
|
}), z.length > 0 ? /* @__PURE__ */ C("div", {
|
|
235
235
|
className: "space-y-3",
|
|
236
236
|
children: z.map((e) => /* @__PURE__ */ C("div", {
|
|
237
|
-
className: "rounded-lg border border-border bg-
|
|
237
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
238
238
|
children: /* @__PURE__ */ w("div", {
|
|
239
239
|
className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3",
|
|
240
240
|
children: [/* @__PURE__ */ w("div", {
|
|
@@ -243,7 +243,7 @@ function E() {
|
|
|
243
243
|
/* @__PURE__ */ w("div", {
|
|
244
244
|
className: "flex flex-wrap items-center gap-2 mb-1",
|
|
245
245
|
children: [/* @__PURE__ */ C("h3", {
|
|
246
|
-
className: "text-sm font-semibold text-
|
|
246
|
+
className: "text-sm font-semibold text-text-primary",
|
|
247
247
|
children: e.cartName
|
|
248
248
|
}), /* @__PURE__ */ C("span", {
|
|
249
249
|
className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize", H(e.status)),
|
|
@@ -251,14 +251,14 @@ function E() {
|
|
|
251
251
|
})]
|
|
252
252
|
}),
|
|
253
253
|
/* @__PURE__ */ C("p", {
|
|
254
|
-
className: "text-xs text-
|
|
254
|
+
className: "text-xs text-text-secondary mb-2 leading-relaxed",
|
|
255
255
|
children: e.items.map((e) => `${e.name} (${e.quantity})`).join(", ")
|
|
256
256
|
}),
|
|
257
257
|
/* @__PURE__ */ w("div", {
|
|
258
|
-
className: "flex flex-wrap items-center gap-3 text-xs text-
|
|
258
|
+
className: "flex flex-wrap items-center gap-3 text-xs text-text-secondary",
|
|
259
259
|
children: [
|
|
260
260
|
/* @__PURE__ */ C("span", {
|
|
261
|
-
className: "font-medium text-
|
|
261
|
+
className: "font-medium text-text-primary",
|
|
262
262
|
children: o(e.total, { minimumFractionDigits: 0 })
|
|
263
263
|
}),
|
|
264
264
|
/* @__PURE__ */ C("span", { children: new Date(e.orderDate).toLocaleDateString() }),
|
|
@@ -272,25 +272,25 @@ function E() {
|
|
|
272
272
|
}), /* @__PURE__ */ C("button", {
|
|
273
273
|
type: "button",
|
|
274
274
|
onClick: () => E(`/customer/orders/${e.id}`),
|
|
275
|
-
className: "rounded-lg border border-border px-3 py-1.5 text-xs font-medium text-
|
|
275
|
+
className: "rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors",
|
|
276
276
|
children: I("adaptercloud.customerDashboard.viewDetails", "View Details")
|
|
277
277
|
})]
|
|
278
278
|
})
|
|
279
279
|
}, e.id))
|
|
280
280
|
}) : /* @__PURE__ */ w("div", {
|
|
281
|
-
className: "rounded-lg border border-border bg-
|
|
282
|
-
children: [/* @__PURE__ */ C(v, { className: "mx-auto h-10 w-10 text-
|
|
283
|
-
className: "mt-3 text-sm text-
|
|
281
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-8 text-center",
|
|
282
|
+
children: [/* @__PURE__ */ C(v, { className: "mx-auto h-10 w-10 text-text-secondary/50" }), /* @__PURE__ */ C("p", {
|
|
283
|
+
className: "mt-3 text-sm text-text-secondary",
|
|
284
284
|
children: I("adaptercloud.customerDashboard.noRecentOrders", "No recent orders")
|
|
285
285
|
})]
|
|
286
286
|
})] }),
|
|
287
287
|
/* @__PURE__ */ w("section", { children: [/* @__PURE__ */ C("h2", {
|
|
288
|
-
className: "text-lg font-semibold text-
|
|
288
|
+
className: "text-lg font-semibold text-text-primary mb-4",
|
|
289
289
|
children: I("adaptercloud.customerDashboard.recommendedForYou", "Recommended for You")
|
|
290
290
|
}), /* @__PURE__ */ C("div", {
|
|
291
291
|
className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
|
|
292
292
|
children: B.map((e) => /* @__PURE__ */ w("div", {
|
|
293
|
-
className: "rounded-lg border border-border bg-
|
|
293
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface overflow-hidden shadow-sm hover:shadow-md transition-shadow",
|
|
294
294
|
children: [/* @__PURE__ */ w("div", {
|
|
295
295
|
className: "relative h-40",
|
|
296
296
|
children: [/* @__PURE__ */ C("img", {
|
|
@@ -312,22 +312,22 @@ function E() {
|
|
|
312
312
|
children: [/* @__PURE__ */ w("div", {
|
|
313
313
|
className: "min-w-0 flex-1",
|
|
314
314
|
children: [/* @__PURE__ */ C("h3", {
|
|
315
|
-
className: "text-sm font-semibold text-
|
|
315
|
+
className: "text-sm font-semibold text-text-primary",
|
|
316
316
|
children: e.name
|
|
317
317
|
}), /* @__PURE__ */ C("p", {
|
|
318
|
-
className: "text-xs text-
|
|
318
|
+
className: "text-xs text-text-secondary",
|
|
319
319
|
children: e.category
|
|
320
320
|
})]
|
|
321
321
|
}), /* @__PURE__ */ w("div", {
|
|
322
322
|
className: "flex items-center gap-1 text-xs",
|
|
323
323
|
children: [/* @__PURE__ */ C(y, { className: "h-3 w-3 fill-yellow-400 text-yellow-400" }), /* @__PURE__ */ C("span", {
|
|
324
|
-
className: "font-medium text-
|
|
324
|
+
className: "font-medium text-text-primary",
|
|
325
325
|
children: e.rating
|
|
326
326
|
})]
|
|
327
327
|
})]
|
|
328
328
|
}),
|
|
329
329
|
/* @__PURE__ */ w("div", {
|
|
330
|
-
className: "flex items-center gap-3 text-xs text-
|
|
330
|
+
className: "flex items-center gap-3 text-xs text-text-secondary mb-3",
|
|
331
331
|
children: [/* @__PURE__ */ w("span", {
|
|
332
332
|
className: "flex items-center gap-1",
|
|
333
333
|
children: [
|
|
@@ -348,7 +348,7 @@ function E() {
|
|
|
348
348
|
type: "button",
|
|
349
349
|
disabled: !e.isOpen,
|
|
350
350
|
onClick: () => e.isOpen && E(`/customer/carts/${e.id}`),
|
|
351
|
-
className: t("w-full rounded-lg py-2 text-sm font-medium transition-opacity", e.isOpen ? "bg-foreground text-background hover:opacity-90" : "bg-
|
|
351
|
+
className: t("w-full rounded-lg py-2 text-sm font-medium transition-opacity", e.isOpen ? "bg-foreground text-background hover:opacity-90" : "bg-bg-sunken text-text-secondary cursor-not-allowed"),
|
|
352
352
|
children: e.isOpen ? I("adaptercloud.customerDashboard.viewMenu", "View Menu") : I("adaptercloud.customerDashboard.currentlyClosed", "Currently Closed")
|
|
353
353
|
})
|
|
354
354
|
]
|
|
@@ -360,9 +360,9 @@ function E() {
|
|
|
360
360
|
className: "space-y-6",
|
|
361
361
|
children: [
|
|
362
362
|
/* @__PURE__ */ w("div", {
|
|
363
|
-
className: "rounded-lg border border-border bg-
|
|
363
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
|
|
364
364
|
children: [/* @__PURE__ */ C("h3", {
|
|
365
|
-
className: "text-base font-semibold text-
|
|
365
|
+
className: "text-base font-semibold text-text-primary mb-4",
|
|
366
366
|
children: I("adaptercloud.customerDashboard.personalizedRecommendations", "Personalized Recommendations")
|
|
367
367
|
}), /* @__PURE__ */ C("div", {
|
|
368
368
|
className: "space-y-3",
|
|
@@ -403,9 +403,9 @@ function E() {
|
|
|
403
403
|
})]
|
|
404
404
|
}),
|
|
405
405
|
/* @__PURE__ */ w("div", {
|
|
406
|
-
className: "rounded-lg border border-border bg-
|
|
406
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
|
|
407
407
|
children: [/* @__PURE__ */ C("h3", {
|
|
408
|
-
className: "text-base font-semibold text-
|
|
408
|
+
className: "text-base font-semibold text-text-primary mb-3",
|
|
409
409
|
children: I("adaptercloud.customerDashboard.quickLinks", "Quick Links")
|
|
410
410
|
}), /* @__PURE__ */ w("div", {
|
|
411
411
|
className: "space-y-2",
|
|
@@ -413,29 +413,29 @@ function E() {
|
|
|
413
413
|
/* @__PURE__ */ w("button", {
|
|
414
414
|
type: "button",
|
|
415
415
|
onClick: () => E("/customer/profile"),
|
|
416
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border px-3 py-2.5 text-sm text-
|
|
417
|
-
children: [/* @__PURE__ */ C(x, { className: "h-4 w-4 text-
|
|
416
|
+
className: "flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left",
|
|
417
|
+
children: [/* @__PURE__ */ C(x, { className: "h-4 w-4 text-text-secondary" }), I("adaptercloud.customerDashboard.profileSettings", "Profile Settings")]
|
|
418
418
|
}),
|
|
419
419
|
/* @__PURE__ */ w("button", {
|
|
420
420
|
type: "button",
|
|
421
421
|
onClick: () => E("/customer/addresses"),
|
|
422
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border px-3 py-2.5 text-sm text-
|
|
423
|
-
children: [/* @__PURE__ */ C(m, { className: "h-4 w-4 text-
|
|
422
|
+
className: "flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left",
|
|
423
|
+
children: [/* @__PURE__ */ C(m, { className: "h-4 w-4 text-text-secondary" }), I("adaptercloud.customerDashboard.savedAddresses", "Saved Addresses")]
|
|
424
424
|
}),
|
|
425
425
|
/* @__PURE__ */ w("button", {
|
|
426
426
|
type: "button",
|
|
427
427
|
onClick: () => E("/customer/payment-methods"),
|
|
428
|
-
className: "flex w-full items-center gap-2 rounded-lg border border-border px-3 py-2.5 text-sm text-
|
|
429
|
-
children: [/* @__PURE__ */ C(d, { className: "h-4 w-4 text-
|
|
428
|
+
className: "flex w-full items-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm text-text-primary hover:bg-accent transition-colors text-left",
|
|
429
|
+
children: [/* @__PURE__ */ C(d, { className: "h-4 w-4 text-text-secondary" }), I("adaptercloud.customerDashboard.paymentMethods", "Payment Methods")]
|
|
430
430
|
})
|
|
431
431
|
]
|
|
432
432
|
})]
|
|
433
433
|
}),
|
|
434
434
|
/* @__PURE__ */ w("div", {
|
|
435
|
-
className: "rounded-lg border border-border bg-
|
|
435
|
+
className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
|
|
436
436
|
children: [
|
|
437
437
|
/* @__PURE__ */ C("h3", {
|
|
438
|
-
className: "text-base font-semibold text-
|
|
438
|
+
className: "text-base font-semibold text-text-primary mb-3",
|
|
439
439
|
children: I("adaptercloud.customerDashboard.currentLocation", "Current Location")
|
|
440
440
|
}),
|
|
441
441
|
/* @__PURE__ */ w("div", {
|
|
@@ -444,15 +444,15 @@ function E() {
|
|
|
444
444
|
className: "flex-1 min-w-0",
|
|
445
445
|
children: [
|
|
446
446
|
/* @__PURE__ */ C("p", {
|
|
447
|
-
className: "text-sm font-medium text-
|
|
447
|
+
className: "text-sm font-medium text-text-primary",
|
|
448
448
|
children: "Koramangala"
|
|
449
449
|
}),
|
|
450
450
|
/* @__PURE__ */ C("p", {
|
|
451
|
-
className: "text-xs text-
|
|
451
|
+
className: "text-xs text-text-secondary",
|
|
452
452
|
children: "80 Feet Road, 6th Block"
|
|
453
453
|
}),
|
|
454
454
|
/* @__PURE__ */ C("p", {
|
|
455
|
-
className: "text-xs text-
|
|
455
|
+
className: "text-xs text-text-secondary",
|
|
456
456
|
children: "Bangalore, Karnataka"
|
|
457
457
|
})
|
|
458
458
|
]
|
|
@@ -461,7 +461,7 @@ function E() {
|
|
|
461
461
|
/* @__PURE__ */ C("button", {
|
|
462
462
|
type: "button",
|
|
463
463
|
onClick: () => E("/customer/addresses"),
|
|
464
|
-
className: "mt-3 w-full rounded-lg border border-border px-3 py-2 text-xs font-medium text-
|
|
464
|
+
className: "mt-3 w-full rounded-lg border border-border-subtle px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent transition-colors",
|
|
465
465
|
children: I("adaptercloud.customerDashboard.updateLocation", "Update Location")
|
|
466
466
|
})
|
|
467
467
|
]
|
|
@@ -470,11 +470,11 @@ function E() {
|
|
|
470
470
|
className: "rounded-lg bg-gradient-to-r from-blue-500/10 to-purple-500/10 border border-blue-500/20 p-5",
|
|
471
471
|
children: [
|
|
472
472
|
/* @__PURE__ */ C("h3", {
|
|
473
|
-
className: "text-base font-semibold text-
|
|
473
|
+
className: "text-base font-semibold text-text-primary mb-2",
|
|
474
474
|
children: I("adaptercloud.customerDashboard.specialOffers", "Special Offers")
|
|
475
475
|
}),
|
|
476
476
|
/* @__PURE__ */ C("p", {
|
|
477
|
-
className: "text-xs text-
|
|
477
|
+
className: "text-xs text-text-secondary mb-3 leading-relaxed",
|
|
478
478
|
children: I("adaptercloud.customerDashboard.specialOffersDescription", "Get 25% off on your next order from featured carts")
|
|
479
479
|
}),
|
|
480
480
|
/* @__PURE__ */ C("button", {
|