@burdenoff/microfe-subscriberbot 2026.624.1 → 2026.625.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 (104) hide show
  1. package/dist/subscriberbot/components/EmptyState.js +17 -10
  2. package/dist/subscriberbot/components/EmptyState.js.map +1 -1
  3. package/dist/subscriberbot/components/InvestmentCard.js +23 -22
  4. package/dist/subscriberbot/components/InvestmentCard.js.map +1 -1
  5. package/dist/subscriberbot/components/MetricsCard.js +15 -12
  6. package/dist/subscriberbot/components/MetricsCard.js.map +1 -1
  7. package/dist/subscriberbot/components/PageLayout.js +27 -15
  8. package/dist/subscriberbot/components/PageLayout.js.map +1 -1
  9. package/dist/subscriberbot/components/RatingDisplay.js +3 -3
  10. package/dist/subscriberbot/components/RatingDisplay.js.map +1 -1
  11. package/dist/subscriberbot/components/StatusBadge.js +25 -13
  12. package/dist/subscriberbot/components/StatusBadge.js.map +1 -1
  13. package/dist/subscriberbot/context/SubscriberBotContext.js.map +1 -1
  14. package/dist/subscriberbot/pages/HomePage.js +67 -63
  15. package/dist/subscriberbot/pages/HomePage.js.map +1 -1
  16. package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js +42 -42
  17. package/dist/subscriberbot/pages/admin/AdminAnalyticsPage.js.map +1 -1
  18. package/dist/subscriberbot/pages/admin/AdminDashboard.js +42 -41
  19. package/dist/subscriberbot/pages/admin/AdminDashboard.js.map +1 -1
  20. package/dist/subscriberbot/pages/admin/AdminFinancialPage.js +14 -14
  21. package/dist/subscriberbot/pages/admin/AdminFinancialPage.js.map +1 -1
  22. package/dist/subscriberbot/pages/admin/AdminOrdersPage.js +24 -24
  23. package/dist/subscriberbot/pages/admin/AdminOrdersPage.js.map +1 -1
  24. package/dist/subscriberbot/pages/admin/AdminProfilePage.js +11 -11
  25. package/dist/subscriberbot/pages/admin/AdminProfilePage.js.map +1 -1
  26. package/dist/subscriberbot/pages/admin/AdminSettingsPage.js +14 -14
  27. package/dist/subscriberbot/pages/admin/AdminSettingsPage.js.map +1 -1
  28. package/dist/subscriberbot/pages/admin/CartManagementPage.js +41 -41
  29. package/dist/subscriberbot/pages/admin/CartManagementPage.js.map +1 -1
  30. package/dist/subscriberbot/pages/admin/UserManagementPage.js +47 -47
  31. package/dist/subscriberbot/pages/admin/UserManagementPage.js.map +1 -1
  32. package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js +44 -44
  33. package/dist/subscriberbot/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  34. package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js +17 -17
  35. package/dist/subscriberbot/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  36. package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js +94 -89
  37. package/dist/subscriberbot/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  38. package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js +58 -58
  39. package/dist/subscriberbot/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  40. package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js +51 -51
  41. package/dist/subscriberbot/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  42. package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js +54 -54
  43. package/dist/subscriberbot/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  44. package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js +54 -53
  45. package/dist/subscriberbot/pages/cart-owner/OrderManagementPage.js.map +1 -1
  46. package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js +51 -51
  47. package/dist/subscriberbot/pages/cart-owner/StaffManagementPage.js.map +1 -1
  48. package/dist/subscriberbot/pages/common/HelpSupportPage.js +65 -65
  49. package/dist/subscriberbot/pages/common/HelpSupportPage.js.map +1 -1
  50. package/dist/subscriberbot/pages/common/NotificationCenterPage.js +46 -45
  51. package/dist/subscriberbot/pages/common/NotificationCenterPage.js.map +1 -1
  52. package/dist/subscriberbot/pages/common/SettingsPage.js +46 -46
  53. package/dist/subscriberbot/pages/common/SettingsPage.js.map +1 -1
  54. package/dist/subscriberbot/pages/customer/BookingDetailsPage.js +24 -23
  55. package/dist/subscriberbot/pages/customer/BookingDetailsPage.js.map +1 -1
  56. package/dist/subscriberbot/pages/customer/CartDetailPage.js +31 -30
  57. package/dist/subscriberbot/pages/customer/CartDetailPage.js.map +1 -1
  58. package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js +25 -23
  59. package/dist/subscriberbot/pages/customer/CartDiscoveryPage.js.map +1 -1
  60. package/dist/subscriberbot/pages/customer/CheckoutPage.js +26 -26
  61. package/dist/subscriberbot/pages/customer/CheckoutPage.js.map +1 -1
  62. package/dist/subscriberbot/pages/customer/CustomerDashboard.js +39 -38
  63. package/dist/subscriberbot/pages/customer/CustomerDashboard.js.map +1 -1
  64. package/dist/subscriberbot/pages/customer/CustomerProfilePage.js +36 -36
  65. package/dist/subscriberbot/pages/customer/CustomerProfilePage.js.map +1 -1
  66. package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js +37 -36
  67. package/dist/subscriberbot/pages/customer/DirectServiceBookingPage.js.map +1 -1
  68. package/dist/subscriberbot/pages/customer/FavoritesPage.js +16 -15
  69. package/dist/subscriberbot/pages/customer/FavoritesPage.js.map +1 -1
  70. package/dist/subscriberbot/pages/customer/OrderHistoryPage.js +19 -17
  71. package/dist/subscriberbot/pages/customer/OrderHistoryPage.js.map +1 -1
  72. package/dist/subscriberbot/pages/customer/OrderTrackingPage.js +21 -20
  73. package/dist/subscriberbot/pages/customer/OrderTrackingPage.js.map +1 -1
  74. package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js +22 -21
  75. package/dist/subscriberbot/pages/customer/PaymentMethodsPage.js.map +1 -1
  76. package/dist/subscriberbot/pages/customer/ReviewsPage.js +29 -28
  77. package/dist/subscriberbot/pages/customer/ReviewsPage.js.map +1 -1
  78. package/dist/subscriberbot/pages/customer/SavedAddressesPage.js +26 -25
  79. package/dist/subscriberbot/pages/customer/SavedAddressesPage.js.map +1 -1
  80. package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js +46 -46
  81. package/dist/subscriberbot/pages/investor/InvestmentDetailsPage.js.map +1 -1
  82. package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js +34 -32
  83. package/dist/subscriberbot/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  84. package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js +38 -38
  85. package/dist/subscriberbot/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  86. package/dist/subscriberbot/pages/investor/InvestorDashboard.js +26 -25
  87. package/dist/subscriberbot/pages/investor/InvestorDashboard.js.map +1 -1
  88. package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js +12 -11
  89. package/dist/subscriberbot/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  90. package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js +25 -25
  91. package/dist/subscriberbot/pages/investor/InvestorPortfolioPage.js.map +1 -1
  92. package/dist/subscriberbot/pages/investor/InvestorProfilePage.js +58 -58
  93. package/dist/subscriberbot/pages/investor/InvestorProfilePage.js.map +1 -1
  94. package/dist/subscriberbot/pages/worker/TaskDetailsPage.js +26 -25
  95. package/dist/subscriberbot/pages/worker/TaskDetailsPage.js.map +1 -1
  96. package/dist/subscriberbot/pages/worker/WorkerDashboard.js +48 -47
  97. package/dist/subscriberbot/pages/worker/WorkerDashboard.js.map +1 -1
  98. package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js +41 -40
  99. package/dist/subscriberbot/pages/worker/WorkerOrdersPage.js.map +1 -1
  100. package/dist/subscriberbot/pages/worker/WorkerProfilePage.js +44 -44
  101. package/dist/subscriberbot/pages/worker/WorkerProfilePage.js.map +1 -1
  102. package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js +32 -30
  103. package/dist/subscriberbot/pages/worker/WorkerSchedulePage.js.map +1 -1
  104. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"CartDiscoveryPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/CartDiscoveryPage.tsx"],"sourcesContent":["/**\n * Cart Discovery Page\n * @module subscriberbot/pages/customer\n *\n * Browse and search service providers (carts) with full filtering:\n * category, rating, price range, sort, search. Grid view with\n * cart info modal, load more, investment indicators, scheduled stops,\n * direct service links, verified badges, and prep time badges.\n */\n\nimport { useState, useMemo } from 'react';\nimport type { MockCart } from '../../types';\nimport {\n Search,\n X,\n Star,\n MapPin,\n Clock,\n CheckCircle2,\n Info,\n Home,\n TrendingUp,\n Calendar,\n Tag,\n Loader2,\n AlertCircle,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useProviders, useInvestmentOpportunities } from '../../hooks/useSubscriberBotApi';\nimport { cn } from '../../utils/cn';\nimport { formatDistance, formatCurrency } from '../../utils/formatters';\n\nconst ALL_CATEGORIES = 'All';\n\ntype RatingFilter = '' | '4.5' | '4.0' | '3.5';\ntype PriceFilter = '' | 'low' | 'medium' | 'high';\ntype SortBy = 'rating' | 'popularity' | 'distance' | 'newest';\n\nexport function CartDiscoveryPage() {\n const { navigateTo } = useSubscriberBot();\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string>(ALL_CATEGORIES);\n const [ratingFilter, setRatingFilter] = useState<RatingFilter>('');\n const [priceFilter, setPriceFilter] = useState<PriceFilter>('');\n const [sortBy, setSortBy] = useState<SortBy>('rating');\n const [visibleCount, setVisibleCount] = useState(9);\n const [showCartInfo, setShowCartInfo] = useState(false);\n const [selectedCartInfo, setSelectedCartInfo] = useState<MockCart | null>(null);\n\n const { data: providers = [], isLoading, isError } = useProviders();\n const { data: investmentOpportunities = [] } = useInvestmentOpportunities();\n\n const categories = useMemo(() => {\n const cats = new Set<string>();\n providers.forEach((p) => {\n if (p.category) cats.add(p.category);\n });\n return [ALL_CATEGORIES, ...Array.from(cats)];\n }, [providers]);\n\n const filteredCarts = useMemo(() => {\n let carts = [...providers];\n\n // Search query\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n carts = carts.filter(\n (c) => c.name.toLowerCase().includes(q) || c.category.toLowerCase().includes(q)\n );\n }\n\n // Category filter\n if (selectedCategory !== ALL_CATEGORIES) {\n carts = carts.filter((cart) => cart.category === selectedCategory);\n }\n\n // Rating filter\n if (ratingFilter) {\n const minRating = parseFloat(ratingFilter);\n carts = carts.filter((cart) => cart.rating >= minRating);\n }\n\n // Price range filter\n if (priceFilter) {\n carts = carts.filter((cart) => {\n const avg = cart.averageOrderValue ?? 0;\n switch (priceFilter) {\n case 'low':\n return avg <= 300;\n case 'medium':\n return avg > 300 && avg <= 800;\n case 'high':\n return avg > 800;\n default:\n return true;\n }\n });\n }\n\n // Sort\n switch (sortBy) {\n case 'rating':\n carts.sort((a, b) => b.rating - a.rating);\n break;\n case 'popularity':\n carts.sort((a, b) => (b.totalRatings || 0) - (a.totalRatings || 0));\n break;\n case 'distance':\n carts.sort((a, b) => (a.distance || 0) - (b.distance || 0));\n break;\n case 'newest':\n carts.sort(\n (a, b) => new Date(b.createdAt || 0).getTime() - new Date(a.createdAt || 0).getTime()\n );\n break;\n }\n\n return carts;\n }, [providers, searchQuery, selectedCategory, ratingFilter, priceFilter, sortBy]);\n\n const visibleCarts = filteredCarts.slice(0, visibleCount);\n const hasMore = visibleCount < filteredCarts.length;\n\n const hasActiveFilters =\n selectedCategory !== ALL_CATEGORIES ||\n ratingFilter !== '' ||\n priceFilter !== '' ||\n searchQuery.trim() !== '';\n\n const clearAllFilters = () => {\n setSearchQuery('');\n setSelectedCategory(ALL_CATEGORIES);\n setRatingFilter('');\n setPriceFilter('');\n setSortBy('rating');\n setVisibleCount(9);\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Discover Carts\" description=\"Finding services and shops near you...\">\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 (isError) {\n return (\n <PageLayout title=\"Discover Carts\" description=\"Error loading carts\">\n <div className=\"flex h-[60vh] flex-col items-center justify-center gap-4\">\n <AlertCircle className=\"h-12 w-12 text-status-error-text\" />\n <h2 className=\"text-xl font-semibold\">Error loading service providers</h2>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text\"\n >\n Retry\n </button>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Discover Carts\"\n description=\"Find services and shops near you\"\n actions={\n <span className=\"text-sm text-text-secondary\">{filteredCarts.length} carts found</span>\n }\n >\n {/* Search Bar */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search carts, services, or items...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n 'w-full rounded-lg border border-border-subtle bg-bg-surface py-2.5 pl-10 pr-10 text-sm text-text-primary',\n 'placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]'\n )}\n />\n {searchQuery && (\n <button\n type=\"button\"\n onClick={() => setSearchQuery('')}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary hover:text-text-primary\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n\n {/* Category Chips */}\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {categories.map((category) => (\n <button\n key={category}\n type=\"button\"\n onClick={() => setSelectedCategory(category)}\n className={cn(\n 'rounded-full px-3 py-1.5 text-xs font-medium transition-colors',\n selectedCategory === category\n ? 'bg-foreground text-background'\n : 'bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary'\n )}\n >\n {category}\n </button>\n ))}\n </div>\n\n {/* Filter Row */}\n <div className=\"mt-4 flex flex-wrap items-center gap-3\">\n <select\n value={ratingFilter}\n onChange={(e) => setRatingFilter(e.target.value as RatingFilter)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Any Rating</option>\n <option value=\"4.5\">4.5+ Stars</option>\n <option value=\"4.0\">4.0+ Stars</option>\n <option value=\"3.5\">3.5+ Stars</option>\n </select>\n\n <select\n value={priceFilter}\n onChange={(e) => setPriceFilter(e.target.value as PriceFilter)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Any Price</option>\n <option value=\"low\">Under ₹300</option>\n <option value=\"medium\">₹300 - ₹800</option>\n <option value=\"high\">₹800+</option>\n </select>\n\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value as SortBy)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"rating\">Highest Rated</option>\n <option value=\"popularity\">Most Popular</option>\n <option value=\"distance\">Nearest</option>\n <option value=\"newest\">Newest</option>\n </select>\n\n {hasActiveFilters && (\n <button\n type=\"button\"\n onClick={clearAllFilters}\n className=\"rounded-lg border border-border-subtle px-3 py-2 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n Clear All Filters\n </button>\n )}\n </div>\n\n {/* Cart Grid */}\n {visibleCarts.length > 0 ? (\n <>\n <div className=\"mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {visibleCarts.map((cart) => {\n const investment = investmentOpportunities.find((o) => o.cartId === cart.id);\n return (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden hover:shadow-md transition-shadow flex flex-col\"\n >\n {/* Image */}\n <div className=\"relative h-40 bg-bg-sunken\">\n <img src={cart.image} alt={cart.name} className=\"h-full w-full object-cover\" />\n <div className=\"absolute top-2 left-2 flex gap-1.5\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium backdrop-blur-sm',\n cart.isOpen\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : 'bg-red-500/20 text-red-600 dark:text-red-400'\n )}\n >\n {cart.isOpen ? 'Open' : 'Closed'}\n </span>\n {cart.isVerified && (\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-blue-500/20 px-2 py-0.5 text-xs font-medium text-blue-600 dark:text-blue-400 backdrop-blur-sm\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Verified\n </span>\n )}\n </div>\n <div className=\"absolute top-2 right-2\">\n <span className=\"rounded-full bg-black/50 px-2 py-0.5 text-xs text-white backdrop-blur-sm\">\n {cart.estimatedTime} min\n </span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"flex flex-col flex-1 p-4\">\n <div className=\"flex items-start justify-between gap-2 mb-1\">\n <h3 className=\"text-sm font-semibold text-text-primary truncate flex-1\">\n {cart.name}\n </h3>\n <div className=\"flex items-center gap-1 shrink-0\">\n <Star className=\"h-3.5 w-3.5 fill-yellow-400 text-yellow-400\" />\n <span className=\"text-xs font-medium text-text-primary\">{cart.rating}</span>\n <span className=\"text-xs text-text-secondary\">({cart.totalRatings})</span>\n </div>\n </div>\n\n <p className=\"text-xs text-text-secondary mb-2\">{cart.category}</p>\n\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-2\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {cart.location?.address?.split(',')[0] || 'Unknown'}\n </span>\n </div>\n\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-3\">\n {cart.averageOrderValue && (\n <span>\n Avg {formatCurrency(cart.averageOrderValue, { minimumFractionDigits: 0 })}\n </span>\n )}\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {formatDistance(cart.distance)}\n </span>\n </div>\n\n {/* Scheduled Stop Info */}\n {cart.serviceTypes?.includes('appointment') && (\n <div className=\"mb-3 rounded-md bg-blue-500/10 border border-blue-500/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-blue-600 dark:text-blue-400\">\n <Calendar className=\"h-3 w-3\" />\n <span className=\"font-medium\">Appointment available</span>\n </div>\n </div>\n )}\n\n {/* Direct Service Info */}\n {cart.serviceTypes?.includes('direct_service') && (\n <div className=\"mb-3 rounded-md bg-purple-500/10 border border-purple-500/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-purple-600 dark:text-purple-400\">\n <Home className=\"h-3 w-3\" />\n <span className=\"font-medium\">Direct Service Available</span>\n </div>\n </div>\n )}\n\n {/* Tags */}\n {cart.serviceTypes && cart.serviceTypes.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mb-3\">\n {cart.serviceTypes.slice(0, 3).map((tag: string) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-[10px] text-text-secondary\"\n >\n {tag.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n )}\n\n <div className=\"mt-auto flex gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n disabled={!cart.isOpen}\n className={cn(\n 'flex-1 rounded-lg py-2 text-xs font-medium transition-opacity',\n cart.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {cart.isOpen ? 'View Services' : 'Closed'}\n </button>\n\n {cart.serviceTypes?.includes('direct_service') && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n className=\"rounded-lg border border-border-subtle px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors\"\n title=\"Book Direct Service\"\n >\n <Home className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n {investment && (\n <button\n type=\"button\"\n onClick={() =>\n alert('Investment opportunity available! View in Investor section.')\n }\n className=\"rounded-lg border border-green-500/30 bg-green-500/10 px-2 py-2 text-xs text-green-600 dark:text-green-400 hover:bg-green-500/20 transition-colors\"\n title=\"Investment Opportunity\"\n >\n <TrendingUp className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => {\n setSelectedCartInfo(cart);\n setShowCartInfo(true);\n }}\n className=\"rounded-lg border border-border-subtle px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors\"\n title=\"Cart Info\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Load More */}\n {hasMore && (\n <div className=\"mt-8 text-center\">\n <button\n type=\"button\"\n onClick={() => setVisibleCount((prev) => prev + 9)}\n className=\"rounded-lg border border-border-subtle px-6 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Load More Carts\n </button>\n </div>\n )}\n </>\n ) : (\n <div className=\"mt-6\">\n <EmptyState\n icon={<Search className=\"h-12 w-12\" />}\n title=\"No carts found\"\n description={\n searchQuery\n ? `No results for \"${searchQuery}\". Try a different search term.`\n : 'No carts available with these filters.'\n }\n action={\n <button\n type=\"button\"\n onClick={clearAllFilters}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Clear Filters\n </button>\n }\n />\n </div>\n )}\n\n {/* Cart Info Modal */}\n {showCartInfo && selectedCartInfo && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-2xl max-h-[90vh] overflow-y-auto rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"p-5\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Cart Information</h3>\n <button\n type=\"button\"\n onClick={() => setShowCartInfo(false)}\n className=\"rounded-md p-1 text-text-secondary hover:text-text-primary transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {/* Image */}\n <div className=\"h-48 rounded-lg overflow-hidden mb-4\">\n <img\n src={selectedCartInfo.image}\n alt={selectedCartInfo.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n\n {/* Basic Info */}\n <h4 className=\"text-xl font-semibold text-text-primary mb-1\">\n {selectedCartInfo.name}\n </h4>\n <div className=\"flex flex-wrap items-center gap-3 mb-4\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-yellow-400 text-yellow-400\" />\n <span className=\"text-sm font-medium\">{selectedCartInfo.rating}</span>\n <span className=\"text-xs text-text-secondary\">\n ({selectedCartInfo.totalRatings} reviews)\n </span>\n </div>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n selectedCartInfo.isOpen\n ? 'bg-green-500/20 text-green-600 dark:text-green-400'\n : 'bg-red-500/20 text-red-600 dark:text-red-400'\n )}\n >\n {selectedCartInfo.isOpen ? 'Open' : 'Closed'}\n </span>\n </div>\n\n {/* Details Grid */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 mb-4\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> Location\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {selectedCartInfo.location.address}\n </p>\n </div>\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <Tag className=\"h-3 w-3\" /> Category\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">{selectedCartInfo.category}</p>\n </div>\n {selectedCartInfo.averageOrderValue && (\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">Average Order</p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {formatCurrency(selectedCartInfo.averageOrderValue, {\n minimumFractionDigits: 0,\n })}\n </p>\n </div>\n )}\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" /> Estimated Time\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {selectedCartInfo.estimatedTime} minutes\n </p>\n </div>\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">Distance</p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {formatDistance(selectedCartInfo.distance)}\n </p>\n </div>\n {selectedCartInfo.isVerified && (\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <CheckCircle2 className=\"h-3 w-3\" /> Verification\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">Verified cart</p>\n </div>\n )}\n </div>\n\n {/* Service Types */}\n {selectedCartInfo.serviceTypes && selectedCartInfo.serviceTypes.length > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Service Types</p>\n <div className=\"flex flex-wrap gap-2\">\n {(selectedCartInfo.serviceTypes as string[]).map((type: string) => (\n <span\n key={type}\n className=\"rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary capitalize\"\n >\n {type.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Business Hours */}\n {selectedCartInfo.businessHours &&\n Object.keys(selectedCartInfo.businessHours).length > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">\n Operating Hours\n </p>\n <div className=\"space-y-1\">\n {Object.entries(selectedCartInfo.businessHours as Record<string, any>).map(\n ([day, hours]) => (\n <div key={day} className=\"flex justify-between text-xs\">\n <span className=\"capitalize text-text-primary\">{day}</span>\n <span className=\"text-text-secondary\">\n {hours.isOpen ? `${hours.open} - ${hours.close}` : 'Closed'}\n </span>\n </div>\n )\n )}\n </div>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => {\n setShowCartInfo(false);\n navigateTo(`/customer/carts/${selectedCartInfo.id}`);\n }}\n disabled={!selectedCartInfo.isOpen}\n className={cn(\n 'flex-1 rounded-lg py-2.5 text-sm font-medium transition-opacity',\n selectedCartInfo.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {selectedCartInfo.isOpen ? 'View Menu' : 'Currently Closed'}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowCartInfo(false)}\n className=\"rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CartDiscoveryPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/CartDiscoveryPage.tsx"],"sourcesContent":["/**\n * Cart Discovery Page\n * @module subscriberbot/pages/customer\n *\n * Browse and search service providers (carts) with full filtering:\n * category, rating, price range, sort, search. Grid view with\n * cart info modal, load more, investment indicators, scheduled stops,\n * direct service links, verified badges, and prep time badges.\n */\n\nimport { useState, useMemo } from 'react';\nimport type { MockCart } from '../../types';\nimport {\n Search,\n X,\n Star,\n MapPin,\n Clock,\n CheckCircle2,\n Info,\n Home,\n TrendingUp,\n Calendar,\n Tag,\n Loader2,\n AlertCircle,\n} from 'lucide-react';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useProviders, useInvestmentOpportunities } from '../../hooks/useSubscriberBotApi';\nimport { cn } from '../../utils/cn';\nimport { formatDistance, formatCurrency } from '../../utils/formatters';\n\nconst ALL_CATEGORIES = 'All';\n\ntype RatingFilter = '' | '4.5' | '4.0' | '3.5';\ntype PriceFilter = '' | 'low' | 'medium' | 'high';\ntype SortBy = 'rating' | 'popularity' | 'distance' | 'newest';\n\nexport function CartDiscoveryPage() {\n const { navigateTo } = useSubscriberBot();\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedCategory, setSelectedCategory] = useState<string>(ALL_CATEGORIES);\n const [ratingFilter, setRatingFilter] = useState<RatingFilter>('');\n const [priceFilter, setPriceFilter] = useState<PriceFilter>('');\n const [sortBy, setSortBy] = useState<SortBy>('rating');\n const [visibleCount, setVisibleCount] = useState(9);\n const [showCartInfo, setShowCartInfo] = useState(false);\n const [selectedCartInfo, setSelectedCartInfo] = useState<MockCart | null>(null);\n\n const { data: providers = [], isLoading, isError } = useProviders();\n const { data: investmentOpportunities = [] } = useInvestmentOpportunities();\n\n const categories = useMemo(() => {\n const cats = new Set<string>();\n providers.forEach((p) => {\n if (p.category) cats.add(p.category);\n });\n return [ALL_CATEGORIES, ...Array.from(cats)];\n }, [providers]);\n\n const filteredCarts = useMemo(() => {\n let carts = [...providers];\n\n // Search query\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n carts = carts.filter(\n (c) => c.name.toLowerCase().includes(q) || c.category.toLowerCase().includes(q)\n );\n }\n\n // Category filter\n if (selectedCategory !== ALL_CATEGORIES) {\n carts = carts.filter((cart) => cart.category === selectedCategory);\n }\n\n // Rating filter\n if (ratingFilter) {\n const minRating = parseFloat(ratingFilter);\n carts = carts.filter((cart) => cart.rating >= minRating);\n }\n\n // Price range filter\n if (priceFilter) {\n carts = carts.filter((cart) => {\n const avg = cart.averageOrderValue ?? 0;\n switch (priceFilter) {\n case 'low':\n return avg <= 300;\n case 'medium':\n return avg > 300 && avg <= 800;\n case 'high':\n return avg > 800;\n default:\n return true;\n }\n });\n }\n\n // Sort\n switch (sortBy) {\n case 'rating':\n carts.sort((a, b) => b.rating - a.rating);\n break;\n case 'popularity':\n carts.sort((a, b) => (b.totalRatings || 0) - (a.totalRatings || 0));\n break;\n case 'distance':\n carts.sort((a, b) => (a.distance || 0) - (b.distance || 0));\n break;\n case 'newest':\n carts.sort(\n (a, b) => new Date(b.createdAt || 0).getTime() - new Date(a.createdAt || 0).getTime()\n );\n break;\n }\n\n return carts;\n }, [providers, searchQuery, selectedCategory, ratingFilter, priceFilter, sortBy]);\n\n const visibleCarts = filteredCarts.slice(0, visibleCount);\n const hasMore = visibleCount < filteredCarts.length;\n\n const hasActiveFilters =\n selectedCategory !== ALL_CATEGORIES ||\n ratingFilter !== '' ||\n priceFilter !== '' ||\n searchQuery.trim() !== '';\n\n const clearAllFilters = () => {\n setSearchQuery('');\n setSelectedCategory(ALL_CATEGORIES);\n setRatingFilter('');\n setPriceFilter('');\n setSortBy('rating');\n setVisibleCount(9);\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Discover Carts\" description=\"Finding services and shops near you...\">\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 (isError) {\n return (\n <PageLayout title=\"Discover Carts\" description=\"Error loading carts\">\n <div className=\"flex h-[60vh] flex-col items-center justify-center gap-4\">\n <AlertCircle className=\"h-12 w-12 text-status-error-text\" />\n <h2 className=\"text-xl font-semibold\">Error loading service providers</h2>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text\"\n >\n Retry\n </button>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Discover Carts\"\n description=\"Find services and shops near you\"\n titleGradient\n actions={\n <span className=\"text-sm text-text-secondary\">{filteredCarts.length} carts found</span>\n }\n >\n {/* Search Bar */}\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <input\n type=\"text\"\n placeholder=\"Search carts, services, or items...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n 'w-full rounded-lg border border-border-seam bg-bg-surface py-2.5 pl-10 pr-10 text-sm text-text-primary',\n 'placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]'\n )}\n />\n {searchQuery && (\n <button\n type=\"button\"\n onClick={() => setSearchQuery('')}\n className=\"absolute right-3 top-1/2 -translate-y-1/2 text-text-secondary hover:text-text-primary\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n\n {/* Category Chips */}\n <div className=\"mt-4 flex flex-wrap gap-2\">\n {categories.map((category) => (\n <button\n key={category}\n type=\"button\"\n onClick={() => setSelectedCategory(category)}\n className={cn(\n 'rounded-full px-3 py-1.5 text-xs font-medium transition-colors',\n selectedCategory === category\n ? 'bg-foreground text-background'\n : 'bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary'\n )}\n >\n {category}\n </button>\n ))}\n </div>\n\n {/* Filter Row */}\n <div className=\"mt-4 flex flex-wrap items-center gap-3\">\n <select\n value={ratingFilter}\n onChange={(e) => setRatingFilter(e.target.value as RatingFilter)}\n className=\"rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Any Rating</option>\n <option value=\"4.5\">4.5+ Stars</option>\n <option value=\"4.0\">4.0+ Stars</option>\n <option value=\"3.5\">3.5+ Stars</option>\n </select>\n\n <select\n value={priceFilter}\n onChange={(e) => setPriceFilter(e.target.value as PriceFilter)}\n className=\"rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Any Price</option>\n <option value=\"low\">Under ₹300</option>\n <option value=\"medium\">₹300 - ₹800</option>\n <option value=\"high\">₹800+</option>\n </select>\n\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value as SortBy)}\n className=\"rounded-lg border border-border-seam bg-bg-surface px-3 py-2 text-xs text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"rating\">Highest Rated</option>\n <option value=\"popularity\">Most Popular</option>\n <option value=\"distance\">Nearest</option>\n <option value=\"newest\">Newest</option>\n </select>\n\n {hasActiveFilters && (\n <button\n type=\"button\"\n onClick={clearAllFilters}\n className=\"rounded-lg border border-border-seam px-3 py-2 text-xs font-medium text-text-secondary hover:text-text-primary transition-colors\"\n >\n Clear All Filters\n </button>\n )}\n </div>\n\n {/* Cart Grid */}\n {visibleCarts.length > 0 ? (\n <>\n <div className=\"mt-6 grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {visibleCarts.map((cart) => {\n const investment = investmentOpportunities.find((o) => o.cartId === cart.id);\n return (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-seam bg-bg-surface shadow-sm overflow-hidden hover:shadow-md transition-shadow flex flex-col\"\n >\n {/* Image */}\n <div className=\"relative h-40 bg-bg-sunken\">\n <img src={cart.image} alt={cart.name} className=\"h-full w-full object-cover\" />\n <div className=\"absolute top-2 left-2 flex gap-1.5\">\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium backdrop-blur-sm',\n cart.isOpen\n ? 'bg-status-success-bg/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 {cart.isVerified && (\n <span className=\"inline-flex items-center gap-0.5 rounded-full bg-status-info-bg/20 px-2 py-0.5 text-xs font-medium text-status-info-text backdrop-blur-sm\">\n <CheckCircle2 className=\"h-3 w-3\" />\n Verified\n </span>\n )}\n </div>\n <div className=\"absolute top-2 right-2\">\n <span className=\"rounded-full bg-bg-canvas/50 px-2 py-0.5 text-xs text-text-inverse backdrop-blur-sm\">\n {cart.estimatedTime} min\n </span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"flex flex-col flex-1 p-4\">\n <div className=\"flex items-start justify-between gap-2 mb-1\">\n <h3 className=\"text-sm font-semibold text-text-primary truncate flex-1\">\n {cart.name}\n </h3>\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\">({cart.totalRatings})</span>\n </div>\n </div>\n\n <p className=\"text-xs text-text-secondary mb-2\">{cart.category}</p>\n\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-2\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {cart.location?.address?.split(',')[0] || 'Unknown'}\n </span>\n </div>\n\n <div className=\"flex items-center gap-3 text-xs text-text-secondary mb-3\">\n {cart.averageOrderValue && (\n <span>\n Avg {formatCurrency(cart.averageOrderValue, { minimumFractionDigits: 0 })}\n </span>\n )}\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {formatDistance(cart.distance)}\n </span>\n </div>\n\n {/* Scheduled Stop Info */}\n {cart.serviceTypes?.includes('appointment') && (\n <div className=\"mb-3 rounded-md bg-status-info-bg/10 border border-status-info-border/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-status-info-text\">\n <Calendar className=\"h-3 w-3\" />\n <span className=\"font-medium\">Appointment available</span>\n </div>\n </div>\n )}\n\n {/* Direct Service Info */}\n {cart.serviceTypes?.includes('direct_service') && (\n <div className=\"mb-3 rounded-md bg-accent-purple-subtle border border-accent-purple/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-accent-purple\">\n <Home className=\"h-3 w-3\" />\n <span className=\"font-medium\">Direct Service Available</span>\n </div>\n </div>\n )}\n\n {/* Tags */}\n {cart.serviceTypes && cart.serviceTypes.length > 0 && (\n <div className=\"flex flex-wrap gap-1 mb-3\">\n {cart.serviceTypes.slice(0, 3).map((tag: string) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-[10px] text-text-secondary\"\n >\n {tag.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n )}\n\n <div className=\"mt-auto flex gap-2\">\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n disabled={!cart.isOpen}\n className={cn(\n 'flex-1 rounded-lg py-2 text-xs font-medium transition-opacity',\n cart.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {cart.isOpen ? 'View Services' : 'Closed'}\n </button>\n\n {cart.serviceTypes?.includes('direct_service') && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n className=\"rounded-lg border border-border-seam px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors\"\n title=\"Book Direct Service\"\n >\n <Home className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n {investment && (\n <button\n type=\"button\"\n onClick={() =>\n alert('Investment opportunity available! View in Investor section.')\n }\n className=\"rounded-lg border border-status-success-border/30 bg-status-success-bg/10 px-2 py-2 text-xs text-status-success-text hover:bg-status-success-bg/20 transition-colors\"\n title=\"Investment Opportunity\"\n >\n <TrendingUp className=\"h-3.5 w-3.5\" />\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => {\n setSelectedCartInfo(cart);\n setShowCartInfo(true);\n }}\n className=\"rounded-lg border border-border-seam px-2 py-2 text-xs text-text-primary hover:bg-accent transition-colors\"\n title=\"Cart Info\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Load More */}\n {hasMore && (\n <div className=\"mt-8 text-center\">\n <button\n type=\"button\"\n onClick={() => setVisibleCount((prev) => prev + 9)}\n className=\"rounded-lg border border-border-seam px-6 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Load More Carts\n </button>\n </div>\n )}\n </>\n ) : (\n <div className=\"mt-6\">\n <EmptyState\n illustration=\"empty-search\"\n icon={<Search className=\"h-12 w-12\" />}\n title=\"No carts found\"\n description={\n searchQuery\n ? `No results for \"${searchQuery}\". Try a different search term.`\n : 'No carts available with these filters.'\n }\n action={\n <button\n type=\"button\"\n onClick={clearAllFilters}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Clear Filters\n </button>\n }\n />\n </div>\n )}\n\n {/* Cart Info Modal */}\n {showCartInfo && selectedCartInfo && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-bg-canvas/50 p-4\">\n <div className=\"w-full max-w-2xl max-h-[90vh] overflow-y-auto rounded-lg border border-border-seam bg-bg-surface\">\n <div className=\"p-5\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Cart Information</h3>\n <button\n type=\"button\"\n onClick={() => setShowCartInfo(false)}\n className=\"rounded-md p-1 text-text-secondary hover:text-text-primary transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n\n {/* Image */}\n <div className=\"h-48 rounded-lg overflow-hidden mb-4\">\n <img\n src={selectedCartInfo.image}\n alt={selectedCartInfo.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n\n {/* Basic Info */}\n <h4 className=\"text-xl font-semibold text-text-primary mb-1\">\n {selectedCartInfo.name}\n </h4>\n <div className=\"flex flex-wrap items-center gap-3 mb-4\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-sm font-medium\">{selectedCartInfo.rating}</span>\n <span className=\"text-xs text-text-secondary\">\n ({selectedCartInfo.totalRatings} reviews)\n </span>\n </div>\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium',\n selectedCartInfo.isOpen\n ? 'bg-status-success-bg/20 text-status-success-text'\n : 'bg-status-error-bg/20 text-status-error-text'\n )}\n >\n {selectedCartInfo.isOpen ? 'Open' : 'Closed'}\n </span>\n </div>\n\n {/* Details Grid */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 mb-4\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> Location\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {selectedCartInfo.location.address}\n </p>\n </div>\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <Tag className=\"h-3 w-3\" /> Category\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">{selectedCartInfo.category}</p>\n </div>\n {selectedCartInfo.averageOrderValue && (\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">Average Order</p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {formatCurrency(selectedCartInfo.averageOrderValue, {\n minimumFractionDigits: 0,\n })}\n </p>\n </div>\n )}\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" /> Estimated Time\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {selectedCartInfo.estimatedTime} minutes\n </p>\n </div>\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary\">Distance</p>\n <p className=\"mt-1 text-sm text-text-primary\">\n {formatDistance(selectedCartInfo.distance)}\n </p>\n </div>\n {selectedCartInfo.isVerified && (\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <p className=\"text-xs font-medium text-text-secondary flex items-center gap-1\">\n <CheckCircle2 className=\"h-3 w-3\" /> Verification\n </p>\n <p className=\"mt-1 text-sm text-text-primary\">Verified cart</p>\n </div>\n )}\n </div>\n\n {/* Service Types */}\n {selectedCartInfo.serviceTypes && selectedCartInfo.serviceTypes.length > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Service Types</p>\n <div className=\"flex flex-wrap gap-2\">\n {(selectedCartInfo.serviceTypes as string[]).map((type: string) => (\n <span\n key={type}\n className=\"rounded-full bg-bg-sunken px-2.5 py-1 text-xs text-text-secondary capitalize\"\n >\n {type.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Business Hours */}\n {selectedCartInfo.businessHours &&\n Object.keys(selectedCartInfo.businessHours).length > 0 && (\n <div className=\"mb-4\">\n <p className=\"text-xs font-medium text-text-secondary mb-2\">Operating Hours</p>\n <div className=\"space-y-1\">\n {Object.entries(selectedCartInfo.businessHours as Record<string, any>).map(\n ([day, hours]) => (\n <div key={day} className=\"flex justify-between text-xs\">\n <span className=\"capitalize text-text-primary\">{day}</span>\n <span className=\"text-text-secondary\">\n {hours.isOpen ? `${hours.open} - ${hours.close}` : 'Closed'}\n </span>\n </div>\n )\n )}\n </div>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex gap-3 mt-6\">\n <button\n type=\"button\"\n onClick={() => {\n setShowCartInfo(false);\n navigateTo(`/customer/carts/${selectedCartInfo.id}`);\n }}\n disabled={!selectedCartInfo.isOpen}\n className={cn(\n 'flex-1 rounded-lg py-2.5 text-sm font-medium transition-opacity',\n selectedCartInfo.isOpen\n ? 'bg-foreground text-background hover:opacity-90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n {selectedCartInfo.isOpen ? 'View Menu' : 'Currently Closed'}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowCartInfo(false)}\n className=\"rounded-lg border border-border-seam px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Close\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -108,7 +108,7 @@ function C() {
108
108
  className: "lg:col-span-2 space-y-6",
109
109
  children: [
110
110
  /* @__PURE__ */ b("section", {
111
- className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
111
+ className: "rounded-lg border border-border-seam bg-bg-surface p-5",
112
112
  children: [/* @__PURE__ */ b("h2", {
113
113
  className: "text-base font-semibold text-text-primary mb-4 flex items-center gap-2",
114
114
  children: [/* @__PURE__ */ y(h, { className: "h-4 w-4 text-text-secondary" }), "Delivery Address"]
@@ -126,7 +126,7 @@ function C() {
126
126
  placeholder: "Building, Street, Area",
127
127
  value: E.addressLine1,
128
128
  onChange: (e) => H("addressLine1", e.target.value),
129
- className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
129
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
130
130
  })] }),
131
131
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("label", {
132
132
  className: "block text-sm font-medium text-text-primary mb-1.5",
@@ -136,7 +136,7 @@ function C() {
136
136
  placeholder: "Apartment, Suite, Floor (Optional)",
137
137
  value: E.addressLine2,
138
138
  onChange: (e) => H("addressLine2", e.target.value),
139
- className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
139
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
140
140
  })] }),
141
141
  /* @__PURE__ */ b("div", {
142
142
  className: "grid grid-cols-1 sm:grid-cols-2 gap-4",
@@ -150,7 +150,7 @@ function C() {
150
150
  type: "text",
151
151
  value: E.city,
152
152
  onChange: (e) => H("city", e.target.value),
153
- className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
153
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
154
154
  })] }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
155
155
  className: "block text-sm font-medium text-text-primary mb-1.5",
156
156
  children: ["State ", /* @__PURE__ */ y("span", {
@@ -161,7 +161,7 @@ function C() {
161
161
  type: "text",
162
162
  value: E.state,
163
163
  onChange: (e) => H("state", e.target.value),
164
- className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
164
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
165
165
  })] })]
166
166
  }),
