@burdenoff/microfe-adaptercloud 2026.614.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.
Files changed (132) hide show
  1. package/README.md +12 -0
  2. package/dist/adaptercloud/AdapterCloudRoot.js +177 -0
  3. package/dist/adaptercloud/AdapterCloudRoot.js.map +1 -0
  4. package/dist/adaptercloud/AdapterCloudRoutes.js +215 -0
  5. package/dist/adaptercloud/AdapterCloudRoutes.js.map +1 -0
  6. package/dist/adaptercloud/components/EmptyState.js +28 -0
  7. package/dist/adaptercloud/components/EmptyState.js.map +1 -0
  8. package/dist/adaptercloud/components/InvestmentCard.js +96 -0
  9. package/dist/adaptercloud/components/InvestmentCard.js.map +1 -0
  10. package/dist/adaptercloud/components/MetricsCard.js +46 -0
  11. package/dist/adaptercloud/components/MetricsCard.js.map +1 -0
  12. package/dist/adaptercloud/components/PageLayout.js +26 -0
  13. package/dist/adaptercloud/components/PageLayout.js.map +1 -0
  14. package/dist/adaptercloud/components/RatingDisplay.js +35 -0
  15. package/dist/adaptercloud/components/RatingDisplay.js.map +1 -0
  16. package/dist/adaptercloud/components/StatusBadge.js +45 -0
  17. package/dist/adaptercloud/components/StatusBadge.js.map +1 -0
  18. package/dist/adaptercloud/context/AdapterCloudContext.js +93 -0
  19. package/dist/adaptercloud/context/AdapterCloudContext.js.map +1 -0
  20. package/dist/adaptercloud/context/index.js +1 -0
  21. package/dist/adaptercloud/hooks/useAdapterCloudApi.js +223 -0
  22. package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -0
  23. package/dist/adaptercloud/index.js +7 -0
  24. package/dist/adaptercloud/mocks/data.js +1517 -0
  25. package/dist/adaptercloud/mocks/data.js.map +1 -0
  26. package/dist/adaptercloud/mocks/users.js +34 -0
  27. package/dist/adaptercloud/mocks/users.js.map +1 -0
  28. package/dist/adaptercloud/pages/HomePage.js +921 -0
  29. package/dist/adaptercloud/pages/HomePage.js.map +1 -0
  30. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +645 -0
  31. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +1 -0
  32. package/dist/adaptercloud/pages/admin/AdminDashboard.js +639 -0
  33. package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +1 -0
  34. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +421 -0
  35. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +1 -0
  36. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +660 -0
  37. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +1 -0
  38. package/dist/adaptercloud/pages/admin/AdminProfilePage.js +259 -0
  39. package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +1 -0
  40. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +649 -0
  41. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +1 -0
  42. package/dist/adaptercloud/pages/admin/CartManagementPage.js +869 -0
  43. package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +1 -0
  44. package/dist/adaptercloud/pages/admin/UserManagementPage.js +893 -0
  45. package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +1 -0
  46. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +834 -0
  47. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +1 -0
  48. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +700 -0
  49. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +1 -0
  50. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +760 -0
  51. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +1 -0
  52. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +886 -0
  53. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +1 -0
  54. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +631 -0
  55. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +1 -0
  56. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +913 -0
  57. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +1 -0
  58. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +881 -0
  59. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +1 -0
  60. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +833 -0
  61. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +1 -0
  62. package/dist/adaptercloud/pages/common/HelpSupportPage.js +1325 -0
  63. package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +1 -0
  64. package/dist/adaptercloud/pages/common/NotificationCenterPage.js +665 -0
  65. package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +1 -0
  66. package/dist/adaptercloud/pages/common/SettingsPage.js +964 -0
  67. package/dist/adaptercloud/pages/common/SettingsPage.js.map +1 -0
  68. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +593 -0
  69. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +1 -0
  70. package/dist/adaptercloud/pages/customer/CartDetailPage.js +620 -0
  71. package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +1 -0
  72. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +547 -0
  73. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +1 -0
  74. package/dist/adaptercloud/pages/customer/CheckoutPage.js +532 -0
  75. package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +1 -0
  76. package/dist/adaptercloud/pages/customer/CustomerDashboard.js +496 -0
  77. package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +1 -0
  78. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +621 -0
  79. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +1 -0
  80. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +623 -0
  81. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +1 -0
  82. package/dist/adaptercloud/pages/customer/FavoritesPage.js +477 -0
  83. package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +1 -0
  84. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +438 -0
  85. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +1 -0
  86. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +388 -0
  87. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +1 -0
  88. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +488 -0
  89. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +1 -0
  90. package/dist/adaptercloud/pages/customer/ReviewsPage.js +606 -0
  91. package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +1 -0
  92. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +443 -0
  93. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +1 -0
  94. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +849 -0
  95. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +1 -0
  96. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +939 -0
  97. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +1 -0
  98. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +681 -0
  99. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +1 -0
  100. package/dist/adaptercloud/pages/investor/InvestorDashboard.js +419 -0
  101. package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +1 -0
  102. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +399 -0
  103. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +1 -0
  104. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +569 -0
  105. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +1 -0
  106. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +1065 -0
  107. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +1 -0
  108. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +496 -0
  109. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +1 -0
  110. package/dist/adaptercloud/pages/worker/WorkerDashboard.js +634 -0
  111. package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +1 -0
  112. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +675 -0
  113. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +1 -0
  114. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +687 -0
  115. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +1 -0
  116. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +578 -0
  117. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +1 -0
  118. package/dist/adaptercloud/store/adaptercloudStore.js +38 -0
  119. package/dist/adaptercloud/store/adaptercloudStore.js.map +1 -0
  120. package/dist/adaptercloud/store/index.js +1 -0
  121. package/dist/adaptercloud/utils/cn.js +10 -0
  122. package/dist/adaptercloud/utils/cn.js.map +1 -0
  123. package/dist/adaptercloud/utils/formatters.js +51 -0
  124. package/dist/adaptercloud/utils/formatters.js.map +1 -0
  125. package/dist/adaptercloud/utils/navigation.js +9 -0
  126. package/dist/adaptercloud/utils/navigation.js.map +1 -0
  127. package/dist/index.js +7 -0
  128. package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +18 -0
  129. package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js.map +1 -0
  130. package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js +1674 -0
  131. package/dist/node_modules/.bun/tailwind-merge@3.5.0/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  132. package/package.json +106 -0
