@burdenoff/microfe-adaptercloud 2026.625.2 → 2026.628.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 (153) hide show
  1. package/dist/adaptercloud/AdapterCloudRoot.js +65 -121
  2. package/dist/adaptercloud/AdapterCloudRoot.js.map +1 -1
  3. package/dist/adaptercloud/AdapterCloudRoutes.js +70 -182
  4. package/dist/adaptercloud/AdapterCloudRoutes.js.map +1 -1
  5. package/dist/adaptercloud/components/DataState.js +42 -0
  6. package/dist/adaptercloud/components/DataState.js.map +1 -0
  7. package/dist/adaptercloud/components/SeverityBadge.js +12 -0
  8. package/dist/adaptercloud/components/SeverityBadge.js.map +1 -0
  9. package/dist/adaptercloud/components/StatusBadge.js +43 -44
  10. package/dist/adaptercloud/components/StatusBadge.js.map +1 -1
  11. package/dist/adaptercloud/context/AdapterCloudContext.js +22 -30
  12. package/dist/adaptercloud/context/AdapterCloudContext.js.map +1 -1
  13. package/dist/adaptercloud/hooks/useAdapterCloudApi.js +397 -194
  14. package/dist/adaptercloud/hooks/useAdapterCloudApi.js.map +1 -1
  15. package/dist/adaptercloud/index.js +1 -0
  16. package/dist/adaptercloud/pages/OverviewPage.js +334 -0
  17. package/dist/adaptercloud/pages/OverviewPage.js.map +1 -0
  18. package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js +187 -0
  19. package/dist/adaptercloud/pages/adapters/AdapterDetailPage.js.map +1 -0
  20. package/dist/adaptercloud/pages/adapters/AdapterFormPage.js +278 -0
  21. package/dist/adaptercloud/pages/adapters/AdapterFormPage.js.map +1 -0
  22. package/dist/adaptercloud/pages/adapters/AdaptersListPage.js +172 -0
  23. package/dist/adaptercloud/pages/adapters/AdaptersListPage.js.map +1 -0
  24. package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js +247 -0
  25. package/dist/adaptercloud/pages/connections/ConnectionDetailPage.js.map +1 -0
  26. package/dist/adaptercloud/pages/connections/ConnectionFormPage.js +271 -0
  27. package/dist/adaptercloud/pages/connections/ConnectionFormPage.js.map +1 -0
  28. package/dist/adaptercloud/pages/connections/ConnectionsListPage.js +167 -0
  29. package/dist/adaptercloud/pages/connections/ConnectionsListPage.js.map +1 -0
  30. package/dist/adaptercloud/pages/costs/CostsPage.js +169 -0
  31. package/dist/adaptercloud/pages/costs/CostsPage.js.map +1 -0
  32. package/dist/adaptercloud/pages/drift/DriftListPage.js +132 -0
  33. package/dist/adaptercloud/pages/drift/DriftListPage.js.map +1 -0
  34. package/dist/adaptercloud/pages/policies/PoliciesListPage.js +171 -0
  35. package/dist/adaptercloud/pages/policies/PoliciesListPage.js.map +1 -0
  36. package/dist/adaptercloud/pages/policies/PolicyDetailPage.js +185 -0
  37. package/dist/adaptercloud/pages/policies/PolicyDetailPage.js.map +1 -0
  38. package/dist/adaptercloud/pages/policies/PolicyFormPage.js +215 -0
  39. package/dist/adaptercloud/pages/policies/PolicyFormPage.js.map +1 -0
  40. package/dist/adaptercloud/pages/resources/ResourceDetailPage.js +207 -0
  41. package/dist/adaptercloud/pages/resources/ResourceDetailPage.js.map +1 -0
  42. package/dist/adaptercloud/pages/resources/ResourcesListPage.js +182 -0
  43. package/dist/adaptercloud/pages/resources/ResourcesListPage.js.map +1 -0
  44. package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js +196 -0
  45. package/dist/adaptercloud/pages/sync-runs/SyncRunsListPage.js.map +1 -0
  46. package/dist/adaptercloud/pages/violations/ViolationsListPage.js +258 -0
  47. package/dist/adaptercloud/pages/violations/ViolationsListPage.js.map +1 -0
  48. package/dist/adaptercloud/store/adaptercloudStore.js +1 -7
  49. package/dist/adaptercloud/store/adaptercloudStore.js.map +1 -1
  50. package/dist/adaptercloud/utils/domain.js +105 -0
  51. package/dist/adaptercloud/utils/domain.js.map +1 -0
  52. package/dist/adaptercloud/utils/formatters.js +1 -12
  53. package/dist/adaptercloud/utils/formatters.js.map +1 -1
  54. package/dist/index.js +5 -4
  55. package/package.json +1 -1
  56. package/dist/adaptercloud/components/InvestmentCard.js +0 -98
  57. package/dist/adaptercloud/components/InvestmentCard.js.map +0 -1
  58. package/dist/adaptercloud/components/RatingDisplay.js +0 -35
  59. package/dist/adaptercloud/components/RatingDisplay.js.map +0 -1
  60. package/dist/adaptercloud/mocks/data.js +0 -1517
  61. package/dist/adaptercloud/mocks/data.js.map +0 -1
  62. package/dist/adaptercloud/mocks/users.js +0 -34
  63. package/dist/adaptercloud/mocks/users.js.map +0 -1
  64. package/dist/adaptercloud/pages/HomePage.js +0 -934
  65. package/dist/adaptercloud/pages/HomePage.js.map +0 -1
  66. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js +0 -653
  67. package/dist/adaptercloud/pages/admin/AdminAnalyticsPage.js.map +0 -1
  68. package/dist/adaptercloud/pages/admin/AdminDashboard.js +0 -665
  69. package/dist/adaptercloud/pages/admin/AdminDashboard.js.map +0 -1
  70. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js +0 -426
  71. package/dist/adaptercloud/pages/admin/AdminFinancialPage.js.map +0 -1
  72. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js +0 -665
  73. package/dist/adaptercloud/pages/admin/AdminOrdersPage.js.map +0 -1
  74. package/dist/adaptercloud/pages/admin/AdminProfilePage.js +0 -261
  75. package/dist/adaptercloud/pages/admin/AdminProfilePage.js.map +0 -1
  76. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js +0 -663
  77. package/dist/adaptercloud/pages/admin/AdminSettingsPage.js.map +0 -1
  78. package/dist/adaptercloud/pages/admin/CartManagementPage.js +0 -874
  79. package/dist/adaptercloud/pages/admin/CartManagementPage.js.map +0 -1
  80. package/dist/adaptercloud/pages/admin/UserManagementPage.js +0 -898
  81. package/dist/adaptercloud/pages/admin/UserManagementPage.js.map +0 -1
  82. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js +0 -840
  83. package/dist/adaptercloud/pages/cart-owner/AnalyticsDashboard.js.map +0 -1
  84. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js +0 -714
  85. package/dist/adaptercloud/pages/cart-owner/BusinessSettingsPage.js.map +0 -1
  86. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js +0 -788
  87. package/dist/adaptercloud/pages/cart-owner/CartOwnerDashboard.js.map +0 -1
  88. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js +0 -888
  89. package/dist/adaptercloud/pages/cart-owner/CartOwnerProfilePage.js.map +0 -1
  90. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js +0 -634
  91. package/dist/adaptercloud/pages/cart-owner/CartServiceConfigPage.js.map +0 -1
  92. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js +0 -907
  93. package/dist/adaptercloud/pages/cart-owner/InventoryManagementPage.js.map +0 -1
  94. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js +0 -875
  95. package/dist/adaptercloud/pages/cart-owner/OrderManagementPage.js.map +0 -1
  96. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js +0 -827
  97. package/dist/adaptercloud/pages/cart-owner/StaffManagementPage.js.map +0 -1
  98. package/dist/adaptercloud/pages/common/HelpSupportPage.js +0 -1329
  99. package/dist/adaptercloud/pages/common/HelpSupportPage.js.map +0 -1
  100. package/dist/adaptercloud/pages/common/NotificationCenterPage.js +0 -671
  101. package/dist/adaptercloud/pages/common/NotificationCenterPage.js.map +0 -1
  102. package/dist/adaptercloud/pages/common/SettingsPage.js +0 -982
  103. package/dist/adaptercloud/pages/common/SettingsPage.js.map +0 -1
  104. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js +0 -596
  105. package/dist/adaptercloud/pages/customer/BookingDetailsPage.js.map +0 -1
  106. package/dist/adaptercloud/pages/customer/CartDetailPage.js +0 -623
  107. package/dist/adaptercloud/pages/customer/CartDetailPage.js.map +0 -1
  108. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js +0 -552
  109. package/dist/adaptercloud/pages/customer/CartDiscoveryPage.js.map +0 -1
  110. package/dist/adaptercloud/pages/customer/CheckoutPage.js +0 -534
  111. package/dist/adaptercloud/pages/customer/CheckoutPage.js.map +0 -1
  112. package/dist/adaptercloud/pages/customer/CustomerDashboard.js +0 -525
  113. package/dist/adaptercloud/pages/customer/CustomerDashboard.js.map +0 -1
  114. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js +0 -623
  115. package/dist/adaptercloud/pages/customer/CustomerProfilePage.js.map +0 -1
  116. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js +0 -629
  117. package/dist/adaptercloud/pages/customer/DirectServiceBookingPage.js.map +0 -1
  118. package/dist/adaptercloud/pages/customer/FavoritesPage.js +0 -480
  119. package/dist/adaptercloud/pages/customer/FavoritesPage.js.map +0 -1
  120. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js +0 -444
  121. package/dist/adaptercloud/pages/customer/OrderHistoryPage.js.map +0 -1
  122. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js +0 -391
  123. package/dist/adaptercloud/pages/customer/OrderTrackingPage.js.map +0 -1
  124. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js +0 -504
  125. package/dist/adaptercloud/pages/customer/PaymentMethodsPage.js.map +0 -1
  126. package/dist/adaptercloud/pages/customer/ReviewsPage.js +0 -609
  127. package/dist/adaptercloud/pages/customer/ReviewsPage.js.map +0 -1
  128. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js +0 -459
  129. package/dist/adaptercloud/pages/customer/SavedAddressesPage.js.map +0 -1
  130. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js +0 -851
  131. package/dist/adaptercloud/pages/investor/InvestmentDetailsPage.js.map +0 -1
  132. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js +0 -942
  133. package/dist/adaptercloud/pages/investor/InvestmentOpportunitiesPage.js.map +0 -1
  134. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js +0 -683
  135. package/dist/adaptercloud/pages/investor/InvestorAnalyticsPage.js.map +0 -1
  136. package/dist/adaptercloud/pages/investor/InvestorDashboard.js +0 -452
  137. package/dist/adaptercloud/pages/investor/InvestorDashboard.js.map +0 -1
  138. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js +0 -402
  139. package/dist/adaptercloud/pages/investor/InvestorInvestmentsPage.js.map +0 -1
  140. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js +0 -571
  141. package/dist/adaptercloud/pages/investor/InvestorPortfolioPage.js.map +0 -1
  142. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js +0 -1067
  143. package/dist/adaptercloud/pages/investor/InvestorProfilePage.js.map +0 -1
  144. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js +0 -526
  145. package/dist/adaptercloud/pages/worker/TaskDetailsPage.js.map +0 -1
  146. package/dist/adaptercloud/pages/worker/WorkerDashboard.js +0 -659
  147. package/dist/adaptercloud/pages/worker/WorkerDashboard.js.map +0 -1
  148. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js +0 -678
  149. package/dist/adaptercloud/pages/worker/WorkerOrdersPage.js.map +0 -1
  150. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js +0 -689
  151. package/dist/adaptercloud/pages/worker/WorkerProfilePage.js.map +0 -1
  152. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js +0 -582
  153. package/dist/adaptercloud/pages/worker/WorkerSchedulePage.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"CartDiscoveryPage.js","names":[],"sources":["../../../../src/adaptercloud/pages/customer/CartDiscoveryPage.tsx"],"sourcesContent":["/**\n * Cart Discovery Page\n * @module adaptercloud/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 { EmphasisPanel } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from'../../components/PageLayout';\nimport { EmptyState } from'../../components/EmptyState';\nimport { useAdapterCloud } from'../../context/AdapterCloudContext';\nimport { useProviders, useInvestmentOpportunities } from'../../hooks/useAdapterCloudApi';\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 } = useAdapterCloud();\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 purpose=\"Browse the carts (local shops and service providers) operating near you. Search by name, filter by category and rating, and open any cart to see its offerings and place an order or booking.\"\n actions={\n <span className=\"text-sm text-text-secondary\">{filteredCarts.length} carts found</span>\n }\n >\n {/* Search + filters (emphasis zone) */}\n <EmphasisPanel>\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 </EmphasisPanel>\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-status-success-bg-subtle/20 text-status-success-text'\n : 'bg-status-error-bg-subtle/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-accent-blue-subtle/20 px-2 py-0.5 text-xs font-medium text-accent-blue 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-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-accent-blue-subtle/10 border border-accent-blue-subtle/20 p-2\">\n <div className=\"flex items-center gap-1 text-xs text-accent-blue\">\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/10 border border-accent-purple-subtle/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-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-status-success-border/30 bg-status-success-bg-subtle/10 px-2 py-2 text-xs text-status-success-text hover:bg-status-success-bg-subtle/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 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-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-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-subtle/20 text-status-success-text'\n : 'bg-status-error-bg-subtle/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\">\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,534 +0,0 @@
1
- import { useAdapterCloud as e } from "../../context/AdapterCloudContext.js";
2
- import { cn as t } from "../../utils/cn.js";
3
- import { PageLayout as n } from "../../components/PageLayout.js";
4
- import { useOrders as r, usePlaceOrder as i } from "../../hooks/useAdapterCloudApi.js";
5
- import { formatCurrency as a } from "../../utils/formatters.js";
6
- import { useMemo as o, useState as s } from "react";
7
- import { AlertCircle as c, ArrowLeft as l, Banknote as u, CheckCircle2 as d, CreditCard as f, Heart as p, Loader2 as m, MapPin as h, ShoppingBag as g, Smartphone as _, Wallet as v } from "lucide-react";
8
- import { jsx as y, jsxs as b } from "react/jsx-runtime";
9
- import { EmphasisPanel as x } from "@burdenoff/fe-libs/ui";
10
- //#region src/adaptercloud/pages/customer/CheckoutPage.tsx
11
- var S = [
12
- {
13
- id: "cash",
14
- label: "Cash on Delivery",
15
- icon: u,
16
- description: "Pay when you receive"
17
- },
18
- {
19
- id: "card",
20
- label: "Credit / Debit Card",
21
- icon: f,
22
- description: "Visa, Mastercard, RuPay"
23
- },
24
- {
25
- id: "upi",
26
- label: "UPI",
27
- icon: _,
28
- description: "Google Pay, PhonePe, Paytm"
29
- },
30
- {
31
- id: "wallet",
32
- label: "Digital Wallet",
33
- icon: v,
34
- description: "AdapterCloud Wallet Balance"
35
- }
36
- ], C = [
37
- 0,
38
- 10,
39
- 20,
40
- 30
41
- ];
42
- function w() {
43
- let { navigateTo: u, currentUser: _ } = e(), { data: v = [], isLoading: w } = r({ customerId: _?.id }), T = i(), E = o(() => v.find((e) => e.status === "pending") || v[0], [v]), [D, O] = s({
44
- addressLine1: "",
45
- addressLine2: "",
46
- city: "Bangalore",
47
- state: "Karnataka",
48
- pincode: ""
49
- }), [k, A] = s("cash"), [j, M] = s({
50
- cardNumber: "",
51
- expiryDate: "",
52
- cvv: "",
53
- upiId: ""
54
- }), [N, P] = s(0), [F, I] = s(""), [L, R] = s(""), [z, B] = s(!1), V = o(() => {
55
- if (!E) return {
56
- subtotal: 0,
57
- deliveryFee: 0,
58
- tax: 0,
59
- total: 0
60
- };
61
- let e = E.subtotal, t = E.deliveryFee, n = E.taxes, r = E.discount ?? 0;
62
- return {
63
- subtotal: e,
64
- deliveryFee: t,
65
- tax: n,
66
- discount: r,
67
- total: e + t + n + N - r
68
- };
69
- }, [E, N]), H = o(() => E ? E.items.reduce((e, t) => e + t.quantity, 0) : 0, [E]), U = (e, t) => {
70
- O((n) => ({
71
- ...n,
72
- [e]: t
73
- }));
74
- }, W = (e, t) => {
75
- M((n) => ({
76
- ...n,
77
- [e]: t
78
- }));
79
- }, G = () => {
80
- if (!D.addressLine1.trim()) return alert("Please enter delivery address"), !1;
81
- if (!D.pincode.trim() || D.pincode.length !== 6) return alert("Please enter a valid 6-digit pincode"), !1;
82
- if (k === "card") {
83
- if (!j.cardNumber || j.cardNumber.length < 16) return alert("Please enter a valid 16-digit card number"), !1;
84
- if (!j.expiryDate) return alert("Please enter card expiry date"), !1;
85
- if (!j.cvv || j.cvv.length < 3) return alert("Please enter a valid 3-digit CVV"), !1;
86
- }
87
- return k === "upi" && !j.upiId.trim() ? (alert("Please enter UPI ID"), !1) : !0;
88
- };
89
- return w ? /* @__PURE__ */ y(n, {
90
- title: "Checkout",
91
- children: /* @__PURE__ */ y("div", {
92
- className: "flex h-[60vh] items-center justify-center",
93
- children: /* @__PURE__ */ y(m, { className: "h-8 w-8 animate-spin text-primary" })
94
- })
95
- }) : E ? /* @__PURE__ */ y(n, {
96
- title: /* @__PURE__ */ b("div", {
97
- className: "flex items-center gap-3",
98
- children: [/* @__PURE__ */ y("button", {
99
- type: "button",
100
- onClick: () => u("/customer/carts"),
101
- className: "rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors",
102
- children: /* @__PURE__ */ y(l, { className: "h-5 w-5" })
103
- }), /* @__PURE__ */ y("span", { children: "Checkout" })]
104
- }),
105
- description: "Review your order and complete payment",
106
- purpose: "The final step before your order is placed — confirm what's in your cart, choose a delivery address and payment method, and pay securely. Check the totals here so there are no surprises.",
107
- children: /* @__PURE__ */ b("div", {
108
- className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
109
- children: [/* @__PURE__ */ b("div", {
110
- className: "lg:col-span-2 space-y-6",
111
- children: [
112
- /* @__PURE__ */ b("section", {
113
- className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
114
- children: [/* @__PURE__ */ b("h2", {
115
- className: "text-base font-semibold text-text-primary mb-4 flex items-center gap-2",
116
- children: [/* @__PURE__ */ y(h, { className: "h-4 w-4 text-text-secondary" }), "Delivery Address"]
117
- }), /* @__PURE__ */ b("div", {
118
- className: "space-y-4",
119
- children: [
120
- /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
121
- className: "block text-sm font-medium text-text-primary mb-1.5",
122
- children: ["Address Line 1 ", /* @__PURE__ */ y("span", {
123
- className: "text-status-error-text",
124
- children: "*"
125
- })]
126
- }), /* @__PURE__ */ y("input", {
127
- type: "text",
128
- placeholder: "Building, Street, Area",
129
- value: D.addressLine1,
130
- onChange: (e) => U("addressLine1", e.target.value),
131
- 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)]"
132
- })] }),
133
- /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("label", {
134
- className: "block text-sm font-medium text-text-primary mb-1.5",
135
- children: "Address Line 2"
136
- }), /* @__PURE__ */ y("input", {
137
- type: "text",
138
- placeholder: "Apartment, Suite, Floor (Optional)",
139
- value: D.addressLine2,
140
- onChange: (e) => U("addressLine2", e.target.value),
141
- 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)]"
142
- })] }),
143
- /* @__PURE__ */ b("div", {
144
- className: "grid grid-cols-1 sm:grid-cols-2 gap-4",
145
- children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
146
- className: "block text-sm font-medium text-text-primary mb-1.5",
147
- children: ["City ", /* @__PURE__ */ y("span", {
148
- className: "text-status-error-text",
149
- children: "*"
150
- })]
151
- }), /* @__PURE__ */ y("input", {
152
- type: "text",
153
- value: D.city,
154
- onChange: (e) => U("city", e.target.value),
155
- 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)]"
156
- })] }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
157
- className: "block text-sm font-medium text-text-primary mb-1.5",
158
- children: ["State ", /* @__PURE__ */ y("span", {
159
- className: "text-status-error-text",
160
- children: "*"
161
- })]
162
- }), /* @__PURE__ */ y("input", {
163
- type: "text",
164
- value: D.state,
165
- onChange: (e) => U("state", e.target.value),
166
- 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)]"
167
- })] })]
168
- }),
169
- /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
170
- className: "block text-sm font-medium text-text-primary mb-1.5",
171
- children: ["Pincode ", /* @__PURE__ */ y("span", {
172
- className: "text-status-error-text",
173
- children: "*"
174
- })]
175
- }), /* @__PURE__ */ y("input", {
176
- type: "text",
177
- placeholder: "560001",
178
- maxLength: 6,
179
- value: D.pincode,
180
- onChange: (e) => U("pincode", e.target.value.replace(/\D/g, "")),
181
- 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)]"
182
- })] })
183
- ]
184
- })]
185
- }),
186
- /* @__PURE__ */ b("section", {
187
- className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
188
- children: [
189
- /* @__PURE__ */ b("h2", {
190
- className: "text-base font-semibold text-text-primary mb-4 flex items-center gap-2",
191
- children: [/* @__PURE__ */ y(f, { className: "h-4 w-4 text-text-secondary" }), "Payment Method"]
192
- }),
193
- /* @__PURE__ */ y("div", {
194
- className: "space-y-2",
195
- children: S.map((e) => {
196
- let n = e.icon;
197
- return /* @__PURE__ */ b("button", {
198
- type: "button",
199
- onClick: () => A(e.id),
200
- className: t("flex w-full items-center gap-4 rounded-lg border p-3 transition-colors text-left", k === e.id ? "border-foreground bg-accent" : "border-border-subtle bg-bg-surface hover:bg-accent"),
201
- children: [
202
- /* @__PURE__ */ y("div", {
203
- className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-bg-sunken",
204
- children: /* @__PURE__ */ y(n, { className: "h-4 w-4 text-text-secondary" })
205
- }),
206
- /* @__PURE__ */ b("div", {
207
- className: "flex-1 min-w-0",
208
- children: [/* @__PURE__ */ y("p", {
209
- className: "text-sm font-medium text-text-primary",
210
- children: e.label
211
- }), /* @__PURE__ */ y("p", {
212
- className: "text-xs text-text-secondary",
213
- children: e.description
214
- })]
215
- }),
216
- k === e.id && /* @__PURE__ */ y(d, { className: "h-5 w-5 text-text-primary shrink-0" })
217
- ]
218
- }, e.id);
219
- })
220
- }),
221
- k === "card" && /* @__PURE__ */ b("div", {
222
- className: "mt-4 space-y-4 border-t border-border-subtle pt-4",
223
- children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
224
- className: "block text-sm font-medium text-text-primary mb-1.5",
225
- children: ["Card Number ", /* @__PURE__ */ y("span", {
226
- className: "text-status-error-text",
227
- children: "*"
228
- })]
229
- }), /* @__PURE__ */ y("input", {
230
- type: "text",
231
- placeholder: "1234 5678 9012 3456",
232
- maxLength: 16,
233
- value: j.cardNumber,
234
- onChange: (e) => W("cardNumber", e.target.value.replace(/\D/g, "")),
235
- 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)]"
236
- })] }), /* @__PURE__ */ b("div", {
237
- className: "grid grid-cols-1 sm:grid-cols-2 gap-4",
238
- children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
239
- className: "block text-sm font-medium text-text-primary mb-1.5",
240
- children: ["Expiry Date ", /* @__PURE__ */ y("span", {
241
- className: "text-status-error-text",
242
- children: "*"
243
- })]
244
- }), /* @__PURE__ */ y("input", {
245
- type: "text",
246
- placeholder: "MM/YY",
247
- maxLength: 5,
248
- value: j.expiryDate,
249
- onChange: (e) => {
250
- let t = e.target.value.replace(/\D/g, "");
251
- t.length >= 2 && (t = t.slice(0, 2) + "/" + t.slice(2, 4)), W("expiryDate", t);
252
- },
253
- 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)]"
254
- })] }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ b("label", {
255
- className: "block text-sm font-medium text-text-primary mb-1.5",
256
- children: ["CVV ", /* @__PURE__ */ y("span", {
257
- className: "text-status-error-text",
258
- children: "*"
259
- })]
260
- }), /* @__PURE__ */ y("input", {
261
- type: "text",
262
- placeholder: "123",
263
- maxLength: 3,
264
- value: j.cvv,
265
- onChange: (e) => W("cvv", e.target.value.replace(/\D/g, "")),
266
- 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)]"
267
- })] })]
268
- })]
269
- }),
270
- k === "upi" && /* @__PURE__ */ b("div", {
271
- className: "mt-4 border-t border-border-subtle pt-4",
272
- children: [/* @__PURE__ */ b("label", {
273
- className: "block text-sm font-medium text-text-primary mb-1.5",
274
- children: ["UPI ID ", /* @__PURE__ */ y("span", {
275
- className: "text-status-error-text",
276
- children: "*"
277
- })]
278
- }), /* @__PURE__ */ y("input", {
279
- type: "text",
280
- placeholder: "user@paytm",
281
- value: j.upiId,
282
- onChange: (e) => W("upiId", e.target.value),
283
- 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)]"
284
- })]
285
- }),
286
- k === "wallet" && /* @__PURE__ */ b("div", {
287
- className: "mt-4 flex items-start gap-3 rounded-lg bg-accent-blue-subtle/10 p-4 border border-accent-blue-subtle/20",
288
- children: [/* @__PURE__ */ y(c, { className: "h-4 w-4 text-accent-blue mt-0.5 shrink-0" }), /* @__PURE__ */ y("p", {
289
- className: "text-sm text-accent-blue",
290
- children: "Digital wallet integration coming soon. Please choose another payment method."
291
- })]
292
- })
293
- ]
294
- }),
295
- /* @__PURE__ */ b("section", {
296
- className: "rounded-lg border border-border-seam bg-bg-surface p-5 bg-gloss-card shadow-pop",
297
- children: [/* @__PURE__ */ b("h2", {
298
- className: "text-base font-semibold text-text-primary mb-4 flex items-center gap-2",
299
- children: [/* @__PURE__ */ y(p, { className: "h-4 w-4 text-text-secondary" }), "Additional Options"]
300
- }), /* @__PURE__ */ b("div", {
301
- className: "space-y-5",
302
- children: [/* @__PURE__ */ b("div", { children: [
303
- /* @__PURE__ */ y("label", {
304
- className: "block text-sm font-medium text-text-primary mb-2",
305
- children: "Tip for delivery partner"
306
- }),
307
- /* @__PURE__ */ y("div", {
308
- className: "flex flex-wrap gap-2 mb-3",
309
- children: C.map((e) => /* @__PURE__ */ y("button", {
310
- type: "button",
311
- onClick: () => {
312
- P(e), I("");
313
- },
314
- className: t("flex-1 min-w-[64px] rounded-lg px-3 py-2.5 text-sm font-medium transition-colors", N === e && F === "" ? "bg-foreground text-background" : "bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary"),
315
- children: e === 0 ? "No Tip" : `₹${e}`
316
- }, e))
317
- }),
318
- /* @__PURE__ */ y("input", {
319
- type: "number",
320
- placeholder: "Custom tip amount",
321
- value: F,
322
- onChange: (e) => {
323
- let t = e.target.value;
324
- I(t), P(parseInt(t) || 0);
325
- },
326
- 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)]"
327
- })
328
- ] }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("label", {
329
- className: "block text-sm font-medium text-text-primary mb-2",
330
- children: "Special Instructions"
331
- }), /* @__PURE__ */ y("textarea", {
332
- rows: 3,
333
- placeholder: "Any special requests for your order...",
334
- value: L,
335
- onChange: (e) => R(e.target.value),
336
- 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"
337
- })] })]
338
- })]
339
- })
340
- ]
341
- }), /* @__PURE__ */ y("div", {
342
- className: "lg:col-span-1",
343
- children: /* @__PURE__ */ b(x, {
344
- className: "sticky top-6 p-5",
345
- children: [
346
- /* @__PURE__ */ y("h2", {
347
- className: "text-base font-semibold text-text-primary mb-4",
348
- children: "Order Summary"
349
- }),
350
- /* @__PURE__ */ b("div", {
351
- className: "flex items-center gap-3 mb-4 pb-4 border-b border-border-subtle",
352
- children: [/* @__PURE__ */ y("div", {
353
- className: "h-12 w-12 rounded-md bg-bg-sunken overflow-hidden",
354
- children: /* @__PURE__ */ y("img", {
355
- src: E.cartImage,
356
- alt: E.cartName,
357
- className: "h-full w-full object-cover"
358
- })
359
- }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("p", {
360
- className: "text-sm font-medium text-text-primary",
361
- children: E.cartName
362
- }), /* @__PURE__ */ b("p", {
363
- className: "text-xs text-text-secondary",
364
- children: [
365
- E.items.length,
366
- " item",
367
- E.items.length === 1 ? "" : "s"
368
- ]
369
- })] })]
370
- }),
371
- /* @__PURE__ */ y("div", {
372
- className: "space-y-2 mb-4",
373
- children: E.items.map((e) => /* @__PURE__ */ b("div", {
374
- className: "flex justify-between items-start",
375
- children: [/* @__PURE__ */ b("div", {
376
- className: "flex-1 min-w-0",
377
- children: [
378
- /* @__PURE__ */ y("p", {
379
- className: "text-sm text-text-primary",
380
- children: e.name
381
- }),
382
- e.customizations && e.customizations.length > 0 && /* @__PURE__ */ y("p", {
383
- className: "text-xs text-text-secondary mt-0.5",
384
- children: e.customizations.join(", ")
385
- }),
386
- /* @__PURE__ */ b("p", {
387
- className: "text-xs text-text-secondary",
388
- children: [
389
- a(e.price, { minimumFractionDigits: 0 }),
390
- " x ",
391
- e.quantity
392
- ]
393
- })
394
- ]
395
- }), /* @__PURE__ */ y("span", {
396
- className: "text-sm font-medium text-text-primary",
397
- children: a(e.price * e.quantity, { minimumFractionDigits: 0 })
398
- })]
399
- }, e.id))
400
- }),
401
- /* @__PURE__ */ b("div", {
402
- className: "border-t border-border-subtle pt-4 space-y-2.5 text-sm",
403
- children: [
404
- /* @__PURE__ */ b("div", {
405
- className: "flex justify-between",
406
- children: [/* @__PURE__ */ b("span", {
407
- className: "text-text-secondary",
408
- children: [
409
- "Subtotal (",
410
- H,
411
- " items)"
412
- ]
413
- }), /* @__PURE__ */ y("span", {
414
- className: "text-text-primary",
415
- children: a(V.subtotal, { minimumFractionDigits: 0 })
416
- })]
417
- }),
418
- /* @__PURE__ */ b("div", {
419
- className: "flex justify-between",
420
- children: [/* @__PURE__ */ y("span", {
421
- className: "text-text-secondary",
422
- children: "Delivery Fee"
423
- }), /* @__PURE__ */ y("span", {
424
- className: "text-text-primary",
425
- children: V.deliveryFee === 0 ? "FREE" : a(V.deliveryFee, { minimumFractionDigits: 0 })
426
- })]
427
- }),
428
- /* @__PURE__ */ b("div", {
429
- className: "flex justify-between",
430
- children: [/* @__PURE__ */ y("span", {
431
- className: "text-text-secondary",
432
- children: "Tax"
433
- }), /* @__PURE__ */ y("span", {
434
- className: "text-text-primary",
435
- children: a(V.tax, { minimumFractionDigits: 0 })
436
- })]
437
- }),
438
- N > 0 && /* @__PURE__ */ b("div", {
439
- className: "flex justify-between",
440
- children: [/* @__PURE__ */ y("span", {
441
- className: "text-text-secondary",
442
- children: "Tip"
443
- }), /* @__PURE__ */ y("span", {
444
- className: "text-text-primary",
445
- children: a(N, { minimumFractionDigits: 0 })
446
- })]
447
- }),
448
- V.discount && V.discount > 0 && /* @__PURE__ */ b("div", {
449
- className: "flex justify-between",
450
- children: [/* @__PURE__ */ y("span", {
451
- className: "text-status-success-text",
452
- children: "Discount"
453
- }), /* @__PURE__ */ b("span", {
454
- className: "text-status-success-text",
455
- children: ["-", a(V.discount, { minimumFractionDigits: 0 })]
456
- })]
457
- })
458
- ]
459
- }),
460
- /* @__PURE__ */ b("div", {
461
- className: "mt-4 flex justify-between border-t border-border-subtle pt-4",
462
- children: [/* @__PURE__ */ y("span", {
463
- className: "text-base font-semibold text-text-primary",
464
- children: "Total"
465
- }), /* @__PURE__ */ y("span", {
466
- className: "text-base font-bold text-text-primary",
467
- children: a(V.total, { minimumFractionDigits: 0 })
468
- })]
469
- }),
470
- /* @__PURE__ */ b("button", {
471
- type: "button",
472
- onClick: async () => {
473
- if (!(!G() || !E)) try {
474
- let e = await T.mutateAsync({
475
- providerId: E.cartId,
476
- customerId: _?.id,
477
- items: E.items.map((e) => ({
478
- offeringId: e.id,
479
- quantity: e.quantity,
480
- customizations: e.customizations
481
- })),
482
- deliveryAddress: `${D.addressLine1}, ${D.addressLine2}, ${D.city}, ${D.state} - ${D.pincode}`,
483
- paymentMethod: k.toUpperCase(),
484
- notes: L,
485
- deliveryFee: V.deliveryFee,
486
- tax: V.tax,
487
- tip: N,
488
- total: V.total
489
- });
490
- alert("Order placed successfully!"), u(`/customer/order/${e.id}`);
491
- } catch {
492
- alert("Failed to place order. Please try again.");
493
- }
494
- },
495
- disabled: T.isPending,
496
- className: t("mt-6 flex w-full items-center justify-center gap-2 rounded-lg py-3 text-sm font-medium transition-opacity", "bg-foreground text-background", T.isPending ? "opacity-60 cursor-not-allowed" : "hover:opacity-90"),
497
- children: [T.isPending ? /* @__PURE__ */ y(m, { className: "h-4 w-4 animate-spin" }) : /* @__PURE__ */ y(g, { className: "h-4 w-4" }), T.isPending ? "Placing Order..." : `Place Order - ${a(V.total, { minimumFractionDigits: 0 })}`]
498
- }),
499
- /* @__PURE__ */ y("p", {
500
- className: "mt-3 text-center text-xs text-text-secondary",
501
- children: "By placing this order, you agree to our Terms of Service and Privacy Policy"
502
- })
503
- ]
504
- })
505
- })]
506
- })
507
- }) : /* @__PURE__ */ y(n, {
508
- title: "Checkout",
509
- children: /* @__PURE__ */ b("div", {
510
- className: "flex flex-col items-center justify-center py-16 text-center",
511
- children: [
512
- /* @__PURE__ */ y(g, { className: "h-16 w-16 text-text-secondary/40 mb-4" }),
513
- /* @__PURE__ */ y("h3", {
514
- className: "text-lg font-semibold text-text-primary mb-2",
515
- children: "Your cart is empty"
516
- }),
517
- /* @__PURE__ */ y("p", {
518
- className: "text-sm text-text-secondary mb-6",
519
- children: "Add some items to proceed with checkout"
520
- }),
521
- /* @__PURE__ */ y("button", {
522
- type: "button",
523
- onClick: () => u("/customer/carts"),
524
- className: "rounded-lg bg-foreground px-6 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity",
525
- children: "Browse Carts"
526
- })
527
- ]
528
- })
529
- });
530
- }
531
- //#endregion
532
- export { w as CheckoutPage };
533
-
534
- //# sourceMappingURL=CheckoutPage.js.map