@burdenoff/microfe-kadaikodi 2026.625.1 → 2026.626.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.
- package/dist/kadaikodi/pages/HomePage.js +19 -14
- package/dist/kadaikodi/pages/HomePage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +118 -83
- package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminDashboard.js +75 -46
- package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +144 -128
- package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +255 -237
- package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminProfilePage.js +129 -128
- package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +178 -150
- package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/CartManagementPage.js +182 -159
- package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/admin/UserManagementPage.js +325 -303
- package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +500 -469
- package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +534 -503
- package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +73 -48
- package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +103 -96
- package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +130 -129
- package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +673 -670
- package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +517 -514
- package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +140 -125
- package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/HelpSupportPage.js +302 -311
- package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/NotificationCenterPage.js +102 -91
- package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
- package/dist/kadaikodi/pages/common/SettingsPage.js +766 -734
- package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +366 -356
- package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDetailPage.js +243 -213
- package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +200 -195
- package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CheckoutPage.js +95 -89
- package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CustomerDashboard.js +430 -387
- package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +488 -478
- package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +523 -512
- package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/FavoritesPage.js +83 -75
- package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +116 -108
- package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +67 -61
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js +90 -73
- package/dist/kadaikodi/pages/customer/PaymentMethodsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/ReviewsPage.js +80 -72
- package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.js +70 -53
- package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +289 -255
- package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +92 -84
- package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +63 -55
- package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorDashboard.js +339 -311
- package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +40 -32
- package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +174 -150
- package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +385 -381
- package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +302 -273
- package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerDashboard.js +87 -59
- package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +82 -75
- package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +81 -77
- package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +78 -71
- package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
- package/package.json +2 -2
|
@@ -10,8 +10,9 @@ import { useCallback as u, useMemo as d, useState as f } from "react";
|
|
|
10
10
|
import { useI18n as p } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
11
11
|
import { Activity as m, AlertCircle as h, ArrowRight as g, BadgeCheck as _, BarChart3 as v, CheckCircle2 as y, ChefHat as b, ClipboardList as x, Clock as S, FileText as C, GraduationCap as w, HandCoins as T, Heart as E, Home as D, IndianRupee as O, LayoutDashboard as k, Loader2 as A, MapPin as j, Package as M, Scissors as N, Search as P, Settings as F, Shirt as I, ShoppingBag as L, ShoppingCart as R, Sparkles as z, Star as B, Store as V, TrendingUp as H, Truck as U, Users as W, Wallet as G, Wrench as K } from "lucide-react";
|
|
12
12
|
import { jsx as q, jsxs as J } from "react/jsx-runtime";
|
|
13
|
+
import { EmphasisPanel as Y, PagePurpose as X } from "@burdenoff/fe-libs/ui";
|
|
13
14
|
//#region src/kadaikodi/pages/HomePage.tsx
|
|
14
|
-
var
|
|
15
|
+
var Z = {
|
|
15
16
|
customer: [
|
|
16
17
|
{
|
|
17
18
|
label: "Discover Services",
|
|
@@ -163,7 +164,7 @@ var Y = {
|
|
|
163
164
|
}
|
|
164
165
|
]
|
|
165
166
|
};
|
|
166
|
-
function
|
|
167
|
+
function Q(e, t, n) {
|
|
167
168
|
switch (e) {
|
|
168
169
|
case "customer": return [
|
|
169
170
|
{
|
|
@@ -317,7 +318,7 @@ function X(e, t, n) {
|
|
|
317
318
|
];
|
|
318
319
|
}
|
|
319
320
|
}
|
|
320
|
-
var
|
|
321
|
+
var $ = [
|
|
321
322
|
{
|
|
322
323
|
label: "Food & Beverage",
|
|
323
324
|
icon: /* @__PURE__ */ q(b, { className: "h-6 w-6" }),
|
|
@@ -363,7 +364,7 @@ var Z = [
|
|
|
363
364
|
icon: /* @__PURE__ */ q(R, { className: "h-6 w-6" }),
|
|
364
365
|
color: "bg-status-success-bg-subtle text-status-success-text"
|
|
365
366
|
}
|
|
366
|
-
],
|
|
367
|
+
], ee = [
|
|
367
368
|
{
|
|
368
369
|
step: 1,
|
|
369
370
|
title: "Browse Services",
|
|
@@ -388,7 +389,7 @@ var Z = [
|
|
|
388
389
|
description: "Share your experience and help others find great services.",
|
|
389
390
|
icon: /* @__PURE__ */ q(B, { className: "h-6 w-6" })
|
|
390
391
|
}
|
|
391
|
-
],
|
|
392
|
+
], te = [
|
|
392
393
|
{
|
|
393
394
|
id: "ha-1",
|
|
394
395
|
description: "New order placed at Dosa Express",
|
|
@@ -419,7 +420,7 @@ var Z = [
|
|
|
419
420
|
time: "5 hours ago",
|
|
420
421
|
type: "order"
|
|
421
422
|
}
|
|
422
|
-
],
|
|
423
|
+
], ne = [
|
|
423
424
|
{
|
|
424
425
|
label: "Service Providers",
|
|
425
426
|
value: "21+",
|
|
@@ -441,7 +442,7 @@ var Z = [
|
|
|
441
442
|
icon: /* @__PURE__ */ q(y, { className: "h-5 w-5" })
|
|
442
443
|
}
|
|
443
444
|
];
|
|
444
|
-
function
|
|
445
|
+
function re() {
|
|
445
446
|
let { navigateTo: v, currentUser: y } = e(), { t: b } = p(), [x, C] = f(""), { providers: w, orders: T, dashboardStats: E } = o(), D = u((e, t) => {
|
|
446
447
|
let n = b(e);
|
|
447
448
|
return n === e ? t : n;
|
|
@@ -457,7 +458,7 @@ function te() {
|
|
|
457
458
|
worker: D("kadaikodi.home.greeting.worker", "Check your tasks and earnings"),
|
|
458
459
|
investor: D("kadaikodi.home.greeting.investor", "Track your investments and returns"),
|
|
459
460
|
admin: D("kadaikodi.home.greeting.admin", "Monitor and manage the platform")
|
|
460
|
-
}, I =
|
|
461
|
+
}, I = Z[M] ?? Z.customer, L = Q(M, T.data ?? [], E.data), R = d(() => {
|
|
461
462
|
let e = (w.data ?? []).filter((e) => e.isOpen);
|
|
462
463
|
if (x) {
|
|
463
464
|
let t = x.toLowerCase();
|
|
@@ -496,6 +497,10 @@ function te() {
|
|
|
496
497
|
title: `${D("kadaikodi.home.hello", "Hello")}, ${k}!`,
|
|
497
498
|
description: F[M],
|
|
498
499
|
children: [
|
|
500
|
+
/* @__PURE__ */ q(X, {
|
|
501
|
+
className: "mb-6",
|
|
502
|
+
children: D("kadaikodi.home.purpose", "Kadaikodi is your local services marketplace — a single place to find mobile carts and service providers near you, place and track orders, and (for owners, workers and investors) run the business side. This home page is your launch pad: jump to what matters for your role, browse what is open nearby, and pick up where you left off.")
|
|
503
|
+
}),
|
|
499
504
|
U && /* @__PURE__ */ q("section", {
|
|
500
505
|
className: "mb-6 rounded-xl border border-border-subtle bg-gradient-to-r from-primary/5 via-primary/10 to-primary/5 p-6",
|
|
501
506
|
children: /* @__PURE__ */ J("div", {
|
|
@@ -562,7 +567,7 @@ function te() {
|
|
|
562
567
|
})]
|
|
563
568
|
})
|
|
564
569
|
}),
|
|
565
|
-
/* @__PURE__ */ J(
|
|
570
|
+
/* @__PURE__ */ J(Y, {
|
|
566
571
|
className: "mb-8",
|
|
567
572
|
children: [/* @__PURE__ */ q("h2", {
|
|
568
573
|
className: "text-lg font-semibold text-text-primary mb-4",
|
|
@@ -818,7 +823,7 @@ function te() {
|
|
|
818
823
|
children: D("kadaikodi.home.howItWorks", "How It Works")
|
|
819
824
|
}), /* @__PURE__ */ q("div", {
|
|
820
825
|
className: "grid grid-cols-2 gap-4 lg:grid-cols-4",
|
|
821
|
-
children:
|
|
826
|
+
children: ee.map((e) => /* @__PURE__ */ J("div", {
|
|
822
827
|
className: "relative rounded-lg border border-border-subtle bg-bg-surface p-5 text-center",
|
|
823
828
|
children: [
|
|
824
829
|
/* @__PURE__ */ q("div", {
|
|
@@ -851,7 +856,7 @@ function te() {
|
|
|
851
856
|
children: D("kadaikodi.home.browseByCategory", "Browse by Category")
|
|
852
857
|
}), /* @__PURE__ */ q("div", {
|
|
853
858
|
className: "grid grid-cols-3 gap-3 sm:grid-cols-4 lg:grid-cols-5",
|
|
854
|
-
children:
|
|
859
|
+
children: $.map((e) => /* @__PURE__ */ J("button", {
|
|
855
860
|
type: "button",
|
|
856
861
|
onClick: () => v(`/customer/carts?category=${encodeURIComponent(e.label)}`),
|
|
857
862
|
className: "flex flex-col items-center gap-2 rounded-lg border border-border-subtle bg-bg-surface p-4 text-center hover:shadow-sm hover:border-accent-foreground/20 transition-all",
|
|
@@ -872,7 +877,7 @@ function te() {
|
|
|
872
877
|
children: D("kadaikodi.home.platformStats", "Platform Stats")
|
|
873
878
|
}), /* @__PURE__ */ q("div", {
|
|
874
879
|
className: "grid grid-cols-2 gap-4 lg:grid-cols-4",
|
|
875
|
-
children:
|
|
880
|
+
children: ne.map((e) => /* @__PURE__ */ J("div", {
|
|
876
881
|
className: "flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4",
|
|
877
882
|
children: [/* @__PURE__ */ q("div", {
|
|
878
883
|
className: "flex h-10 w-10 items-center justify-center rounded-full bg-action-primary-bg/10 text-primary shrink-0",
|
|
@@ -892,7 +897,7 @@ function te() {
|
|
|
892
897
|
children: D("kadaikodi.home.recentActivity", "Recent Activity")
|
|
893
898
|
}), /* @__PURE__ */ q("div", {
|
|
894
899
|
className: "rounded-lg border border-border-subtle bg-bg-surface divide-y divide-border",
|
|
895
|
-
children:
|
|
900
|
+
children: te.map((e) => /* @__PURE__ */ J("div", {
|
|
896
901
|
className: "flex items-center gap-3 px-4 py-3",
|
|
897
902
|
children: [
|
|
898
903
|
/* @__PURE__ */ q("div", {
|
|
@@ -917,6 +922,6 @@ function te() {
|
|
|
917
922
|
});
|
|
918
923
|
}
|
|
919
924
|
//#endregion
|
|
920
|
-
export {
|
|
925
|
+
export { re as HomePage };
|
|
921
926
|
|
|
922
927
|
//# sourceMappingURL=HomePage.js.map
|
|
@@ -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 * Role-based landing page with hero section, quick stats, quick actions,\n * featured carts, recent orders, how-it-works, category browsing,\n * platform stats, and welcome banner for new users.\n */\n\nimport { useState, useMemo, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Search,\n ShoppingBag,\n Store,\n ClipboardList,\n TrendingUp,\n LayoutDashboard,\n Users,\n IndianRupee,\n Activity,\n ArrowRight,\n Star,\n MapPin,\n Clock,\n ChefHat,\n Scissors,\n Wrench,\n Home,\n Shirt,\n Heart,\n GraduationCap,\n Package,\n ShoppingCart,\n BarChart3,\n Wallet,\n CheckCircle2,\n Zap,\n Shield,\n Sparkles,\n HandCoins,\n UserCheck,\n Truck,\n BadgeCheck,\n FileText,\n Settings,\n Loader2,\n AlertCircle,\n} from 'lucide-react';\nimport { PageLayout } from '../components/PageLayout';\nimport { MetricsCard } from '../components/MetricsCard';\nimport { CartCard } from '../components/CartCard';\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 {\n formatCurrency,\n formatDate,\n formatRelativeTime,\n formatDistance,\n} from '../utils/formatters';\nimport type { UserRole, MockCart, MockOrder, DashboardStats } from '../types';\n\n// ---------------------------------------------------------------------------\n// Role-based Quick Action configs\n// ---------------------------------------------------------------------------\n\ninterface QuickAction {\n label: string;\n description: string;\n icon: React.ReactNode;\n path: string;\n color: string;\n}\n\nconst quickActionsByRole: Record<UserRole, QuickAction[]> = {\n customer: [\n {\n label: 'Discover Services',\n description: 'Browse carts near you',\n icon: <Search className=\"h-5 w-5\" />,\n path: '/customer/carts',\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: 'My Cart',\n description: 'Manage your cart',\n icon: <Store className=\"h-5 w-5\" />,\n path: '/owner/dashboard',\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n {\n label: 'Orders',\n description: 'Incoming orders',\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n path: '/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: '/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: '/owner/staff',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n ],\n worker: [\n {\n label: 'My Tasks',\n description: 'View assigned tasks',\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: 'Earnings',\n description: 'Track pay',\n icon: <Wallet className=\"h-5 w-5\" />,\n path: '/worker/earnings',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Performance',\n description: 'Ratings & stats',\n icon: <Star className=\"h-5 w-5\" />,\n path: '/worker/performance',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n ],\n investor: [\n {\n label: 'Portfolio',\n description: 'Your investments',\n icon: <TrendingUp className=\"h-5 w-5\" />,\n path: '/investor/dashboard',\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: 'Returns',\n description: 'Earnings history',\n icon: <IndianRupee className=\"h-5 w-5\" />,\n path: '/investor/returns',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Reports',\n description: 'Performance reports',\n icon: <FileText className=\"h-5 w-5\" />,\n path: '/investor/reports',\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// Role-based Quick Stats configs\n// ---------------------------------------------------------------------------\n\nfunction getStatsForRole(\n role: UserRole,\n orders: MockOrder[],\n dashboardStats: DashboardStats | undefined\n) {\n switch (role) {\n case 'customer':\n return [\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: orders.length.toString(),\n label: 'Total Orders',\n trend: 'up' as const,\n trendValue: '+2 this week',\n },\n {\n icon: <Store className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeProviders ?? 0).toString(),\n label: 'Nearby Providers',\n trend: 'up' as const,\n trendValue: '+3',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: (dashboardStats?.avgRating ?? 0).toFixed(1),\n label: 'Avg. Rating',\n trend: 'up' as const,\n trendValue: '+0.1',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(\n orders.reduce((s, o) => s + o.total, 0),\n { minimumFractionDigits: 0 }\n ),\n label: 'Total Spent',\n trend: 'neutral' as const,\n trendValue: '',\n },\n ];\n case 'cart_owner':\n return [\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: '48',\n label: 'Orders Today',\n trend: 'up' as const,\n trendValue: '+12%',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(12850, { minimumFractionDigits: 0 }),\n label: \"Today's Revenue\",\n trend: 'up' as const,\n trendValue: '+8%',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: '4.6',\n label: 'Cart Rating',\n trend: 'up' as const,\n trendValue: '+0.2',\n },\n {\n icon: <Users className=\"h-5 w-5\" />,\n value: '5',\n label: 'Active Staff',\n trend: 'neutral' as const,\n trendValue: '',\n },\n ];\n case 'worker':\n return [\n {\n icon: <ClipboardList className=\"h-5 w-5\" />,\n value: '5',\n label: 'Tasks Today',\n trend: 'up' as const,\n trendValue: '+2',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(425, { minimumFractionDigits: 0 }),\n label: \"Today's Earnings\",\n trend: 'up' as const,\n trendValue: '+15%',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: '4.7',\n label: 'Rating',\n trend: 'up' as const,\n trendValue: '+0.1',\n },\n {\n icon: <CheckCircle2 className=\"h-5 w-5\" />,\n value: '96.8%',\n label: 'Completion Rate',\n trend: 'up' as const,\n trendValue: '+0.5%',\n },\n ];\n case 'investor':\n return [\n {\n icon: <TrendingUp className=\"h-5 w-5\" />,\n value: '3',\n label: 'Active Investments',\n trend: 'up' as const,\n trendValue: '+1',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(450000, { minimumFractionDigits: 0 }),\n label: 'Total Invested',\n trend: 'up' as const,\n trendValue: '',\n },\n {\n icon: <HandCoins className=\"h-5 w-5\" />,\n value: '16.5%',\n label: 'Avg. Returns',\n trend: 'up' as const,\n trendValue: '+2.1%',\n },\n {\n icon: <BarChart3 className=\"h-5 w-5\" />,\n value: formatCurrency(74250, { minimumFractionDigits: 0 }),\n label: 'Total Returns',\n trend: 'up' as const,\n trendValue: '+8.5%',\n },\n ];\n case 'admin':\n default:\n return [\n {\n icon: <Users className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeCustomers ?? 0).toLocaleString('en-IN'),\n label: 'Active Customers',\n trend: 'up' as const,\n trendValue: '+50',\n },\n {\n icon: <Store className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeProviders ?? 0).toString(),\n label: 'Service Providers',\n trend: 'up' as const,\n trendValue: '+3',\n },\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: (dashboardStats?.totalOrders ?? 0).toLocaleString('en-IN'),\n label: 'Total Orders',\n trend: 'up' as const,\n trendValue: '+12%',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(dashboardStats?.totalRevenue ?? 0, { minimumFractionDigits: 0 }),\n label: 'Total Revenue',\n trend: 'up' as const,\n trendValue: '+8.5%',\n },\n ];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Category data\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// How It Works steps\n// ---------------------------------------------------------------------------\n\nconst howItWorks = [\n {\n step: 1,\n title: 'Browse Services',\n description: 'Discover local service providers and carts near you.',\n icon: <Search className=\"h-6 w-6\" />,\n },\n {\n step: 2,\n title: 'Place an Order',\n description: 'Select items or services and place your order seamlessly.',\n icon: <ShoppingBag className=\"h-6 w-6\" />,\n },\n {\n step: 3,\n title: 'Track in Real-time',\n description: 'Get live updates on your order from confirmation to delivery.',\n icon: <Truck className=\"h-6 w-6\" />,\n },\n {\n step: 4,\n title: 'Rate & Review',\n description: 'Share your experience and help others find great services.',\n icon: <Star className=\"h-6 w-6\" />,\n },\n];\n\n// ---------------------------------------------------------------------------\n// Recent activity mock\n// ---------------------------------------------------------------------------\n\nconst mockRecentActivity = [\n {\n id: 'ha-1',\n description: 'New order placed at Dosa Express',\n time: '2 mins ago',\n type: 'order',\n },\n {\n id: 'ha-2',\n description: 'Quick Cuts Salon received a new review',\n time: '15 mins ago',\n type: 'review',\n },\n {\n id: 'ha-3',\n description: 'Investment opportunity funded: Spotless Cleaning',\n time: '1 hour ago',\n type: 'investment',\n },\n {\n id: 'ha-4',\n description: 'New cart registered: Gadget Zone Brigade',\n time: '3 hours ago',\n type: 'cart',\n },\n {\n id: 'ha-5',\n description: 'Order delivered: Fix-It Mobile Repair',\n time: '5 hours ago',\n type: 'order',\n },\n];\n\n// ---------------------------------------------------------------------------\n// Platform Stats\n// ---------------------------------------------------------------------------\n\nconst platformStats = [\n { label: 'Service Providers', value: '21+', icon: <Store className=\"h-5 w-5\" /> },\n { label: 'Categories', value: '9', icon: <Package className=\"h-5 w-5\" /> },\n { label: 'Happy Customers', value: '534+', icon: <Users className=\"h-5 w-5\" /> },\n { label: 'Orders Completed', value: '1,247+', icon: <CheckCircle2 className=\"h-5 w-5\" /> },\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 } = 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\n const roleLabel: Record<UserRole, string> = {\n customer: t('kadaikodi.home.role.customer', 'Customer'),\n cart_owner: t('kadaikodi.home.role.cartOwner', 'Cart Owner'),\n worker: t('kadaikodi.home.role.worker', 'Worker'),\n investor: t('kadaikodi.home.role.investor', 'Investor'),\n admin: t('kadaikodi.home.role.admin', 'Administrator'),\n };\n\n const roleGreetings: Record<UserRole, string> = {\n customer: t('kadaikodi.home.greeting.customer', 'Discover amazing services near you'),\n cart_owner: t('kadaikodi.home.greeting.cartOwner', 'Manage your business and grow'),\n worker: t('kadaikodi.home.greeting.worker', 'Check your tasks and earnings'),\n investor: t('kadaikodi.home.greeting.investor', 'Track your investments and returns'),\n admin: t('kadaikodi.home.greeting.admin', 'Monitor and manage the platform'),\n };\n\n const quickActions = quickActionsByRole[userRole] ?? quickActionsByRole.customer;\n const stats = getStatsForRole(userRole, orders.data ?? [], dashboardStats.data);\n\n // Featured carts (top-rated, open)\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\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 activityIcons: Record<string, string> = {\n order: 'text-text-primary',\n review: 'text-status-warning-text',\n investment: 'text-status-success-text',\n cart: 'text-text-primary',\n };\n\n // Check if \"new user\" (no orders)\n const isNewUser = (orders.data ?? []).length === 0 && !orders.isLoading;\n\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-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\">\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.hello', 'Hello')}, ${firstName}!`}\n description={roleGreetings[userRole]}\n >\n {/* Welcome Banner for New Users */}\n {isNewUser && (\n <section className=\"mb-6 rounded-xl border border-border-subtle bg-gradient-to-r from-primary/5 via-primary/10 to-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-action-primary-bg/10\">\n <Sparkles className=\"h-6 w-6 text-primary\" />\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 services marketplace. Start by exploring service providers near you or browse categories to find what you need.'\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\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 hover:bg-action-primary-bg/90 transition-colors\"\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 {/* Hero Section with Role Info */}\n <section className=\"mb-6 rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"inline-flex items-center rounded-full bg-action-primary-bg/10 px-2.5 py-0.5 text-xs font-medium text-primary\">\n <BadgeCheck className=\"mr-1 h-3 w-3\" />\n {roleLabel[userRole]}\n </span>\n </div>\n <h2 className=\"text-xl font-bold text-text-primary\">\n {t('kadaikodi.home.good', 'Good')}{' '}\n {new Date().getHours() < 12\n ? t('kadaikodi.home.time.morning', 'morning')\n : new Date().getHours() < 17\n ? t('kadaikodi.home.time.afternoon', 'afternoon')\n : t('kadaikodi.home.time.evening', 'evening')}\n , {firstName}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{roleGreetings[userRole]}</p>\n </div>\n <div className=\"relative w-full sm:w-72\">\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 services, 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.5 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 </div>\n </section>\n\n {/* Quick Stats */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.home.quickStats', 'Quick Stats')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {stats.map((stat) => (\n <MetricsCard\n key={stat.label}\n icon={stat.icon}\n value={stat.value}\n label={stat.label}\n trend={stat.trend}\n trendValue={stat.trendValue}\n />\n ))}\n </div>\n </section>\n\n {/* Quick Actions */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\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 '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-accent-foreground/20 hover:shadow-md'\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=\"h-4 w-4 text-text-secondary shrink-0 mt-1\" />\n </button>\n ))}\n </div>\n </section>\n\n {/* Featured / Nearby Carts */}\n <section className=\"mb-8\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {searchQuery\n ? t('kadaikodi.home.searchResults', 'Search Results')\n : t('kadaikodi.home.featuredCarts', 'Featured Carts')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"flex items-center gap-1 text-sm font-medium text-primary hover:underline\"\n >\n {t('kadaikodi.common.viewAll', 'View All')} <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\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 <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 hover:bg-accent transition-colors\"\n >\n {t('kadaikodi.home.clearSearch', 'Clear Search')}\n </button>\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=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden transition-all hover:shadow-md hover:border-accent-foreground/20 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n {/* Image */}\n <div className=\"relative h-40 bg-bg-sunken\">\n <img\n src={cart.image}\n alt={cart.name}\n className=\"h-full w-full object-cover\"\n loading=\"lazy\"\n />\n <div className=\"absolute top-2 right-2\">\n <StatusBadge status={cart.isOpen ? 'open' : 'closed'} />\n </div>\n {cart.isVerified && (\n <div className=\"absolute top-2 left-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-[var(--color-accent-soft)] px-2 py-0.5 text-xs font-medium text-white backdrop-blur-sm\">\n <BadgeCheck className=\"h-3 w-3\" />{' '}\n {t('kadaikodi.home.verified', 'Verified')}\n </span>\n </div>\n )}\n <div className=\"absolute bottom-2 right-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-black/60 px-2 py-0.5 text-xs text-white backdrop-blur-sm\">\n <Clock className=\"h-3 w-3\" /> {cart.estimatedTime} min\n </span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-base font-semibold text-text-primary truncate\">\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 items-center gap-1 rounded bg-status-success-text px-1.5 py-0.5 ml-2 shrink-0\">\n <Star className=\"h-3 w-3 fill-white text-white\" />\n <span className=\"text-xs font-bold text-white\">{cart.rating}</span>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> {formatDistance(cart.distance)}\n </span>\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 && (\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 {/* Tags / service types */}\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 */}\n {recentOrders.length > 0 && (\n <section className=\"mb-8\">\n <div className=\"flex items-center justify-between mb-4\">\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-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=\"rounded-lg border border-border-subtle bg-bg-surface divide-y divide-border\">\n {recentOrders.map((order) => (\n <div\n key={order.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => navigateTo(`/customer/order/${order.id}`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/customer/order/${order.id}`);\n }\n }}\n className=\"flex items-center gap-4 px-4 py-3 hover:bg-accent/50 transition-colors cursor-pointer\"\n >\n <img\n src={order.cartImage}\n alt={order.cartName}\n className=\"h-12 w-12 rounded-lg object-cover shrink-0\"\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {order.cartName}\n </p>\n <StatusBadge status={order.status} />\n </div>\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {order.items.map((i) => i.name).join(', ')}\n </p>\n </div>\n <div className=\"text-right shrink-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\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 {/* How It Works */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.home.howItWorks', 'How It Works')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {howItWorks.map((item) => (\n <div\n key={item.step}\n className=\"relative rounded-lg border border-border-subtle bg-bg-surface p-5 text-center\"\n >\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2\">\n <span className=\"inline-flex h-6 w-6 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {item.step}\n </span>\n </div>\n <div className=\"mt-2 flex justify-center text-text-secondary mb-3\">{item.icon}</div>\n <h3 className=\"text-sm font-semibold text-text-primary\">{item.title}</h3>\n <p className=\"mt-1 text-xs text-text-secondary\">{item.description}</p>\n </div>\n ))}\n </div>\n </section>\n\n {/* Browse by Category */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\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/carts?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 hover:shadow-sm hover:border-accent-foreground/20 transition-all\"\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 text-text-primary leading-tight\">\n {cat.label}\n </span>\n </button>\n ))}\n </div>\n </section>\n\n {/* Platform Stats */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.home.platformStats', 'Platform Stats')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {platformStats.map((stat) => (\n <div\n key={stat.label}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4\"\n >\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-action-primary-bg/10 text-primary shrink-0\">\n {stat.icon}\n </div>\n <div>\n <p className=\"text-lg font-bold text-text-primary\">{stat.value}</p>\n <p className=\"text-xs text-text-secondary\">{stat.label}</p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Recent Activity */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.home.recentActivity', 'Recent Activity')}\n </h2>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface divide-y divide-border\">\n {mockRecentActivity.map((item) => (\n <div key={item.id} className=\"flex items-center gap-3 px-4 py-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken\">\n <Activity\n className={cn('h-4 w-4', activityIcons[item.type] ?? 'text-text-secondary')}\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-text-primary truncate\">{item.description}</p>\n </div>\n <span className=\"text-xs text-text-secondary whitespace-nowrap\">{item.time}</span>\n </div>\n ))}\n </div>\n </section>\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 * Role-based landing page with hero section, quick stats, quick actions,\n * featured carts, recent orders, how-it-works, category browsing,\n * platform stats, and welcome banner for new users.\n */\n\nimport { useState, useMemo, useCallback } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n Search,\n ShoppingBag,\n Store,\n ClipboardList,\n TrendingUp,\n LayoutDashboard,\n Users,\n IndianRupee,\n Activity,\n ArrowRight,\n Star,\n MapPin,\n Clock,\n ChefHat,\n Scissors,\n Wrench,\n Home,\n Shirt,\n Heart,\n GraduationCap,\n Package,\n ShoppingCart,\n BarChart3,\n Wallet,\n CheckCircle2,\n Zap,\n Shield,\n Sparkles,\n HandCoins,\n UserCheck,\n Truck,\n BadgeCheck,\n FileText,\n Settings,\n Loader2,\n AlertCircle,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../components/PageLayout';\nimport { MetricsCard } from '../components/MetricsCard';\nimport { CartCard } from '../components/CartCard';\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 {\n formatCurrency,\n formatDate,\n formatRelativeTime,\n formatDistance,\n} from '../utils/formatters';\nimport type { UserRole, MockCart, MockOrder, DashboardStats } from '../types';\n\n// ---------------------------------------------------------------------------\n// Role-based Quick Action configs\n// ---------------------------------------------------------------------------\n\ninterface QuickAction {\n label: string;\n description: string;\n icon: React.ReactNode;\n path: string;\n color: string;\n}\n\nconst quickActionsByRole: Record<UserRole, QuickAction[]> = {\n customer: [\n {\n label: 'Discover Services',\n description: 'Browse carts near you',\n icon: <Search className=\"h-5 w-5\" />,\n path: '/customer/carts',\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: 'My Cart',\n description: 'Manage your cart',\n icon: <Store className=\"h-5 w-5\" />,\n path: '/owner/dashboard',\n color: 'bg-accent-purple-subtle text-text-primary',\n },\n {\n label: 'Orders',\n description: 'Incoming orders',\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n path: '/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: '/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: '/owner/staff',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n ],\n worker: [\n {\n label: 'My Tasks',\n description: 'View assigned tasks',\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: 'Earnings',\n description: 'Track pay',\n icon: <Wallet className=\"h-5 w-5\" />,\n path: '/worker/earnings',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Performance',\n description: 'Ratings & stats',\n icon: <Star className=\"h-5 w-5\" />,\n path: '/worker/performance',\n color: 'bg-status-warning-bg-subtle text-status-warning-text',\n },\n ],\n investor: [\n {\n label: 'Portfolio',\n description: 'Your investments',\n icon: <TrendingUp className=\"h-5 w-5\" />,\n path: '/investor/dashboard',\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: 'Returns',\n description: 'Earnings history',\n icon: <IndianRupee className=\"h-5 w-5\" />,\n path: '/investor/returns',\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n {\n label: 'Reports',\n description: 'Performance reports',\n icon: <FileText className=\"h-5 w-5\" />,\n path: '/investor/reports',\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// Role-based Quick Stats configs\n// ---------------------------------------------------------------------------\n\nfunction getStatsForRole(\n role: UserRole,\n orders: MockOrder[],\n dashboardStats: DashboardStats | undefined\n) {\n switch (role) {\n case 'customer':\n return [\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: orders.length.toString(),\n label: 'Total Orders',\n trend: 'up' as const,\n trendValue: '+2 this week',\n },\n {\n icon: <Store className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeProviders ?? 0).toString(),\n label: 'Nearby Providers',\n trend: 'up' as const,\n trendValue: '+3',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: (dashboardStats?.avgRating ?? 0).toFixed(1),\n label: 'Avg. Rating',\n trend: 'up' as const,\n trendValue: '+0.1',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(\n orders.reduce((s, o) => s + o.total, 0),\n { minimumFractionDigits: 0 }\n ),\n label: 'Total Spent',\n trend: 'neutral' as const,\n trendValue: '',\n },\n ];\n case 'cart_owner':\n return [\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: '48',\n label: 'Orders Today',\n trend: 'up' as const,\n trendValue: '+12%',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(12850, { minimumFractionDigits: 0 }),\n label: \"Today's Revenue\",\n trend: 'up' as const,\n trendValue: '+8%',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: '4.6',\n label: 'Cart Rating',\n trend: 'up' as const,\n trendValue: '+0.2',\n },\n {\n icon: <Users className=\"h-5 w-5\" />,\n value: '5',\n label: 'Active Staff',\n trend: 'neutral' as const,\n trendValue: '',\n },\n ];\n case 'worker':\n return [\n {\n icon: <ClipboardList className=\"h-5 w-5\" />,\n value: '5',\n label: 'Tasks Today',\n trend: 'up' as const,\n trendValue: '+2',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(425, { minimumFractionDigits: 0 }),\n label: \"Today's Earnings\",\n trend: 'up' as const,\n trendValue: '+15%',\n },\n {\n icon: <Star className=\"h-5 w-5\" />,\n value: '4.7',\n label: 'Rating',\n trend: 'up' as const,\n trendValue: '+0.1',\n },\n {\n icon: <CheckCircle2 className=\"h-5 w-5\" />,\n value: '96.8%',\n label: 'Completion Rate',\n trend: 'up' as const,\n trendValue: '+0.5%',\n },\n ];\n case 'investor':\n return [\n {\n icon: <TrendingUp className=\"h-5 w-5\" />,\n value: '3',\n label: 'Active Investments',\n trend: 'up' as const,\n trendValue: '+1',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(450000, { minimumFractionDigits: 0 }),\n label: 'Total Invested',\n trend: 'up' as const,\n trendValue: '',\n },\n {\n icon: <HandCoins className=\"h-5 w-5\" />,\n value: '16.5%',\n label: 'Avg. Returns',\n trend: 'up' as const,\n trendValue: '+2.1%',\n },\n {\n icon: <BarChart3 className=\"h-5 w-5\" />,\n value: formatCurrency(74250, { minimumFractionDigits: 0 }),\n label: 'Total Returns',\n trend: 'up' as const,\n trendValue: '+8.5%',\n },\n ];\n case 'admin':\n default:\n return [\n {\n icon: <Users className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeCustomers ?? 0).toLocaleString('en-IN'),\n label: 'Active Customers',\n trend: 'up' as const,\n trendValue: '+50',\n },\n {\n icon: <Store className=\"h-5 w-5\" />,\n value: (dashboardStats?.activeProviders ?? 0).toString(),\n label: 'Service Providers',\n trend: 'up' as const,\n trendValue: '+3',\n },\n {\n icon: <ShoppingBag className=\"h-5 w-5\" />,\n value: (dashboardStats?.totalOrders ?? 0).toLocaleString('en-IN'),\n label: 'Total Orders',\n trend: 'up' as const,\n trendValue: '+12%',\n },\n {\n icon: <IndianRupee className=\"h-5 w-5\" />,\n value: formatCurrency(dashboardStats?.totalRevenue ?? 0, { minimumFractionDigits: 0 }),\n label: 'Total Revenue',\n trend: 'up' as const,\n trendValue: '+8.5%',\n },\n ];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Category data\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// How It Works steps\n// ---------------------------------------------------------------------------\n\nconst howItWorks = [\n {\n step: 1,\n title: 'Browse Services',\n description: 'Discover local service providers and carts near you.',\n icon: <Search className=\"h-6 w-6\" />,\n },\n {\n step: 2,\n title: 'Place an Order',\n description: 'Select items or services and place your order seamlessly.',\n icon: <ShoppingBag className=\"h-6 w-6\" />,\n },\n {\n step: 3,\n title: 'Track in Real-time',\n description: 'Get live updates on your order from confirmation to delivery.',\n icon: <Truck className=\"h-6 w-6\" />,\n },\n {\n step: 4,\n title: 'Rate & Review',\n description: 'Share your experience and help others find great services.',\n icon: <Star className=\"h-6 w-6\" />,\n },\n];\n\n// ---------------------------------------------------------------------------\n// Recent activity mock\n// ---------------------------------------------------------------------------\n\nconst mockRecentActivity = [\n {\n id: 'ha-1',\n description: 'New order placed at Dosa Express',\n time: '2 mins ago',\n type: 'order',\n },\n {\n id: 'ha-2',\n description: 'Quick Cuts Salon received a new review',\n time: '15 mins ago',\n type: 'review',\n },\n {\n id: 'ha-3',\n description: 'Investment opportunity funded: Spotless Cleaning',\n time: '1 hour ago',\n type: 'investment',\n },\n {\n id: 'ha-4',\n description: 'New cart registered: Gadget Zone Brigade',\n time: '3 hours ago',\n type: 'cart',\n },\n {\n id: 'ha-5',\n description: 'Order delivered: Fix-It Mobile Repair',\n time: '5 hours ago',\n type: 'order',\n },\n];\n\n// ---------------------------------------------------------------------------\n// Platform Stats\n// ---------------------------------------------------------------------------\n\nconst platformStats = [\n { label: 'Service Providers', value: '21+', icon: <Store className=\"h-5 w-5\" /> },\n { label: 'Categories', value: '9', icon: <Package className=\"h-5 w-5\" /> },\n { label: 'Happy Customers', value: '534+', icon: <Users className=\"h-5 w-5\" /> },\n { label: 'Orders Completed', value: '1,247+', icon: <CheckCircle2 className=\"h-5 w-5\" /> },\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 } = 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\n const roleLabel: Record<UserRole, string> = {\n customer: t('kadaikodi.home.role.customer', 'Customer'),\n cart_owner: t('kadaikodi.home.role.cartOwner', 'Cart Owner'),\n worker: t('kadaikodi.home.role.worker', 'Worker'),\n investor: t('kadaikodi.home.role.investor', 'Investor'),\n admin: t('kadaikodi.home.role.admin', 'Administrator'),\n };\n\n const roleGreetings: Record<UserRole, string> = {\n customer: t('kadaikodi.home.greeting.customer', 'Discover amazing services near you'),\n cart_owner: t('kadaikodi.home.greeting.cartOwner', 'Manage your business and grow'),\n worker: t('kadaikodi.home.greeting.worker', 'Check your tasks and earnings'),\n investor: t('kadaikodi.home.greeting.investor', 'Track your investments and returns'),\n admin: t('kadaikodi.home.greeting.admin', 'Monitor and manage the platform'),\n };\n\n const quickActions = quickActionsByRole[userRole] ?? quickActionsByRole.customer;\n const stats = getStatsForRole(userRole, orders.data ?? [], dashboardStats.data);\n\n // Featured carts (top-rated, open)\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\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 activityIcons: Record<string, string> = {\n order: 'text-text-primary',\n review: 'text-status-warning-text',\n investment: 'text-status-success-text',\n cart: 'text-text-primary',\n };\n\n // Check if \"new user\" (no orders)\n const isNewUser = (orders.data ?? []).length === 0 && !orders.isLoading;\n\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-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\">\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.hello', 'Hello')}, ${firstName}!`}\n description={roleGreetings[userRole]}\n >\n <PagePurpose className=\"mb-6\">\n {t(\n 'kadaikodi.home.purpose',\n 'Kadaikodi is your local services marketplace — a single place to find mobile carts and service providers near you, place and track orders, and (for owners, workers and investors) run the business side. This home page is your launch pad: jump to what matters for your role, browse what is open nearby, and pick up where you left off.'\n )}\n </PagePurpose>\n\n {/* Welcome Banner for New Users */}\n {isNewUser && (\n <section className=\"mb-6 rounded-xl border border-border-subtle bg-gradient-to-r from-primary/5 via-primary/10 to-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-action-primary-bg/10\">\n <Sparkles className=\"h-6 w-6 text-primary\" />\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 services marketplace. Start by exploring service providers near you or browse categories to find what you need.'\n )}\n </p>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\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 hover:bg-action-primary-bg/90 transition-colors\"\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 {/* Hero Section with Role Info */}\n <section className=\"mb-6 rounded-xl border border-border-subtle bg-bg-surface p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"inline-flex items-center rounded-full bg-action-primary-bg/10 px-2.5 py-0.5 text-xs font-medium text-primary\">\n <BadgeCheck className=\"mr-1 h-3 w-3\" />\n {roleLabel[userRole]}\n </span>\n </div>\n <h2 className=\"text-xl font-bold text-text-primary\">\n {t('kadaikodi.home.good', 'Good')}{' '}\n {new Date().getHours() < 12\n ? t('kadaikodi.home.time.morning', 'morning')\n : new Date().getHours() < 17\n ? t('kadaikodi.home.time.afternoon', 'afternoon')\n : t('kadaikodi.home.time.evening', 'evening')}\n , {firstName}\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">{roleGreetings[userRole]}</p>\n </div>\n <div className=\"relative w-full sm:w-72\">\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 services, 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.5 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 </div>\n </section>\n\n {/* Quick Stats — the one emphasis zone for this page */}\n <EmphasisPanel className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.home.quickStats', 'Quick Stats')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {stats.map((stat) => (\n <MetricsCard\n key={stat.label}\n icon={stat.icon}\n value={stat.value}\n label={stat.label}\n trend={stat.trend}\n trendValue={stat.trendValue}\n />\n ))}\n </div>\n </EmphasisPanel>\n\n {/* Quick Actions */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\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 '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-accent-foreground/20 hover:shadow-md'\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=\"h-4 w-4 text-text-secondary shrink-0 mt-1\" />\n </button>\n ))}\n </div>\n </section>\n\n {/* Featured / Nearby Carts */}\n <section className=\"mb-8\">\n <div className=\"flex items-center justify-between mb-4\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {searchQuery\n ? t('kadaikodi.home.searchResults', 'Search Results')\n : t('kadaikodi.home.featuredCarts', 'Featured Carts')}\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/carts')}\n className=\"flex items-center gap-1 text-sm font-medium text-primary hover:underline\"\n >\n {t('kadaikodi.common.viewAll', 'View All')} <ArrowRight className=\"h-3.5 w-3.5\" />\n </button>\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 <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 hover:bg-accent transition-colors\"\n >\n {t('kadaikodi.home.clearSearch', 'Clear Search')}\n </button>\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=\"rounded-lg border border-border-subtle bg-bg-surface shadow-sm overflow-hidden transition-all hover:shadow-md hover:border-accent-foreground/20 cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)]\"\n >\n {/* Image */}\n <div className=\"relative h-40 bg-bg-sunken\">\n <img\n src={cart.image}\n alt={cart.name}\n className=\"h-full w-full object-cover\"\n loading=\"lazy\"\n />\n <div className=\"absolute top-2 right-2\">\n <StatusBadge status={cart.isOpen ? 'open' : 'closed'} />\n </div>\n {cart.isVerified && (\n <div className=\"absolute top-2 left-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-[var(--color-accent-soft)] px-2 py-0.5 text-xs font-medium text-white backdrop-blur-sm\">\n <BadgeCheck className=\"h-3 w-3\" />{' '}\n {t('kadaikodi.home.verified', 'Verified')}\n </span>\n </div>\n )}\n <div className=\"absolute bottom-2 right-2\">\n <span className=\"inline-flex items-center gap-1 rounded-full bg-black/60 px-2 py-0.5 text-xs text-white backdrop-blur-sm\">\n <Clock className=\"h-3 w-3\" /> {cart.estimatedTime} min\n </span>\n </div>\n </div>\n\n {/* Details */}\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between\">\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"text-base font-semibold text-text-primary truncate\">\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 items-center gap-1 rounded bg-status-success-text px-1.5 py-0.5 ml-2 shrink-0\">\n <Star className=\"h-3 w-3 fill-white text-white\" />\n <span className=\"text-xs font-bold text-white\">{cart.rating}</span>\n </div>\n </div>\n\n <div className=\"mt-3 flex items-center gap-4 text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" /> {formatDistance(cart.distance)}\n </span>\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 && (\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 {/* Tags / service types */}\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 */}\n {recentOrders.length > 0 && (\n <section className=\"mb-8\">\n <div className=\"flex items-center justify-between mb-4\">\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-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=\"rounded-lg border border-border-subtle bg-bg-surface divide-y divide-border\">\n {recentOrders.map((order) => (\n <div\n key={order.id}\n role=\"button\"\n tabIndex={0}\n onClick={() => navigateTo(`/customer/order/${order.id}`)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n navigateTo(`/customer/order/${order.id}`);\n }\n }}\n className=\"flex items-center gap-4 px-4 py-3 hover:bg-accent/50 transition-colors cursor-pointer\"\n >\n <img\n src={order.cartImage}\n alt={order.cartName}\n className=\"h-12 w-12 rounded-lg object-cover shrink-0\"\n />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {order.cartName}\n </p>\n <StatusBadge status={order.status} />\n </div>\n <p className=\"text-xs text-text-secondary mt-0.5\">\n {order.items.map((i) => i.name).join(', ')}\n </p>\n </div>\n <div className=\"text-right shrink-0\">\n <p className=\"text-sm font-semibold text-text-primary\">\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 {/* How It Works */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.home.howItWorks', 'How It Works')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {howItWorks.map((item) => (\n <div\n key={item.step}\n className=\"relative rounded-lg border border-border-subtle bg-bg-surface p-5 text-center\"\n >\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2\">\n <span className=\"inline-flex h-6 w-6 items-center justify-center rounded-full bg-action-primary-bg text-xs font-bold text-action-primary-text\">\n {item.step}\n </span>\n </div>\n <div className=\"mt-2 flex justify-center text-text-secondary mb-3\">{item.icon}</div>\n <h3 className=\"text-sm font-semibold text-text-primary\">{item.title}</h3>\n <p className=\"mt-1 text-xs text-text-secondary\">{item.description}</p>\n </div>\n ))}\n </div>\n </section>\n\n {/* Browse by Category */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\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/carts?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 hover:shadow-sm hover:border-accent-foreground/20 transition-all\"\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 text-text-primary leading-tight\">\n {cat.label}\n </span>\n </button>\n ))}\n </div>\n </section>\n\n {/* Platform Stats */}\n <section className=\"mb-8\">\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.home.platformStats', 'Platform Stats')}\n </h2>\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {platformStats.map((stat) => (\n <div\n key={stat.label}\n className=\"flex items-center gap-3 rounded-lg border border-border-subtle bg-bg-surface p-4\"\n >\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-action-primary-bg/10 text-primary shrink-0\">\n {stat.icon}\n </div>\n <div>\n <p className=\"text-lg font-bold text-text-primary\">{stat.value}</p>\n <p className=\"text-xs text-text-secondary\">{stat.label}</p>\n </div>\n </div>\n ))}\n </div>\n </section>\n\n {/* Recent Activity */}\n <section>\n <h2 className=\"text-lg font-semibold text-text-primary mb-4\">\n {t('kadaikodi.home.recentActivity', 'Recent Activity')}\n </h2>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface divide-y divide-border\">\n {mockRecentActivity.map((item) => (\n <div key={item.id} className=\"flex items-center gap-3 px-4 py-3\">\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-bg-sunken\">\n <Activity\n className={cn('h-4 w-4', activityIcons[item.type] ?? 'text-text-secondary')}\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm text-text-primary truncate\">{item.description}</p>\n </div>\n <span className=\"text-xs text-text-secondary whitespace-nowrap\">{item.time}</span>\n </div>\n ))}\n </div>\n </section>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|