@burdenoff/microfe-kadaikodi 2026.802.1 → 2026.830.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 (58) hide show
  1. package/dist/kadaikodi/KadaikodiRoot.d.ts.map +1 -1
  2. package/dist/kadaikodi/KadaikodiRoot.js +69 -72
  3. package/dist/kadaikodi/KadaikodiRoot.js.map +1 -1
  4. package/dist/kadaikodi/components/InvestmentCard.d.ts.map +1 -1
  5. package/dist/kadaikodi/components/InvestmentCard.js +58 -54
  6. package/dist/kadaikodi/components/InvestmentCard.js.map +1 -1
  7. package/dist/kadaikodi/components/OrderCard.d.ts.map +1 -1
  8. package/dist/kadaikodi/components/StatusBadge.d.ts.map +1 -1
  9. package/dist/kadaikodi/components/StatusBadge.js +25 -14
  10. package/dist/kadaikodi/components/StatusBadge.js.map +1 -1
  11. package/dist/kadaikodi/hooks/useKadaikodiApi.d.ts +24 -0
  12. package/dist/kadaikodi/hooks/useKadaikodiApi.d.ts.map +1 -1
  13. package/dist/kadaikodi/hooks/useKadaikodiApi.js +177 -132
  14. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  15. package/dist/kadaikodi/pages/HomePage.d.ts.map +1 -1
  16. package/dist/kadaikodi/pages/HomePage.js +284 -282
  17. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  18. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.d.ts +7 -2
  19. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.d.ts.map +1 -1
  20. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +319 -228
  21. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  22. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +1 -1
  23. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  24. package/dist/kadaikodi/pages/admin/CartManagementPage.d.ts +10 -4
  25. package/dist/kadaikodi/pages/admin/CartManagementPage.d.ts.map +1 -1
  26. package/dist/kadaikodi/pages/admin/CartManagementPage.js +320 -279
  27. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  28. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.d.ts.map +1 -1
  29. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js +365 -292
  30. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js.map +1 -1
  31. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.d.ts +7 -2
  32. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.d.ts.map +1 -1
  33. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +300 -158
  34. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  35. package/dist/kadaikodi/pages/common/SettingsPage.js +286 -286
  36. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  37. package/dist/kadaikodi/pages/customer/CartDetailPage.d.ts.map +1 -1
  38. package/dist/kadaikodi/pages/customer/CartDetailPage.js +3 -3
  39. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  40. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.d.ts +13 -3
  41. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.d.ts.map +1 -1
  42. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +270 -220
  43. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  44. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +97 -97
  45. package/dist/kadaikodi/pages/customer/OrderTrackingPage.d.ts.map +1 -1
  46. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +1 -1
  47. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  48. package/dist/kadaikodi/pages/worker/TaskDetailsPage.d.ts +5 -3
  49. package/dist/kadaikodi/pages/worker/TaskDetailsPage.d.ts.map +1 -1
  50. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +286 -199
  51. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  52. package/dist/kadaikodi/types/index.d.ts +46 -2
  53. package/dist/kadaikodi/types/index.d.ts.map +1 -1
  54. package/dist/shared/hooks/useTr.d.ts +2 -0
  55. package/dist/shared/hooks/useTr.d.ts.map +1 -0
  56. package/dist/shared/hooks/useTr.js +14 -0
  57. package/dist/shared/hooks/useTr.js.map +1 -0
  58. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/kadaikodi/pages/HomePage.tsx"],"sourcesContent":["/**\n * Home Page\n * @module kadaikodi/pages\n *\n * The role-aware launch pad — \"one account, every role\". The hero is a set of\n * role cards (Customer / My Cart-Merchant / Work / Invest / Admin), each with an\n * icon, a one-line description, a LIVE stat pulled from the real backend hooks\n * where it is cheap, and a chevron that jumps to that role's home. The Admin\n * card is gated for operators. Below the role cards, a compact current-role\n * surface keeps the day-to-day essentials (quick actions, what's open nearby,\n * recent orders, categories) — all wired to real data, no fabricated values.\n */\n\nimport { useState, useMemo, useCallback } from 'react';\nimport type { ReactNode } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Search,\n ShoppingBag,\n ShoppingCart,\n Store,\n ClipboardList,\n TrendingUp,\n LayoutDashboard,\n Users,\n IndianRupee,\n ArrowRight,\n ChevronRight,\n Star,\n MapPin,\n Clock,\n ChefHat,\n Scissors,\n Wrench,\n Home,\n Shirt,\n Heart,\n GraduationCap,\n Package,\n BarChart3,\n Sparkles,\n HandCoins,\n UserCheck,\n Truck,\n BadgeCheck,\n Shield,\n Lock,\n Settings,\n Loader2,\n AlertCircle,\n} from 'lucide-react';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { StatusBadge } from '../components/StatusBadge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useKadaikodi } from '../context/KadaikodiContext';\nimport { useKadaikodiApi } from '../hooks/useKadaikodiApi';\nimport { cn } from '../utils/cn';\nimport { formatCurrency, formatRelativeTime, formatDistance } from '../utils/formatters';\nimport type { UserRole } from '../types';\n\n// ---------------------------------------------------------------------------\n// Role-based Quick Action configs (valid, real routes only)\n// ---------------------------------------------------------------------------\n\ninterface QuickAction {\n label: string;\n description: string;\n icon: ReactNode;\n path: string;\n color: string;\n}\n\nconst quickActionsByRole: Record<UserRole, QuickAction[]> = {\n customer: [\n {\n label: 'Discover',\n description: 'Browse carts near you',\n icon: <Search className=\"h-5 w-5\" />,\n path: '/customer/discover',\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: 'My Orders',\n description: 'Track your orders',\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n path: '/customer/orders',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Favorites',\n description: 'Your saved carts',\n icon: <Heart className=\"h-5 w-5\" />,\n path: '/customer/favorites',\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n {\n label: 'Settings',\n description: 'Manage preferences',\n icon: <Settings className=\"h-5 w-5\" />,\n path: '/settings',\n color: 'bg-bg-sunken text-text-secondary',\n },\n ],\n cart_owner: [\n {\n label: 'Dashboard',\n description: 'Run your cart',\n icon: <Store className=\"h-5 w-5\" />,\n path: '/cart-owner/dashboard',\n color: 'bg-accent-primary/10 text-accent-primary',\n },\n {\n label: 'Orders',\n description: 'Incoming orders',\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n path: '/cart-owner/orders',\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: 'Analytics',\n description: 'Revenue & insights',\n icon: <BarChart3 className=\"h-5 w-5\" />,\n path: '/cart-owner/analytics',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Staff',\n description: 'Manage workers',\n icon: <Users className=\"h-5 w-5\" />,\n path: '/cart-owner/staff',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n ],\n worker: [\n {\n label: 'My Tasks',\n description: 'Assigned work',\n icon: <ClipboardList className=\"h-5 w-5\" />,\n path: '/worker/dashboard',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: 'Schedule',\n description: 'View shifts',\n icon: <Clock className=\"h-5 w-5\" />,\n path: '/worker/schedule',\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: 'Deliveries',\n description: 'Active runs',\n icon: <Package className=\"h-5 w-5\" />,\n path: '/worker/orders',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Profile',\n description: 'Your details',\n icon: <UserCheck className=\"h-5 w-5\" />,\n path: '/worker/profile',\n color: 'bg-bg-sunken text-text-secondary',\n },\n ],\n investor: [\n {\n label: 'Portfolio',\n description: 'Your investments',\n icon: <TrendingUp className=\"h-5 w-5\" />,\n path: '/investor/portfolio',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Opportunities',\n description: 'New investments',\n icon: <HandCoins className=\"h-5 w-5\" />,\n path: '/investor/opportunities',\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: 'Investments',\n description: 'Active positions',\n icon: <IndianRupee className=\"h-5 w-5\" />,\n path: '/investor/investments',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Analytics',\n description: 'Performance',\n icon: <BarChart3 className=\"h-5 w-5\" />,\n path: '/investor/analytics',\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n ],\n admin: [\n {\n label: 'Dashboard',\n description: 'Platform overview',\n icon: <LayoutDashboard className=\"h-5 w-5\" />,\n path: '/admin/dashboard',\n color: 'bg-status-error-bg-subtle text-status-error-text',\n },\n {\n label: 'Users',\n description: 'Manage accounts',\n icon: <Users className=\"h-5 w-5\" />,\n path: '/admin/users',\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: 'Carts',\n description: 'Approve & manage',\n icon: <Store className=\"h-5 w-5\" />,\n path: '/admin/carts',\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n {\n label: 'Analytics',\n description: 'Revenue reports',\n icon: <BarChart3 className=\"h-5 w-5\" />,\n path: '/admin/analytics',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n ],\n};\n\n// ---------------------------------------------------------------------------\n// Category data (real navigation into discovery, filtered by category)\n// ---------------------------------------------------------------------------\n\nconst categories = [\n {\n label: 'Food & Beverage',\n icon: <ChefHat className=\"h-6 w-6\" />,\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: 'Personal Care & Beauty',\n icon: <Scissors className=\"h-6 w-6\" />,\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n {\n label: 'Repair & Maintenance',\n icon: <Wrench className=\"h-6 w-6\" />,\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: 'Home Services',\n icon: <Home className=\"h-6 w-6\" />,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Clothing & Fashion',\n icon: <Shirt className=\"h-6 w-6\" />,\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n {\n label: 'Health & Wellness',\n icon: <Heart className=\"h-6 w-6\" />,\n color: 'bg-status-error-bg-subtle text-status-error-text',\n },\n {\n label: 'Education & Skills',\n icon: <GraduationCap className=\"h-6 w-6\" />,\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: 'Retail & Merchandise',\n icon: <Package className=\"h-6 w-6\" />,\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: 'Grocery & Essentials',\n icon: <ShoppingCart className=\"h-6 w-6\" />,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n];\n\n// ---------------------------------------------------------------------------\n// Role card definitions (the hero of the page)\n// ---------------------------------------------------------------------------\n\ninterface RoleCardDef {\n role: UserRole;\n title: string;\n description: string;\n icon: ReactNode;\n path: string;\n iconClass: string;\n}\n\ninterface RoleStat {\n value: string;\n label: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function HomePage() {\n const { navigateTo, currentUser } = useKadaikodi();\n const { t: translate } = useI18n();\n const [searchQuery, setSearchQuery] = useState('');\n\n const { providers, orders, dashboardStats, investments } = useKadaikodiApi();\n\n const t = useCallback(\n (key: string, fallback: string): string => {\n const value = translate(key);\n return value === key ? fallback : value;\n },\n [translate]\n );\n\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'there';\n const userRole: UserRole = (currentUser?.role as UserRole) ?? 'customer';\n const isOperator = userRole === 'admin';\n\n const quickActions = quickActionsByRole[userRole] ?? quickActionsByRole.customer;\n\n // --- Real, cheap live metrics (derived only from already-fetched data) ---\n const myProvider = useMemo(\n () => (providers.data ?? []).find((p) => p.ownerId === currentUser?.id),\n [providers.data, currentUser?.id]\n );\n const customerOrderCount = (orders.data ?? []).length;\n const portfolioValue = useMemo(\n () => (investments.data ?? []).reduce((sum, inv) => sum + inv.currentValue, 0),\n [investments.data]\n );\n\n const roleStat = useCallback(\n (role: UserRole): RoleStat | null => {\n switch (role) {\n case 'customer':\n return {\n value: customerOrderCount.toString(),\n label:\n customerOrderCount === 1\n ? t('kadaikodi.home.order', 'order')\n : t('kadaikodi.home.orders', 'orders'),\n };\n case 'cart_owner':\n return myProvider\n ? {\n value: `★ ${myProvider.rating.toFixed(1)}`,\n label: t('kadaikodi.home.rating', 'rating'),\n }\n : null;\n case 'investor':\n return portfolioValue > 0\n ? {\n value: formatCurrency(portfolioValue, { minimumFractionDigits: 0 }),\n label: t('kadaikodi.home.portfolio', 'portfolio'),\n }\n : null;\n case 'admin':\n return isOperator\n ? {\n value: (dashboardStats.data?.activeProviders ?? 0).toString(),\n label: t('kadaikodi.home.providers', 'providers'),\n }\n : null;\n case 'worker':\n default:\n // Worker stats need a worker-scoped query we intentionally keep off the\n // launch pad to stay cheap — the card shows its description only.\n return null;\n }\n },\n [customerOrderCount, myProvider, portfolioValue, isOperator, dashboardStats.data, t]\n );\n\n const roleCards: RoleCardDef[] = [\n {\n role: 'customer',\n title: t('kadaikodi.home.roleCard.customer.title', 'Shop as Customer'),\n description: t('kadaikodi.home.roleCard.customer.desc', 'Discover carts & order'),\n icon: <ShoppingCart className=\"h-6 w-6\" />,\n path: '/customer/dashboard',\n iconClass: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n role: 'cart_owner',\n title: t('kadaikodi.home.roleCard.merchant.title', 'My Cart (Merchant)'),\n description: t('kadaikodi.home.roleCard.merchant.desc', 'Run your business'),\n icon: <Store className=\"h-6 w-6\" />,\n path: '/cart-owner/dashboard',\n iconClass: 'bg-accent-primary/10 text-accent-primary',\n },\n {\n role: 'worker',\n title: t('kadaikodi.home.roleCard.worker.title', 'Work'),\n description: t('kadaikodi.home.roleCard.worker.desc', 'Deliveries & tasks'),\n icon: <Truck className=\"h-6 w-6\" />,\n path: '/worker/dashboard',\n iconClass: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n role: 'investor',\n title: t('kadaikodi.home.roleCard.investor.title', 'Invest'),\n description: t('kadaikodi.home.roleCard.investor.desc', 'Back local merchants'),\n icon: <HandCoins className=\"h-6 w-6\" />,\n path: '/investor/dashboard',\n iconClass: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n role: 'admin',\n title: t('kadaikodi.home.roleCard.admin.title', 'Admin'),\n description: t('kadaikodi.home.roleCard.admin.desc', 'Platform operations'),\n icon: <Shield className=\"h-6 w-6\" />,\n path: '/admin/dashboard',\n iconClass: 'bg-bg-sunken text-text-secondary',\n },\n ];\n\n // Featured carts (top-rated, open) — real providers\n const featuredCarts = useMemo(() => {\n let carts = (providers.data ?? []).filter((c) => c.isOpen);\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n carts = carts.filter(\n (c) => c.name.toLowerCase().includes(q) || c.category.toLowerCase().includes(q)\n );\n }\n return carts.sort((a, b) => b.rating - a.rating).slice(0, 6);\n }, [providers.data, searchQuery]);\n\n // Recent orders — real\n const recentOrders = useMemo(() => {\n return [...(orders.data ?? [])]\n .sort((a, b) => new Date(b.orderDate).getTime() - new Date(a.orderDate).getTime())\n .slice(0, 3);\n }, [orders.data]);\n\n const isNewUser = (orders.data ?? []).length === 0 && !orders.isLoading;\n const isLoading = providers.isLoading || orders.isLoading || dashboardStats.isLoading;\n const isError = providers.isError || orders.isError || dashboardStats.isError;\n\n if (isLoading) {\n return (\n <PageLayout title={t('kadaikodi.common.loading', 'Loading...')}>\n <div className=\"flex h-[60vh] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-accent-primary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (isError) {\n return (\n <PageLayout title={t('kadaikodi.common.error', 'Error')}>\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 text-text-primary\">\n {t('kadaikodi.common.errorLoading', 'Error loading data')}\n </h2>\n <p className=\"text-text-secondary\">\n {t('kadaikodi.common.tryAgain', 'Please try again later.')}\n </p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={`${t('kadaikodi.home.hi', 'Hi')}, ${firstName}`}\n description={t('kadaikodi.home.everyRole', 'One account, every role')}\n >\n <PagePurpose className=\"mb-6\">\n {t(\n 'kadaikodi.home.purpose',\n 'Kadaikodi gives you one account for every side of local commerce. Jump into the role you need — shop as a customer, run your cart as a merchant, pick up delivery work, or back local businesses — and pick up right where you left off.'\n )}\n </PagePurpose>\n\n {/* Welcome Banner for New Users (real: gated on empty order history) */}\n {isNewUser && (\n <section className=\"mb-8 overflow-hidden rounded-xl border border-border-subtle bg-accent-primary/5 p-6\">\n <div className=\"flex items-start gap-4\">\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-accent-primary/10 text-accent-primary\">\n <Sparkles className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('kadaikodi.home.welcomeTitle', 'Welcome to Kadaikodi!')}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t(\n 'kadaikodi.home.welcomeDescription',\n 'Your local commerce hub. Start by exploring service providers near you, or pick a role above to get going.'\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/discover')}\n className=\"mt-3 inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n <Search className=\"h-4 w-4\" />\n {t('kadaikodi.home.exploreServices', 'Explore Services')}\n </button>\n </div>\n </div>\n </section>\n )}\n\n {/* ── ROLE CARDS — the hero: one account, every role ─────────── */}\n <section className=\"mb-10\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('kadaikodi.home.chooseRole', 'Choose how you want to show up')}\n </h2>\n <span className=\"hidden items-center gap-1 text-xs font-medium text-text-muted sm:inline-flex\">\n <Shield className=\"h-3.5 w-3.5\" />\n {t('kadaikodi.home.rbac', 'RBAC & multi-tenant')}\n </span>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3\">\n {roleCards.map((card) => {\n const isCurrent = card.role === userRole;\n const gated = card.role === 'admin' && !isOperator;\n const stat = roleStat(card.role);\n\n return (\n <button\n key={card.role}\n type=\"button\"\n disabled={gated}\n onClick={() => {\n if (!gated) navigateTo(card.path);\n }}\n aria-label={card.title}\n className={cn(\n 'group relative flex items-center gap-4 rounded-xl border p-4 text-left transition-all sm:p-5',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]',\n isCurrent\n ? 'border-accent-primary/40 bg-accent-primary/5 shadow-[var(--shadow-glow)]'\n : 'border-border-subtle bg-bg-surface hover:border-border-strong hover:shadow-md',\n gated &&\n 'cursor-not-allowed opacity-70 hover:border-border-subtle hover:shadow-none'\n )}\n >\n <div\n className={cn(\n 'flex h-12 w-12 shrink-0 items-center justify-center rounded-xl',\n card.iconClass\n )}\n >\n {gated ? <Lock className=\"h-6 w-6\" /> : card.icon}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"truncate text-base font-semibold text-text-primary\">\n {card.title}\n </p>\n {isCurrent && (\n <span className=\"inline-flex items-center rounded-full bg-accent-primary/10 px-2 py-0.5 text-[11px] font-medium text-accent-primary\">\n {t('kadaikodi.home.current', 'Current')}\n </span>\n )}\n </div>\n <p className=\"mt-0.5 truncate text-sm text-text-secondary\">{card.description}</p>\n </div>\n\n <div className=\"flex shrink-0 items-center gap-3\">\n {gated ? (\n <span className=\"inline-flex items-center gap-1 whitespace-nowrap text-xs font-medium text-text-muted\">\n {t('kadaikodi.home.operatorsOnly', 'operators only')}\n <Lock className=\"h-3.5 w-3.5\" />\n </span>\n ) : (\n <>\n {stat && (\n <div className=\"hidden text-right sm:block\">\n <p className=\"text-sm font-bold tabular-nums text-text-primary\">\n {stat.value}\n </p>\n <p className=\"text-[11px] text-text-secondary\">{stat.label}</p>\n </div>\n )}\n <ChevronRight className=\"h-5 w-5 text-text-secondary transition group-hover:translate-x-0.5 group-hover:text-text-primary\" />\n </>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </section>\n\n {/* ── Current-role surface ───────────────────────────────────── */}\n\n {/* Quick Actions */}\n <section className=\"mb-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">\n {t('kadaikodi.home.quickActions', 'Quick Actions')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {quickActions.map((action) => (\n <button\n key={action.label}\n type=\"button\"\n onClick={() => navigateTo(action.path)}\n className={cn(\n 'group flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 text-left shadow-sm transition-all',\n 'hover:border-border-strong hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-lg',\n action.color\n )}\n >\n {action.icon}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold text-text-primary\">{action.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">{action.description}</p>\n </div>\n <ArrowRight className=\"mt-1 h-4 w-4 shrink-0 text-text-secondary transition group-hover:translate-x-0.5\" />\n </button>\n ))}\n </div>\n </section>\n\n {/* Featured / Nearby Carts (real providers) */}\n <section className=\"mb-8\">\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {searchQuery\n ? t('kadaikodi.home.searchResults', 'Search Results')\n : t('kadaikodi.home.openNearby', \"What's open nearby\")}\n </h2>\n <div className=\"flex items-center gap-3\">\n <div className=\"relative w-full sm:w-64\">\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={t('kadaikodi.home.searchPlaceholder', 'Search carts...')}\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-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/discover')}\n className=\"hidden items-center gap-1 whitespace-nowrap text-sm font-medium text-accent-primary hover:underline sm:flex\"\n >\n {t('kadaikodi.common.viewAll', 'View All')} <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n\n {featuredCarts.length === 0 ? (\n <EmptyState\n illustration=\"empty-search\"\n icon={<Search className=\"h-10 w-10\" />}\n title={t('kadaikodi.home.noCartsFound', 'No carts found')}\n description={t(\n 'kadaikodi.home.noCartsDescription',\n 'Try adjusting your search or browse all categories'\n )}\n action={\n searchQuery ? (\n <button\n type=\"button\"\n onClick={() => setSearchQuery('')}\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n {t('kadaikodi.home.clearSearch', 'Clear Search')}\n </button>\n ) : undefined\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {featuredCarts.map((cart) => (\n <div\n key={cart.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/customer/cart/${cart.id}`);\n }\n }}\n className=\"group cursor-pointer overflow-hidden rounded-xl border border-border-subtle bg-bg-surface shadow-sm transition-all hover:border-border-strong hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n {/* Header band — honest placeholder (no fabricated imagery). */}\n <div className=\"relative flex h-24 items-center justify-center bg-gradient-to-br from-[var(--color-accent-soft)] to-bg-sunken\">\n <Store className=\"h-8 w-8 text-text-secondary/50\" />\n <div className=\"absolute right-2 top-2\">\n <StatusBadge status={cart.isOpen ? 'open' : 'closed'} />\n </div>\n {cart.isVerified && (\n <div className=\"absolute left-2 top-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-surface/80 px-2 py-0.5 text-xs font-medium text-accent-primary backdrop-blur-sm\">\n <BadgeCheck className=\"h-3 w-3\" />\n {t('kadaikodi.home.verified', 'Verified')}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">\n {cart.name}\n </h3>\n <p className=\"mt-0.5 text-sm text-text-secondary\">{cart.category}</p>\n </div>\n <div className=\"flex shrink-0 items-center gap-1 rounded bg-status-success-bg-subtle px-1.5 py-0.5\">\n <Star className=\"h-3 w-3 fill-status-success-text text-status-success-text\" />\n <span className=\"text-xs font-bold text-status-success-text tabular-nums\">\n {cart.rating.toFixed(1)}\n </span>\n </div>\n </div>\n\n <div className=\"mt-3 flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-text-secondary\">\n {cart.distance != null && (\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> {formatDistance(cart.distance)}\n </span>\n )}\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3\" /> {cart.totalRatings}{' '}\n {t('kadaikodi.home.reviews', 'reviews')}\n </span>\n {cart.averageOrderValue != null && cart.averageOrderValue > 0 && (\n <span className=\"flex items-center gap-1\">\n <IndianRupee className=\"h-3 w-3\" /> {t('kadaikodi.home.average', 'Avg.')}{' '}\n {formatCurrency(cart.averageOrderValue, { minimumFractionDigits: 0 })}\n </span>\n )}\n </div>\n\n {cart.serviceTypes && cart.serviceTypes.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {cart.serviceTypes.slice(0, 3).map((st) => (\n <span\n key={st}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {st.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </section>\n\n {/* Recent Orders (real) */}\n {recentOrders.length > 0 && (\n <section className=\"mb-8\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {t('kadaikodi.home.recentOrders', 'Recent Orders')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className=\"flex items-center gap-1 text-sm font-medium text-accent-primary hover:underline\"\n >\n {t('kadaikodi.common.viewAll', 'View All')} <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <div className=\"divide-y divide-border-subtle overflow-hidden rounded-xl border border-border-subtle bg-bg-surface\">\n {recentOrders.map((order) => (\n <div\n key={order.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => navigateTo(`/customer/orders/${order.id}/track`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/customer/orders/${order.id}/track`);\n }\n }}\n className=\"flex cursor-pointer items-center gap-4 px-4 py-3 transition-colors hover:bg-bg-sunken/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary\">\n <ShoppingBag className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {order.cartName}\n </p>\n <StatusBadge status={order.status} />\n </div>\n <p className=\"mt-0.5 truncate text-xs text-text-secondary\">\n {order.items.map((i) => i.name).join(', ')}\n </p>\n </div>\n <div className=\"shrink-0 text-right\">\n <p className=\"text-sm font-semibold text-text-primary tabular-nums\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {formatRelativeTime(order.orderDate)}\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n )}\n\n {/* Browse by Category (real navigation) */}\n <section className=\"mb-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">\n {t('kadaikodi.home.browseByCategory', 'Browse by Category')}\n </h2>\n <div className=\"grid grid-cols-3 gap-3 sm:grid-cols-4 lg:grid-cols-5\">\n {categories.map((cat) => (\n <button\n key={cat.label}\n type=\"button\"\n onClick={() =>\n navigateTo(`/customer/discover?category=${encodeURIComponent(cat.label)}`)\n }\n className=\"flex flex-col items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface p-4 text-center transition-all hover:border-border-strong hover:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div\n className={cn('flex h-12 w-12 items-center justify-center rounded-full', cat.color)}\n >\n {cat.icon}\n </div>\n <span className=\"text-xs font-medium leading-tight text-text-primary\">\n {cat.label}\n </span>\n </button>\n ))}\n </div>\n </section>\n\n {/* Footer note */}\n <p className=\"mt-2 text-center text-xs text-text-muted\">\n {t(\n 'kadaikodi.home.footerNote',\n 'RBAC & multi-tenancy inherited from the Burdenoff platform'\n )}\n </p>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/kadaikodi/pages/HomePage.tsx"],"sourcesContent":["/**\n * Home Page\n * @module kadaikodi/pages\n *\n * The role-aware launch pad — \"one account, every role\". The hero is a set of\n * role cards (Customer / My Cart-Merchant / Work / Invest / Admin), each with an\n * icon, a one-line description, a LIVE stat pulled from the real backend hooks\n * where it is cheap, and a chevron that jumps to that role's home. The Admin\n * card is gated for operators. Below the role cards, a compact current-role\n * surface keeps the day-to-day essentials (quick actions, what's open nearby,\n * recent orders, categories) — all wired to real data, no fabricated values.\n */\n\nimport { useState, useMemo, useCallback } from 'react';\nimport type { ReactNode } from 'react';\nimport {\n Search,\n ShoppingBag,\n ShoppingCart,\n Store,\n ClipboardList,\n TrendingUp,\n LayoutDashboard,\n Users,\n IndianRupee,\n ArrowRight,\n ChevronRight,\n Star,\n MapPin,\n Clock,\n ChefHat,\n Scissors,\n Wrench,\n Home,\n Shirt,\n Heart,\n GraduationCap,\n Package,\n BarChart3,\n Sparkles,\n HandCoins,\n UserCheck,\n Truck,\n BadgeCheck,\n Shield,\n Lock,\n Settings,\n Loader2,\n AlertCircle,\n} from 'lucide-react';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { StatusBadge } from '../components/StatusBadge';\nimport { EmptyState } from '../components/EmptyState';\nimport { useKadaikodi } from '../context/KadaikodiContext';\nimport { useKadaikodiApi } from '../hooks/useKadaikodiApi';\nimport { cn } from '../utils/cn';\nimport { formatCurrency, formatRelativeTime, formatDistance } from '../utils/formatters';\nimport type { UserRole } from '../types';\nimport { useTr } from '../../shared/hooks/useTr';\n\n// ---------------------------------------------------------------------------\n// Role-based Quick Action configs (valid, real routes only)\n// ---------------------------------------------------------------------------\n\ninterface QuickAction {\n label: string;\n description: string;\n icon: ReactNode;\n path: string;\n color: string;\n}\n\nfunction getQuickActionsByRole(tr: ReturnType<typeof useTr>): Record<UserRole, QuickAction[]> {\n return {\n customer: [\n {\n label: tr('kadaikodi.home.quickAction.discover.label', 'Discover'),\n description: tr('kadaikodi.home.quickAction.discover.description', 'Browse carts near you'),\n icon: <Search className=\"h-5 w-5\" />,\n path: '/customer/discover',\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: tr('kadaikodi.home.quickAction.myOrders.label', 'My Orders'),\n description: tr('kadaikodi.home.quickAction.myOrders.description', 'Track your orders'),\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n path: '/customer/orders',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: tr('kadaikodi.home.quickAction.favorites.label', 'Favorites'),\n description: tr('kadaikodi.home.quickAction.favorites.description', 'Your saved carts'),\n icon: <Heart className=\"h-5 w-5\" />,\n path: '/customer/favorites',\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n {\n label: tr('kadaikodi.home.quickAction.settings.label', 'Settings'),\n description: tr('kadaikodi.home.quickAction.settings.description', 'Manage preferences'),\n icon: <Settings className=\"h-5 w-5\" />,\n path: '/settings',\n color: 'bg-bg-sunken text-text-secondary',\n },\n ],\n cart_owner: [\n {\n label: tr('kadaikodi.home.quickAction.merchantDashboard.label', 'Dashboard'),\n description: tr(\n 'kadaikodi.home.quickAction.merchantDashboard.description',\n 'Run your cart'\n ),\n icon: <Store className=\"h-5 w-5\" />,\n path: '/cart-owner/dashboard',\n color: 'bg-accent-primary/10 text-accent-primary',\n },\n {\n label: tr('kadaikodi.home.quickAction.merchantOrders.label', 'Orders'),\n description: tr('kadaikodi.home.quickAction.merchantOrders.description', 'Incoming orders'),\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n path: '/cart-owner/orders',\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: tr('kadaikodi.home.quickAction.merchantAnalytics.label', 'Analytics'),\n description: tr(\n 'kadaikodi.home.quickAction.merchantAnalytics.description',\n 'Revenue & insights'\n ),\n icon: <BarChart3 className=\"h-5 w-5\" />,\n path: '/cart-owner/analytics',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: tr('kadaikodi.home.quickAction.merchantStaff.label', 'Staff'),\n description: tr('kadaikodi.home.quickAction.merchantStaff.description', 'Manage workers'),\n icon: <Users className=\"h-5 w-5\" />,\n path: '/cart-owner/staff',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n ],\n worker: [\n {\n label: tr('kadaikodi.home.quickAction.workerTasks.label', 'My Tasks'),\n description: tr('kadaikodi.home.quickAction.workerTasks.description', 'Assigned work'),\n icon: <ClipboardList className=\"h-5 w-5\" />,\n path: '/worker/dashboard',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: tr('kadaikodi.home.quickAction.workerSchedule.label', 'Schedule'),\n description: tr('kadaikodi.home.quickAction.workerSchedule.description', 'View shifts'),\n icon: <Clock className=\"h-5 w-5\" />,\n path: '/worker/schedule',\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: tr('kadaikodi.home.quickAction.workerDeliveries.label', 'Deliveries'),\n description: tr('kadaikodi.home.quickAction.workerDeliveries.description', 'Active runs'),\n icon: <Package className=\"h-5 w-5\" />,\n path: '/worker/orders',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: tr('kadaikodi.home.quickAction.workerProfile.label', 'Profile'),\n description: tr('kadaikodi.home.quickAction.workerProfile.description', 'Your details'),\n icon: <UserCheck className=\"h-5 w-5\" />,\n path: '/worker/profile',\n color: 'bg-bg-sunken text-text-secondary',\n },\n ],\n investor: [\n {\n label: tr('kadaikodi.home.quickAction.investorPortfolio.label', 'Portfolio'),\n description: tr(\n 'kadaikodi.home.quickAction.investorPortfolio.description',\n 'Your investments'\n ),\n icon: <TrendingUp className=\"h-5 w-5\" />,\n path: '/investor/portfolio',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: tr('kadaikodi.home.quickAction.investorOpportunities.label', 'Opportunities'),\n description: tr(\n 'kadaikodi.home.quickAction.investorOpportunities.description',\n 'New investments'\n ),\n icon: <HandCoins className=\"h-5 w-5\" />,\n path: '/investor/opportunities',\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: tr('kadaikodi.home.quickAction.investorInvestments.label', 'Investments'),\n description: tr(\n 'kadaikodi.home.quickAction.investorInvestments.description',\n 'Active positions'\n ),\n icon: <IndianRupee className=\"h-5 w-5\" />,\n path: '/investor/investments',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: tr('kadaikodi.home.quickAction.investorAnalytics.label', 'Analytics'),\n description: tr('kadaikodi.home.quickAction.investorAnalytics.description', 'Performance'),\n icon: <BarChart3 className=\"h-5 w-5\" />,\n path: '/investor/analytics',\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n ],\n admin: [\n {\n label: tr('kadaikodi.home.quickAction.adminDashboard.label', 'Dashboard'),\n description: tr(\n 'kadaikodi.home.quickAction.adminDashboard.description',\n 'Platform overview'\n ),\n icon: <LayoutDashboard className=\"h-5 w-5\" />,\n path: '/admin/dashboard',\n color: 'bg-status-error-bg-subtle text-status-error-text',\n },\n {\n label: tr('kadaikodi.home.quickAction.adminUsers.label', 'Users'),\n description: tr('kadaikodi.home.quickAction.adminUsers.description', 'Manage accounts'),\n icon: <Users className=\"h-5 w-5\" />,\n path: '/admin/users',\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: tr('kadaikodi.home.quickAction.adminCarts.label', 'Carts'),\n description: tr('kadaikodi.home.quickAction.adminCarts.description', 'Approve & manage'),\n icon: <Store className=\"h-5 w-5\" />,\n path: '/admin/carts',\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n {\n label: tr('kadaikodi.home.quickAction.adminAnalytics.label', 'Analytics'),\n description: tr('kadaikodi.home.quickAction.adminAnalytics.description', 'Revenue reports'),\n icon: <BarChart3 className=\"h-5 w-5\" />,\n path: '/admin/analytics',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n ],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Category data (real navigation into discovery, filtered by category)\n// ---------------------------------------------------------------------------\n\nfunction getCategories(tr: ReturnType<typeof useTr>) {\n return [\n {\n label: tr('kadaikodi.home.categories.foodAndBeverage', 'Food & Beverage'),\n icon: <ChefHat className=\"h-6 w-6\" />,\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: tr('kadaikodi.home.categories.personalCareAndBeauty', 'Personal Care & Beauty'),\n icon: <Scissors className=\"h-6 w-6\" />,\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n {\n label: tr('kadaikodi.home.categories.repairAndMaintenance', 'Repair & Maintenance'),\n icon: <Wrench className=\"h-6 w-6\" />,\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: tr('kadaikodi.home.categories.homeServices', 'Home Services'),\n icon: <Home className=\"h-6 w-6\" />,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: tr('kadaikodi.home.categories.clothingAndFashion', 'Clothing & Fashion'),\n icon: <Shirt className=\"h-6 w-6\" />,\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n {\n label: tr('kadaikodi.home.categories.healthAndWellness', 'Health & Wellness'),\n icon: <Heart className=\"h-6 w-6\" />,\n color: 'bg-status-error-bg-subtle text-status-error-text',\n },\n {\n label: tr('kadaikodi.home.categories.educationAndSkills', 'Education & Skills'),\n icon: <GraduationCap className=\"h-6 w-6\" />,\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n label: tr('kadaikodi.home.categories.retailAndMerchandise', 'Retail & Merchandise'),\n icon: <Package className=\"h-6 w-6\" />,\n color: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n label: tr('kadaikodi.home.categories.groceryAndEssentials', 'Grocery & Essentials'),\n icon: <ShoppingCart className=\"h-6 w-6\" />,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Role card definitions (the hero of the page)\n// ---------------------------------------------------------------------------\n\ninterface RoleCardDef {\n role: UserRole;\n title: string;\n description: string;\n icon: ReactNode;\n path: string;\n iconClass: string;\n}\n\ninterface RoleStat {\n value: string;\n label: string;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function HomePage() {\n const { navigateTo, currentUser } = useKadaikodi();\n const tr = useTr();\n const [searchQuery, setSearchQuery] = useState('');\n\n const { providers, orders, dashboardStats, investments } = useKadaikodiApi();\n\n const firstName = currentUser?.firstName ?? currentUser?.name ?? 'there';\n const userRole: UserRole = (currentUser?.role as UserRole) ?? 'customer';\n const isOperator = userRole === 'admin';\n\n const quickActions = useMemo(\n () => getQuickActionsByRole(tr)[userRole] ?? getQuickActionsByRole(tr).customer,\n [tr, userRole]\n );\n const categories = useMemo(() => getCategories(tr), [tr]);\n\n // --- Real, cheap live metrics (derived only from already-fetched data) ---\n const myProvider = useMemo(\n () => (providers.data ?? []).find((p) => p.ownerId === currentUser?.id),\n [providers.data, currentUser?.id]\n );\n const customerOrderCount = (orders.data ?? []).length;\n const portfolioValue = useMemo(\n () => (investments.data ?? []).reduce((sum, inv) => sum + inv.currentValue, 0),\n [investments.data]\n );\n\n const roleStat = useCallback(\n (role: UserRole): RoleStat | null => {\n switch (role) {\n case 'customer':\n return {\n value: customerOrderCount.toString(),\n label:\n customerOrderCount === 1\n ? tr('kadaikodi.home.order', 'order')\n : tr('kadaikodi.home.orders', 'orders'),\n };\n case 'cart_owner':\n return myProvider\n ? {\n value: `★ ${myProvider.rating.toFixed(1)}`,\n label: tr('kadaikodi.home.rating', 'rating'),\n }\n : null;\n case 'investor':\n return portfolioValue > 0\n ? {\n value: formatCurrency(portfolioValue, { minimumFractionDigits: 0 }),\n label: tr('kadaikodi.home.portfolio', 'portfolio'),\n }\n : null;\n case 'admin':\n return isOperator\n ? {\n value: (dashboardStats.data?.activeProviders ?? 0).toString(),\n label: tr('kadaikodi.home.providers', 'providers'),\n }\n : null;\n case 'worker':\n default:\n // Worker stats need a worker-scoped query we intentionally keep off the\n // launch pad to stay cheap — the card shows its description only.\n return null;\n }\n },\n [customerOrderCount, myProvider, portfolioValue, isOperator, dashboardStats.data, tr]\n );\n\n const roleCards: RoleCardDef[] = [\n {\n role: 'customer',\n title: tr('kadaikodi.home.roleCard.customer.title', 'Shop as Customer'),\n description: tr('kadaikodi.home.roleCard.customer.desc', 'Discover carts & order'),\n icon: <ShoppingCart className=\"h-6 w-6\" />,\n path: '/customer/dashboard',\n iconClass: 'bg-[var(--color-accent-soft)] text-text-primary',\n },\n {\n role: 'cart_owner',\n title: tr('kadaikodi.home.roleCard.merchant.title', 'My Cart (Merchant)'),\n description: tr('kadaikodi.home.roleCard.merchant.desc', 'Run your business'),\n icon: <Store className=\"h-6 w-6\" />,\n path: '/cart-owner/dashboard',\n iconClass: 'bg-accent-primary/10 text-accent-primary',\n },\n {\n role: 'worker',\n title: tr('kadaikodi.home.roleCard.worker.title', 'Work'),\n description: tr('kadaikodi.home.roleCard.worker.desc', 'Deliveries & tasks'),\n icon: <Truck className=\"h-6 w-6\" />,\n path: '/worker/dashboard',\n iconClass: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n {\n role: 'investor',\n title: tr('kadaikodi.home.roleCard.investor.title', 'Invest'),\n description: tr('kadaikodi.home.roleCard.investor.desc', 'Back local merchants'),\n icon: <HandCoins className=\"h-6 w-6\" />,\n path: '/investor/dashboard',\n iconClass: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n role: 'admin',\n title: tr('kadaikodi.home.roleCard.admin.title', 'Admin'),\n description: tr('kadaikodi.home.roleCard.admin.desc', 'Platform operations'),\n icon: <Shield className=\"h-6 w-6\" />,\n path: '/admin/dashboard',\n iconClass: 'bg-bg-sunken text-text-secondary',\n },\n ];\n\n // Featured carts (top-rated, open) — real providers\n const featuredCarts = useMemo(() => {\n let carts = (providers.data ?? []).filter((c) => c.isOpen);\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n carts = carts.filter(\n (c) => c.name.toLowerCase().includes(q) || c.category.toLowerCase().includes(q)\n );\n }\n return carts.sort((a, b) => b.rating - a.rating).slice(0, 6);\n }, [providers.data, searchQuery]);\n\n // Recent orders — real\n const recentOrders = useMemo(() => {\n return [...(orders.data ?? [])]\n .sort((a, b) => new Date(b.orderDate).getTime() - new Date(a.orderDate).getTime())\n .slice(0, 3);\n }, [orders.data]);\n\n const isNewUser = (orders.data ?? []).length === 0 && !orders.isLoading;\n const isLoading = providers.isLoading || orders.isLoading || dashboardStats.isLoading;\n const isError = providers.isError || orders.isError || dashboardStats.isError;\n\n if (isLoading) {\n return (\n <PageLayout title={tr('kadaikodi.common.loading', 'Loading...')}>\n <div className=\"flex h-[60vh] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-accent-primary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (isError) {\n return (\n <PageLayout title={tr('kadaikodi.common.error', 'Error')}>\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 text-text-primary\">\n {tr('kadaikodi.common.errorLoading', 'Error loading data')}\n </h2>\n <p className=\"text-text-secondary\">\n {tr('kadaikodi.common.tryAgain', 'Please try again later.')}\n </p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title={`${tr('kadaikodi.home.hi', 'Hi')}, ${firstName}`}\n description={tr('kadaikodi.home.everyRole', 'One account, every role')}\n >\n <PagePurpose className=\"mb-6\">\n {tr(\n 'kadaikodi.home.purpose',\n 'Kadaikodi gives you one account for every side of local commerce. Jump into the role you need — shop as a customer, run your cart as a merchant, pick up delivery work, or back local businesses — and pick up right where you left off.'\n )}\n </PagePurpose>\n\n {/* Welcome Banner for New Users (real: gated on empty order history) */}\n {isNewUser && (\n <section className=\"mb-8 overflow-hidden rounded-xl border border-border-subtle bg-accent-primary/5 p-6\">\n <div className=\"flex items-start gap-4\">\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-accent-primary/10 text-accent-primary\">\n <Sparkles className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr('kadaikodi.home.welcomeTitle', 'Welcome to Kadaikodi!')}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {tr(\n 'kadaikodi.home.welcomeDescription',\n 'Your local commerce hub. Start by exploring service providers near you, or pick a role above to get going.'\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/discover')}\n className=\"mt-3 inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text transition-colors hover:bg-action-primary-bg-hover\"\n >\n <Search className=\"h-4 w-4\" />\n {tr('kadaikodi.home.exploreServices', 'Explore Services')}\n </button>\n </div>\n </div>\n </section>\n )}\n\n {/* ── ROLE CARDS — the hero: one account, every role ─────────── */}\n <section className=\"mb-10\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr('kadaikodi.home.chooseRole', 'Choose how you want to show up')}\n </h2>\n <span className=\"hidden items-center gap-1 text-xs font-medium text-text-muted sm:inline-flex\">\n <Shield className=\"h-3.5 w-3.5\" />\n {tr('kadaikodi.home.rbac', 'RBAC & multi-tenant')}\n </span>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3\">\n {roleCards.map((card) => {\n const isCurrent = card.role === userRole;\n const gated = card.role === 'admin' && !isOperator;\n const stat = roleStat(card.role);\n\n return (\n <button\n key={card.role}\n type=\"button\"\n disabled={gated}\n onClick={() => {\n if (!gated) navigateTo(card.path);\n }}\n aria-label={card.title}\n className={cn(\n 'group relative flex items-center gap-4 rounded-xl border p-4 text-left transition-all sm:p-5',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]',\n isCurrent\n ? 'border-accent-primary/40 bg-accent-primary/5 shadow-[var(--shadow-glow)]'\n : 'border-border-subtle bg-bg-surface hover:border-border-strong hover:shadow-md',\n gated &&\n 'cursor-not-allowed opacity-70 hover:border-border-subtle hover:shadow-none'\n )}\n >\n <div\n className={cn(\n 'flex h-12 w-12 shrink-0 items-center justify-center rounded-xl',\n card.iconClass\n )}\n >\n {gated ? <Lock className=\"h-6 w-6\" /> : card.icon}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"truncate text-base font-semibold text-text-primary\">\n {card.title}\n </p>\n {isCurrent && (\n <span className=\"inline-flex items-center rounded-full bg-accent-primary/10 px-2 py-0.5 text-[11px] font-medium text-accent-primary\">\n {tr('kadaikodi.home.current', 'Current')}\n </span>\n )}\n </div>\n <p className=\"mt-0.5 truncate text-sm text-text-secondary\">{card.description}</p>\n </div>\n\n <div className=\"flex shrink-0 items-center gap-3\">\n {gated ? (\n <span className=\"inline-flex items-center gap-1 whitespace-nowrap text-xs font-medium text-text-muted\">\n {tr('kadaikodi.home.operatorsOnly', 'operators only')}\n <Lock className=\"h-3.5 w-3.5\" />\n </span>\n ) : (\n <>\n {stat && (\n <div className=\"hidden text-right sm:block\">\n <p className=\"text-sm font-bold tabular-nums text-text-primary\">\n {stat.value}\n </p>\n <p className=\"text-[11px] text-text-secondary\">{stat.label}</p>\n </div>\n )}\n <ChevronRight className=\"h-5 w-5 text-text-secondary transition group-hover:translate-x-0.5 group-hover:text-text-primary\" />\n </>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </section>\n\n {/* ── Current-role surface ───────────────────────────────────── */}\n\n {/* Quick Actions */}\n <section className=\"mb-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">\n {tr('kadaikodi.home.quickActions', 'Quick Actions')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {quickActions.map((action) => (\n <button\n key={action.label}\n type=\"button\"\n onClick={() => navigateTo(action.path)}\n className={cn(\n 'group flex items-start gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4 text-left shadow-sm transition-all',\n 'hover:border-border-strong hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]'\n )}\n >\n <div\n className={cn(\n 'flex h-10 w-10 shrink-0 items-center justify-center rounded-lg',\n action.color\n )}\n >\n {action.icon}\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold text-text-primary\">{action.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">{action.description}</p>\n </div>\n <ArrowRight className=\"mt-1 h-4 w-4 shrink-0 text-text-secondary transition group-hover:translate-x-0.5\" />\n </button>\n ))}\n </div>\n </section>\n\n {/* Featured / Nearby Carts (real providers) */}\n <section className=\"mb-8\">\n <div className=\"mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {searchQuery\n ? tr('kadaikodi.home.searchResults', 'Search Results')\n : tr('kadaikodi.home.openNearby', \"What's open nearby\")}\n </h2>\n <div className=\"flex items-center gap-3\">\n <div className=\"relative w-full sm:w-64\">\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={tr('kadaikodi.home.searchPlaceholder', 'Search carts...')}\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-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/discover')}\n className=\"hidden items-center gap-1 whitespace-nowrap text-sm font-medium text-accent-primary hover:underline sm:flex\"\n >\n {tr('kadaikodi.common.viewAll', 'View All')} <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n </div>\n\n {featuredCarts.length === 0 ? (\n <EmptyState\n illustration=\"empty-search\"\n icon={<Search className=\"h-10 w-10\" />}\n title={tr('kadaikodi.home.noCartsFound', 'No carts found')}\n description={tr(\n 'kadaikodi.home.noCartsDescription',\n 'Try adjusting your search or browse all categories'\n )}\n action={\n searchQuery ? (\n <button\n type=\"button\"\n onClick={() => setSearchQuery('')}\n className=\"rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary transition-colors hover:bg-bg-sunken\"\n >\n {tr('kadaikodi.home.clearSearch', 'Clear Search')}\n </button>\n ) : undefined\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {featuredCarts.map((cart) => (\n <div\n key={cart.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => navigateTo(`/customer/cart/${cart.id}`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/customer/cart/${cart.id}`);\n }\n }}\n className=\"group cursor-pointer overflow-hidden rounded-xl border border-border-subtle bg-bg-surface shadow-sm transition-all hover:border-border-strong hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n {/* Header band — honest placeholder (no fabricated imagery). */}\n <div className=\"relative flex h-24 items-center justify-center bg-gradient-to-br from-[var(--color-accent-soft)] to-bg-sunken\">\n <Store className=\"h-8 w-8 text-text-secondary/50\" />\n <div className=\"absolute right-2 top-2\">\n <StatusBadge status={cart.isOpen ? 'open' : 'closed'} />\n </div>\n {cart.isVerified && (\n <div className=\"absolute left-2 top-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-bg-surface/80 px-2 py-0.5 text-xs font-medium text-accent-primary backdrop-blur-sm\">\n <BadgeCheck className=\"h-3 w-3\" />\n {tr('kadaikodi.home.verified', 'Verified')}\n </span>\n </div>\n )}\n </div>\n\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"truncate text-base font-semibold text-text-primary\">\n {cart.name}\n </h3>\n <p className=\"mt-0.5 text-sm text-text-secondary\">{cart.category}</p>\n </div>\n <div className=\"flex shrink-0 items-center gap-1 rounded bg-status-success-bg-subtle px-1.5 py-0.5\">\n <Star className=\"h-3 w-3 fill-status-success-text text-status-success-text\" />\n <span className=\"text-xs font-bold text-status-success-text tabular-nums\">\n {cart.rating.toFixed(1)}\n </span>\n </div>\n </div>\n\n <div className=\"mt-3 flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-text-secondary\">\n {cart.distance != null && (\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> {formatDistance(cart.distance)}\n </span>\n )}\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3\" /> {cart.totalRatings}{' '}\n {tr('kadaikodi.home.reviews', 'reviews')}\n </span>\n {cart.averageOrderValue != null && cart.averageOrderValue > 0 && (\n <span className=\"flex items-center gap-1\">\n <IndianRupee className=\"h-3 w-3\" /> {tr('kadaikodi.home.average', 'Avg.')}{' '}\n {formatCurrency(cart.averageOrderValue, { minimumFractionDigits: 0 })}\n </span>\n )}\n </div>\n\n {cart.serviceTypes && cart.serviceTypes.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {cart.serviceTypes.slice(0, 3).map((st) => (\n <span\n key={st}\n className=\"inline-flex items-center rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary\"\n >\n {st.replace(/_/g, ' ')}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </section>\n\n {/* Recent Orders (real) */}\n {recentOrders.length > 0 && (\n <section className=\"mb-8\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr('kadaikodi.home.recentOrders', 'Recent Orders')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className=\"flex items-center gap-1 text-sm font-medium text-accent-primary hover:underline\"\n >\n {tr('kadaikodi.common.viewAll', 'View All')} <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <div className=\"divide-y divide-border-subtle overflow-hidden rounded-xl border border-border-subtle bg-bg-surface\">\n {recentOrders.map((order) => (\n <div\n key={order.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => navigateTo(`/customer/orders/${order.id}/track`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/customer/orders/${order.id}/track`);\n }\n }}\n className=\"flex cursor-pointer items-center gap-4 px-4 py-3 transition-colors hover:bg-bg-sunken/60 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div className=\"flex h-12 w-12 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary\">\n <ShoppingBag className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {order.cartName}\n </p>\n <StatusBadge status={order.status} />\n </div>\n <p className=\"mt-0.5 truncate text-xs text-text-secondary\">\n {order.items.map((i) => i.name).join(', ')}\n </p>\n </div>\n <div className=\"shrink-0 text-right\">\n <p className=\"text-sm font-semibold text-text-primary tabular-nums\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {formatRelativeTime(order.orderDate)}\n </p>\n </div>\n </div>\n ))}\n </div>\n </section>\n )}\n\n {/* Browse by Category (real navigation) */}\n <section className=\"mb-8\">\n <h2 className=\"mb-4 text-lg font-semibold text-text-primary\">\n {tr('kadaikodi.home.browseByCategory', 'Browse by Category')}\n </h2>\n <div className=\"grid grid-cols-3 gap-3 sm:grid-cols-4 lg:grid-cols-5\">\n {categories.map((cat) => (\n <button\n key={cat.label}\n type=\"button\"\n onClick={() =>\n navigateTo(`/customer/discover?category=${encodeURIComponent(cat.label)})`)\n }\n className=\"flex flex-col items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface p-4 text-center transition-all hover:border-border-strong hover:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n <div\n className={cn('flex h-12 w-12 items-center justify-center rounded-full', cat.color)}\n >\n {cat.icon}\n </div>\n <span className=\"text-xs font-medium leading-tight text-text-primary\">\n {cat.label}\n </span>\n </button>\n ))}\n </div>\n </section>\n\n {/* Footer note */}\n <p className=\"mt-2 text-center text-xs text-text-muted\">\n {tr(\n 'kadaikodi.home.footerNote',\n 'RBAC & multi-tenancy inherited from the Burdenoff platform'\n )}\n </p>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -6,8 +6,13 @@
6
6
  * useAdminAnalytics + useProviders + useOrders). Every figure is real or
7
7
  * derived from real records — order-status distribution is counted from
8
8
  * loaded orders, category/growth breakdowns come from the analytics hook.
9
- * Metrics with no honest source (operating costs, delivery time, etc.) are
10
- * omitted rather than fabricated.
9
+ * Metrics with no honest source (take rate, platform commission, operating
10
+ * costs, delivery time) are omitted rather than fabricated.
11
+ *
12
+ * The range selector re-windows the same real records client-side; it never
13
+ * claims a period the loaded data cannot cover. Customer growth is a cumulative
14
+ * distinct-customer series built from `kadaikodiAdminAnalytics.orderTrends`,
15
+ * whose rows carry `customerId` — `customerGrowth` itself is only a bare total.
11
16
  */
12
17
  export declare function AdminAnalyticsPage(): import("react").JSX.Element;
13
18
  //# sourceMappingURL=AdminAnalyticsPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminAnalyticsPage.d.ts","sourceRoot":"","sources":["../../../../src/kadaikodi/pages/admin/AdminAnalyticsPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAyDH,wBAAgB,kBAAkB,gCAilBjC"}
1
+ {"version":3,"file":"AdminAnalyticsPage.d.ts","sourceRoot":"","sources":["../../../../src/kadaikodi/pages/admin/AdminAnalyticsPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAoEH,wBAAgB,kBAAkB,gCA+rBjC"}