@@ -0,0 +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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"}
@@ -0,0 +1,496 @@
1
+ import { useAdapterCloud as e } from "../../context/AdapterCloudContext.js";
2
+ import { cn as t } from "../../utils/cn.js";
3
+ import { PageLayout as n } from "../../components/PageLayout.js";
4
+ import { useDashboardStats as r, useOrders as i, useProviders as a } from "../../hooks/useAdapterCloudApi.js";
5
+ import { formatCurrency as o } from "../../utils/formatters.js";
6
+ import { useCallback as s } from "react";
7
+ import { useI18n as c } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
8
+ import { ArrowRight as l, Clock as u, CreditCard as d, Heart as f, Lightbulb as p, MapPin as m, Navigation as h, Package as g, Search as _, ShoppingBag as v, Star as y, TrendingUp as b, User as x, Zap as S } from "lucide-react";
9
+ import { jsx as C, jsxs as w } from "react/jsx-runtime";
10
+ //#region src/adaptercloud/pages/customer/CustomerDashboard.tsx
11
+ function T() {
12
+ let e = (/* @__PURE__ */ new Date()).getHours();
13
+ return e < 12 ? "Good morning" : e < 17 ? "Good afternoon" : "Good evening";
14
+ }
15
+ function E() {
16
+ let { navigateTo: E, currentUser: D } = e(), { t: O } = c(), { data: k = [], isLoading: A } = i({ customerId: D?.id }), { data: j = [], isLoading: M } = a(), { data: N, isLoading: P } = r(), F = A || M || P, I = s((e, t) => {
17
+ let n = O(e);
18
+ return n === e ? t : n;
19
+ }, [O]), L = D?.firstName ?? D?.name ?? "Customer", R = [
20
+ {
21
+ id: "1",
22
+ type: "suggestion",
23
+ title: "New Cart Nearby",
24
+ description: "Healthy Bowls cart just opened 0.2km from your location. They specialize in acai bowls and smoothies.",
25
+ confidence: 92,
26
+ action: "Explore Cart"
27
+ },
28
+ {
29
+ id: "2",
30
+ type: "opportunity",
31
+ title: "Special Offer Available",
32
+ description: "Your favorite Dosa Express is offering 20% off on orders above ₹300. Valid until tonight.",
33
+ confidence: 95,
34
+ action: "Order Now"
35
+ },
36
+ {
37
+ id: "3",
38
+ type: "trend",
39
+ title: "Peak Hours Alert",
40
+ description: "Order now to avoid lunch rush. Delivery times typically increase by 15-20 minutes after 12 PM.",
41
+ confidence: 88,
42
+ action: "View Carts"
43
+ }
44
+ ], z = k.slice(0, 3), B = j.slice(0, 3), V = {
45
+ totalOrders: k.length,
46
+ totalSpent: k.reduce((e, t) => e + t.total, 0),
47
+ favoriteCount: 6,
48
+ avgRating: 4.5
49
+ }, H = (e) => {
50
+ switch (e) {
51
+ case "delivered": return "bg-green-500/20 text-green-600 dark:text-green-400";
52
+ case "preparing": return "bg-yellow-500/20 text-yellow-600 dark:text-yellow-400";
53
+ case "out_for_delivery": return "bg-blue-500/20 text-blue-600 dark:text-blue-400";
54
+ case "confirmed": return "bg-blue-500/20 text-blue-600 dark:text-blue-400";
55
+ case "cancelled": return "bg-red-500/20 text-red-600 dark:text-red-400";
56
+ default: return "bg-muted text-muted-foreground";
57
+ }
58
+ }, U = (e) => {
59
+ switch (e) {
60
+ case "suggestion": return /* @__PURE__ */ C(p, { className: "h-4 w-4" });
61
+ case "opportunity": return /* @__PURE__ */ C(b, { className: "h-4 w-4" });
62
+ case "trend": return /* @__PURE__ */ C(S, { className: "h-4 w-4" });
63
+ default: return /* @__PURE__ */ C(p, { className: "h-4 w-4" });
64
+ }
65
+ }, W = (e) => {
66
+ switch (e) {
67
+ case "suggestion": return "bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/20";
68
+ case "opportunity": return "bg-green-500/10 text-green-600 dark:text-green-400 border-green-500/20";
69
+ case "trend": return "bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/20";
70
+ default: return "bg-muted text-muted-foreground border-border";
71
+ }
72
+ };
73
+ return F ? /* @__PURE__ */ C(n, {
74
+ title: I("adaptercloud.customerDashboard.title", "Dashboard"),
75
+ children: /* @__PURE__ */ C("div", {
76
+ className: "flex items-center justify-center py-20",
77
+ children: /* @__PURE__ */ w("div", {
78
+ className: "text-center",
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-muted-foreground",
81
+ children: I("adaptercloud.customerDashboard.loading", "Loading your dashboard...")
82
+ })]
83
+ })
84
+ })
85
+ }) : /* @__PURE__ */ w(n, {
86
+ title: I("adaptercloud.customerDashboard.welcomeBack", "Welcome Back!"),
87
+ description: `${T()}, ${L}`,
88
+ children: [V && /* @__PURE__ */ w("div", {
89
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4",
90
+ children: [
91
+ /* @__PURE__ */ C("div", {
92
+ className: "rounded-lg border border-border bg-card p-4",
93
+ children: /* @__PURE__ */ w("div", {
94
+ className: "flex items-center gap-3",
95
+ children: [/* @__PURE__ */ C("div", {
96
+ className: "flex h-10 w-10 items-center justify-center rounded-lg bg-muted",
97
+ children: /* @__PURE__ */ C(g, { className: "h-5 w-5 text-muted-foreground" })
98
+ }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
99
+ className: "text-2xl font-bold text-foreground",
100
+ children: V.totalOrders
101
+ }), /* @__PURE__ */ C("p", {
102
+ className: "text-xs text-muted-foreground",
103
+ children: I("adaptercloud.customerDashboard.totalOrders", "Total Orders")
104
+ })] })]
105
+ })
106
+ }),
107
+ /* @__PURE__ */ C("div", {
108
+ className: "rounded-lg border border-border bg-card p-4",
109
+ children: /* @__PURE__ */ w("div", {
110
+ className: "flex items-center gap-3",
111
+ children: [/* @__PURE__ */ C("div", {
112
+ className: "flex h-10 w-10 items-center justify-center rounded-lg bg-muted",
113
+ children: /* @__PURE__ */ C(d, { className: "h-5 w-5 text-muted-foreground" })
114
+ }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
115
+ className: "text-2xl font-bold text-foreground",
116
+ children: o(V.totalSpent, { minimumFractionDigits: 0 })
117
+ }), /* @__PURE__ */ C("p", {
118
+ className: "text-xs text-muted-foreground",
119
+ children: I("adaptercloud.customerDashboard.totalSpent", "Total Spent")
120
+ })] })]
121
+ })
122
+ }),
123
+ /* @__PURE__ */ C("div", {
124
+ className: "rounded-lg border border-border bg-card p-4",
125
+ children: /* @__PURE__ */ w("div", {
126
+ className: "flex items-center gap-3",
127
+ children: [/* @__PURE__ */ C("div", {
128
+ className: "flex h-10 w-10 items-center justify-center rounded-lg bg-muted",
129
+ children: /* @__PURE__ */ C(f, { className: "h-5 w-5 text-muted-foreground" })
130
+ }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
131
+ className: "text-2xl font-bold text-foreground",
132
+ children: V.favoriteCount
133
+ }), /* @__PURE__ */ C("p", {
134
+ className: "text-xs text-muted-foreground",
135
+ children: I("adaptercloud.customerDashboard.favoriteCarts", "Favorite Carts")
136
+ })] })]
137
+ })
138
+ }),
139
+ /* @__PURE__ */ C("div", {
140
+ className: "rounded-lg border border-border bg-card p-4",
141
+ children: /* @__PURE__ */ w("div", {
142
+ className: "flex items-center gap-3",
143
+ children: [/* @__PURE__ */ C("div", {
144
+ className: "flex h-10 w-10 items-center justify-center rounded-lg bg-muted",
145
+ children: /* @__PURE__ */ C(y, { className: "h-5 w-5 text-muted-foreground" })
146
+ }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("p", {
147
+ className: "text-2xl font-bold text-foreground",
148
+ children: V.avgRating.toFixed(1)
149
+ }), /* @__PURE__ */ C("p", {
150
+ className: "text-xs text-muted-foreground",
151
+ children: I("adaptercloud.customerDashboard.avgRatingGiven", "Avg Rating Given")
152
+ })] })]
153
+ })
154
+ })
155
+ ]
156
+ }), /* @__PURE__ */ w("div", {
157
+ className: "mt-8 grid grid-cols-1 gap-8 lg:grid-cols-3",
158
+ children: [/* @__PURE__ */ w("div", {
159
+ className: "lg:col-span-2 space-y-8",
160
+ children: [
161
+ /* @__PURE__ */ w("section", { children: [/* @__PURE__ */ C("h2", {
162
+ className: "text-lg font-semibold text-foreground mb-4",
163
+ children: I("adaptercloud.customerDashboard.quickActions", "Quick Actions")
164
+ }), /* @__PURE__ */ w("div", {
165
+ className: "grid grid-cols-1 gap-3 sm:grid-cols-3",
166
+ children: [
167
+ /* @__PURE__ */ w("button", {
168
+ type: "button",
169
+ onClick: () => E("/customer/carts"),
170
+ className: t("flex items-center gap-3 rounded-lg border border-border bg-card p-4 shadow-sm transition-colors text-left", "hover:bg-accent hover:shadow-md"),
171
+ children: [/* @__PURE__ */ C("div", {
172
+ className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-blue-500/10",
173
+ children: /* @__PURE__ */ C(_, { className: "h-5 w-5 text-blue-600 dark:text-blue-400" })
174
+ }), /* @__PURE__ */ w("div", {
175
+ className: "min-w-0",
176
+ children: [/* @__PURE__ */ C("p", {
177
+ className: "text-sm font-semibold text-foreground",
178
+ children: I("adaptercloud.customerDashboard.discoverCarts", "Discover Carts")
179
+ }), /* @__PURE__ */ C("p", {
180
+ className: "text-xs text-muted-foreground",
181
+ children: I("adaptercloud.customerDashboard.findNearbyCarts", "Find nearby carts")
182
+ })]
183
+ })]
184
+ }),
185
+ /* @__PURE__ */ w("button", {
186
+ type: "button",
187
+ onClick: () => E("/customer/orders"),
188
+ className: t("flex items-center gap-3 rounded-lg border border-border bg-card p-4 shadow-sm transition-colors text-left", "hover:bg-accent hover:shadow-md"),
189
+ children: [/* @__PURE__ */ C("div", {
190
+ className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-green-500/10",
191
+ children: /* @__PURE__ */ C(u, { className: "h-5 w-5 text-green-600 dark:text-green-400" })
192
+ }), /* @__PURE__ */ w("div", {
193
+ className: "min-w-0",
194
+ children: [/* @__PURE__ */ C("p", {
195
+ className: "text-sm font-semibold text-foreground",
196
+ children: I("adaptercloud.customerDashboard.orderHistory", "Order History")
197
+ }), /* @__PURE__ */ C("p", {
198
+ className: "text-xs text-muted-foreground",
199
+ children: I("adaptercloud.customerDashboard.viewPastOrders", "View past orders")
200
+ })]
201
+ })]
202
+ }),
203
+ /* @__PURE__ */ w("button", {
204
+ type: "button",
205
+ onClick: () => E("/customer/favorites"),
206
+ className: t("flex items-center gap-3 rounded-lg border border-border bg-card p-4 shadow-sm transition-colors text-left", "hover:bg-accent hover:shadow-md"),
207
+ children: [/* @__PURE__ */ C("div", {
208
+ className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-red-500/10",
209
+ children: /* @__PURE__ */ C(f, { className: "h-5 w-5 text-red-600 dark:text-red-400" })
210
+ }), /* @__PURE__ */ w("div", {
211
+ className: "min-w-0",
212
+ children: [/* @__PURE__ */ C("p", {
213
+ className: "text-sm font-semibold text-foreground",
214
+ children: I("adaptercloud.customerDashboard.favorites", "Favorites")
215
+ }), /* @__PURE__ */ C("p", {
216
+ className: "text-xs text-muted-foreground",
217
+ children: I("adaptercloud.customerDashboard.savedCarts", "Saved carts")
218
+ })]
219
+ })]
220
+ })
221
+ ]
222
+ })] }),
223
+ /* @__PURE__ */ w("section", { children: [/* @__PURE__ */ w("div", {
224
+ className: "flex items-center justify-between mb-4",
225
+ children: [/* @__PURE__ */ C("h2", {
226
+ className: "text-lg font-semibold text-foreground",
227
+ children: I("adaptercloud.customerDashboard.recentOrders", "Recent Orders")
228
+ }), /* @__PURE__ */ w("button", {
229
+ type: "button",
230
+ onClick: () => E("/customer/orders"),
231
+ className: "flex items-center gap-1 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors",
232
+ children: [I("adaptercloud.common.viewAll", "View All"), /* @__PURE__ */ C(l, { className: "h-4 w-4" })]
233
+ })]
234
+ }), z.length > 0 ? /* @__PURE__ */ C("div", {
235
+ className: "space-y-3",
236
+ children: z.map((e) => /* @__PURE__ */ C("div", {
237
+ className: "rounded-lg border border-border bg-card p-4",
238
+ children: /* @__PURE__ */ w("div", {
239
+ className: "flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3",
240
+ children: [/* @__PURE__ */ w("div", {
241
+ className: "flex-1 min-w-0",
242
+ children: [
243
+ /* @__PURE__ */ w("div", {
244
+ className: "flex flex-wrap items-center gap-2 mb-1",
245
+ children: [/* @__PURE__ */ C("h3", {
246
+ className: "text-sm font-semibold text-foreground",
247
+ children: e.cartName
248
+ }), /* @__PURE__ */ C("span", {
249
+ className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium capitalize", H(e.status)),
250
+ children: e.status.replace(/_/g, " ")
251
+ })]
252
+ }),
253
+ /* @__PURE__ */ C("p", {
254
+ className: "text-xs text-muted-foreground mb-2 leading-relaxed",
255
+ children: e.items.map((e) => `${e.name} (${e.quantity})`).join(", ")
256
+ }),
257
+ /* @__PURE__ */ w("div", {
258
+ className: "flex flex-wrap items-center gap-3 text-xs text-muted-foreground",
259
+ children: [
260
+ /* @__PURE__ */ C("span", {
261
+ className: "font-medium text-foreground",
262
+ children: o(e.total, { minimumFractionDigits: 0 })
263
+ }),
264
+ /* @__PURE__ */ C("span", { children: new Date(e.orderDate).toLocaleDateString() }),
265
+ e.rating && /* @__PURE__ */ w("span", {
266
+ className: "flex items-center gap-1",
267
+ children: [/* @__PURE__ */ C(y, { className: "h-3 w-3 fill-yellow-400 text-yellow-400" }), e.rating]
268
+ })
269
+ ]
270
+ })
271
+ ]
272
+ }), /* @__PURE__ */ C("button", {
273
+ type: "button",
274
+ onClick: () => E(`/customer/orders/${e.id}`),
275
+ className: "rounded-lg border border-border px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent transition-colors",
276
+ children: I("adaptercloud.customerDashboard.viewDetails", "View Details")
277
+ })]
278
+ })
279
+ }, e.id))
280
+ }) : /* @__PURE__ */ w("div", {
281
+ className: "rounded-lg border border-border bg-card p-8 text-center",
282
+ children: [/* @__PURE__ */ C(v, { className: "mx-auto h-10 w-10 text-muted-foreground/50" }), /* @__PURE__ */ C("p", {
283
+ className: "mt-3 text-sm text-muted-foreground",
284
+ children: I("adaptercloud.customerDashboard.noRecentOrders", "No recent orders")
285
+ })]
286
+ })] }),
287
+ /* @__PURE__ */ w("section", { children: [/* @__PURE__ */ C("h2", {
288
+ className: "text-lg font-semibold text-foreground mb-4",
289
+ children: I("adaptercloud.customerDashboard.recommendedForYou", "Recommended for You")
290
+ }), /* @__PURE__ */ C("div", {
291
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
292
+ children: B.map((e) => /* @__PURE__ */ w("div", {
293
+ className: "rounded-lg border border-border bg-card overflow-hidden shadow-sm hover:shadow-md transition-shadow",
294
+ children: [/* @__PURE__ */ w("div", {
295
+ className: "relative h-40",
296
+ children: [/* @__PURE__ */ C("img", {
297
+ src: e.image,
298
+ alt: e.name,
299
+ className: "h-full w-full object-cover"
300
+ }), /* @__PURE__ */ C("div", {
301
+ className: "absolute top-2 right-2",
302
+ children: /* @__PURE__ */ C("span", {
303
+ className: t("inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium", e.isOpen ? "bg-green-500/20 text-green-600 dark:text-green-400" : "bg-red-500/20 text-red-600 dark:text-red-400"),
304
+ children: e.isOpen ? I("adaptercloud.customerDashboard.open", "Open") : I("adaptercloud.customerDashboard.closed", "Closed")
305
+ })
306
+ })]
307
+ }), /* @__PURE__ */ w("div", {
308
+ className: "p-4",
309
+ children: [
310
+ /* @__PURE__ */ w("div", {
311
+ className: "flex items-start justify-between mb-2",
312
+ children: [/* @__PURE__ */ w("div", {
313
+ className: "min-w-0 flex-1",
314
+ children: [/* @__PURE__ */ C("h3", {
315
+ className: "text-sm font-semibold text-foreground",
316
+ children: e.name
317
+ }), /* @__PURE__ */ C("p", {
318
+ className: "text-xs text-muted-foreground",
319
+ children: e.category
320
+ })]
321
+ }), /* @__PURE__ */ w("div", {
322
+ className: "flex items-center gap-1 text-xs",
323
+ children: [/* @__PURE__ */ C(y, { className: "h-3 w-3 fill-yellow-400 text-yellow-400" }), /* @__PURE__ */ C("span", {
324
+ className: "font-medium text-foreground",
325
+ children: e.rating
326
+ })]
327
+ })]
328
+ }),
329
+ /* @__PURE__ */ w("div", {
330
+ className: "flex items-center gap-3 text-xs text-muted-foreground mb-3",
331
+ children: [/* @__PURE__ */ w("span", {
332
+ className: "flex items-center gap-1",
333
+ children: [
334
+ /* @__PURE__ */ C(m, { className: "h-3 w-3" }),
335
+ e.distance,
336
+ "km away"
337
+ ]
338
+ }), /* @__PURE__ */ w("span", {
339
+ className: "flex items-center gap-1",
340
+ children: [
341
+ /* @__PURE__ */ C(u, { className: "h-3 w-3" }),
342
+ e.estimatedTime,
343
+ " mins"
344
+ ]
345
+ })]
346
+ }),
347
+ /* @__PURE__ */ C("button", {
348
+ type: "button",
349
+ disabled: !e.isOpen,
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-muted text-muted-foreground cursor-not-allowed"),
352
+ children: e.isOpen ? I("adaptercloud.customerDashboard.viewMenu", "View Menu") : I("adaptercloud.customerDashboard.currentlyClosed", "Currently Closed")
353
+ })
354
+ ]
355
+ })]
356
+ }, e.id))
357
+ })] })
358
+ ]
359
+ }), /* @__PURE__ */ w("div", {
360
+ className: "space-y-6",
361
+ children: [
362
+ /* @__PURE__ */ w("div", {
363
+ className: "rounded-lg border border-border bg-card p-5",
364
+ children: [/* @__PURE__ */ C("h3", {
365
+ className: "text-base font-semibold text-foreground mb-4",
366
+ children: I("adaptercloud.customerDashboard.personalizedRecommendations", "Personalized Recommendations")
367
+ }), /* @__PURE__ */ C("div", {
368
+ className: "space-y-3",
369
+ children: R.map((e) => /* @__PURE__ */ C("div", {
370
+ className: t("rounded-lg border p-3", W(e.type)),
371
+ children: /* @__PURE__ */ w("div", {
372
+ className: "flex items-start gap-2",
373
+ children: [/* @__PURE__ */ C("div", {
374
+ className: "mt-0.5 shrink-0",
375
+ children: U(e.type)
376
+ }), /* @__PURE__ */ w("div", {
377
+ className: "flex-1 min-w-0",
378
+ children: [
379
+ /* @__PURE__ */ w("div", {
380
+ className: "flex items-center justify-between gap-2",
381
+ children: [/* @__PURE__ */ C("p", {
382
+ className: "text-xs font-semibold",
383
+ children: e.title
384
+ }), /* @__PURE__ */ w("span", {
385
+ className: "text-[10px] opacity-70",
386
+ children: [e.confidence, "%"]
387
+ })]
388
+ }),
389
+ /* @__PURE__ */ C("p", {
390
+ className: "mt-1 text-xs opacity-80 leading-relaxed",
391
+ children: e.description
392
+ }),
393
+ /* @__PURE__ */ C("button", {
394
+ type: "button",
395
+ onClick: () => E("/customer/carts"),
396
+ className: "mt-2 text-[10px] font-semibold underline underline-offset-2",
397
+ children: e.action
398
+ })
399
+ ]
400
+ })]
401
+ })
402
+ }, e.id))
403
+ })]
404
+ }),
405
+ /* @__PURE__ */ w("div", {
406
+ className: "rounded-lg border border-border bg-card p-5",
407
+ children: [/* @__PURE__ */ C("h3", {
408
+ className: "text-base font-semibold text-foreground mb-3",
409
+ children: I("adaptercloud.customerDashboard.quickLinks", "Quick Links")
410
+ }), /* @__PURE__ */ w("div", {
411
+ className: "space-y-2",
412
+ children: [
413
+ /* @__PURE__ */ w("button", {
414
+ type: "button",
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-foreground hover:bg-accent transition-colors text-left",
417
+ children: [/* @__PURE__ */ C(x, { className: "h-4 w-4 text-muted-foreground" }), I("adaptercloud.customerDashboard.profileSettings", "Profile Settings")]
418
+ }),
419
+ /* @__PURE__ */ w("button", {
420
+ type: "button",
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-foreground hover:bg-accent transition-colors text-left",
423
+ children: [/* @__PURE__ */ C(m, { className: "h-4 w-4 text-muted-foreground" }), I("adaptercloud.customerDashboard.savedAddresses", "Saved Addresses")]
424
+ }),
425
+ /* @__PURE__ */ w("button", {
426
+ type: "button",
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-foreground hover:bg-accent transition-colors text-left",
429
+ children: [/* @__PURE__ */ C(d, { className: "h-4 w-4 text-muted-foreground" }), I("adaptercloud.customerDashboard.paymentMethods", "Payment Methods")]
430
+ })
431
+ ]
432
+ })]
433
+ }),
434
+ /* @__PURE__ */ w("div", {
435
+ className: "rounded-lg border border-border bg-card p-5",
436
+ children: [
437
+ /* @__PURE__ */ C("h3", {
438
+ className: "text-base font-semibold text-foreground mb-3",
439
+ children: I("adaptercloud.customerDashboard.currentLocation", "Current Location")
440
+ }),
441
+ /* @__PURE__ */ w("div", {
442
+ className: "flex items-start gap-3",
443
+ children: [/* @__PURE__ */ C(h, { className: "h-4 w-4 text-blue-500 mt-0.5 shrink-0" }), /* @__PURE__ */ w("div", {
444
+ className: "flex-1 min-w-0",
445
+ children: [
446
+ /* @__PURE__ */ C("p", {
447
+ className: "text-sm font-medium text-foreground",
448
+ children: "Koramangala"
449
+ }),
450
+ /* @__PURE__ */ C("p", {
451
+ className: "text-xs text-muted-foreground",
452
+ children: "80 Feet Road, 6th Block"
453
+ }),
454
+ /* @__PURE__ */ C("p", {
455
+ className: "text-xs text-muted-foreground",
456
+ children: "Bangalore, Karnataka"
457
+ })
458
+ ]
459
+ })]
460
+ }),
461
+ /* @__PURE__ */ C("button", {
462
+ type: "button",
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-foreground hover:bg-accent transition-colors",
465
+ children: I("adaptercloud.customerDashboard.updateLocation", "Update Location")
466
+ })
467
+ ]
468
+ }),
469
+ /* @__PURE__ */ w("div", {
470
+ className: "rounded-lg bg-gradient-to-r from-blue-500/10 to-purple-500/10 border border-blue-500/20 p-5",
471
+ children: [
472
+ /* @__PURE__ */ C("h3", {
473
+ className: "text-base font-semibold text-foreground mb-2",
474
+ children: I("adaptercloud.customerDashboard.specialOffers", "Special Offers")
475
+ }),
476
+ /* @__PURE__ */ C("p", {
477
+ className: "text-xs text-muted-foreground mb-3 leading-relaxed",
478
+ children: I("adaptercloud.customerDashboard.specialOffersDescription", "Get 25% off on your next order from featured carts")
479
+ }),
480
+ /* @__PURE__ */ C("button", {
481
+ type: "button",
482
+ onClick: () => E("/customer/carts"),
483
+ className: "w-full rounded-lg bg-foreground px-3 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity",
484
+ children: I("adaptercloud.customerDashboard.viewOffers", "View Offers")
485
+ })
486
+ ]
487
+ })
488
+ ]
489
+ })]
490
+ })]
491
+ });
492
+ }
493
+ //#endregion
494
+ export { E as CustomerDashboard };
495
+
496
+ //# sourceMappingURL=CustomerDashboard.js.map