167
167
  /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
@@ -176,13 +176,13 @@ function C() {
176
176
  maxLength: 6,
177
177
  value: E.pincode,
178
178
  onChange: (e) => H("pincode", e.target.value.replace(/\D/g, "")),
179
- className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
179
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
180
180
  })] })
181
181
  ]
182
182
  })]
183
183
  }),
184
184
  /* @__PURE__ */ b("section", {
185
- className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
185
+ className: "rounded-lg border border-border-seam bg-bg-surface p-5",
186
186
  children: [
187
187
  /* @__PURE__ */ b("h2", {
188
188
  className: "text-base font-semibold text-text-primary mb-4 flex items-center gap-2",
@@ -195,7 +195,7 @@ function C() {
195
195
  return /* @__PURE__ */ b("button", {
196
196
  type: "button",
197
197
  onClick: () => k(e.id),
198
- className: t("flex w-full items-center gap-4 rounded-lg border p-3 transition-colors text-left", O === e.id ? "border-foreground bg-accent" : "border-border-subtle bg-bg-surface hover:bg-accent"),
198
+ className: t("flex w-full items-center gap-4 rounded-lg border p-3 transition-colors text-left", O === e.id ? "border-foreground bg-accent" : "border-border-seam bg-bg-surface hover:bg-accent"),
199
199
  children: [
200
200
  /* @__PURE__ */ y("div", {
201
201
  className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-bg-sunken",
@@ -217,7 +217,7 @@ function C() {
217
217
  })
218
218
  }),
219
219
  O === "card" && /* @__PURE__ */ b("div", {
220
- className: "mt-4 space-y-4 border-t border-border-subtle pt-4",
220
+ className: "mt-4 space-y-4 border-t border-border-seam pt-4",
221
221
  children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
222
222
  className: "block text-sm font-medium text-text-primary mb-1.5",
223
223
  children: ["Card Number ", /* @__PURE__ */ y("span", {
@@ -230,7 +230,7 @@ function C() {
230
230
  maxLength: 16,
231
231
  value: A.cardNumber,
232
232
  onChange: (e) => U("cardNumber", e.target.value.replace(/\D/g, "")),
233
- className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
233
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
234
234
  })] }), /* @__PURE__ */ b("div", {
235
235
  className: "grid grid-cols-1 sm:grid-cols-2 gap-4",
236
236
  children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
@@ -248,7 +248,7 @@ function C() {
248
248
  let t = e.target.value.replace(/\D/g, "");
249
249
  t.length >= 2 && (t = t.slice(0, 2) + "/" + t.slice(2, 4)), U("expiryDate", t);
250
250
  },
251
- className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
251
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
252
252
  })] }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
253
253
  className: "block text-sm font-medium text-text-primary mb-1.5",
254
254
  children: ["CVV ", /* @__PURE__ */ y("span", {
@@ -261,12 +261,12 @@ function C() {
261
261
  maxLength: 3,
262
262
  value: A.cvv,
263
263
  onChange: (e) => U("cvv", e.target.value.replace(/\D/g, "")),
264
- className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
264
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
265
265
  })] })]
266
266
  })]
267
267
  }),
