@burdenoff/microfe-kadaikodi 2026.704.3 → 2026.704.5

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 (145) hide show
  1. package/dist/kadaikodi/KadaikodiRoutes.js +34 -26
  2. package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
  3. package/dist/kadaikodi/components/viz/AllocationBar.js +68 -0
  4. package/dist/kadaikodi/components/viz/AllocationBar.js.map +1 -0
  5. package/dist/kadaikodi/components/viz/AreaChart.js +102 -0
  6. package/dist/kadaikodi/components/viz/AreaChart.js.map +1 -0
  7. package/dist/kadaikodi/components/viz/AvatarStack.js +36 -0
  8. package/dist/kadaikodi/components/viz/AvatarStack.js.map +1 -0
  9. package/dist/kadaikodi/components/viz/BarChart.js +83 -0
  10. package/dist/kadaikodi/components/viz/BarChart.js.map +1 -0
  11. package/dist/kadaikodi/components/viz/CertificateCard.js +4 -0
  12. package/dist/kadaikodi/components/viz/DonutChart.js +109 -0
  13. package/dist/kadaikodi/components/viz/DonutChart.js.map +1 -0
  14. package/dist/kadaikodi/components/viz/HBarFunnel.js +54 -0
  15. package/dist/kadaikodi/components/viz/HBarFunnel.js.map +1 -0
  16. package/dist/kadaikodi/components/viz/Heatmap.js +3 -0
  17. package/dist/kadaikodi/components/viz/KanbanBoard.js +50 -0
  18. package/dist/kadaikodi/components/viz/KanbanBoard.js.map +1 -0
  19. package/dist/kadaikodi/components/viz/LineChart.js +4 -0
  20. package/dist/kadaikodi/components/viz/OrgTree.js +2 -0
  21. package/dist/kadaikodi/components/viz/PathSteps.js +3 -0
  22. package/dist/kadaikodi/components/viz/ProgressRing.js +68 -0
  23. package/dist/kadaikodi/components/viz/ProgressRing.js.map +1 -0
  24. package/dist/kadaikodi/components/viz/RatingStars.js +51 -0
  25. package/dist/kadaikodi/components/viz/RatingStars.js.map +1 -0
  26. package/dist/kadaikodi/components/viz/SegmentedTabs.js +69 -0
  27. package/dist/kadaikodi/components/viz/SegmentedTabs.js.map +1 -0
  28. package/dist/kadaikodi/components/viz/SkillBar.js +3 -0
  29. package/dist/kadaikodi/components/viz/Sparkline.js +74 -0
  30. package/dist/kadaikodi/components/viz/Sparkline.js.map +1 -0
  31. package/dist/kadaikodi/components/viz/StatCard.js +60 -0
  32. package/dist/kadaikodi/components/viz/StatCard.js.map +1 -0
  33. package/dist/kadaikodi/components/viz/StepProgress.js +64 -0
  34. package/dist/kadaikodi/components/viz/StepProgress.js.map +1 -0
  35. package/dist/kadaikodi/components/viz/Timeline.js +66 -0
  36. package/dist/kadaikodi/components/viz/Timeline.js.map +1 -0
  37. package/dist/kadaikodi/components/viz/index.js +23 -0
  38. package/dist/kadaikodi/components/viz/lib/Avatar.js +30 -0
  39. package/dist/kadaikodi/components/viz/lib/Avatar.js.map +1 -0
  40. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js +119 -0
  41. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js.map +1 -0
  42. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js +35 -0
  43. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js.map +1 -0
  44. package/dist/kadaikodi/components/viz/lib/format.js +21 -0
  45. package/dist/kadaikodi/components/viz/lib/format.js.map +1 -0
  46. package/dist/kadaikodi/components/viz/lib/geometry.js +61 -0
  47. package/dist/kadaikodi/components/viz/lib/geometry.js.map +1 -0
  48. package/dist/kadaikodi/components/viz/lib/hooks.js +39 -0
  49. package/dist/kadaikodi/components/viz/lib/hooks.js.map +1 -0
  50. package/dist/kadaikodi/components/viz/lib/palette.js +27 -0
  51. package/dist/kadaikodi/components/viz/lib/palette.js.map +1 -0
  52. package/dist/kadaikodi/hooks/useKadaikodiApi.js +84 -6
  53. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  54. package/dist/kadaikodi/pages/HomePage.js +373 -631
  55. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  56. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +304 -169
  57. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  58. package/dist/kadaikodi/pages/admin/AdminDashboard.js +255 -271
  59. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  60. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +185 -125
  61. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +141 -102
  63. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
  65. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +332 -276
  66. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
  67. package/dist/kadaikodi/pages/admin/CartManagementPage.js +564 -729
  68. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  69. package/dist/kadaikodi/pages/admin/UserManagementPage.js +310 -366
  70. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  71. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +201 -120
  72. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  73. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +290 -257
  74. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  75. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +173 -194
  76. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  77. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +270 -228
  78. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  79. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +194 -173
  80. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  81. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +428 -347
  82. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  83. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +332 -0
  84. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -0
  85. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js +373 -0
  86. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js.map +1 -0
  87. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +294 -162
  88. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  89. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +180 -181
  90. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  91. package/dist/kadaikodi/pages/common/HelpSupportPage.js +310 -317
  92. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  93. package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
  94. package/dist/kadaikodi/pages/common/SettingsPage.js +502 -586
  95. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  96. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +239 -156
  97. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  98. package/dist/kadaikodi/pages/customer/CartDetailPage.js +405 -248
  99. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  100. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +258 -232
  101. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  102. package/dist/kadaikodi/pages/customer/CheckoutPage.js +254 -205
  103. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  104. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +5 -5
  105. package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
  106. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +189 -199
  107. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
  108. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +272 -230
  109. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  110. package/dist/kadaikodi/pages/customer/FavoritesPage.js +150 -413
  111. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  112. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +173 -134
  113. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  114. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +411 -305
  115. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  116. package/dist/kadaikodi/pages/customer/ReviewsPage.js +310 -406
  117. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  118. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
  119. package/dist/kadaikodi/pages/customer/shared.js +181 -0
  120. package/dist/kadaikodi/pages/customer/shared.js.map +1 -0
  121. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +438 -311
  122. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  123. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +320 -293
  124. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  125. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +159 -91
  126. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  127. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +137 -107
  128. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  129. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +157 -135
  130. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  131. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +280 -206
  132. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  133. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +441 -514
  134. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  135. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +428 -431
  136. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  137. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +328 -445
  138. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  139. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +141 -164
  140. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  141. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +360 -288
  142. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  143. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +303 -281
  144. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  145. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CartManagementPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/CartManagementPage.tsx"],"sourcesContent":["/**\n * Cart Management Page\n * @module kadaikodi/pages/admin\n *\n * Full-featured cart management with 8 stats cards, 6 filter controls,\n * dual layout (mobile cards + desktop table), cart action modal\n * (view/approve/reject with reason/suspend/inspect), loading state.\n */\n\nimport { useState, useMemo } from 'react';\nimport {\n Search,\n Store,\n CheckCircle2,\n XCircle,\n Pause,\n Star,\n Eye,\n ClipboardCheck,\n Loader2,\n X,\n AlertTriangle,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useProviders } from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\nimport type { MockCart } from '../../types';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ninterface ExtendedCart {\n id: string;\n name: string;\n description: string;\n category: string;\n image: string;\n ownerName: string;\n ownerEmail: string;\n ownerPhone: string;\n address: string;\n city: string;\n isActive: boolean;\n isVerified: boolean;\n rating: number;\n reviewCount: number;\n monthlyRevenue: number;\n monthlyOrders: number;\n complianceScore: number;\n documentsSubmitted: number;\n documentsRequired: number;\n inspectionStatus: 'pending' | 'scheduled' | 'completed' | 'failed';\n inspectionDate?: string;\n rejectionReason?: string;\n applicationDate: string;\n licenseNumber?: string;\n}\n\ninterface CartFilters {\n searchQuery: string;\n status: string;\n verificationStatus: string;\n category: string;\n location: string;\n sortBy: string;\n}\n\ninterface CartStats {\n totalCarts: number;\n activeCarts: number;\n pendingApproval: number;\n rejectedCarts: number;\n totalRevenue: number;\n averageRating: number;\n complianceRate: number;\n newApplications: number;\n}\n\ntype CartActionType = 'view' | 'approve' | 'reject' | 'suspend' | 'inspect';\n\n/* ------------------------------------------------------------------ */\n/* Provider → admin cart view-model (real data, no fabricated fields) */\n/* ------------------------------------------------------------------ */\n\nfunction mapProviderToCart(p: MockCart): ExtendedCart {\n return {\n id: p.id,\n name: p.name,\n description: '',\n category: p.category,\n image: '',\n ownerName: '',\n ownerEmail: '',\n ownerPhone: '',\n address: p.location?.address ?? '',\n city: '',\n isActive: p.isOpen,\n isVerified: p.isVerified ?? false,\n rating: p.rating,\n reviewCount: p.totalRatings,\n monthlyRevenue: 0,\n monthlyOrders: 0,\n complianceScore: 0,\n documentsSubmitted: 0,\n documentsRequired: 0,\n inspectionStatus: p.isVerified ? 'completed' : 'pending',\n applicationDate: p.createdAt ?? new Date().toISOString(),\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function CartManagementPage() {\n const { navigateTo } = useKadaikodi();\n\n const { data: providers = [], isLoading: loading } = useProviders();\n const [selectedCart, setSelectedCart] = useState<ExtendedCart | null>(null);\n const [showCartModal, setShowCartModal] = useState(false);\n const [actionType, setActionType] = useState<CartActionType>('view');\n const [rejectionReason, setRejectionReason] = useState('');\n\n const [filters, setFilters] = useState<CartFilters>({\n searchQuery: '',\n status: '',\n verificationStatus: '',\n category: '',\n location: '',\n sortBy: 'recent',\n });\n\n const allCarts = useMemo(() => providers.map(mapProviderToCart), [providers]);\n\n const stats: CartStats = useMemo(() => {\n const active = allCarts.filter((c) => c.isActive).length;\n const pending = allCarts.filter((c) => !c.isVerified).length;\n const avg = allCarts.length ? allCarts.reduce((s, c) => s + c.rating, 0) / allCarts.length : 0;\n return {\n totalCarts: allCarts.length,\n activeCarts: active,\n pendingApproval: pending,\n rejectedCarts: 0,\n totalRevenue: 0,\n averageRating: Number(avg.toFixed(1)),\n complianceRate: 0,\n newApplications: pending,\n };\n }, [allCarts]);\n\n const carts = useMemo(() => {\n let filtered = [...allCarts];\n\n if (filters.searchQuery) {\n const q = filters.searchQuery.toLowerCase();\n filtered = filtered.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.ownerName.toLowerCase().includes(q) ||\n c.description.toLowerCase().includes(q) ||\n c.address.toLowerCase().includes(q)\n );\n }\n if (filters.status) {\n if (filters.status === 'active') filtered = filtered.filter((c) => c.isActive);\n if (filters.status === 'inactive') filtered = filtered.filter((c) => !c.isActive);\n }\n if (filters.verificationStatus) {\n if (filters.verificationStatus === 'verified')\n filtered = filtered.filter((c) => c.isVerified);\n if (filters.verificationStatus === 'pending')\n filtered = filtered.filter((c) => !c.isVerified && c.inspectionStatus !== 'failed');\n if (filters.verificationStatus === 'rejected')\n filtered = filtered.filter((c) => c.inspectionStatus === 'failed');\n }\n if (filters.category) filtered = filtered.filter((c) => c.category === filters.category);\n if (filters.location)\n filtered = filtered.filter((c) =>\n c.city.toLowerCase().includes(filters.location.toLowerCase())\n );\n\n switch (filters.sortBy) {\n case 'name':\n filtered.sort((a, b) => a.name.localeCompare(b.name));\n break;\n case 'rating':\n filtered.sort((a, b) => b.rating - a.rating);\n break;\n case 'revenue':\n filtered.sort((a, b) => b.monthlyRevenue - a.monthlyRevenue);\n break;\n case 'compliance':\n filtered.sort((a, b) => b.complianceScore - a.complianceScore);\n break;\n default:\n filtered.sort(\n (a, b) => new Date(b.applicationDate).getTime() - new Date(a.applicationDate).getTime()\n );\n }\n\n return filtered;\n }, [allCarts, filters]);\n\n const handleFilterChange = (key: keyof CartFilters, value: string) => {\n setFilters((prev) => ({ ...prev, [key]: value }));\n };\n\n const handleCartAction = (cart: ExtendedCart, action: CartActionType) => {\n setSelectedCart(cart);\n setActionType(action);\n setRejectionReason('');\n setShowCartModal(true);\n };\n\n const executeCartAction = () => {\n if (!selectedCart) return;\n let message = '';\n switch (actionType) {\n case 'approve':\n message = `Cart \"${selectedCart.name}\" approved successfully`;\n break;\n case 'reject':\n if (!rejectionReason.trim()) {\n alert('Please provide a rejection reason');\n return;\n }\n message = `Cart \"${selectedCart.name}\" rejected`;\n break;\n case 'suspend':\n message = `Cart \"${selectedCart.name}\" suspended`;\n break;\n case 'inspect':\n message = `Inspection scheduled for \"${selectedCart.name}\"`;\n break;\n }\n alert(message);\n setShowCartModal(false);\n setRejectionReason('');\n };\n\n const formatDate = (d: string) =>\n new Date(d).toLocaleDateString('en-IN', { year: 'numeric', month: 'short', day: 'numeric' });\n\n const verificationBadge = (cart: ExtendedCart) => {\n if (cart.isVerified)\n return (\n <span className=\"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium bg-status-success-bg-subtle text-status-success-text\">\n Verified\n </span>\n );\n if (cart.inspectionStatus === 'pending')\n return (\n <span className=\"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium bg-status-warning-bg-subtle text-status-warning-text\">\n Pending Review\n </span>\n );\n if (cart.inspectionStatus === 'scheduled')\n return (\n <span className=\"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium bg-[var(--color-accent-soft)] text-text-primary\">\n Inspection Scheduled\n </span>\n );\n if (cart.inspectionStatus === 'failed')\n return (\n <span className=\"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium bg-status-error-bg-subtle text-status-error-text\">\n Rejected\n </span>\n );\n return (\n <span className=\"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium bg-bg-sunken text-text-secondary\">\n Under Review\n </span>\n );\n };\n\n const statusBadge = (isActive: boolean) =>\n isActive ? (\n <span className=\"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium bg-status-success-bg-subtle text-status-success-text\">\n Active\n </span>\n ) : (\n <span className=\"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium bg-bg-sunken text-text-secondary\">\n Inactive\n </span>\n );\n\n const complianceBar = (score: number) => (\n <div className=\"w-full bg-bg-sunken rounded-full h-2\">\n <div\n className={cn(\n 'h-2 rounded-full',\n score >= 80\n ? 'bg-status-success-text'\n : score >= 60\n ? 'bg-status-warning-text'\n : 'bg-status-error-text'\n )}\n style={{ width: `${score}%` }}\n />\n </div>\n );\n\n if (loading) {\n return (\n <PageLayout title=\"Cart Management\" description=\"Loading carts...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"h-10 w-10 animate-spin text-text-secondary mb-4\" />\n <p className=\"text-text-secondary\">Loading carts...</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Cart Management\"\n description={`${stats.totalCarts} service providers on the platform`}\n actions={\n <span className=\"text-sm text-text-secondary\">\n {stats.pendingApproval} pending approval\n </span>\n }\n >\n <PagePurpose className=\"mb-6\">\n Where you onboard and oversee every cart (service provider) on Kadaikodi. Use this page to\n approve or reject new applications, verify legitimate businesses, suspend ones that break\n the rules, and keep an eye on each cart&apos;s performance and ratings — so customers only\n ever see trustworthy, active providers. Filter and search to zero in on what needs your\n attention.\n </PagePurpose>\n\n {/* 8 Stats Cards — the one emphasis zone for this page */}\n <EmphasisPanel className=\"mb-6\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">Provider Overview</h2>\n <div className=\"grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-8 gap-3\">\n {[\n { label: 'Total Carts', value: stats.totalCarts, cls: '' },\n {\n label: 'Active',\n value: stats.activeCarts,\n cls: 'bg-status-success-bg-subtle border-status-success-text/30',\n },\n {\n label: 'Pending',\n value: stats.pendingApproval,\n cls: 'bg-status-warning-bg-subtle border-status-warning-text/30',\n },\n {\n label: 'Rejected',\n value: stats.rejectedCarts,\n cls: 'bg-status-error-bg-subtle border-status-error-text/30',\n },\n {\n label: 'Total Revenue',\n value: formatCurrency(stats.totalRevenue, { minimumFractionDigits: 0 }),\n cls: 'col-span-2 min-w-fit',\n },\n { label: 'Avg Rating', value: `${stats.averageRating}`, cls: '' },\n {\n label: 'New Apps',\n value: stats.newApplications,\n cls: 'bg-[var(--color-accent-soft)] border-border-focus/30',\n },\n ].map((s) => (\n <div\n key={s.label}\n className={cn('rounded-lg border border-border-subtle bg-bg-surface p-3', s.cls)}\n >\n <p className=\"text-xs text-text-secondary\">{s.label}</p>\n <p className=\"text-lg font-bold text-text-primary\">{s.value}</p>\n </div>\n ))}\n </div>\n </EmphasisPanel>\n\n {/* 6 Filter Controls */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 mb-6\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-3\">\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...\"\n value={filters.searchQuery}\n onChange={(e) => handleFilterChange('searchQuery', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 pl-10 pr-4 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 <select\n value={filters.status}\n onChange={(e) => handleFilterChange('status', e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">All Status</option>\n <option value=\"active\">Active</option>\n <option value=\"inactive\">Inactive</option>\n </select>\n <select\n value={filters.verificationStatus}\n onChange={(e) => handleFilterChange('verificationStatus', e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">All Verification</option>\n <option value=\"verified\">Verified</option>\n <option value=\"pending\">Pending</option>\n <option value=\"rejected\">Rejected</option>\n </select>\n <select\n value={filters.category}\n onChange={(e) => handleFilterChange('category', e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">All Categories</option>\n <option value=\"Food & Beverage\">Food & Beverage</option>\n <option value=\"Beverages\">Beverages</option>\n <option value=\"Street Food\">Street Food</option>\n <option value=\"Fast Food\">Fast Food</option>\n </select>\n <input\n type=\"text\"\n placeholder=\"Location...\"\n value={filters.location}\n onChange={(e) => handleFilterChange('location', e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n <select\n value={filters.sortBy}\n onChange={(e) => handleFilterChange('sortBy', e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"recent\">Most Recent</option>\n <option value=\"name\">Name A-Z</option>\n <option value=\"rating\">Highest Rated</option>\n <option value=\"revenue\">Highest Revenue</option>\n <option value=\"compliance\">Best Compliance</option>\n </select>\n </div>\n </div>\n\n {/* Dual Layout */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface overflow-hidden\">\n {/* Mobile Card View */}\n <div className=\"block md:hidden space-y-4 p-4\">\n {carts.map((cart) => (\n <div\n key={cart.id}\n className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-4\"\n >\n <div className=\"flex items-center mb-3\">\n <div className=\"w-16 h-16 rounded-lg bg-bg-sunken flex items-center justify-center mr-3 shrink-0\">\n <Store className=\"h-7 w-7 text-text-secondary\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"font-medium text-text-primary text-lg truncate\">{cart.name}</h3>\n <p className=\"text-sm text-text-secondary truncate\">{cart.category}</p>\n <p className=\"text-sm text-text-secondary truncate\">{cart.address}</p>\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4 mb-3 text-sm\">\n <div>\n <p className=\"text-text-secondary font-medium\">Owner</p>\n <p className=\"text-text-primary\">{cart.ownerName}</p>\n <p className=\"text-text-secondary text-xs\">{cart.ownerPhone}</p>\n </div>\n <div>\n <p className=\"text-text-secondary font-medium\">Performance</p>\n <p className=\"text-text-primary\">\n {formatCurrency(cart.monthlyRevenue, { minimumFractionDigits: 0 })}/mo\n </p>\n <p className=\"text-text-secondary text-xs\">{cart.monthlyOrders} orders</p>\n </div>\n </div>\n <div className=\"flex flex-wrap gap-2 mb-3\">\n {statusBadge(cart.isActive)}\n {verificationBadge(cart)}\n {cart.rating > 0 && (\n <span className=\"inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium bg-status-warning-bg-subtle text-status-warning-text\">\n <Star className=\"h-3 w-3 fill-current\" />\n {cart.rating} ({cart.reviewCount})\n </span>\n )}\n </div>\n <div className=\"mb-3\">\n <div className=\"flex items-center justify-between text-sm mb-1\">\n <span className=\"text-text-secondary\">Compliance</span>\n <span className=\"font-medium text-text-primary\">{cart.complianceScore}%</span>\n </div>\n {complianceBar(cart.complianceScore)}\n <p className=\"text-xs text-text-secondary mt-1\">\n Docs: {cart.documentsSubmitted}/{cart.documentsRequired} &bull; Applied:{' '}\n {formatDate(cart.applicationDate)}\n </p>\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <button\n type=\"button\"\n onClick={() => handleCartAction(cart, 'view')}\n className=\"flex-1 rounded-lg border border-border-subtle px-3 py-1.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Details\n </button>\n {!cart.isVerified && cart.inspectionStatus !== 'failed' && (\n <>\n <button\n type=\"button\"\n onClick={() => handleCartAction(cart, 'approve')}\n className=\"rounded-lg bg-action-primary-bg px-3 py-1.5 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n Approve\n </button>\n <button\n type=\"button\"\n onClick={() => handleCartAction(cart, 'reject')}\n className=\"rounded-lg border border-border-subtle px-3 py-1.5 text-sm font-medium text-status-error-text hover:bg-status-error-bg-subtle transition-colors\"\n >\n Reject\n </button>\n </>\n )}\n {cart.inspectionStatus === 'pending' && (\n <button\n type=\"button\"\n onClick={() => handleCartAction(cart, 'inspect')}\n className=\"rounded-lg border border-border-subtle px-3 py-1.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Inspect\n </button>\n )}\n {cart.isActive && (\n <button\n type=\"button\"\n onClick={() => handleCartAction(cart, 'suspend')}\n className=\"rounded-lg border border-border-subtle px-3 py-1.5 text-sm font-medium text-status-error-text hover:bg-status-error-bg-subtle transition-colors\"\n >\n Suspend\n </button>\n )}\n </div>\n </div>\n ))}\n </div>\n\n {/* Desktop Table View */}\n <div className=\"hidden md:block overflow-x-auto\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Cart\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Owner\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Status\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Performance\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Compliance\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium text-text-secondary uppercase tracking-wider\">\n Actions\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {carts.map((cart) => (\n <tr key={cart.id} className=\"hover:bg-accent/50 transition-colors\">\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-12 h-12 rounded-lg bg-bg-sunken flex items-center justify-center shrink-0\">\n <Store className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {cart.name}\n </p>\n <p className=\"text-xs text-text-secondary truncate\">{cart.category}</p>\n <p className=\"text-xs text-text-secondary truncate\">{cart.address}</p>\n </div>\n </div>\n </td>\n <td className=\"px-4 py-3 text-sm\">\n <p className=\"font-medium text-text-primary\">{cart.ownerName}</p>\n <p className=\"text-xs text-text-secondary\">{cart.ownerEmail}</p>\n <p className=\"text-xs text-text-secondary\">{cart.ownerPhone}</p>\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"space-y-1\">\n {statusBadge(cart.isActive)}\n <br />\n {verificationBadge(cart)}\n {cart.rating > 0 && (\n <div className=\"text-sm flex items-center gap-1 mt-1\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n {cart.rating}{' '}\n <span className=\"text-text-secondary\">({cart.reviewCount})</span>\n </div>\n )}\n </div>\n </td>\n <td className=\"px-4 py-3 text-sm\">\n <p className=\"text-text-primary\">\n {formatCurrency(cart.monthlyRevenue, { minimumFractionDigits: 0 })}/mo\n </p>\n <p className=\"text-text-secondary\">{cart.monthlyOrders} orders/mo</p>\n </td>\n <td className=\"px-4 py-3 text-sm\">\n <div className=\"flex items-center gap-2 mb-1\">\n <div className=\"w-16\">{complianceBar(cart.complianceScore)}</div>\n <span className=\"font-medium text-text-primary\">{cart.complianceScore}%</span>\n </div>\n <p className=\"text-xs text-text-secondary\">\n Docs: {cart.documentsSubmitted}/{cart.documentsRequired}\n </p>\n <p className=\"text-xs text-text-secondary\">\n Applied: {formatDate(cart.applicationDate)}\n </p>\n </td>\n <td className=\"px-4 py-3\">\n <div className=\"flex flex-col gap-1\">\n <button\n type=\"button\"\n onClick={() => handleCartAction(cart, 'view')}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-accent transition-colors inline-flex items-center gap-1 text-xs\"\n >\n <Eye className=\"h-4 w-4\" /> View\n </button>\n {!cart.isVerified && cart.inspectionStatus !== 'failed' && (\n <div className=\"flex gap-1\">\n <button\n type=\"button\"\n onClick={() => handleCartAction(cart, 'approve')}\n className=\"rounded p-1.5 text-text-secondary hover:text-status-success-text hover:bg-status-success-bg-subtle transition-colors\"\n >\n <CheckCircle2 className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => handleCartAction(cart, 'reject')}\n className=\"rounded p-1.5 text-text-secondary hover:text-status-error-text hover:bg-status-error-bg-subtle transition-colors\"\n >\n <XCircle className=\"h-4 w-4\" />\n </button>\n </div>\n )}\n {cart.inspectionStatus === 'pending' && (\n <button\n type=\"button\"\n onClick={() => handleCartAction(cart, 'inspect')}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-[var(--color-accent-soft)] transition-colors inline-flex items-center gap-1 text-xs\"\n >\n <ClipboardCheck className=\"h-4 w-4\" /> Inspect\n </button>\n )}\n {cart.isActive && (\n <button\n type=\"button\"\n onClick={() => handleCartAction(cart, 'suspend')}\n className=\"rounded p-1.5 text-text-secondary hover:text-status-error-text hover:bg-status-error-bg-subtle transition-colors\"\n >\n <Pause className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {carts.length === 0 && (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No carts found\"\n description=\"No service providers match your current filters. Try clearing the filters or searching for a different name.\"\n action={\n <button\n type=\"button\"\n onClick={() =>\n setFilters({\n searchQuery: '',\n status: '',\n verificationStatus: '',\n category: '',\n location: '',\n sortBy: 'recent',\n })\n }\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Clear filters\n </button>\n }\n />\n )}\n </div>\n\n {/* Cart Action Modal */}\n {showCartModal && selectedCart && (\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 rounded-lg border border-border-subtle bg-bg-surface shadow-lg max-h-[90vh] overflow-y-auto\">\n <div className=\"flex items-center justify-between p-4 border-b border-border-subtle\">\n <h3 className=\"text-lg font-semibold text-text-primary\">\n {actionType === 'view'\n ? 'Cart Details'\n : actionType === 'approve'\n ? 'Approve Cart'\n : actionType === 'reject'\n ? 'Reject Cart'\n : actionType === 'suspend'\n ? 'Suspend Cart'\n : 'Schedule Inspection'}\n </h3>\n <button\n type=\"button\"\n onClick={() => setShowCartModal(false)}\n className=\"rounded p-1.5 text-text-secondary hover:text-text-primary hover:bg-accent transition-colors\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"p-4 space-y-4\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Cart Name</p>\n <p className=\"font-medium text-text-primary\">{selectedCart.name}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Category</p>\n <p className=\"font-medium text-text-primary\">{selectedCart.category}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Owner</p>\n <p className=\"font-medium text-text-primary\">{selectedCart.ownerName}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Contact</p>\n <p className=\"font-medium text-text-primary\">{selectedCart.ownerPhone}</p>\n </div>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Description</p>\n <p className=\"font-medium text-text-primary\">{selectedCart.description}</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Location</p>\n <p className=\"font-medium text-text-primary\">{selectedCart.address}</p>\n </div>\n <div className=\"grid grid-cols-1 sm:grid-cols-3 gap-4\">\n <div>\n <p className=\"text-sm text-text-secondary\">Compliance Score</p>\n <p className=\"font-medium text-text-primary\">{selectedCart.complianceScore}%</p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Documents</p>\n <p className=\"font-medium text-text-primary\">\n {selectedCart.documentsSubmitted}/{selectedCart.documentsRequired}\n </p>\n </div>\n <div>\n <p className=\"text-sm text-text-secondary\">Monthly Revenue</p>\n <p className=\"font-medium text-text-primary\">\n {formatCurrency(selectedCart.monthlyRevenue, { minimumFractionDigits: 0 })}\n </p>\n </div>\n </div>\n\n {selectedCart.rejectionReason && (\n <div className=\"rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle p-4\">\n <p className=\"text-sm font-medium text-status-error-text\">\n Previous Rejection Reason:\n </p>\n <p className=\"text-sm text-status-error-text/80\">\n {selectedCart.rejectionReason}\n </p>\n </div>\n )}\n\n {actionType === 'reject' && (\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-2\">\n Rejection Reason *\n </label>\n <textarea\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface p-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] min-h-[100px]\"\n rows={4}\n value={rejectionReason}\n onChange={(e) => setRejectionReason(e.target.value)}\n placeholder=\"Please provide a detailed reason for rejection...\"\n />\n </div>\n )}\n\n {actionType === 'approve' && (\n <div className=\"rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-4\">\n <p className=\"text-sm text-status-success-text\">\n This will approve the cart for operation on the platform. The cart owner will be\n notified and the cart will become active.\n </p>\n </div>\n )}\n\n <div className=\"flex gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={() => setShowCartModal(false)}\n className=\"flex-1 rounded-lg border border-border-subtle py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Cancel\n </button>\n {actionType !== 'view' && (\n <button\n type=\"button\"\n onClick={executeCartAction}\n disabled={actionType === 'reject' && !rejectionReason.trim()}\n className=\"flex-1 rounded-lg bg-action-primary-bg py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {actionType === 'approve'\n ? 'Approve Cart'\n : actionType === 'reject'\n ? 'Reject Cart'\n : actionType === 'suspend'\n ? 'Suspend Cart'\n : 'Schedule Inspection'}\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CartManagementPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/admin/CartManagementPage.tsx"],"sourcesContent":["/**\n * Merchant (Cart) Management Page\n * @module kadaikodi/pages/admin\n *\n * Merchant management wired to the live backend (useProviders +\n * useUpdateProvider). Status tabs, the merchant table, expandable detail rows\n * and the approve / verify / suspend / reject actions all operate on real\n * provider records. Approve→VERIFIED, Suspend→SUSPENDED and Reject→ARCHIVED\n * persist via useUpdateProvider. Fields with no backend source (verification\n * documents, monthly revenue) are omitted rather than fabricated.\n */\n\nimport { Fragment, useState, useMemo } from 'react';\nimport {\n Search,\n Store,\n CheckCircle2,\n Star,\n Loader2,\n X,\n AlertCircle,\n ChevronDown,\n MapPin,\n Calendar,\n IndianRupee,\n FileText,\n} from 'lucide-react';\nimport { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { EmptyState } from '../../components/EmptyState';\nimport { StatCard, SegmentedTabs } from '../../components/viz';\nimport { useProviders, useUpdateProvider } from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency } from '../../utils/formatters';\nimport type { MockCart } from '../../types';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\ntype MerchantStatus = 'verified' | 'pending' | 'inactive';\ntype StatusTab = 'all' | MerchantStatus;\ntype CartActionType = 'approve' | 'reject' | 'suspend';\n\ninterface MerchantVM {\n id: string;\n name: string;\n category: string;\n ownerId: string;\n address: string;\n rating: number;\n reviewCount: number;\n avgOrderValue: number;\n serviceTypes: string[];\n isOpen: boolean;\n isVerified: boolean;\n status: MerchantStatus;\n createdAt: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Provider → merchant view-model (real data only) */\n/* ------------------------------------------------------------------ */\n\nconst titleCase = (s: string) =>\n s\n .replace(/_/g, ' ')\n .toLowerCase()\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n\nfunction toMerchant(p: MockCart): MerchantVM {\n const status: MerchantStatus = p.isVerified ? 'verified' : p.isOpen ? 'pending' : 'inactive';\n return {\n id: p.id,\n name: p.name,\n category: p.category,\n ownerId: p.ownerId ?? '',\n address: p.location?.address ?? '',\n rating: p.rating,\n reviewCount: p.totalRatings,\n avgOrderValue: p.averageOrderValue ?? 0,\n serviceTypes: p.serviceTypes ?? [],\n isOpen: p.isOpen,\n isVerified: p.isVerified ?? false,\n status,\n createdAt: p.createdAt ?? new Date().toISOString(),\n };\n}\n\nconst STATUS_META: Record<MerchantStatus, { label: string; cls: string }> = {\n verified: { label: 'Verified', cls: 'bg-status-success-bg-subtle text-status-success-text' },\n pending: { label: 'Pending', cls: 'bg-status-warning-bg-subtle text-status-warning-text' },\n inactive: { label: 'Inactive', cls: 'bg-bg-sunken text-text-secondary' },\n};\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport function CartManagementPage() {\n const { data: providers = [], isLoading: loading } = useProviders();\n const updateProvider = useUpdateProvider();\n\n const [statusMessage, setStatusMessage] = useState<{\n text: string;\n type: 'success' | 'error';\n } | null>(null);\n const showStatus = (text: string, type: 'success' | 'error') => {\n setStatusMessage({ text, type });\n setTimeout(() => setStatusMessage(null), 3500);\n };\n\n const [statusTab, setStatusTab] = useState<StatusTab>('all');\n const [searchQuery, setSearchQuery] = useState('');\n const [category, setCategory] = useState('');\n const [sortBy, setSortBy] = useState('recent');\n const [expandedId, setExpandedId] = useState<string | null>(null);\n\n const [selected, setSelected] = useState<MerchantVM | null>(null);\n const [actionType, setActionType] = useState<CartActionType>('approve');\n const [showModal, setShowModal] = useState(false);\n const [rejectionReason, setRejectionReason] = useState('');\n\n const merchants = useMemo(() => providers.map(toMerchant), [providers]);\n\n const counts = useMemo(\n () => ({\n all: merchants.length,\n verified: merchants.filter((m) => m.status === 'verified').length,\n pending: merchants.filter((m) => m.status === 'pending').length,\n inactive: merchants.filter((m) => m.status === 'inactive').length,\n }),\n [merchants]\n );\n\n const avgRating = useMemo(() => {\n const rated = merchants.filter((m) => m.rating > 0);\n if (rated.length === 0) return 0;\n return rated.reduce((s, m) => s + m.rating, 0) / rated.length;\n }, [merchants]);\n\n const categories = useMemo(\n () => Array.from(new Set(merchants.map((m) => m.category))).sort(),\n [merchants]\n );\n\n const rows = useMemo(() => {\n let list = [...merchants];\n if (statusTab !== 'all') list = list.filter((m) => m.status === statusTab);\n if (category) list = list.filter((m) => m.category === category);\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n list = list.filter(\n (m) =>\n m.name.toLowerCase().includes(q) ||\n m.category.toLowerCase().includes(q) ||\n m.address.toLowerCase().includes(q)\n );\n }\n switch (sortBy) {\n case 'name':\n list.sort((a, b) => a.name.localeCompare(b.name));\n break;\n case 'rating':\n list.sort((a, b) => b.rating - a.rating);\n break;\n case 'value':\n list.sort((a, b) => b.avgOrderValue - a.avgOrderValue);\n break;\n default:\n list.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n }\n return list;\n }, [merchants, statusTab, category, searchQuery, sortBy]);\n\n const fmtCur = (n: number) => formatCurrency(n, { minimumFractionDigits: 0 });\n const formatDate = (d: string) =>\n new Date(d).toLocaleDateString('en-IN', { year: 'numeric', month: 'short', day: 'numeric' });\n\n const openAction = (merchant: MerchantVM, action: CartActionType) => {\n setSelected(merchant);\n setActionType(action);\n setRejectionReason('');\n setShowModal(true);\n };\n\n const executeAction = () => {\n if (!selected) return;\n if (actionType === 'reject' && !rejectionReason.trim()) {\n showStatus('Please provide a rejection reason', 'error');\n return;\n }\n const status =\n actionType === 'approve' ? 'VERIFIED' : actionType === 'reject' ? 'ARCHIVED' : 'SUSPENDED';\n updateProvider.mutate(\n { id: selected.id, input: { status } },\n {\n onSuccess: () => {\n const verb =\n actionType === 'approve'\n ? 'approved & verified'\n : actionType === 'reject'\n ? 'rejected'\n : 'suspended';\n showStatus(`\"${selected.name}\" ${verb}.`, 'success');\n setShowModal(false);\n setRejectionReason('');\n },\n onError: () =>\n showStatus(`Could not ${actionType} \"${selected.name}\". Please try again.`, 'error'),\n }\n );\n };\n\n const StatusPill = ({ status }: { status: MerchantStatus }) => (\n <span\n className={cn(\n 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium',\n STATUS_META[status].cls\n )}\n >\n {STATUS_META[status].label}\n </span>\n );\n\n const RowActions = ({ m, compact }: { m: MerchantVM; compact?: boolean }) => (\n <div className={cn('flex gap-2', compact ? 'flex-wrap' : 'items-center justify-end')}>\n {!m.isVerified && (\n <button\n type=\"button\"\n onClick={() => openAction(m, 'approve')}\n className=\"rounded-lg bg-action-primary-bg px-3 py-1.5 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n Approve\n </button>\n )}\n {m.status !== 'inactive' && (\n <button\n type=\"button\"\n onClick={() => openAction(m, 'suspend')}\n className=\"rounded-lg border border-border-default px-3 py-1.5 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle\"\n >\n Suspend\n </button>\n )}\n </div>\n );\n\n const MerchantDetail = ({ m }: { m: MerchantVM }) => (\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/40 p-4\">\n <div className=\"grid grid-cols-1 gap-6 md:grid-cols-2\">\n <div>\n <h4 className=\"mb-3 text-sm font-semibold text-text-primary\">Business Details</h4>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex gap-2\">\n <dt className=\"w-28 shrink-0 text-text-secondary\">Merchant</dt>\n <dd className=\"font-medium text-text-primary\">{m.name}</dd>\n </div>\n <div className=\"flex gap-2\">\n <dt className=\"w-28 shrink-0 text-text-secondary\">Category</dt>\n <dd className=\"text-text-primary\">{titleCase(m.category)}</dd>\n </div>\n {m.address && (\n <div className=\"flex gap-2\">\n <dt className=\"w-28 shrink-0 text-text-secondary\">Address</dt>\n <dd className=\"flex items-start gap-1 text-text-primary\">\n <MapPin className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-text-secondary\" />\n {m.address}\n </dd>\n </div>\n )}\n <div className=\"flex gap-2\">\n <dt className=\"w-28 shrink-0 text-text-secondary\">Applied</dt>\n <dd className=\"flex items-center gap-1 text-text-primary\">\n <Calendar className=\"h-3.5 w-3.5 text-text-secondary\" />\n {formatDate(m.createdAt)}\n </dd>\n </div>\n {m.ownerId && (\n <div className=\"flex gap-2\">\n <dt className=\"w-28 shrink-0 text-text-secondary\">Owner ID</dt>\n <dd className=\"truncate font-mono text-xs text-text-primary\">{m.ownerId}</dd>\n </div>\n )}\n </dl>\n </div>\n <div>\n <h4 className=\"mb-3 text-sm font-semibold text-text-primary\">Performance</h4>\n <div className=\"grid grid-cols-2 gap-3\">\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <p className=\"text-xs text-text-secondary\">Rating</p>\n <p className=\"flex items-center gap-1 text-lg font-bold text-text-primary\">\n <Star className=\"h-4 w-4 fill-status-warning-text text-status-warning-text\" />\n {m.rating > 0 ? m.rating.toFixed(1) : '—'}\n </p>\n <p className=\"text-xs text-text-secondary\">{m.reviewCount} reviews</p>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-3\">\n <p className=\"text-xs text-text-secondary\">Avg Order Value</p>\n <p className=\"flex items-center gap-0.5 text-lg font-bold text-text-primary\">\n <IndianRupee className=\"h-3.5 w-3.5\" />\n {m.avgOrderValue > 0 ? m.avgOrderValue.toLocaleString('en-IN') : '—'}\n </p>\n </div>\n </div>\n {m.serviceTypes.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {m.serviceTypes.map((s) => (\n <span\n key={s}\n className=\"rounded-full bg-bg-surface px-2 py-0.5 text-xs text-text-secondary\"\n >\n {titleCase(s)}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"mt-4 flex flex-col items-start justify-between gap-3 border-t border-border-subtle pt-4 sm:flex-row sm:items-center\">\n <p className=\"flex items-center gap-1.5 text-xs text-text-muted\">\n <FileText className=\"h-3.5 w-3.5\" />\n Verification documents are not stored on the platform yet.\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {!m.isVerified && (\n <button\n type=\"button\"\n onClick={() => openAction(m, 'reject')}\n className=\"rounded-lg border border-status-error-text/40 px-3 py-1.5 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle\"\n >\n Reject\n </button>\n )}\n {!m.isVerified && (\n <button\n type=\"button\"\n onClick={() => openAction(m, 'approve')}\n className=\"rounded-lg bg-action-primary-bg px-3 py-1.5 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n Approve Merchant\n </button>\n )}\n {m.status !== 'inactive' && (\n <button\n type=\"button\"\n onClick={() => openAction(m, 'suspend')}\n className=\"rounded-lg border border-border-default px-3 py-1.5 text-sm font-medium text-status-error-text transition-colors hover:bg-status-error-bg-subtle\"\n >\n Suspend\n </button>\n )}\n </div>\n </div>\n </div>\n );\n\n if (loading) {\n return (\n <PageLayout title=\"Merchants\" description=\"Loading merchants...\">\n <div className=\"flex flex-col items-center justify-center py-20\">\n <Loader2 className=\"mb-4 h-10 w-10 animate-spin text-text-secondary\" />\n <p className=\"text-text-secondary\">Loading merchants...</p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Merchants\"\n description={`${counts.all} merchants on the platform · ${counts.pending} awaiting review`}\n >\n <PagePurpose className=\"mb-6\">\n Onboard and oversee every merchant (cart) on Kadaikodi. Approve and verify legitimate\n businesses, suspend ones that break the rules, and keep an eye on ratings and performance —\n so customers only ever see trustworthy, active merchants.\n </PagePurpose>\n\n {statusMessage && (\n <div\n className={cn(\n 'mb-6 flex items-center gap-2 rounded-lg border p-3',\n statusMessage.type === 'success'\n ? 'border-status-success-text/30 bg-status-success-bg-subtle'\n : 'border-status-error-text/30 bg-status-error-bg-subtle'\n )}\n >\n {statusMessage.type === 'success' ? (\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text\" />\n ) : (\n <AlertCircle className=\"h-4 w-4 text-status-error-text\" />\n )}\n <span\n className={cn(\n 'text-sm font-medium',\n statusMessage.type === 'success'\n ? 'text-status-success-text'\n : 'text-status-error-text'\n )}\n >\n {statusMessage.text}\n </span>\n </div>\n )}\n\n {/* KPI row */}\n <div className=\"mb-6 grid grid-cols-2 gap-4 lg:grid-cols-4\">\n <StatCard label=\"Total Merchants\" value={counts.all.toLocaleString('en-IN')} icon={<Store className=\"h-4 w-4\" />} />\n <StatCard label=\"Pending Review\" value={counts.pending.toLocaleString('en-IN')} icon={<AlertCircle className=\"h-4 w-4\" />} />\n <StatCard label=\"Verified\" value={counts.verified.toLocaleString('en-IN')} icon={<CheckCircle2 className=\"h-4 w-4\" />} />\n <StatCard label=\"Avg Rating\" value={avgRating > 0 ? avgRating.toFixed(1) : '—'} icon={<Star className=\"h-4 w-4\" />} />\n </div>\n\n {/* Tabs + search */}\n <div className=\"mb-6 flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"overflow-x-auto\">\n <SegmentedTabs\n aria-label=\"Filter merchants by status\"\n value={statusTab}\n onChange={(id) => setStatusTab(id as StatusTab)}\n tabs={[\n { id: 'all', label: 'All', count: counts.all },\n { id: 'pending', label: 'Pending', count: counts.pending },\n { id: 'verified', label: 'Verified', count: counts.verified },\n { id: 'inactive', label: 'Inactive', count: counts.inactive },\n ]}\n />\n </div>\n <div className=\"flex flex-col gap-3 sm:flex-row\">\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 merchants...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 pl-10 pr-4 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] sm:w-64\"\n />\n </div>\n <select\n value={category}\n onChange={(e) => setCategory(e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">All Categories</option>\n {categories.map((c) => (\n <option key={c} value={c}>\n {titleCase(c)}\n </option>\n ))}\n </select>\n <select\n value={sortBy}\n onChange={(e) => setSortBy(e.target.value)}\n className=\"rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"recent\">Most Recent</option>\n <option value=\"name\">Name A–Z</option>\n <option value=\"rating\">Highest Rated</option>\n <option value=\"value\">Highest Avg Order</option>\n </select>\n </div>\n </div>\n\n {/* Merchant table / cards */}\n {rows.length === 0 ? (\n <EmptyState\n illustration=\"empty-search\"\n title=\"No merchants found\"\n description=\"No merchants match your current filters. Try clearing the search or switching tabs.\"\n action={\n <button\n type=\"button\"\n onClick={() => {\n setSearchQuery('');\n setCategory('');\n setStatusTab('all');\n }}\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-accent\"\n >\n Clear filters\n </button>\n }\n />\n ) : (\n <GlassCard treatment=\"plain\" className=\"overflow-hidden\">\n {/* Desktop table */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b border-border-subtle bg-bg-sunken/50\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary\">\n Merchant\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary\">\n Category\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary\">\n Status\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary\">\n Rating\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-text-secondary\">\n Avg Order\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium uppercase tracking-wider text-text-secondary\">\n Actions\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-border\">\n {rows.map((m) => {\n const expanded = expandedId === m.id;\n return (\n <Fragment key={m.id}>\n <tr className=\"transition-colors hover:bg-accent/50\">\n <td className=\"px-4 py-3\">\n <button\n type=\"button\"\n onClick={() => setExpandedId(expanded ? null : m.id)}\n className=\"flex items-center gap-3 text-left\"\n >\n <ChevronDown\n className={cn(\n 'h-4 w-4 shrink-0 text-text-secondary transition-transform',\n expanded && 'rotate-180'\n )}\n />\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary\">\n <Store className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {m.name}\n </p>\n {m.address && (\n <p className=\"truncate text-xs text-text-secondary\">{m.address}</p>\n )}\n </div>\n </button>\n </td>\n <td className=\"px-4 py-3 text-sm text-text-secondary\">\n {titleCase(m.category)}\n </td>\n <td className=\"px-4 py-3\">\n <StatusPill status={m.status} />\n </td>\n <td className=\"px-4 py-3 text-sm\">\n {m.rating > 0 ? (\n <span className=\"flex items-center gap-1 text-text-primary\">\n <Star className=\"h-3.5 w-3.5 fill-status-warning-text text-status-warning-text\" />\n {m.rating.toFixed(1)}\n <span className=\"text-text-secondary\">({m.reviewCount})</span>\n </span>\n ) : (\n <span className=\"text-text-secondary\">—</span>\n )}\n </td>\n <td className=\"px-4 py-3 text-sm text-text-primary\">\n {m.avgOrderValue > 0 ? fmtCur(m.avgOrderValue) : '—'}\n </td>\n <td className=\"px-4 py-3\">\n <RowActions m={m} />\n </td>\n </tr>\n {expanded && (\n <tr className=\"bg-bg-sunken/20\">\n <td colSpan={6} className=\"px-4 py-4\">\n <MerchantDetail m={m} />\n </td>\n </tr>\n )}\n </Fragment>\n );\n })}\n </tbody>\n </table>\n </div>\n\n {/* Mobile cards */}\n <div className=\"space-y-4 p-4 md:hidden\">\n {rows.map((m) => {\n const expanded = expandedId === m.id;\n return (\n <div\n key={m.id}\n className=\"rounded-lg border border-border-subtle bg-bg-sunken/30 p-4\"\n >\n <div className=\"mb-3 flex items-start gap-3\">\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary\">\n <Store className=\"h-6 w-6\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate font-medium text-text-primary\">{m.name}</h3>\n <p className=\"truncate text-sm text-text-secondary\">{titleCase(m.category)}</p>\n {m.address && (\n <p className=\"truncate text-xs text-text-secondary\">{m.address}</p>\n )}\n </div>\n </div>\n <div className=\"mb-3 flex flex-wrap items-center gap-2\">\n <StatusPill status={m.status} />\n {m.rating > 0 && (\n <span className=\"inline-flex items-center gap-1 rounded-full bg-status-warning-bg-subtle px-2.5 py-0.5 text-xs font-medium text-status-warning-text\">\n <Star className=\"h-3 w-3 fill-current\" />\n {m.rating.toFixed(1)} ({m.reviewCount})\n </span>\n )}\n {m.avgOrderValue > 0 && (\n <span className=\"text-xs text-text-secondary\">\n Avg {fmtCur(m.avgOrderValue)}\n </span>\n )}\n </div>\n <div className=\"mb-3\">\n <RowActions m={m} compact />\n </div>\n <button\n type=\"button\"\n onClick={() => setExpandedId(expanded ? null : m.id)}\n className=\"flex w-full items-center justify-center gap-1 rounded-lg border border-border-subtle py-1.5 text-sm font-medium text-text-primary transition-colors hover:bg-accent\"\n >\n {expanded ? 'Hide details' : 'View details'}\n <ChevronDown\n className={cn('h-4 w-4 transition-transform', expanded && 'rotate-180')}\n />\n </button>\n {expanded && (\n <div className=\"mt-3\">\n <MerchantDetail m={m} />\n </div>\n )}\n </div>\n );\n })}\n </div>\n </GlassCard>\n )}\n\n {/* Confirmation modal */}\n {showModal && selected && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"max-h-[90vh] w-full max-w-lg overflow-y-auto rounded-lg border border-border-subtle bg-bg-surface shadow-lg\">\n <div className=\"flex items-center justify-between border-b border-border-subtle p-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">\n {actionType === 'approve'\n ? 'Approve Merchant'\n : actionType === 'reject'\n ? 'Reject Merchant'\n : 'Suspend Merchant'}\n </h3>\n <button\n type=\"button\"\n onClick={() => setShowModal(false)}\n className=\"rounded p-1.5 text-text-secondary transition-colors hover:bg-accent hover:text-text-primary\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <div className=\"space-y-4 p-4\">\n <div className=\"flex items-center gap-3 rounded-lg bg-bg-sunken/50 p-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary\">\n <Store className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{selected.name}</p>\n <p className=\"truncate text-sm text-text-secondary\">\n {titleCase(selected.category)}\n </p>\n </div>\n </div>\n\n {actionType === 'approve' && (\n <div className=\"rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-3\">\n <p className=\"text-sm text-status-success-text\">\n This marks the merchant as verified and active, so customers can start ordering\n from it.\n </p>\n </div>\n )}\n {actionType === 'suspend' && (\n <div className=\"rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle p-3\">\n <p className=\"text-sm text-status-error-text\">\n This suspends the merchant. It will be hidden from customers until reinstated.\n </p>\n </div>\n )}\n {actionType === 'reject' && (\n <div>\n <label className=\"mb-2 block text-sm font-medium text-text-primary\">\n Rejection Reason *\n </label>\n <textarea\n className=\"min-h-[100px] w-full rounded-lg border border-border-subtle bg-bg-surface p-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n rows={4}\n value={rejectionReason}\n onChange={(e) => setRejectionReason(e.target.value)}\n placeholder=\"Explain why this application is being rejected...\"\n />\n </div>\n )}\n\n <div className=\"flex gap-3 pt-2\">\n <button\n type=\"button\"\n onClick={() => setShowModal(false)}\n className=\"flex-1 rounded-lg border border-border-subtle py-2 text-sm font-medium text-text-primary transition-colors hover:bg-accent\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={executeAction}\n disabled={\n updateProvider.isPending || (actionType === 'reject' && !rejectionReason.trim())\n }\n className=\"flex-1 rounded-lg bg-action-primary-bg py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {updateProvider.isPending\n ? 'Working…'\n : actionType === 'approve'\n ? 'Approve Merchant'\n : actionType === 'reject'\n ? 'Reject Merchant'\n : 'Suspend Merchant'}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}