@burdenoff/microfe-coolandlovely 2026.625.1 → 2026.625.2

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 (91) hide show
  1. package/dist/coolandlovely/pages/HomePage.js +263 -258
  2. package/dist/coolandlovely/pages/HomePage.js.map +1 -1
  3. package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js +67 -61
  4. package/dist/coolandlovely/pages/admin/AdminAnalyticsPage.js.map +1 -1
  5. package/dist/coolandlovely/pages/admin/AdminDashboard.js +79 -45
  6. package/dist/coolandlovely/pages/admin/AdminDashboard.js.map +1 -1
  7. package/dist/coolandlovely/pages/admin/AdminFinancialPage.js +39 -33
  8. package/dist/coolandlovely/pages/admin/AdminFinancialPage.js.map +1 -1
  9. package/dist/coolandlovely/pages/admin/AdminOrdersPage.js +227 -222
  10. package/dist/coolandlovely/pages/admin/AdminOrdersPage.js.map +1 -1
  11. package/dist/coolandlovely/pages/admin/AdminProfilePage.js +65 -60
  12. package/dist/coolandlovely/pages/admin/AdminProfilePage.js.map +1 -1
  13. package/dist/coolandlovely/pages/admin/AdminSettingsPage.js +235 -230
  14. package/dist/coolandlovely/pages/admin/AdminSettingsPage.js.map +1 -1
  15. package/dist/coolandlovely/pages/admin/CartManagementPage.js +268 -263
  16. package/dist/coolandlovely/pages/admin/CartManagementPage.js.map +1 -1
  17. package/dist/coolandlovely/pages/admin/UserManagementPage.js +268 -263
  18. package/dist/coolandlovely/pages/admin/UserManagementPage.js.map +1 -1
  19. package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js +92 -84
  20. package/dist/coolandlovely/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  21. package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js +257 -252
  22. package/dist/coolandlovely/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  23. package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js +587 -548
  24. package/dist/coolandlovely/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  25. package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js +171 -166
  26. package/dist/coolandlovely/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  27. package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js +219 -211
  28. package/dist/coolandlovely/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  29. package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js +671 -670
  30. package/dist/coolandlovely/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  31. package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js +515 -514
  32. package/dist/coolandlovely/pages/cart-owner/OrderManagementPage.js.map +1 -1
  33. package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js +244 -246
  34. package/dist/coolandlovely/pages/cart-owner/StaffManagementPage.js.map +1 -1
  35. package/dist/coolandlovely/pages/common/HelpSupportPage.js +96 -96
  36. package/dist/coolandlovely/pages/common/HelpSupportPage.js.map +1 -1
  37. package/dist/coolandlovely/pages/common/NotificationCenterPage.js +50 -44
  38. package/dist/coolandlovely/pages/common/NotificationCenterPage.js.map +1 -1
  39. package/dist/coolandlovely/pages/common/SettingsPage.js +745 -736
  40. package/dist/coolandlovely/pages/common/SettingsPage.js.map +1 -1
  41. package/dist/coolandlovely/pages/customer/BookingDetailsPage.js +394 -357
  42. package/dist/coolandlovely/pages/customer/BookingDetailsPage.js.map +1 -1
  43. package/dist/coolandlovely/pages/customer/CartDetailPage.js +179 -176
  44. package/dist/coolandlovely/pages/customer/CartDetailPage.js.map +1 -1
  45. package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js +215 -204
  46. package/dist/coolandlovely/pages/customer/CartDiscoveryPage.js.map +1 -1
  47. package/dist/coolandlovely/pages/customer/CheckoutPage.js +212 -215
  48. package/dist/coolandlovely/pages/customer/CheckoutPage.js.map +1 -1
  49. package/dist/coolandlovely/pages/customer/CustomerDashboard.js +438 -396
  50. package/dist/coolandlovely/pages/customer/CustomerDashboard.js.map +1 -1
  51. package/dist/coolandlovely/pages/customer/CustomerProfilePage.js +525 -488
  52. package/dist/coolandlovely/pages/customer/CustomerProfilePage.js.map +1 -1
  53. package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js +522 -513
  54. package/dist/coolandlovely/pages/customer/DirectServiceBookingPage.js.map +1 -1
  55. package/dist/coolandlovely/pages/customer/FavoritesPage.js +86 -76
  56. package/dist/coolandlovely/pages/customer/FavoritesPage.js.map +1 -1
  57. package/dist/coolandlovely/pages/customer/OrderHistoryPage.js +118 -109
  58. package/dist/coolandlovely/pages/customer/OrderHistoryPage.js.map +1 -1
  59. package/dist/coolandlovely/pages/customer/OrderTrackingPage.js +312 -275
  60. package/dist/coolandlovely/pages/customer/OrderTrackingPage.js.map +1 -1
  61. package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js +82 -76
  62. package/dist/coolandlovely/pages/customer/PaymentMethodsPage.js.map +1 -1
  63. package/dist/coolandlovely/pages/customer/ReviewsPage.js +83 -73
  64. package/dist/coolandlovely/pages/customer/ReviewsPage.js.map +1 -1
  65. package/dist/coolandlovely/pages/customer/SavedAddressesPage.js +61 -55
  66. package/dist/coolandlovely/pages/customer/SavedAddressesPage.js.map +1 -1
  67. package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js +293 -255
  68. package/dist/coolandlovely/pages/investor/InvestmentDetailsPage.js.map +1 -1
  69. package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js +238 -232
  70. package/dist/coolandlovely/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  71. package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js +61 -55
  72. package/dist/coolandlovely/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  73. package/dist/coolandlovely/pages/investor/InvestorDashboard.js +356 -320
  74. package/dist/coolandlovely/pages/investor/InvestorDashboard.js.map +1 -1
  75. package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js +107 -101
  76. package/dist/coolandlovely/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  77. package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js +170 -137
  78. package/dist/coolandlovely/pages/investor/InvestorPortfolioPage.js.map +1 -1
  79. package/dist/coolandlovely/pages/investor/InvestorProfilePage.js +386 -381
  80. package/dist/coolandlovely/pages/investor/InvestorProfilePage.js.map +1 -1
  81. package/dist/coolandlovely/pages/worker/TaskDetailsPage.js +359 -322
  82. package/dist/coolandlovely/pages/worker/TaskDetailsPage.js.map +1 -1
  83. package/dist/coolandlovely/pages/worker/WorkerDashboard.js +574 -537
  84. package/dist/coolandlovely/pages/worker/WorkerDashboard.js.map +1 -1
  85. package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js +81 -76
  86. package/dist/coolandlovely/pages/worker/WorkerOrdersPage.js.map +1 -1
  87. package/dist/coolandlovely/pages/worker/WorkerProfilePage.js +82 -77
  88. package/dist/coolandlovely/pages/worker/WorkerProfilePage.js.map +1 -1
  89. package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js +78 -73
  90. package/dist/coolandlovely/pages/worker/WorkerSchedulePage.js.map +1 -1
  91. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"FavoritesPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/customer/FavoritesPage.tsx"],"sourcesContent":["/**\n * Favorites Page\n * @module coolandlovely/pages/customer\n *\n * Favorite carts AND products with stats header, 4 filters\n * (search, type, category, sort), Order Again / View Menu per cart,\n * Add to Cart / View Cart + remove per product, Veg badges,\n * prep time, 3 mock favorite products, 2 mock favorite carts.\n */\n\nimport { useState, useCallback, useEffect } from'react';\nimport {\n Heart,\n Star,\n MapPin,\n Clock,\n CheckCircle2,\n Search,\n ShoppingCart,\n Leaf,\n Utensils,\n RotateCcw,\n ListFilter,\n X,\n} from'lucide-react';\nimport { PageLayout } from'../../components/PageLayout';\nimport { EmptyState } from'../../components/EmptyState';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\nimport { useProviders, useOrders } from'../../hooks/useCoolAndLovelyApi';\nimport { mockCarts } from'../../mocks/data';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency, formatDate, formatDistance } from'../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface FavoriteCart {\n id: string;\n name: string;\n description: string;\n category: string;\n image: string;\n rating: number;\n reviewCount: number;\n isOpen: boolean;\n isVerified: boolean;\n distance: number;\n estimatedTime: number;\n addedToFavorites: string;\n lastOrdered?: string;\n totalOrders: number;\n totalSpent: number;\n}\n\ninterface FavoriteProduct {\n id: string;\n name: string;\n description: string;\n price: number;\n category: string;\n image: string;\n cartId: string;\n cartName: string;\n isVegetarian: boolean;\n isVegan: boolean;\n preparationTime: number;\n rating: number;\n addedToFavorites: string;\n lastOrdered?: string;\n orderCount: number;\n}\n\ninterface FavoriteFilters {\n searchQuery: string;\n type: 'all' | 'carts' | 'products';\n category: string;\n sortBy: 'recent' | 'name' | 'rating' | 'orders';\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function FavoritesPage() {\n const { navigateTo, currentUser } = useCoolAndLovely();\n const { data: providers = [], isLoading: isLoadingProviders } = useProviders();\n const { data: orders = [], isLoading: isLoadingOrders } = useOrders({\n customerId: currentUser?.id,\n });\n\n const favoriteCarts: FavoriteCart[] = providers.slice(0, 2).map((p) => ({\n id: p.id,\n name: p.name,\n description: 'Authentic services from CoolAndLovely',\n category: p.category,\n image: p.image,\n rating: p.rating,\n reviewCount: p.totalRatings,\n isOpen: p.isOpen,\n isVerified: p.isVerified || false,\n distance: p.distance,\n estimatedTime: p.estimatedTime,\n addedToFavorites: new Date().toISOString(),\n totalOrders: orders.filter((o) => o.cartId === p.id).length,\n totalSpent: orders.filter((o) => o.cartId === p.id).reduce((acc, o) => acc + o.total, 0),\n }));\n\n const favoriteProducts: FavoriteProduct[] = [\n {\n id: 'prod-001',\n name: 'Masala Dosa',\n description: 'Crispy rice crepe with spiced potato filling',\n price: 120,\n category: 'South Indian',\n image: 'https://images.unsplash.com/photo-1630383249896-424e482df921?w=300',\n cartId: providers[0]?.id || 'FOOD-001',\n cartName: providers[0]?.name || 'Dosa Express',\n isVegetarian: true,\n isVegan: false,\n preparationTime: 15,\n rating: 4.7,\n addedToFavorites: '2024-02-20T12:30:00Z',\n orderCount: 8,\n },\n ];\n\n const [filters, setFilters] = useState<FavoriteFilters>({\n searchQuery: '',\n type: 'all',\n category: '',\n sortBy: 'recent',\n });\n\n const isLoading = isLoadingProviders || isLoadingOrders;\n\n // --- Derived data ---\n const getDisplayItems = useCallback(() => {\n let carts = [...favoriteCarts];\n let products = [...favoriteProducts];\n\n // Search\n if (filters.searchQuery) {\n const q = filters.searchQuery.toLowerCase();\n carts = carts.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.description.toLowerCase().includes(q) ||\n c.category.toLowerCase().includes(q)\n );\n products = products.filter(\n (p) =>\n p.name.toLowerCase().includes(q) ||\n p.description.toLowerCase().includes(q) ||\n p.category.toLowerCase().includes(q) ||\n p.cartName.toLowerCase().includes(q)\n );\n }\n\n // Category\n if (filters.category) {\n carts = carts.filter((c) => c.category === filters.category);\n products = products.filter((p) => p.category === filters.category);\n }\n\n // Sort\n switch (filters.sortBy) {\n case'recent':\n carts.sort(\n (a, b) => new Date(b.addedToFavorites).getTime() - new Date(a.addedToFavorites).getTime()\n );\n products.sort(\n (a, b) => new Date(b.addedToFavorites).getTime() - new Date(a.addedToFavorites).getTime()\n );\n break;\n case'name':\n carts.sort((a, b) => a.name.localeCompare(b.name));\n products.sort((a, b) => a.name.localeCompare(b.name));\n break;\n case'rating':\n carts.sort((a, b) => b.rating - a.rating);\n products.sort((a, b) => b.rating - a.rating);\n break;\n case'orders':\n carts.sort((a, b) => b.totalOrders - a.totalOrders);\n products.sort((a, b) => b.orderCount - a.orderCount);\n break;\n }\n\n // Type filter\n if (filters.type === 'carts') return { carts, products: [] };\n if (filters.type === 'products') return { carts: [], products };\n return { carts, products };\n }, [favoriteCarts, favoriteProducts, filters]);\n\n const { carts: displayCarts, products: displayProducts } = getDisplayItems();\n\n const handleRemoveCart = (id: string) => {\n // In real app, this would call an API\n console.log('Remove cart:', id);\n };\n\n const handleRemoveProduct = (id: string) => {\n // In real app, this would call an API\n console.log('Remove product:', id);\n };\n\n // Stats\n const totalSaved =\n favoriteCarts.reduce((s, c) => s + c.totalSpent, 0) +\n favoriteProducts.reduce((s, p) => s + p.price * p.orderCount, 0);\n\n if (isLoading) {\n return (\n <PageLayout title=\"My Favorites\">\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-foreground\" />\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"My Favorites\"\n description={`${favoriteCarts.length} carts, ${favoriteProducts.length} products`}\n >\n {/* Stats Header */}\n <div className=\"flex flex-wrap items-center gap-4 text-sm text-text-secondary mb-6\">\n <span className=\"flex items-center gap-1.5\">\n <ShoppingCart className=\"h-3.5 w-3.5\" />\n {favoriteCarts.length} carts\n </span>\n <span className=\"flex items-center gap-1.5\">\n <Utensils className=\"h-3.5 w-3.5\" />\n {favoriteProducts.length} products\n </span>\n <span className=\"flex items-center gap-1.5\">\n <Star className=\"h-3.5 w-3.5\" />\n Total saved: {formatCurrency(totalSaved, { minimumFractionDigits: 0 })}\n </span>\n </div>\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 mb-6 bg-gloss-card shadow-pop\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3\">\n {/* Search */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search favorites...\"\n value={filters.searchQuery}\n onChange={(e) => setFilters((p) => ({ ...p, searchQuery: e.target.value }))}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 pl-9 pr-3 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 {/* Type */}\n <select\n value={filters.type}\n onChange={(e) =>\n setFilters((p) => ({ ...p, type: e.target.value as FavoriteFilters['type'] }))\n }\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"all\">All Favorites</option>\n <option value=\"carts\">Favorite Carts</option>\n <option value=\"products\">Favorite Products</option>\n </select>\n\n {/* Category */}\n <select\n value={filters.category}\n onChange={(e) => setFilters((p) => ({ ...p, category: e.target.value }))}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">All Categories</option>\n <option value=\"Food & Beverage\">Food & Beverage</option>\n <option value=\"Street Food\">Street Food</option>\n <option value=\"South Indian\">South Indian</option>\n <option value=\"Beverages\">Beverages</option>\n </select>\n\n {/* Sort */}\n <select\n value={filters.sortBy}\n onChange={(e) =>\n setFilters((p) => ({ ...p, sortBy: e.target.value as FavoriteFilters['sortBy'] }))\n }\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"recent\">Recently Added</option>\n <option value=\"name\">Name A-Z</option>\n <option value=\"rating\">Highest Rated</option>\n <option value=\"orders\">Most Ordered</option>\n </select>\n </div>\n </div>\n\n {/* Content */}\n {displayCarts.length === 0 && displayProducts.length === 0 ? (\n <EmptyState\n icon={<Heart className=\"h-12 w-12\" />}\n title=\"No favorites yet\"\n description=\"Browse carts and tap the heart icon to add them to your favorites.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Discover Carts\n </button>\n }\n />\n ) : (\n <div className=\"space-y-8\">\n {/* Favorite Carts */}\n {displayCarts.length > 0 && (\n <section>\n <h3 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <ShoppingCart className=\"h-4 w-4 text-text-secondary\" />\n Favorite Carts ({displayCarts.length})\n </h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {displayCarts.map((cart) => (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden\"\n >\n {/* Image */}\n <div className=\"relative h-36 bg-bg-sunken\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${cart.id}`)}\n className=\"block h-full w-full\"\n >\n <img\n src={cart.image}\n alt={cart.name}\n className=\"h-full w-full object-cover\"\n />\n </button>\n <button\n type=\"button\"\n onClick={() => handleRemoveCart(cart.id)}\n title=\"Remove from favorites\"\n className=\"absolute top-2 right-2 flex h-8 w-8 items-center justify-center rounded-full bg-bg-surface/80 backdrop-blur-sm text-status-error-text hover:bg-bg-surface transition-colors\"\n >\n <Heart className=\"h-4 w-4 fill-current\" />\n </button>\n <div className=\"absolute top-2 left-2\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n cart.isOpen\n ? 'bg-status-success-bg-subtle/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {cart.isOpen ? 'Open' : 'Closed'}\n </span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between gap-2 mb-2\">\n <h4 className=\"text-sm font-semibold text-text-primary truncate\">\n {cart.name}\n </h4>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium text-text-primary\">{cart.rating}</span>\n <span className=\"text-xs text-text-secondary\">\n ({cart.reviewCount})\n </span>\n </div>\n </div>\n\n <p className=\"text-xs text-text-secondary line-clamp-2 mb-3\">\n {cart.description}\n </p>\n\n <div className=\"space-y-1.5 text-xs text-text-secondary\">\n <div className=\"flex justify-between\">\n <span>Added:</span>\n <span>\n {formatDate(cart.addedToFavorites, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span>Total orders:</span>\n <span>{cart.totalOrders}</span>\n </div>\n <div className=\"flex justify-between\">\n <span>Total spent:</span>\n <span className=\"font-medium\">\n {formatCurrency(cart.totalSpent, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {cart.lastOrdered && (\n <div className=\"flex justify-between\">\n <span>Last ordered:</span>\n <span>\n {formatDate(cart.lastOrdered, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"flex gap-2 mt-4\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${cart.id}`)}\n className=\"flex-1 flex items-center justify-center gap-1.5 rounded-lg bg-foreground px-3 py-2 text-xs font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <RotateCcw className=\"h-3 w-3\" />\n Order Again\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${cart.id}`)}\n className=\"flex-1 rounded-lg border border-border-subtle px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Menu\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n </section>\n )}\n\n {/* Favorite Products */}\n {displayProducts.length > 0 && (\n <section>\n <h3 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Utensils className=\"h-4 w-4 text-text-secondary\" />\n Favorite Products ({displayProducts.length})\n </h3>\n <div className=\"space-y-3\">\n {displayProducts.map((product) => (\n <div key={product.id} className=\"rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-4\">\n {/* Image */}\n <img\n src={product.image}\n alt={product.name}\n className=\"w-20 h-20 rounded-lg object-cover shrink-0 mx-auto sm:mx-0\"\n />\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-2 mb-1\">\n <h4 className=\"text-sm font-semibold text-text-primary\">{product.name}</h4>\n <div className=\"flex items-center gap-2 shrink-0\">\n <span className=\"text-base font-bold text-text-primary\">\n {formatCurrency(product.price, { minimumFractionDigits: 0 })}\n </span>\n <button\n type=\"button\"\n onClick={() => handleRemoveProduct(product.id)}\n title=\"Remove from favorites\"\n className=\"rounded-md p-1 text-status-error-text hover:bg-status-error-bg/10 transition-colors\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n <p className=\"text-xs text-text-secondary mb-2\">{product.description}</p>\n\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-text-secondary mb-2\">\n <span>\n From:{' '}\n <span className=\"font-medium text-text-primary\">{product.cartName}</span>\n </span>\n <span>Ordered {product.orderCount} times</span>\n <span>\n Added:{' '}\n {formatDate(product.addedToFavorites, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {product.isVegetarian && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle/10 px-2 py-0.5 text-[10px] font-medium text-status-success-text\">\n <Leaf className=\"h-3 w-3\" />\n Veg\n </span>\n )}\n {product.isVegan && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle/10 px-2 py-0.5 text-[10px] font-medium text-status-success-text\">\n <Leaf className=\"h-3 w-3\" />\n Vegan\n </span>\n )}\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2 py-0.5 text-[10px] font-medium text-text-secondary\">\n <Clock className=\"h-3 w-3\" />\n {product.preparationTime} min\n </span>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex sm:flex-col gap-2 shrink-0\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${product.cartId}`)}\n className=\"flex-1 sm:flex-none rounded-lg bg-foreground px-4 py-2 text-xs font-medium text-background hover:opacity-90 transition-opacity whitespace-nowrap\"\n >\n Add to Cart\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${product.cartId}`)}\n className=\"flex-1 sm:flex-none rounded-lg border border-border-subtle px-4 py-2 text-xs font-medium text-text-primary hover:bg-accent transition-colors whitespace-nowrap\"\n >\n View Cart\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n </section>\n )}\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FavoritesPage.js","names":[],"sources":["../../../../src/coolandlovely/pages/customer/FavoritesPage.tsx"],"sourcesContent":["/**\n * Favorites Page\n * @module coolandlovely/pages/customer\n *\n * Favorite carts AND products with stats header, 4 filters\n * (search, type, category, sort), Order Again / View Menu per cart,\n * Add to Cart / View Cart + remove per product, Veg badges,\n * prep time, 3 mock favorite products, 2 mock favorite carts.\n */\n\nimport { useState, useCallback, useEffect } from'react';\nimport {\n Heart,\n Star,\n MapPin,\n Clock,\n CheckCircle2,\n Search,\n ShoppingCart,\n Leaf,\n Utensils,\n RotateCcw,\n ListFilter,\n X,\n} from'lucide-react';\nimport { EmphasisPanel, PagePurpose } from'@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { EmptyState } from'../../components/EmptyState';\nimport { useCoolAndLovely } from'../../context/CoolAndLovelyContext';\nimport { useProviders, useOrders } from'../../hooks/useCoolAndLovelyApi';\nimport { mockCarts } from'../../mocks/data';\nimport { cn } from'../../utils/cn';\nimport { formatCurrency, formatDate, formatDistance } from'../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface FavoriteCart {\n id: string;\n name: string;\n description: string;\n category: string;\n image: string;\n rating: number;\n reviewCount: number;\n isOpen: boolean;\n isVerified: boolean;\n distance: number;\n estimatedTime: number;\n addedToFavorites: string;\n lastOrdered?: string;\n totalOrders: number;\n totalSpent: number;\n}\n\ninterface FavoriteProduct {\n id: string;\n name: string;\n description: string;\n price: number;\n category: string;\n image: string;\n cartId: string;\n cartName: string;\n isVegetarian: boolean;\n isVegan: boolean;\n preparationTime: number;\n rating: number;\n addedToFavorites: string;\n lastOrdered?: string;\n orderCount: number;\n}\n\ninterface FavoriteFilters {\n searchQuery: string;\n type: 'all' | 'carts' | 'products';\n category: string;\n sortBy: 'recent' | 'name' | 'rating' | 'orders';\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function FavoritesPage() {\n const { navigateTo, currentUser } = useCoolAndLovely();\n const { data: providers = [], isLoading: isLoadingProviders } = useProviders();\n const { data: orders = [], isLoading: isLoadingOrders } = useOrders({\n customerId: currentUser?.id,\n });\n\n const favoriteCarts: FavoriteCart[] = providers.slice(0, 2).map((p) => ({\n id: p.id,\n name: p.name,\n description: 'Authentic services from CoolAndLovely',\n category: p.category,\n image: p.image,\n rating: p.rating,\n reviewCount: p.totalRatings,\n isOpen: p.isOpen,\n isVerified: p.isVerified || false,\n distance: p.distance,\n estimatedTime: p.estimatedTime,\n addedToFavorites: new Date().toISOString(),\n totalOrders: orders.filter((o) => o.cartId === p.id).length,\n totalSpent: orders.filter((o) => o.cartId === p.id).reduce((acc, o) => acc + o.total, 0),\n }));\n\n const favoriteProducts: FavoriteProduct[] = [\n {\n id: 'prod-001',\n name: 'Masala Dosa',\n description: 'Crispy rice crepe with spiced potato filling',\n price: 120,\n category: 'South Indian',\n image: 'https://images.unsplash.com/photo-1630383249896-424e482df921?w=300',\n cartId: providers[0]?.id || 'FOOD-001',\n cartName: providers[0]?.name || 'Dosa Express',\n isVegetarian: true,\n isVegan: false,\n preparationTime: 15,\n rating: 4.7,\n addedToFavorites: '2024-02-20T12:30:00Z',\n orderCount: 8,\n },\n ];\n\n const [filters, setFilters] = useState<FavoriteFilters>({\n searchQuery: '',\n type: 'all',\n category: '',\n sortBy: 'recent',\n });\n\n const isLoading = isLoadingProviders || isLoadingOrders;\n\n // --- Derived data ---\n const getDisplayItems = useCallback(() => {\n let carts = [...favoriteCarts];\n let products = [...favoriteProducts];\n\n // Search\n if (filters.searchQuery) {\n const q = filters.searchQuery.toLowerCase();\n carts = carts.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.description.toLowerCase().includes(q) ||\n c.category.toLowerCase().includes(q)\n );\n products = products.filter(\n (p) =>\n p.name.toLowerCase().includes(q) ||\n p.description.toLowerCase().includes(q) ||\n p.category.toLowerCase().includes(q) ||\n p.cartName.toLowerCase().includes(q)\n );\n }\n\n // Category\n if (filters.category) {\n carts = carts.filter((c) => c.category === filters.category);\n products = products.filter((p) => p.category === filters.category);\n }\n\n // Sort\n switch (filters.sortBy) {\n case'recent':\n carts.sort(\n (a, b) => new Date(b.addedToFavorites).getTime() - new Date(a.addedToFavorites).getTime()\n );\n products.sort(\n (a, b) => new Date(b.addedToFavorites).getTime() - new Date(a.addedToFavorites).getTime()\n );\n break;\n case'name':\n carts.sort((a, b) => a.name.localeCompare(b.name));\n products.sort((a, b) => a.name.localeCompare(b.name));\n break;\n case'rating':\n carts.sort((a, b) => b.rating - a.rating);\n products.sort((a, b) => b.rating - a.rating);\n break;\n case'orders':\n carts.sort((a, b) => b.totalOrders - a.totalOrders);\n products.sort((a, b) => b.orderCount - a.orderCount);\n break;\n }\n\n // Type filter\n if (filters.type === 'carts') return { carts, products: [] };\n if (filters.type === 'products') return { carts: [], products };\n return { carts, products };\n }, [favoriteCarts, favoriteProducts, filters]);\n\n const { carts: displayCarts, products: displayProducts } = getDisplayItems();\n\n const handleRemoveCart = (id: string) => {\n // In real app, this would call an API\n console.log('Remove cart:', id);\n };\n\n const handleRemoveProduct = (id: string) => {\n // In real app, this would call an API\n console.log('Remove product:', id);\n };\n\n // Stats\n const totalSaved =\n favoriteCarts.reduce((s, c) => s + c.totalSpent, 0) +\n favoriteProducts.reduce((s, p) => s + p.price * p.orderCount, 0);\n\n if (isLoading) {\n return (\n <PageLayout title=\"My Favorites\">\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-foreground\" />\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"My Favorites\"\n description={`${favoriteCarts.length} carts, ${favoriteProducts.length} products`}\n >\n <PagePurpose className=\"mb-6\" icon={<Heart className=\"h-4 w-4\" />}>\n Everything you have saved in one place. Tap the heart on any cart or dish\n to keep it here, then reorder favourites in a couple of taps and see how\n much you have spent with the carts you love most.\n </PagePurpose>\n\n {/* Stats Header — primary emphasis zone */}\n <EmphasisPanel className=\"mb-6 p-5\">\n <div className=\"flex flex-wrap items-center justify-between gap-4\">\n <div className=\"flex flex-wrap items-center gap-5 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1.5\">\n <ShoppingCart className=\"h-4 w-4\" />\n {favoriteCarts.length} carts\n </span>\n <span className=\"flex items-center gap-1.5\">\n <Utensils className=\"h-4 w-4\" />\n {favoriteProducts.length} products\n </span>\n </div>\n <div className=\"text-right\">\n <p className=\"text-xs text-text-secondary\">Total saved with favourites</p>\n <p className=\"text-2xl font-bold text-text-primary\">\n {formatCurrency(totalSaved, { minimumFractionDigits: 0 })}\n </p>\n </div>\n </div>\n </EmphasisPanel>\n\n {/* Filters */}\n <div className=\"rounded-lg border border-border-seam bg-bg-surface p-4 mb-6 bg-gloss-card shadow-pop\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3\">\n {/* Search */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search favorites...\"\n value={filters.searchQuery}\n onChange={(e) => setFilters((p) => ({ ...p, searchQuery: e.target.value }))}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 pl-9 pr-3 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 {/* Type */}\n <select\n value={filters.type}\n onChange={(e) =>\n setFilters((p) => ({ ...p, type: e.target.value as FavoriteFilters['type'] }))\n }\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"all\">All Favorites</option>\n <option value=\"carts\">Favorite Carts</option>\n <option value=\"products\">Favorite Products</option>\n </select>\n\n {/* Category */}\n <select\n value={filters.category}\n onChange={(e) => setFilters((p) => ({ ...p, category: e.target.value }))}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">All Categories</option>\n <option value=\"Food & Beverage\">Food & Beverage</option>\n <option value=\"Street Food\">Street Food</option>\n <option value=\"South Indian\">South Indian</option>\n <option value=\"Beverages\">Beverages</option>\n </select>\n\n {/* Sort */}\n <select\n value={filters.sortBy}\n onChange={(e) =>\n setFilters((p) => ({ ...p, sortBy: e.target.value as FavoriteFilters['sortBy'] }))\n }\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"recent\">Recently Added</option>\n <option value=\"name\">Name A-Z</option>\n <option value=\"rating\">Highest Rated</option>\n <option value=\"orders\">Most Ordered</option>\n </select>\n </div>\n </div>\n\n {/* Content */}\n {displayCarts.length === 0 && displayProducts.length === 0 ? (\n <EmptyState\n illustration=\"empty-generic\"\n title=\"No favorites yet\"\n description=\"Browse carts and tap the heart icon to add them to your favorites.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Discover Carts\n </button>\n }\n />\n ) : (\n <div className=\"space-y-8\">\n {/* Favorite Carts */}\n {displayCarts.length > 0 && (\n <section>\n <h3 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <ShoppingCart className=\"h-4 w-4 text-text-secondary\" />\n Favorite Carts ({displayCarts.length})\n </h3>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n {displayCarts.map((cart) => (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden\"\n >\n {/* Image */}\n <div className=\"relative h-36 bg-bg-sunken\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${cart.id}`)}\n className=\"block h-full w-full\"\n >\n <img\n src={cart.image}\n alt={cart.name}\n className=\"h-full w-full object-cover\"\n />\n </button>\n <button\n type=\"button\"\n onClick={() => handleRemoveCart(cart.id)}\n title=\"Remove from favorites\"\n className=\"absolute top-2 right-2 flex h-8 w-8 items-center justify-center rounded-full bg-bg-surface/80 backdrop-blur-sm text-status-error-text hover:bg-bg-surface transition-colors\"\n >\n <Heart className=\"h-4 w-4 fill-current\" />\n </button>\n <div className=\"absolute top-2 left-2\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n cart.isOpen\n ? 'bg-status-success-bg-subtle/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {cart.isOpen ? 'Open' : 'Closed'}\n </span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between gap-2 mb-2\">\n <h4 className=\"text-sm font-semibold text-text-primary truncate\">\n {cart.name}\n </h4>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs font-medium text-text-primary\">{cart.rating}</span>\n <span className=\"text-xs text-text-secondary\">\n ({cart.reviewCount})\n </span>\n </div>\n </div>\n\n <p className=\"text-xs text-text-secondary line-clamp-2 mb-3\">\n {cart.description}\n </p>\n\n <div className=\"space-y-1.5 text-xs text-text-secondary\">\n <div className=\"flex justify-between\">\n <span>Added:</span>\n <span>\n {formatDate(cart.addedToFavorites, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span>Total orders:</span>\n <span>{cart.totalOrders}</span>\n </div>\n <div className=\"flex justify-between\">\n <span>Total spent:</span>\n <span className=\"font-medium\">\n {formatCurrency(cart.totalSpent, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {cart.lastOrdered && (\n <div className=\"flex justify-between\">\n <span>Last ordered:</span>\n <span>\n {formatDate(cart.lastOrdered, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"flex gap-2 mt-4\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${cart.id}`)}\n className=\"flex-1 flex items-center justify-center gap-1.5 rounded-lg bg-foreground px-3 py-2 text-xs font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <RotateCcw className=\"h-3 w-3\" />\n Order Again\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${cart.id}`)}\n className=\"flex-1 rounded-lg border border-border-subtle px-3 py-2 text-xs font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Menu\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n </section>\n )}\n\n {/* Favorite Products */}\n {displayProducts.length > 0 && (\n <section>\n <h3 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Utensils className=\"h-4 w-4 text-text-secondary\" />\n Favorite Products ({displayProducts.length})\n </h3>\n <div className=\"space-y-3\">\n {displayProducts.map((product) => (\n <div key={product.id} className=\"rounded-lg border border-border-seam bg-bg-surface p-4 bg-gloss-card shadow-pop\">\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-4\">\n {/* Image */}\n <img\n src={product.image}\n alt={product.name}\n className=\"w-20 h-20 rounded-lg object-cover shrink-0 mx-auto sm:mx-0\"\n />\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-start justify-between gap-2 mb-1\">\n <h4 className=\"text-sm font-semibold text-text-primary\">{product.name}</h4>\n <div className=\"flex items-center gap-2 shrink-0\">\n <span className=\"text-base font-bold text-text-primary\">\n {formatCurrency(product.price, { minimumFractionDigits: 0 })}\n </span>\n <button\n type=\"button\"\n onClick={() => handleRemoveProduct(product.id)}\n title=\"Remove from favorites\"\n className=\"rounded-md p-1 text-status-error-text hover:bg-status-error-bg/10 transition-colors\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n\n <p className=\"text-xs text-text-secondary mb-2\">{product.description}</p>\n\n <div className=\"flex flex-wrap items-center gap-2 text-xs text-text-secondary mb-2\">\n <span>\n From:{' '}\n <span className=\"font-medium text-text-primary\">{product.cartName}</span>\n </span>\n <span>Ordered {product.orderCount} times</span>\n <span>\n Added:{' '}\n {formatDate(product.addedToFavorites, {\n hour: undefined,\n minute: undefined,\n hour12: undefined,\n })}\n </span>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {product.isVegetarian && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle/10 px-2 py-0.5 text-[10px] font-medium text-status-success-text\">\n <Leaf className=\"h-3 w-3\" />\n Veg\n </span>\n )}\n {product.isVegan && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle/10 px-2 py-0.5 text-[10px] font-medium text-status-success-text\">\n <Leaf className=\"h-3 w-3\" />\n Vegan\n </span>\n )}\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2 py-0.5 text-[10px] font-medium text-text-secondary\">\n <Clock className=\"h-3 w-3\" />\n {product.preparationTime} min\n </span>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex sm:flex-col gap-2 shrink-0\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${product.cartId}`)}\n className=\"flex-1 sm:flex-none rounded-lg bg-foreground px-4 py-2 text-xs font-medium text-background hover:opacity-90 transition-opacity whitespace-nowrap\"\n >\n Add to Cart\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${product.cartId}`)}\n className=\"flex-1 sm:flex-none rounded-lg border border-border-subtle px-4 py-2 text-xs font-medium text-text-primary hover:bg-accent transition-colors whitespace-nowrap\"\n >\n View Cart\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n </section>\n )}\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -8,8 +8,9 @@ import { RatingDisplay as s } from "../../components/RatingDisplay.js";