268
268
  O === "upi" && /* @__PURE__ */ b("div", {
269
- className: "mt-4 border-t border-border-subtle pt-4",
269
+ className: "mt-4 border-t border-border-seam pt-4",
270
270
  children: [/* @__PURE__ */ b("label", {
271
271
  className: "block text-sm font-medium text-text-primary mb-1.5",
272
272
  children: ["UPI ID ", /* @__PURE__ */ y("span", {
@@ -278,20 +278,20 @@ function C() {
278
278
  placeholder: "user@paytm",
279
279
  value: A.upiId,
280
280
  onChange: (e) => U("upiId", e.target.value),
281
- className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
281
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
282
282
  })]
283
283
  }),
284
284
  O === "wallet" && /* @__PURE__ */ b("div", {
285
- className: "mt-4 flex items-start gap-3 rounded-lg bg-blue-500/10 p-4 border border-blue-500/20",
286
- children: [/* @__PURE__ */ y(c, { className: "h-4 w-4 text-blue-600 dark:text-blue-400 mt-0.5 shrink-0" }), /* @__PURE__ */ y("p", {
287
- className: "text-sm text-blue-600 dark:text-blue-400",
285
+ className: "mt-4 flex items-start gap-3 rounded-lg bg-status-info-bg/10 p-4 border border-status-info-border/20",
286
+ children: [/* @__PURE__ */ y(c, { className: "h-4 w-4 text-status-info-text mt-0.5 shrink-0" }), /* @__PURE__ */ y("p", {
287
+ className: "text-sm text-status-info-text",
288
288
  children: "Digital wallet integration coming soon. Please choose another payment method."
289
289
  })]
290
290
  })
291
291
  ]
292
292
  }),
293
293
  /* @__PURE__ */ b("section", {
294
- className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
294
+ className: "rounded-lg border border-border-seam bg-bg-surface p-5",
295
295
  children: [/* @__PURE__ */ b("h2", {
296
296
  className: "text-base font-semibold text-text-primary mb-4 flex items-center gap-2",
297
297
  children: [/* @__PURE__ */ y(p, { className: "h-4 w-4 text-text-secondary" }), "Additional Options"]
@@ -321,7 +321,7 @@ function C() {
321
321
  let t = e.target.value;
322
322
  F(t), N(parseInt(t) || 0);
323
323
  },
324
- className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
324
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]"
325
325
  })
326
326
  ] }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("label", {
327
327
  className: "block text-sm font-medium text-text-primary mb-2",
@@ -331,7 +331,7 @@ function C() {
331
331
  placeholder: "Any special requests for your order...",
332
332
  value: I,
333
333
  onChange: (e) => L(e.target.value),
334
- className: "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none"
334
+ className: "w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none"
335
335
  })] })]
336
336
  })]
337
337
  })
@@ -339,14 +339,14 @@ function C() {
339
339
  }), /* @__PURE__ */ y("div", {
340
340
  className: "lg:col-span-1",
341
341
  children: /* @__PURE__ */ b("div", {
342
- className: "sticky top-6 rounded-lg border border-border-subtle bg-bg-surface p-5",
342
+ className: "sticky top-6 rounded-lg border border-border-seam bg-bg-surface p-5",
343
343
  children: [
344
344
  /* @__PURE__ */ y("h2", {
345
345
  className: "text-base font-semibold text-text-primary mb-4",
346
346
  children: "Order Summary"
347
347
  }),
348
348
  /* @__PURE__ */ b("div", {
349
- className: "flex items-center gap-3 mb-4 pb-4 border-b border-border-subtle",
349
+ className: "flex items-center gap-3 mb-4 pb-4 border-b border-border-seam",
350
350
  children: [/* @__PURE__ */ y("div", {
351
351
  className: "h-12 w-12 rounded-md bg-bg-sunken overflow-hidden",
352
352
  children: /* @__PURE__ */ y("img", {
@@ -397,7 +397,7 @@ function C() {
397
397
  }, e.id))
398
398
  }),
399
399
  /* @__PURE__ */ b("div", {
400
- className: "border-t border-border-subtle pt-4 space-y-2.5 text-sm",
400
+ className: "border-t border-border-seam pt-4 space-y-2.5 text-sm",
401
401
  children: [
402
402
  /* @__PURE__ */ b("div", {
403
403
  className: "flex justify-between",
@@ -446,17 +446,17 @@ function C() {
446
446
  B.discount && B.discount > 0 && /* @__PURE__ */ b("div", {
447
447
  className: "flex justify-between",
448
448
  children: [/* @__PURE__ */ y("span", {
449
- className: "text-green-600 dark:text-green-400",
449
+ className: "text-status-success-text",
450
450
  children: "Discount"
451
451
  }), /* @__PURE__ */ b("span", {
452
- className: "text-green-600 dark:text-green-400",
452
+ className: "text-status-success-text",
453
453
  children: ["-", a(B.discount, { minimumFractionDigits: 0 })]
454
454
  })]
455
455
  })
456
456
  ]
457
457
  }),
458
458
  /* @__PURE__ */ b("div", {
459
- className: "mt-4 flex justify-between border-t border-border-subtle pt-4",
459
+ className: "mt-4 flex justify-between border-t border-border-seam pt-4",
460
460
  children: [/* @__PURE__ */ y("span", {
461
461
  className: "text-base font-semibold text-text-primary",
462
462
  children: "Total"
@@ -1 +1 @@
1
- {"version":3,"file":"CheckoutPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/CheckoutPage.tsx"],"sourcesContent":["/**\n * Checkout Page\n * @module subscriberbot/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 { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useOrders, usePlaceOrder } from '../../hooks/useSubscriberBotApi';\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: 'SubscriberBot Wallet Balance' },\n];\n\nconst quickTips = [0, 10, 20, 30];\n\nexport function CheckoutPage() {\n const { navigateTo, currentUser } = useSubscriberBot();\n const { data: allOrders = [], isLoading } = useOrders({ customerId: currentUser?.id });\n const placeOrderMutation = usePlaceOrder();\n\n // Use the first pending order as the \"current order\" being placed, or most recent\n const order = useMemo(() => {\n return allOrders.find((o) => o.status === 'pending') || allOrders[0];\n }, [allOrders]);\n\n const [deliveryAddress, setDeliveryAddress] = useState<DeliveryAddress>({\n addressLine1: '',\n addressLine2: '',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '',\n });\n\n const [selectedPayment, setSelectedPayment] = useState<PaymentMethod>('cash');\n const [paymentDetails, setPaymentDetails] = useState<PaymentDetails>({\n cardNumber: '',\n expiryDate: '',\n cvv: '',\n upiId: '',\n });\n\n const [tip, setTip] = useState(0);\n const [customTipInput, setCustomTipInput] = useState('');\n const [specialInstructions, setSpecialInstructions] = useState('');\n const [isPlacing, setIsPlacing] = useState(false);\n\n // Calculate order summary dynamically\n const orderSummary = useMemo(() => {\n if (!order) return { subtotal: 0, deliveryFee: 0, tax: 0, total: 0 };\n const subtotal = order.subtotal;\n const deliveryFee = order.deliveryFee;\n const tax = order.taxes;\n const discount = order.discount ?? 0;\n const total = subtotal + deliveryFee + tax + tip - discount;\n return { subtotal, deliveryFee, tax, discount, total };\n }, [order, tip]);\n\n const totalItems = useMemo(() => {\n if (!order) return 0;\n return order.items.reduce((sum, item) => sum + item.quantity, 0);\n }, [order]);\n\n const handleAddressChange = (field: keyof DeliveryAddress, value: string) => {\n setDeliveryAddress((prev) => ({ ...prev, [field]: value }));\n };\n\n const handlePaymentDetailsChange = (field: keyof PaymentDetails, value: string) => {\n setPaymentDetails((prev) => ({ ...prev, [field]: value }));\n };\n\n const validateForm = (): boolean => {\n if (!deliveryAddress.addressLine1.trim()) {\n alert('Please enter delivery address');\n return false;\n }\n if (!deliveryAddress.pincode.trim() || deliveryAddress.pincode.length !== 6) {\n alert('Please enter a valid 6-digit pincode');\n return false;\n }\n if (selectedPayment === 'card') {\n if (!paymentDetails.cardNumber || paymentDetails.cardNumber.length < 16) {\n alert('Please enter a valid 16-digit card number');\n return false;\n }\n if (!paymentDetails.expiryDate) {\n alert('Please enter card expiry date');\n return false;\n }\n if (!paymentDetails.cvv || paymentDetails.cvv.length < 3) {\n alert('Please enter a valid 3-digit CVV');\n return false;\n }\n }\n if (selectedPayment === 'upi' && !paymentDetails.upiId.trim()) {\n alert('Please enter UPI ID');\n return false;\n }\n return true;\n };\n\n const handlePlaceOrder = async () => {\n if (!validateForm() || !order) return;\n\n try {\n const result = await placeOrderMutation.mutateAsync({\n providerId: order.cartId,\n customerId: currentUser?.id,\n items: order.items.map((i) => ({\n offeringId: i.id,\n quantity: i.quantity,\n customizations: i.customizations,\n })),\n deliveryAddress: `${deliveryAddress.addressLine1}, ${deliveryAddress.addressLine2}, ${deliveryAddress.city}, ${deliveryAddress.state} - ${deliveryAddress.pincode}`,\n paymentMethod: selectedPayment.toUpperCase(),\n notes: specialInstructions,\n deliveryFee: orderSummary.deliveryFee,\n tax: orderSummary.tax,\n tip: tip,\n total: orderSummary.total,\n });\n\n alert('Order placed successfully!');\n navigateTo(`/customer/order/${result.id}`);\n } catch (err) {\n alert('Failed to place order. Please try again.');\n }\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Checkout\">\n <div className=\"flex h-[60vh] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!order) {\n return (\n <PageLayout title=\"Checkout\">\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <ShoppingBag className=\"h-16 w-16 text-text-secondary/40 mb-4\" />\n <h3 className=\"text-lg font-semibold text-text-primary mb-2\">Your cart is empty</h3>\n <p className=\"text-sm text-text-secondary mb-6\">\n Add some items to proceed with checkout\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-lg bg-foreground px-6 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Browse Carts\n </button>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Checkout</span>\n </div>\n }\n description=\"Review your order and complete payment\"\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Checkout Form */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Delivery Address */}\n <section className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <MapPin className=\"h-4 w-4 text-text-secondary\" />\n Delivery Address\n </h2>\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Address Line 1 <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"Building, Street, Area\"\n value={deliveryAddress.addressLine1}\n onChange={(e) => handleAddressChange('addressLine1', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Address Line 2\n </label>\n <input\n type=\"text\"\n placeholder=\"Apartment, Suite, Floor (Optional)\"\n value={deliveryAddress.addressLine2}\n onChange={(e) => handleAddressChange('addressLine2', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n City <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n value={deliveryAddress.city}\n onChange={(e) => handleAddressChange('city', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n State <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n value={deliveryAddress.state}\n onChange={(e) => handleAddressChange('state', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Pincode <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"560001\"\n maxLength={6}\n value={deliveryAddress.pincode}\n onChange={(e) =>\n handleAddressChange('pincode', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n </div>\n </section>\n\n {/* Payment Method */}\n <section className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <CreditCard className=\"h-4 w-4 text-text-secondary\" />\n Payment Method\n </h2>\n <div className=\"space-y-2\">\n {paymentMethods.map((method) => {\n const Icon = method.icon;\n return (\n <button\n key={method.id}\n type=\"button\"\n onClick={() => setSelectedPayment(method.id)}\n className={cn(\n 'flex w-full items-center gap-4 rounded-lg border p-3 transition-colors text-left',\n selectedPayment === method.id\n ? 'border-foreground bg-accent'\n : 'border-border-subtle bg-bg-surface hover:bg-accent'\n )}\n >\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-bg-sunken\">\n <Icon className=\"h-4 w-4 text-text-secondary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">{method.label}</p>\n <p className=\"text-xs text-text-secondary\">{method.description}</p>\n </div>\n {selectedPayment === method.id && (\n <CheckCircle2 className=\"h-5 w-5 text-text-primary shrink-0\" />\n )}\n </button>\n );\n })}\n </div>\n\n {/* Card Payment Details */}\n {selectedPayment === 'card' && (\n <div className=\"mt-4 space-y-4 border-t border-border-subtle pt-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Card Number <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"1234 5678 9012 3456\"\n maxLength={16}\n value={paymentDetails.cardNumber}\n onChange={(e) =>\n handlePaymentDetailsChange('cardNumber', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Expiry Date <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"MM/YY\"\n maxLength={5}\n value={paymentDetails.expiryDate}\n onChange={(e) => {\n let value = e.target.value.replace(/\\D/g, '');\n if (value.length >= 2) {\n value = value.slice(0, 2) + '/' + value.slice(2, 4);\n }\n handlePaymentDetailsChange('expiryDate', value);\n }}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n CVV <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"123\"\n maxLength={3}\n value={paymentDetails.cvv}\n onChange={(e) =>\n handlePaymentDetailsChange('cvv', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n </div>\n </div>\n )}\n\n {/* UPI ID */}\n {selectedPayment === 'upi' && (\n <div className=\"mt-4 border-t border-border-subtle pt-4\">\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n UPI ID <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"user@paytm\"\n value={paymentDetails.upiId}\n onChange={(e) => handlePaymentDetailsChange('upiId', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n )}\n\n {/* Wallet notice */}\n {selectedPayment === 'wallet' && (\n <div className=\"mt-4 flex items-start gap-3 rounded-lg bg-blue-500/10 p-4 border border-blue-500/20\">\n <AlertCircle className=\"h-4 w-4 text-blue-600 dark:text-blue-400 mt-0.5 shrink-0\" />\n <p className=\"text-sm text-blue-600 dark:text-blue-400\">\n Digital wallet integration coming soon. Please choose another payment method.\n </p>\n </div>\n )}\n </section>\n\n {/* Tip and Special Instructions */}\n <section className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Heart className=\"h-4 w-4 text-text-secondary\" />\n Additional Options\n </h2>\n <div className=\"space-y-5\">\n {/* Tip Selection */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-2\">\n Tip for delivery partner\n </label>\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {quickTips.map((amount) => (\n <button\n key={amount}\n type=\"button\"\n onClick={() => {\n setTip(amount);\n setCustomTipInput('');\n }}\n className={cn(\n 'flex-1 min-w-[64px] rounded-lg px-3 py-2.5 text-sm font-medium transition-colors',\n tip === amount && customTipInput === ''\n ? 'bg-foreground text-background'\n : 'bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary'\n )}\n >\n {amount === 0 ? 'No Tip' : `₹${amount}`}\n </button>\n ))}\n </div>\n <input\n type=\"number\"\n placeholder=\"Custom tip amount\"\n value={customTipInput}\n onChange={(e) => {\n const val = e.target.value;\n setCustomTipInput(val);\n setTip(parseInt(val) || 0);\n }}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n\n {/* Special Instructions */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-2\">\n Special Instructions\n </label>\n <textarea\n rows={3}\n placeholder=\"Any special requests for your order...\"\n value={specialInstructions}\n onChange={(e) => setSpecialInstructions(e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none\"\n />\n </div>\n </div>\n </section>\n </div>\n\n {/* Right: Order Summary & Place Order */}\n <div className=\"lg:col-span-1\">\n <div className=\"sticky top-6 rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Order Summary</h2>\n\n {/* Cart Info */}\n <div className=\"flex items-center gap-3 mb-4 pb-4 border-b border-border-subtle\">\n <div className=\"h-12 w-12 rounded-md bg-bg-sunken overflow-hidden\">\n <img\n src={order.cartImage}\n alt={order.cartName}\n className=\"h-full w-full object-cover\"\n />\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{order.cartName}</p>\n <p className=\"text-xs text-text-secondary\">\n {order.items.length} item{order.items.length !== 1 ? 's' : ''}\n </p>\n </div>\n </div>\n\n {/* Cart Items */}\n <div className=\"space-y-2 mb-4\">\n {order.items.map((item) => (\n <div key={item.id} className=\"flex justify-between items-start\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-text-primary\">{item.name}</p>\n {item.customizations && item.customizations.length > 0 && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {item.customizations.join(', ')}\n </p>\n )}\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(item.price, { minimumFractionDigits: 0 })} x {item.quantity}\n </p>\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(item.price * item.quantity, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n\n {/* Price Breakdown */}\n <div className=\"border-t border-border-subtle pt-4 space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Subtotal ({totalItems} items)</span>\n <span className=\"text-text-primary\">\n {formatCurrency(orderSummary.subtotal, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Delivery Fee</span>\n <span className=\"text-text-primary\">\n {orderSummary.deliveryFee === 0\n ? 'FREE'\n : formatCurrency(orderSummary.deliveryFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tax</span>\n <span className=\"text-text-primary\">\n {formatCurrency(orderSummary.tax, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {tip > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tip</span>\n <span className=\"text-text-primary\">\n {formatCurrency(tip, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n {orderSummary.discount && orderSummary.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-green-600 dark:text-green-400\">Discount</span>\n <span className=\"text-green-600 dark:text-green-400\">\n -{formatCurrency(orderSummary.discount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"mt-4 flex justify-between border-t border-border-subtle pt-4\">\n <span className=\"text-base font-semibold text-text-primary\">Total</span>\n <span className=\"text-base font-bold text-text-primary\">\n {formatCurrency(orderSummary.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n\n <button\n type=\"button\"\n onClick={handlePlaceOrder}\n disabled={placeOrderMutation.isPending}\n className={cn(\n 'mt-6 flex w-full items-center justify-center gap-2 rounded-lg py-3 text-sm font-medium transition-opacity',\n 'bg-foreground text-background',\n placeOrderMutation.isPending ? 'opacity-60 cursor-not-allowed' : 'hover:opacity-90'\n )}\n >\n {placeOrderMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <ShoppingBag className=\"h-4 w-4\" />\n )}\n {placeOrderMutation.isPending\n ? 'Placing Order...'\n : `Place Order - ${formatCurrency(orderSummary.total, { minimumFractionDigits: 0 })}`}\n </button>\n\n <p className=\"mt-3 text-center text-xs text-text-secondary\">\n By placing this order, you agree to our Terms of Service and Privacy Policy\n </p>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CheckoutPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/customer/CheckoutPage.tsx"],"sourcesContent":["/**\n * Checkout Page\n * @module subscriberbot/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 { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useOrders, usePlaceOrder } from '../../hooks/useSubscriberBotApi';\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 {\n id: 'wallet',\n label: 'Digital Wallet',\n icon: Wallet,\n description: 'SubscriberBot Wallet Balance',\n },\n];\n\nconst quickTips = [0, 10, 20, 30];\n\nexport function CheckoutPage() {\n const { navigateTo, currentUser } = useSubscriberBot();\n const { data: allOrders = [], isLoading } = useOrders({ customerId: currentUser?.id });\n const placeOrderMutation = usePlaceOrder();\n\n // Use the first pending order as the \"current order\" being placed, or most recent\n const order = useMemo(() => {\n return allOrders.find((o) => o.status === 'pending') || allOrders[0];\n }, [allOrders]);\n\n const [deliveryAddress, setDeliveryAddress] = useState<DeliveryAddress>({\n addressLine1: '',\n addressLine2: '',\n city: 'Bangalore',\n state: 'Karnataka',\n pincode: '',\n });\n\n const [selectedPayment, setSelectedPayment] = useState<PaymentMethod>('cash');\n const [paymentDetails, setPaymentDetails] = useState<PaymentDetails>({\n cardNumber: '',\n expiryDate: '',\n cvv: '',\n upiId: '',\n });\n\n const [tip, setTip] = useState(0);\n const [customTipInput, setCustomTipInput] = useState('');\n const [specialInstructions, setSpecialInstructions] = useState('');\n const [isPlacing, setIsPlacing] = useState(false);\n\n // Calculate order summary dynamically\n const orderSummary = useMemo(() => {\n if (!order) return { subtotal: 0, deliveryFee: 0, tax: 0, total: 0 };\n const subtotal = order.subtotal;\n const deliveryFee = order.deliveryFee;\n const tax = order.taxes;\n const discount = order.discount ?? 0;\n const total = subtotal + deliveryFee + tax + tip - discount;\n return { subtotal, deliveryFee, tax, discount, total };\n }, [order, tip]);\n\n const totalItems = useMemo(() => {\n if (!order) return 0;\n return order.items.reduce((sum, item) => sum + item.quantity, 0);\n }, [order]);\n\n const handleAddressChange = (field: keyof DeliveryAddress, value: string) => {\n setDeliveryAddress((prev) => ({ ...prev, [field]: value }));\n };\n\n const handlePaymentDetailsChange = (field: keyof PaymentDetails, value: string) => {\n setPaymentDetails((prev) => ({ ...prev, [field]: value }));\n };\n\n const validateForm = (): boolean => {\n if (!deliveryAddress.addressLine1.trim()) {\n alert('Please enter delivery address');\n return false;\n }\n if (!deliveryAddress.pincode.trim() || deliveryAddress.pincode.length !== 6) {\n alert('Please enter a valid 6-digit pincode');\n return false;\n }\n if (selectedPayment === 'card') {\n if (!paymentDetails.cardNumber || paymentDetails.cardNumber.length < 16) {\n alert('Please enter a valid 16-digit card number');\n return false;\n }\n if (!paymentDetails.expiryDate) {\n alert('Please enter card expiry date');\n return false;\n }\n if (!paymentDetails.cvv || paymentDetails.cvv.length < 3) {\n alert('Please enter a valid 3-digit CVV');\n return false;\n }\n }\n if (selectedPayment === 'upi' && !paymentDetails.upiId.trim()) {\n alert('Please enter UPI ID');\n return false;\n }\n return true;\n };\n\n const handlePlaceOrder = async () => {\n if (!validateForm() || !order) return;\n\n try {\n const result = await placeOrderMutation.mutateAsync({\n providerId: order.cartId,\n customerId: currentUser?.id,\n items: order.items.map((i) => ({\n offeringId: i.id,\n quantity: i.quantity,\n customizations: i.customizations,\n })),\n deliveryAddress: `${deliveryAddress.addressLine1}, ${deliveryAddress.addressLine2}, ${deliveryAddress.city}, ${deliveryAddress.state} - ${deliveryAddress.pincode}`,\n paymentMethod: selectedPayment.toUpperCase(),\n notes: specialInstructions,\n deliveryFee: orderSummary.deliveryFee,\n tax: orderSummary.tax,\n tip: tip,\n total: orderSummary.total,\n });\n\n alert('Order placed successfully!');\n navigateTo(`/customer/order/${result.id}`);\n } catch (err) {\n alert('Failed to place order. Please try again.');\n }\n };\n\n if (isLoading) {\n return (\n <PageLayout title=\"Checkout\">\n <div className=\"flex h-[60vh] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!order) {\n return (\n <PageLayout title=\"Checkout\">\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <ShoppingBag className=\"h-16 w-16 text-text-secondary/40 mb-4\" />\n <h3 className=\"text-lg font-semibold text-text-primary mb-2\">Your cart is empty</h3>\n <p className=\"text-sm text-text-secondary mb-6\">\n Add some items to proceed with checkout\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-lg bg-foreground px-6 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Browse Carts\n </button>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Checkout</span>\n </div>\n }\n description=\"Review your order and complete payment\"\n >\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Checkout Form */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Delivery Address */}\n <section className=\"rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <MapPin className=\"h-4 w-4 text-text-secondary\" />\n Delivery Address\n </h2>\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Address Line 1 <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"Building, Street, Area\"\n value={deliveryAddress.addressLine1}\n onChange={(e) => handleAddressChange('addressLine1', e.target.value)}\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Address Line 2\n </label>\n <input\n type=\"text\"\n placeholder=\"Apartment, Suite, Floor (Optional)\"\n value={deliveryAddress.addressLine2}\n onChange={(e) => handleAddressChange('addressLine2', e.target.value)}\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n City <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n value={deliveryAddress.city}\n onChange={(e) => handleAddressChange('city', e.target.value)}\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n State <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n value={deliveryAddress.state}\n onChange={(e) => handleAddressChange('state', e.target.value)}\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Pincode <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"560001\"\n maxLength={6}\n value={deliveryAddress.pincode}\n onChange={(e) =>\n handleAddressChange('pincode', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n </div>\n </section>\n\n {/* Payment Method */}\n <section className=\"rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <CreditCard className=\"h-4 w-4 text-text-secondary\" />\n Payment Method\n </h2>\n <div className=\"space-y-2\">\n {paymentMethods.map((method) => {\n const Icon = method.icon;\n return (\n <button\n key={method.id}\n type=\"button\"\n onClick={() => setSelectedPayment(method.id)}\n className={cn(\n 'flex w-full items-center gap-4 rounded-lg border p-3 transition-colors text-left',\n selectedPayment === method.id\n ? 'border-foreground bg-accent'\n : 'border-border-seam bg-bg-surface hover:bg-accent'\n )}\n >\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-bg-sunken\">\n <Icon className=\"h-4 w-4 text-text-secondary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">{method.label}</p>\n <p className=\"text-xs text-text-secondary\">{method.description}</p>\n </div>\n {selectedPayment === method.id && (\n <CheckCircle2 className=\"h-5 w-5 text-text-primary shrink-0\" />\n )}\n </button>\n );\n })}\n </div>\n\n {/* Card Payment Details */}\n {selectedPayment === 'card' && (\n <div className=\"mt-4 space-y-4 border-t border-border-seam pt-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Card Number <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"1234 5678 9012 3456\"\n maxLength={16}\n value={paymentDetails.cardNumber}\n onChange={(e) =>\n handlePaymentDetailsChange('cardNumber', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Expiry Date <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"MM/YY\"\n maxLength={5}\n value={paymentDetails.expiryDate}\n onChange={(e) => {\n let value = e.target.value.replace(/\\D/g, '');\n if (value.length >= 2) {\n value = value.slice(0, 2) + '/' + value.slice(2, 4);\n }\n handlePaymentDetailsChange('expiryDate', value);\n }}\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n CVV <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"123\"\n maxLength={3}\n value={paymentDetails.cvv}\n onChange={(e) =>\n handlePaymentDetailsChange('cvv', e.target.value.replace(/\\D/g, ''))\n }\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n </div>\n </div>\n )}\n\n {/* UPI ID */}\n {selectedPayment === 'upi' && (\n <div className=\"mt-4 border-t border-border-seam pt-4\">\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n UPI ID <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"user@paytm\"\n value={paymentDetails.upiId}\n onChange={(e) => handlePaymentDetailsChange('upiId', e.target.value)}\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n )}\n\n {/* Wallet notice */}\n {selectedPayment === 'wallet' && (\n <div className=\"mt-4 flex items-start gap-3 rounded-lg bg-status-info-bg/10 p-4 border border-status-info-border/20\">\n <AlertCircle className=\"h-4 w-4 text-status-info-text mt-0.5 shrink-0\" />\n <p className=\"text-sm text-status-info-text\">\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-seam bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4 flex items-center gap-2\">\n <Heart className=\"h-4 w-4 text-text-secondary\" />\n Additional Options\n </h2>\n <div className=\"space-y-5\">\n {/* Tip Selection */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-2\">\n Tip for delivery partner\n </label>\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {quickTips.map((amount) => (\n <button\n key={amount}\n type=\"button\"\n onClick={() => {\n setTip(amount);\n setCustomTipInput('');\n }}\n className={cn(\n 'flex-1 min-w-[64px] rounded-lg px-3 py-2.5 text-sm font-medium transition-colors',\n tip === amount && customTipInput === ''\n ? 'bg-foreground text-background'\n : 'bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary'\n )}\n >\n {amount === 0 ? 'No Tip' : `₹${amount}`}\n </button>\n ))}\n </div>\n <input\n type=\"number\"\n placeholder=\"Custom tip amount\"\n value={customTipInput}\n onChange={(e) => {\n const val = e.target.value;\n setCustomTipInput(val);\n setTip(parseInt(val) || 0);\n }}\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n\n {/* Special Instructions */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-2\">\n Special Instructions\n </label>\n <textarea\n rows={3}\n placeholder=\"Any special requests for your order...\"\n value={specialInstructions}\n onChange={(e) => setSpecialInstructions(e.target.value)}\n className=\"w-full rounded-lg border border-border-seam bg-bg-surface px-3 py-2.5 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none\"\n />\n </div>\n </div>\n </section>\n </div>\n\n {/* Right: Order Summary & Place Order */}\n <div className=\"lg:col-span-1\">\n <div className=\"sticky top-6 rounded-lg border border-border-seam bg-bg-surface p-5\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Order Summary</h2>\n\n {/* Cart Info */}\n <div className=\"flex items-center gap-3 mb-4 pb-4 border-b border-border-seam\">\n <div className=\"h-12 w-12 rounded-md bg-bg-sunken overflow-hidden\">\n <img\n src={order.cartImage}\n alt={order.cartName}\n className=\"h-full w-full object-cover\"\n />\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{order.cartName}</p>\n <p className=\"text-xs text-text-secondary\">\n {order.items.length} item{order.items.length !== 1 ? 's' : ''}\n </p>\n </div>\n </div>\n\n {/* Cart Items */}\n <div className=\"space-y-2 mb-4\">\n {order.items.map((item) => (\n <div key={item.id} className=\"flex justify-between items-start\">\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-text-primary\">{item.name}</p>\n {item.customizations && item.customizations.length > 0 && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {item.customizations.join(', ')}\n </p>\n )}\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(item.price, { minimumFractionDigits: 0 })} x {item.quantity}\n </p>\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(item.price * item.quantity, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n\n {/* Price Breakdown */}\n <div className=\"border-t border-border-seam pt-4 space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Subtotal ({totalItems} items)</span>\n <span className=\"text-text-primary\">\n {formatCurrency(orderSummary.subtotal, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Delivery Fee</span>\n <span className=\"text-text-primary\">\n {orderSummary.deliveryFee === 0\n ? 'FREE'\n : formatCurrency(orderSummary.deliveryFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tax</span>\n <span className=\"text-text-primary\">\n {formatCurrency(orderSummary.tax, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {tip > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tip</span>\n <span className=\"text-text-primary\">\n {formatCurrency(tip, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n {orderSummary.discount && orderSummary.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-status-success-text\">Discount</span>\n <span className=\"text-status-success-text\">\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-seam pt-4\">\n <span className=\"text-base font-semibold text-text-primary\">Total</span>\n <span className=\"text-base font-bold text-text-primary\">\n {formatCurrency(orderSummary.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n\n <button\n type=\"button\"\n onClick={handlePlaceOrder}\n disabled={placeOrderMutation.isPending}\n className={cn(\n 'mt-6 flex w-full items-center justify-center gap-2 rounded-lg py-3 text-sm font-medium transition-opacity',\n 'bg-foreground text-background',\n placeOrderMutation.isPending ? 'opacity-60 cursor-not-allowed' : 'hover:opacity-90'\n )}\n >\n {placeOrderMutation.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <ShoppingBag className=\"h-4 w-4\" />\n )}\n {placeOrderMutation.isPending\n ? 'Placing Order...'\n : `Place Order - ${formatCurrency(orderSummary.total, { minimumFractionDigits: 0 })}`}\n </button>\n\n <p className=\"mt-3 text-center text-xs text-text-secondary\">\n By placing this order, you agree to our Terms of Service and Privacy Policy\n </p>\n </div>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}