8
8
  import { useMemo as c, useState as l } from "react";
9
9
  import { AlertCircle as u, CheckCircle2 as d, ChevronDown as f, Clock as p, Eye as m, Heart as h, IndianRupee as g, Loader2 as _, Package as v, RotateCcw as y, Search as b, ShoppingBag as x, Star as S, TrendingUp as C, Truck as w, XCircle as T } from "lucide-react";
10
10
  import { jsx as E, jsxs as D } from "react/jsx-runtime";
11
+ import { EmphasisPanel as O, PagePurpose as k } from "@burdenoff/fe-libs/ui";
11
12
  //#region src/coolandlovely/pages/customer/OrderHistoryPage.tsx
12
- var O = 10, k = [
13
+ var A = 10, j = [
13
14
  {
14
15
  value: "",
15
16
  label: "All Status"
@@ -42,7 +43,7 @@ var O = 10, k = [
42
43
  value: "cancelled",
43
44
  label: "Cancelled"
44
45
  }
45
- ], A = [
46
+ ], M = [
46
47
  {
47
48
  value: "7days",
48
49
  label: "Last 7 Days"
@@ -59,7 +60,7 @@ var O = 10, k = [
59
60
  value: "all",
60
61
  label: "All Time"
61
62
  }
62
- ], j = [
63
+ ], N = [
63
64
  {
64
65
  value: "recent",
65
66
  label: "Most Recent"
@@ -77,15 +78,15 @@ var O = 10, k = [
77
78
  label: "Amount: Low to High"
78
79
  }
79
80
  ];
80
- function M() {
81
- let { navigateTo: M, currentUser: N } = e(), [P, F] = l(O), [I, L] = l({
81
+ function P() {
82
+ let { navigateTo: P, currentUser: F } = e(), [I, L] = l(A), [R, z] = l({
82
83
  status: "",
83
84
  dateRange: "30days",
84
85
  searchQuery: "",
85
86
  sortBy: "recent"
86
- }), { data: R = [], isLoading: z, isError: B } = i({ customerId: N?.id }), V = c(() => {
87
- let e = R.length, t = R.reduce((e, t) => e + t.total, 0), n = e > 0 ? Math.round(t / e) : 0, r = R.filter((e) => new Date(e.orderDate) > /* @__PURE__ */ new Date(Date.now() - 10080 * 60 * 1e3)).length, i = {};
88
- for (let e of R) i[e.cartName] = (i[e.cartName] || 0) + 1;
87
+ }), { data: B = [], isLoading: V, isError: H } = i({ customerId: F?.id }), U = c(() => {
88
+ let e = B.length, t = B.reduce((e, t) => e + t.total, 0), n = e > 0 ? Math.round(t / e) : 0, r = B.filter((e) => new Date(e.orderDate) > /* @__PURE__ */ new Date(Date.now() - 10080 * 60 * 1e3)).length, i = {};
89
+ for (let e of B) i[e.cartName] = (i[e.cartName] || 0) + 1;
89
90
  return {
90
91
  totalOrders: e,
91
92
  totalSpent: t,
@@ -93,11 +94,11 @@ function M() {
93
94
  recentOrdersCount: r,
94
95
  favoriteCart: Object.entries(i).sort((e, t) => t[1] - e[1])[0]?.[0] || "No orders yet"
95
96
  };
96
- }, [R]), H = c(() => {
97
- let e = [...R];
98
- if (I.status && (e = e.filter((e) => e.status === I.status)), I.dateRange !== "all") {
97
+ }, [B]), W = c(() => {
98
+ let e = [...B];
99
+ if (R.status && (e = e.filter((e) => e.status === R.status)), R.dateRange !== "all") {
99
100
  let t = /* @__PURE__ */ new Date(), n = /* @__PURE__ */ new Date();
100
- switch (I.dateRange) {
101
+ switch (R.dateRange) {
101
102
  case "7days":
102
103
  n.setDate(t.getDate() - 7);
103
104
  break;
@@ -110,11 +111,11 @@ function M() {
110
111
  }
111
112
  e = e.filter((e) => new Date(e.orderDate) >= n);
112
113
  }
113
- if (I.searchQuery) {
114
- let t = I.searchQuery.toLowerCase();
114
+ if (R.searchQuery) {
115
+ let t = R.searchQuery.toLowerCase();
115
116
  e = e.filter((e) => e.id.toLowerCase().includes(t) || e.cartName.toLowerCase().includes(t) || e.items.some((e) => e.name.toLowerCase().includes(t)));
116
117
  }
117
- switch (I.sortBy) {
118
+ switch (R.sortBy) {
118
119
  case "recent":
119
120
  e.sort((e, t) => new Date(t.orderDate).getTime() - new Date(e.orderDate).getTime());
120
121
  break;
@@ -129,22 +130,22 @@ function M() {
129
130
  break;
130
131
  }
131
132
  return e;
132
- }, [R, I]), U = c(() => H.slice(0, P), [H, P]), W = P < H.length, G = (e, t) => {
133
- L((n) => ({
133
+ }, [B, R]), G = c(() => W.slice(0, I), [W, I]), K = I < W.length, q = (e, t) => {
134
+ z((n) => ({
134
135
  ...n,
135
136
  [e]: t
136
- })), F(O);
137
- }, K = (e) => {
138
- M(`/customer/cart/${e.cartId}`), alert("Add items to cart to reorder");
137
+ })), L(A);
138
+ }, J = (e) => {
139
+ P(`/customer/cart/${e.cartId}`), alert("Add items to cart to reorder");
139
140
  };
140
- return z ? /* @__PURE__ */ E(t, {
141
+ return V ? /* @__PURE__ */ E(t, {
141
142
  title: "Order History",
142
143
  description: "Loading your orders...",
143
144
  children: /* @__PURE__ */ E("div", {
144
145
  className: "flex h-[60vh] items-center justify-center",
145
146
  children: /* @__PURE__ */ E(_, { className: "h-8 w-8 animate-spin text-primary" })
146
147
  })
147
- }) : B ? /* @__PURE__ */ E(t, {
148
+ }) : H ? /* @__PURE__ */ E(t, {
148
149
  title: "Order History",
149
150
  description: "Error loading orders",
150
151
  children: /* @__PURE__ */ D("div", {
@@ -167,75 +168,83 @@ function M() {
167
168
  title: "Order History",
168
169
  description: "View all your past and current orders",
169
170
  children: [
170
- /* @__PURE__ */ D("div", {
171
- className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-3 mb-6",
172
- children: [
173
- /* @__PURE__ */ D("div", {
174
- className: "rounded-lg border border-border-subtle bg-bg-surface p-3.5",
175
- children: [/* @__PURE__ */ D("div", {
176
- className: "flex items-center gap-2 mb-1",
177
- children: [/* @__PURE__ */ E(v, { className: "h-3.5 w-3.5 text-text-secondary" }), /* @__PURE__ */ E("p", {
178
- className: "text-xs text-text-secondary",
179
- children: "Total Orders"
171
+ /* @__PURE__ */ E(k, {
172
+ className: "mb-6",
173
+ icon: /* @__PURE__ */ E(x, { className: "h-4 w-4" }),
174
+ children: "A complete record of everything you have ordered. Search and filter by status or date to find a specific order, track anything still on the way, reorder past favourites in one tap, and rate orders once they arrive."
175
+ }),
176
+ /* @__PURE__ */ E(O, {
177
+ className: "mb-6 p-4",
178
+ children: /* @__PURE__ */ D("div", {
179
+ className: "grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-3",
180
+ children: [
181
+ /* @__PURE__ */ D("div", {
182
+ className: "rounded-lg border border-border-subtle bg-bg-surface p-3.5",
183
+ children: [/* @__PURE__ */ D("div", {
184
+ className: "flex items-center gap-2 mb-1",
185
+ children: [/* @__PURE__ */ E(v, { className: "h-3.5 w-3.5 text-text-secondary" }), /* @__PURE__ */ E("p", {
186
+ className: "text-xs text-text-secondary",
187
+ children: "Total Orders"
188
+ })]
189
+ }), /* @__PURE__ */ E("p", {
190
+ className: "text-xl font-bold text-text-primary",
191
+ children: U.totalOrders
180
192
  })]
181
- }), /* @__PURE__ */ E("p", {
182
- className: "text-xl font-bold text-text-primary",
183
- children: V.totalOrders
184
- })]
185
- }),
186
- /* @__PURE__ */ D("div", {
187
- className: "rounded-lg border border-border-subtle bg-bg-surface p-3.5",
188
- children: [/* @__PURE__ */ D("div", {
189
- className: "flex items-center gap-2 mb-1",
190
- children: [/* @__PURE__ */ E(g, { className: "h-3.5 w-3.5 text-text-secondary" }), /* @__PURE__ */ E("p", {
191
- className: "text-xs text-text-secondary",
192
- children: "Total Spent"
193
+ }),
194
+ /* @__PURE__ */ D("div", {
195
+ className: "rounded-lg border border-border-subtle bg-bg-surface p-3.5",
196
+ children: [/* @__PURE__ */ D("div", {
197
+ className: "flex items-center gap-2 mb-1",
198
+ children: [/* @__PURE__ */ E(g, { className: "h-3.5 w-3.5 text-text-secondary" }), /* @__PURE__ */ E("p", {
199
+ className: "text-xs text-text-secondary",
200
+ children: "Total Spent"
201
+ })]
202
+ }), /* @__PURE__ */ E("p", {
203
+ className: "text-xl font-bold text-text-primary",
204
+ children: a(U.totalSpent, { minimumFractionDigits: 0 })
193
205
  })]
194
- }), /* @__PURE__ */ E("p", {
195
- className: "text-xl font-bold text-text-primary",
196
- children: a(V.totalSpent, { minimumFractionDigits: 0 })
197
- })]
198
- }),
199
- /* @__PURE__ */ D("div", {
200
- className: "rounded-lg border border-border-subtle bg-bg-surface p-3.5",
201
- children: [/* @__PURE__ */ D("div", {
202
- className: "flex items-center gap-2 mb-1",
203
- children: [/* @__PURE__ */ E(C, { className: "h-3.5 w-3.5 text-text-secondary" }), /* @__PURE__ */ E("p", {
204
- className: "text-xs text-text-secondary",
205
- children: "Average Order"
206
+ }),
207
+ /* @__PURE__ */ D("div", {
208
+ className: "rounded-lg border border-border-subtle bg-bg-surface p-3.5",
209
+ children: [/* @__PURE__ */ D("div", {
210
+ className: "flex items-center gap-2 mb-1",
211
+ children: [/* @__PURE__ */ E(C, { className: "h-3.5 w-3.5 text-text-secondary" }), /* @__PURE__ */ E("p", {
212
+ className: "text-xs text-text-secondary",
213
+ children: "Average Order"
214
+ })]
215
+ }), /* @__PURE__ */ E("p", {
216
+ className: "text-xl font-bold text-text-primary",
217
+ children: a(U.averageOrderValue, { minimumFractionDigits: 0 })
206
218
  })]
207
- }), /* @__PURE__ */ E("p", {
208
- className: "text-xl font-bold text-text-primary",
209
- children: a(V.averageOrderValue, { minimumFractionDigits: 0 })
210
- })]
211
- }),
212
- /* @__PURE__ */ D("div", {
213
- className: "rounded-lg border border-border-subtle bg-bg-surface p-3.5",
214
- children: [/* @__PURE__ */ D("div", {
215
- className: "flex items-center gap-2 mb-1",
216
- children: [/* @__PURE__ */ E(p, { className: "h-3.5 w-3.5 text-text-secondary" }), /* @__PURE__ */ E("p", {
217
- className: "text-xs text-text-secondary",
218
- children: "Recent Orders"
219
+ }),
220
+ /* @__PURE__ */ D("div", {
221
+ className: "rounded-lg border border-border-subtle bg-bg-surface p-3.5",
222
+ children: [/* @__PURE__ */ D("div", {
223
+ className: "flex items-center gap-2 mb-1",
224
+ children: [/* @__PURE__ */ E(p, { className: "h-3.5 w-3.5 text-text-secondary" }), /* @__PURE__ */ E("p", {
225
+ className: "text-xs text-text-secondary",
226
+ children: "Recent Orders"
227
+ })]
228
+ }), /* @__PURE__ */ E("p", {
229
+ className: "text-xl font-bold text-text-primary",
230
+ children: U.recentOrdersCount
219
231
  })]
220
- }), /* @__PURE__ */ E("p", {
221
- className: "text-xl font-bold text-text-primary",
222
- children: V.recentOrdersCount
223
- })]
224
- }),
225
- /* @__PURE__ */ D("div", {
226
- className: "rounded-lg border border-border-subtle bg-bg-surface p-3.5 col-span-2 md:col-span-1",
227
- children: [/* @__PURE__ */ D("div", {
228
- className: "flex items-center gap-2 mb-1",
229
- children: [/* @__PURE__ */ E(h, { className: "h-3.5 w-3.5 text-text-secondary" }), /* @__PURE__ */ E("p", {
230
- className: "text-xs text-text-secondary",
231
- children: "Favorite Cart"
232
+ }),
233
+ /* @__PURE__ */ D("div", {
234
+ className: "rounded-lg border border-border-subtle bg-bg-surface p-3.5 col-span-2 md:col-span-1",
235
+ children: [/* @__PURE__ */ D("div", {
236
+ className: "flex items-center gap-2 mb-1",
237
+ children: [/* @__PURE__ */ E(h, { className: "h-3.5 w-3.5 text-text-secondary" }), /* @__PURE__ */ E("p", {
238
+ className: "text-xs text-text-secondary",
239
+ children: "Favorite Cart"
240
+ })]
241
+ }), /* @__PURE__ */ E("p", {
242
+ className: "text-sm font-bold text-text-primary truncate",
243
+ children: U.favoriteCart
232
244
  })]
233
- }), /* @__PURE__ */ E("p", {
234
- className: "text-sm font-bold text-text-primary truncate",
235
- children: V.favoriteCart
236
- })]
237
- })
238
- ]
245
+ })
246
+ ]
247
+ })
239
248
  }),
240
249
  /* @__PURE__ */ E("div", {
241
250
  className: "rounded-lg border border-border-seam bg-bg-surface p-4 mb-6 bg-gloss-card shadow-pop",
@@ -247,34 +256,34 @@ function M() {
247
256
  children: [/* @__PURE__ */ E(b, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ E("input", {
248
257
  type: "text",
249
258
  placeholder: "Search orders...",
250
- value: I.searchQuery,
251
- onChange: (e) => G("searchQuery", e.target.value),
259
+ value: R.searchQuery,
260
+ onChange: (e) => q("searchQuery", e.target.value),
252
261
  className: "w-full rounded-lg border border-border-subtle bg-bg-surface pl-9 pr-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)]"
253
262
  })]
254
263
  }),
255
264
  /* @__PURE__ */ E("select", {
256
- value: I.status,
257
- onChange: (e) => G("status", e.target.value),
265
+ value: R.status,
266
+ onChange: (e) => q("status", e.target.value),
258
267
  className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
259
- children: k.map((e) => /* @__PURE__ */ E("option", {
268
+ children: j.map((e) => /* @__PURE__ */ E("option", {
260
269
  value: e.value,
261
270
  children: e.label
262
271
  }, e.value))
263
272
  }),
264
273
  /* @__PURE__ */ E("select", {
265
- value: I.dateRange,
266
- onChange: (e) => G("dateRange", e.target.value),
274
+ value: R.dateRange,
275
+ onChange: (e) => q("dateRange", e.target.value),
267
276
  className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
268
- children: A.map((e) => /* @__PURE__ */ E("option", {
277
+ children: M.map((e) => /* @__PURE__ */ E("option", {
269
278
  value: e.value,
270
279
  children: e.label
271
280
  }, e.value))
272
281
  }),
273
282
  /* @__PURE__ */ E("select", {
274
- value: I.sortBy,
275
- onChange: (e) => G("sortBy", e.target.value),
283
+ value: R.sortBy,
284
+ onChange: (e) => q("sortBy", e.target.value),
276
285
  className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]",
277
- children: j.map((e) => /* @__PURE__ */ E("option", {
286
+ children: N.map((e) => /* @__PURE__ */ E("option", {
278
287
  value: e.value,
279
288
  children: e.label
280
289
  }, e.value))
@@ -282,25 +291,25 @@ function M() {
282
291
  ]
283
292
  })
284
293
  }),
285
- z ? /* @__PURE__ */ D("div", {
294
+ V ? /* @__PURE__ */ D("div", {
286
295
  className: "flex flex-col items-center justify-center py-12 text-center",
287
296
  children: [/* @__PURE__ */ E("div", { className: "animate-spin rounded-full h-12 w-12 border-b-2 border-foreground mx-auto mb-4" }), /* @__PURE__ */ E("p", {
288
297
  className: "text-sm text-text-secondary",
289
298
  children: "Loading orders..."
290
299
  })]
291
- }) : U.length === 0 ? /* @__PURE__ */ E(r, {
292
- icon: /* @__PURE__ */ E(x, { className: "h-12 w-12" }),
300
+ }) : G.length === 0 ? /* @__PURE__ */ E(r, {
301
+ illustration: R.searchQuery || R.status ? "empty-search" : "empty-data",
293
302
  title: "No orders found",
294
- description: I.searchQuery || I.status ? "Try adjusting your filters" : "You haven't placed any orders yet",
303
+ description: R.searchQuery || R.status ? "Try adjusting your filters" : "You haven't placed any orders yet",
295
304
  action: /* @__PURE__ */ E("button", {
296
305
  type: "button",
297
- onClick: () => M("/customer/carts"),
306
+ onClick: () => P("/customer/carts"),
298
307
  className: "rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity",
299
308
  children: "Start Ordering"
300
309
  })
301
310
  }) : /* @__PURE__ */ E("div", {
302
311
  className: "space-y-4",
303
- children: U.map((e) => /* @__PURE__ */ E("div", {
312
+ children: G.map((e) => /* @__PURE__ */ E("div", {
304
313
  className: "rounded-lg border border-border-subtle bg-bg-surface hover:shadow-md transition-shadow",
305
314
  children: /* @__PURE__ */ D("div", {
306
315
  className: "p-4 md:p-5",
@@ -333,12 +342,12 @@ function M() {
333
342
  className: "flex gap-2",
334
343
  children: [/* @__PURE__ */ D("button", {
335
344
  type: "button",
336
- onClick: () => M(`/customer/orders/${e.id}`),
345
+ onClick: () => P(`/customer/orders/${e.id}`),
337
346
  className: "flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors",
338
347
  children: [/* @__PURE__ */ E(m, { className: "h-3 w-3" }), "Track Order"]
339
348
  }), e.status === "delivered" && /* @__PURE__ */ D("button", {
340
349
  type: "button",
341
- onClick: () => K(e),
350
+ onClick: () => J(e),
342
351
  className: "flex items-center gap-1.5 rounded-lg bg-foreground px-3 py-1.5 text-xs font-medium text-background hover:opacity-90 transition-opacity",
343
352
  children: [/* @__PURE__ */ E(y, { className: "h-3 w-3" }), "Reorder"]
344
353
  })]
@@ -409,7 +418,7 @@ function M() {
409
418
  })]
410
419
  }) : /* @__PURE__ */ D("button", {
411
420
  type: "button",
412
- onClick: () => M(`/customer/orders/${e.id}/rate`),
421
+ onClick: () => P(`/customer/orders/${e.id}/rate`),
413
422
  className: "flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-1.5 text-xs font-medium text-text-primary hover:bg-accent transition-colors",
414
423
  children: [/* @__PURE__ */ E(S, { className: "h-3 w-3" }), "Rate Order"]
415
424
  })
@@ -418,12 +427,12 @@ function M() {
418
427
  })
419
428
  }, e.id))
420
429
  }),
421
- W && !z && /* @__PURE__ */ E("div", {
430
+ K && !V && /* @__PURE__ */ E("div", {
422
431
  className: "text-center mt-8",
423
432
  children: /* @__PURE__ */ D("button", {
424
433
  type: "button",
425
434
  onClick: () => {
426
- F((e) => e + O);
435
+ L((e) => e + A);
427
436
  },
428
437
  className: "inline-flex items-center gap-2 rounded-lg border border-border-subtle px-6 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
429
438
  children: [/* @__PURE__ */ E(f, { className: "h-4 w-4" }), "Load More Orders"]
@@ -433,6 +442,6 @@ function M() {
433
442
  });
434
443
  }
435
444
  //#endregion
436
- export { M as OrderHistoryPage };
445
+ export { P as OrderHistoryPage };
437
446
 
438
447
  //# sourceMappingURL=OrderHistoryPage.js.map