@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":"SettingsPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/common/SettingsPage.tsx"],"sourcesContent":["/**\n * Settings Page\n * @module kadaikodi/pages/common\n *\n * Personal control center: Profile, Preferences, Security, Privacy, Billing.\n *\n * Wiring notes (pre-launch, honest):\n * - Theme and language apply LIVE through the shared fe-libs providers\n * (ThemeProvider / I18nProvider) — they persist themselves, no Save needed.\n * - User identity (name, email, phone, avatar) and account security\n * (password, 2FA, devices, sessions) are PLATFORM-owned (global-auth). This\n * page shows them read-only and routes to Account Security for changes — it\n * never fakes those mutations.\n * - The remaining app/billing preferences have no kadaikodi backend, so Save\n * persists them on THIS DEVICE (localStorage) with honest messaging. Payment\n * method / auto-recharge (platform billing) are honestly disabled.\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { Locale } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useTheme } from '@burdenoff/fe-libs/shared/providers/shell/ThemeProvider';\nimport {\n User,\n Settings,\n Sun,\n Moon,\n Monitor,\n Globe,\n Bell,\n Shield,\n Eye,\n Save,\n RotateCcw,\n Lock,\n Trash2,\n CreditCard,\n Receipt,\n Building2,\n MapPin,\n Camera,\n AlertTriangle,\n CheckCircle2,\n ExternalLink,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { cn } from '../../utils/cn';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ThemeRadio = 'light' | 'dark' | 'system';\ntype TabId = 'profile' | 'preferences' | 'security' | 'privacy' | 'billing';\n\n/**\n * Device-local settings only. Identity, theme, language and account-security\n * are intentionally excluded — they are owned elsewhere (see file header).\n */\ninterface UserSettings {\n profileExtra: {\n bio: string;\n dateOfBirth: string;\n gender: string;\n };\n preferences: {\n timezone: string;\n currency: string;\n notifications: {\n email: boolean;\n sms: boolean;\n push: boolean;\n orderUpdates: boolean;\n promotions: boolean;\n newsletters: boolean;\n security: boolean;\n };\n };\n privacy: {\n profileVisibility: 'public' | 'private' | 'friends';\n dataSharing: {\n analytics: boolean;\n marketing: boolean;\n thirdParty: boolean;\n };\n locationTracking: boolean;\n activityHistory: boolean;\n };\n billing: {\n invoiceEmail: string;\n gstNumber: string;\n companyName: string;\n billingAddress: string;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Defaults & persistence\n// ---------------------------------------------------------------------------\n\nconst PREFS_STORAGE_KEY = 'kadaikodi-user-prefs';\n\nconst defaultSettings: UserSettings = {\n profileExtra: {\n bio: '',\n dateOfBirth: '',\n gender: '',\n },\n preferences: {\n timezone: 'Asia/Kolkata',\n currency: 'INR',\n notifications: {\n email: true,\n sms: true,\n push: true,\n orderUpdates: true,\n promotions: false,\n newsletters: false,\n security: true,\n },\n },\n privacy: {\n profileVisibility: 'private',\n dataSharing: {\n analytics: true,\n marketing: false,\n thirdParty: false,\n },\n locationTracking: true,\n activityHistory: true,\n },\n billing: {\n invoiceEmail: '',\n gstNumber: '',\n companyName: '',\n billingAddress: '',\n },\n};\n\n/** Load device-local settings from localStorage, merged over defaults. */\nfunction loadSettings(invoiceEmail: string): UserSettings {\n const base: UserSettings = {\n ...defaultSettings,\n billing: { ...defaultSettings.billing, invoiceEmail },\n };\n try {\n const raw = localStorage.getItem(PREFS_STORAGE_KEY);\n if (!raw) return base;\n const saved = JSON.parse(raw) as Partial<UserSettings>;\n return {\n profileExtra: { ...base.profileExtra, ...(saved.profileExtra ?? {}) },\n preferences: {\n ...base.preferences,\n ...(saved.preferences ?? {}),\n notifications: {\n ...base.preferences.notifications,\n ...(saved.preferences?.notifications ?? {}),\n },\n },\n privacy: {\n ...base.privacy,\n ...(saved.privacy ?? {}),\n dataSharing: {\n ...base.privacy.dataSharing,\n ...(saved.privacy?.dataSharing ?? {}),\n },\n },\n billing: { ...base.billing, ...(saved.billing ?? {}) },\n };\n } catch {\n return base;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Tab config\n// ---------------------------------------------------------------------------\n\nconst tabConfig: { id: TabId; label: string; icon: typeof User }[] = [\n { id: 'profile', label: 'Profile', icon: User },\n { id: 'preferences', label: 'Preferences', icon: Settings },\n { id: 'security', label: 'Security', icon: Shield },\n { id: 'privacy', label: 'Privacy', icon: Eye },\n { id: 'billing', label: 'Billing', icon: CreditCard },\n];\n\n// Languages the platform actually has locale support for (fe-libs I18n Locale).\nconst LANGUAGE_OPTIONS: { value: Locale; label: string }[] = [\n { value: 'en', label: 'English' },\n { value: 'hi', label: 'Hindi' },\n { value: 'ta', label: 'Tamil' },\n];\n\n// ---------------------------------------------------------------------------\n// Toggle Switch component (inline)\n// ---------------------------------------------------------------------------\n\nfunction ToggleSwitch({\n checked,\n onChange,\n label,\n}: {\n checked: boolean;\n onChange: (val: boolean) => void;\n label?: string;\n}) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n onClick={() => onChange(!checked)}\n className={cn(\n 'relative inline-flex h-6 w-11 items-center rounded-full transition-colors shrink-0',\n checked ? 'bg-action-primary-bg' : 'bg-bg-sunken'\n )}\n >\n <span\n className={cn(\n 'inline-block h-4 w-4 transform rounded-full bg-white transition-transform',\n checked ? 'translate-x-6' : 'translate-x-1'\n )}\n />\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SettingsPage() {\n const { currentUser, navigateTo } = useKadaikodi();\n const { t: translate, locale, setLocale } = useI18n();\n const { mode, setMode } = useTheme();\n\n // Display-only identity, always sourced from the platform session.\n const identity = useMemo(() => {\n const firstName = currentUser?.firstName ?? currentUser?.name?.split(' ')[0] ?? '';\n const lastName =\n currentUser?.lastName ?? currentUser?.name?.split(' ').slice(1).join(' ') ?? '';\n const email = currentUser?.email ?? '';\n const fullName = [firstName, lastName].filter(Boolean).join(' ') || currentUser?.name || '—';\n return {\n firstName,\n lastName,\n fullName,\n email,\n phone: currentUser?.phone ?? '',\n avatar: currentUser?.avatar ?? currentUser?.profilePicture ?? '',\n initials:\n ((firstName[0] ?? '') + (lastName[0] ?? '')).toUpperCase() ||\n (email[0] ?? '?').toUpperCase(),\n };\n }, [currentUser]);\n\n const [activeTab, setActiveTab] = useState<TabId>('profile');\n const [settings, setSettings] = useState<UserSettings>(() => loadSettings(identity.email));\n const [hasChanges, setHasChanges] = useState(false);\n const [saveMessage, setSaveMessage] = useState('');\n const [saveIsError, setSaveIsError] = useState(false);\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 themeValue: ThemeRadio =\n mode === 'light' || mode === 'dark' || mode === 'system' ? mode : 'system';\n\n const localizedTabConfig = useMemo(\n () =>\n tabConfig.map((tab) => ({\n ...tab,\n label:\n tab.id === 'profile'\n ? t('kadaikodi.settings.tabs.profile', 'Profile')\n : tab.id === 'preferences'\n ? t('kadaikodi.settings.tabs.preferences', 'Preferences')\n : tab.id === 'security'\n ? t('kadaikodi.settings.tabs.security', 'Security')\n : tab.id === 'privacy'\n ? t('kadaikodi.settings.tabs.privacy', 'Privacy')\n : t('kadaikodi.settings.tabs.billing', 'Billing'),\n })),\n [t]\n );\n\n // Deep update helpers for device-local settings.\n const update = useCallback(\n <S extends keyof UserSettings, F extends keyof UserSettings[S]>(\n section: S,\n field: F,\n value: UserSettings[S][F]\n ) => {\n setSettings((prev) => ({\n ...prev,\n [section]: { ...prev[section], [field]: value },\n }));\n setHasChanges(true);\n setSaveMessage('');\n },\n []\n );\n\n const updateNested = useCallback(\n (section: keyof UserSettings, sub: string, field: string, value: boolean | string) => {\n setSettings((prev) => ({\n ...prev,\n [section]: {\n ...prev[section],\n [sub]: {\n ...((prev[section] as Record<string, unknown>)[sub] as Record<string, unknown>),\n [field]: value,\n },\n },\n }));\n setHasChanges(true);\n setSaveMessage('');\n },\n []\n );\n\n const resetSettings = useCallback(() => {\n setSettings({\n ...defaultSettings,\n billing: { ...defaultSettings.billing, invoiceEmail: identity.email },\n });\n setHasChanges(false);\n setSaveMessage('');\n setSaveIsError(false);\n }, [identity.email]);\n\n // Theme / language apply immediately via the shared providers (self-persist).\n const handleThemeChange = useCallback(\n (value: ThemeRadio) => {\n setMode(value);\n },\n [setMode]\n );\n\n const handleLanguageChange = useCallback(\n (value: Locale) => {\n setLocale(value);\n },\n [setLocale]\n );\n\n // Save persists ONLY the device-local preference subtree. Honest messaging.\n const saveSettings = useCallback(() => {\n try {\n localStorage.setItem(PREFS_STORAGE_KEY, JSON.stringify(settings));\n setHasChanges(false);\n setSaveIsError(false);\n setSaveMessage(t('kadaikodi.settings.saveSuccess', 'Preferences saved on this device.'));\n window.setTimeout(() => setSaveMessage(''), 3000);\n } catch {\n setSaveIsError(true);\n setSaveMessage(\n t(\n 'kadaikodi.settings.saveError',\n 'Could not save preferences on this device. Please check your browser storage settings.'\n )\n );\n }\n }, [settings, t]);\n\n const goToAccountSecurity = useCallback(() => {\n navigateTo('/auth/security');\n }, [navigateTo]);\n\n const handleDeleteAccount = useCallback(() => {\n if (\n window.confirm(\n t(\n 'kadaikodi.settings.deleteConfirm',\n 'Account deletion is handled by our support team. Do you want to email support@kadaikodi.com to request it? This cannot be undone once processed.'\n )\n )\n ) {\n const subject = encodeURIComponent('Account deletion request');\n const body = encodeURIComponent(\n `I would like to request deletion of my Kadaikodi account (${identity.email}).`\n );\n window.location.href = `mailto:support@kadaikodi.com?subject=${subject}&body=${body}`;\n }\n }, [t, identity.email]);\n\n // Small reusable \"managed elsewhere\" call-to-action.\n const AccountSecurityLink = ({ label }: { label: string }) => (\n <button\n type=\"button\"\n onClick={goToAccountSecurity}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Shield className=\"h-4 w-4\" />\n {label}\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </button>\n );\n\n // ---- Profile Tab ----\n const renderProfile = () => (\n <div className=\"space-y-6\">\n <h3 className=\"text-base font-semibold text-text-primary\">Personal Information</h3>\n\n {/* Profile Picture (identity — platform managed) */}\n <div className=\"flex items-center gap-4\">\n <div className=\"relative\">\n {identity.avatar ? (\n <img\n src={identity.avatar}\n alt=\"Profile\"\n className=\"h-20 w-20 rounded-full object-cover border border-border-subtle\"\n />\n ) : (\n <div className=\"flex h-20 w-20 items-center justify-center rounded-full border border-border-subtle bg-bg-sunken text-lg font-semibold text-text-secondary\">\n {identity.initials}\n </div>\n )}\n <button\n type=\"button\"\n onClick={goToAccountSecurity}\n aria-label=\"Update profile photo in Account Security\"\n title=\"Update your photo in Account Security\"\n className=\"absolute -bottom-1 -right-1 flex h-7 w-7 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-text shadow-sm hover:bg-action-primary-bg/90\"\n >\n <Camera className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Profile Picture</p>\n <p className=\"text-xs text-text-secondary\">Your photo is managed in Account Security.</p>\n </div>\n </div>\n\n {/* Identity (read-only, from session) */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 flex-1\">\n <div>\n <p className=\"text-xs text-text-secondary mb-0.5\">Full Name</p>\n <p className=\"text-sm font-medium text-text-primary\">{identity.fullName}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary mb-0.5\">Email Address</p>\n <p className=\"text-sm font-medium text-text-primary break-all\">\n {identity.email || '—'}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary mb-0.5\">Phone Number</p>\n <p className=\"text-sm font-medium text-text-primary\">{identity.phone || '—'}</p>\n </div>\n </div>\n <AccountSecurityLink label=\"Manage in Account Security\" />\n </div>\n <p className=\"text-xs text-text-secondary mt-3\">\n Your name, email and phone are part of your account identity and are managed centrally in\n Account Security.\n </p>\n </div>\n\n {/* Bio (device-local preference) */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Bio</label>\n <textarea\n rows={3}\n value={settings.profileExtra.bio}\n onChange={(e) => update('profileExtra', 'bio', e.target.value)}\n placeholder=\"Tell us about yourself...\"\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none\"\n />\n </div>\n\n {/* DOB & Gender (device-local preferences) */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Date of Birth\n </label>\n <input\n type=\"date\"\n value={settings.profileExtra.dateOfBirth}\n onChange={(e) => update('profileExtra', 'dateOfBirth', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Gender</label>\n <select\n value={settings.profileExtra.gender}\n onChange={(e) => update('profileExtra', 'gender', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Select gender</option>\n <option value=\"male\">Male</option>\n <option value=\"female\">Female</option>\n <option value=\"other\">Other</option>\n <option value=\"prefer-not-to-say\">Prefer not to say</option>\n </select>\n </div>\n </div>\n </div>\n );\n\n // ---- Preferences Tab ----\n const renderPreferences = () => (\n <div className=\"space-y-6\">\n <h3 className=\"text-base font-semibold text-text-primary\">App Preferences</h3>\n\n {/* Language, Timezone, Currency */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n <span className=\"flex items-center gap-1.5\">\n <Globe className=\"h-4 w-4 text-text-secondary\" /> Language\n </span>\n </label>\n <select\n value={LANGUAGE_OPTIONS.some((o) => o.value === locale) ? locale : 'en'}\n onChange={(e) => handleLanguageChange(e.target.value as Locale)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n {LANGUAGE_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n <p className=\"mt-1 text-xs text-text-secondary\">Applies instantly across the app.</p>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Timezone</label>\n <select\n value={settings.preferences.timezone}\n onChange={(e) => update('preferences', 'timezone', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"Asia/Kolkata\">India (IST)</option>\n <option value=\"Asia/Dubai\">Dubai (GST)</option>\n <option value=\"Europe/London\">London (GMT)</option>\n <option value=\"America/New_York\">New York (EST)</option>\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Currency</label>\n <select\n value={settings.preferences.currency}\n onChange={(e) => update('preferences', 'currency', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"INR\">Indian Rupee (₹)</option>\n <option value=\"USD\">US Dollar ($)</option>\n <option value=\"EUR\">Euro (€)</option>\n <option value=\"GBP\">British Pound (£)</option>\n </select>\n </div>\n </div>\n\n {/* Theme — applies live via the shared theme provider */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-3\">Theme</label>\n <div className=\"flex gap-3 flex-wrap\">\n {(\n [\n { value: 'light', label: 'Light', Icon: Sun },\n { value: 'dark', label: 'Dark', Icon: Moon },\n { value: 'system', label: 'System', Icon: Monitor },\n ] as const\n ).map(({ value, label, Icon }) => (\n <label\n key={value}\n className={cn(\n 'flex items-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium cursor-pointer transition-colors',\n themeValue === value\n ? 'border-primary bg-action-primary-bg/10 text-text-primary'\n : 'border-border-subtle text-text-secondary hover:border-border-strong hover:text-text-primary'\n )}\n >\n <input\n type=\"radio\"\n name=\"theme\"\n value={value}\n checked={themeValue === value}\n onChange={(e) => handleThemeChange(e.target.value as ThemeRadio)}\n className=\"sr-only\"\n />\n <Icon className=\"h-4 w-4\" />\n {label}\n </label>\n ))}\n </div>\n <p className=\"mt-2 text-xs text-text-secondary\">\n Your theme applies immediately and is remembered on this device.\n </p>\n </div>\n\n {/* Notification Toggles (device-local) */}\n <div>\n <div className=\"flex items-center gap-2 mb-4\">\n <Bell className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-semibold text-text-primary\">Notification Preferences</h4>\n </div>\n <div className=\"space-y-3\">\n {(\n [\n { key: 'email', label: 'Email notifications' },\n { key: 'sms', label: 'SMS notifications' },\n { key: 'push', label: 'Push notifications' },\n { key: 'orderUpdates', label: 'Order status updates' },\n { key: 'promotions', label: 'Promotional offers' },\n { key: 'newsletters', label: 'Newsletters and updates' },\n { key: 'security', label: 'Security alerts' },\n ] as const\n ).map((item) => (\n <div\n key={item.key}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle p-3\"\n >\n <span className=\"text-sm text-text-primary\">{item.label}</span>\n <ToggleSwitch\n checked={settings.preferences.notifications[item.key]}\n onChange={(val) => updateNested('preferences', 'notifications', item.key, val)}\n label={item.label}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n\n // ---- Security Tab (platform-owned; route out, no fake controls) ----\n const renderSecurity = () => (\n <div className=\"space-y-6\">\n <h3 className=\"text-base font-semibold text-text-primary\">Security Settings</h3>\n\n <div className=\"flex items-start gap-3 rounded-lg border border-status-warning-text/30 bg-status-warning-bg-subtle p-4\">\n <AlertTriangle className=\"h-5 w-5 text-status-warning-text shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n Account Security is managed centrally\n </p>\n <p className=\"text-xs text-text-secondary\">\n Your password, two-factor authentication, login alerts, active sessions and trusted\n devices are protected by the platform&apos;s Account Security. Manage them there to keep\n a single, secure source of truth for your account.\n </p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle p-4 space-y-3\">\n {[\n { icon: Lock, label: 'Password', desc: 'Change your account password.' },\n {\n icon: Shield,\n label: 'Two-Factor Authentication',\n desc: 'Add an extra layer of security with 2FA.',\n },\n {\n icon: Monitor,\n label: 'Devices & Sessions',\n desc: 'Review active devices and sign out everywhere.',\n },\n ].map((row) => {\n const RowIcon = row.icon;\n return (\n <div key={row.label} className=\"flex items-start gap-3\">\n <RowIcon className=\"h-4 w-4 text-text-secondary shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{row.label}</p>\n <p className=\"text-xs text-text-secondary\">{row.desc}</p>\n </div>\n </div>\n );\n })}\n </div>\n\n <AccountSecurityLink label=\"Manage in Account Security\" />\n </div>\n );\n\n // ---- Privacy Tab ----\n const renderPrivacy = () => (\n <div className=\"space-y-6\">\n <h3 className=\"text-base font-semibold text-text-primary\">Privacy Controls</h3>\n\n {/* Profile Visibility */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n <span className=\"flex items-center gap-1.5\">\n <Eye className=\"h-4 w-4 text-text-secondary\" /> Profile Visibility\n </span>\n </label>\n <select\n value={settings.privacy.profileVisibility}\n onChange={(e) =>\n update(\n 'privacy',\n 'profileVisibility',\n e.target.value as 'public' | 'private' | 'friends'\n )\n }\n className=\"w-full max-w-sm rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"public\">Public - Anyone can see your profile</option>\n <option value=\"private\">Private - Only you can see your profile</option>\n <option value=\"friends\">Friends - Only friends can see your profile</option>\n </select>\n </div>\n\n {/* Data Sharing */}\n <div>\n <h4 className=\"text-sm font-semibold text-text-primary mb-3\">Data Sharing</h4>\n <div className=\"space-y-3\">\n {(\n [\n { key: 'analytics', label: 'Share usage analytics to improve the app' },\n { key: 'marketing', label: 'Share data for personalized marketing' },\n { key: 'thirdParty', label: 'Share data with third-party partners' },\n ] as const\n ).map((item) => (\n <div\n key={item.key}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle p-3\"\n >\n <span className=\"text-sm text-text-primary\">{item.label}</span>\n <ToggleSwitch\n checked={settings.privacy.dataSharing[item.key]}\n onChange={(val) => updateNested('privacy', 'dataSharing', item.key, val)}\n label={item.label}\n />\n </div>\n ))}\n </div>\n </div>\n\n {/* Location & Activity */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Location Tracking</p>\n <p className=\"text-xs text-text-secondary\">\n Allow app to track your location for better service\n </p>\n </div>\n <ToggleSwitch\n checked={settings.privacy.locationTracking}\n onChange={(val) => update('privacy', 'locationTracking', val)}\n label=\"Location tracking\"\n />\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Activity History</p>\n <p className=\"text-xs text-text-secondary\">Keep track of your orders and activities</p>\n </div>\n <ToggleSwitch\n checked={settings.privacy.activityHistory}\n onChange={(val) => update('privacy', 'activityHistory', val)}\n label=\"Activity history\"\n />\n </div>\n </div>\n\n {/* Delete Account — routed to support, no fake success */}\n <div className=\"rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle p-4\">\n <div className=\"flex items-start gap-3\">\n <Trash2 className=\"h-5 w-5 text-status-error-text shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Delete Account</p>\n <p className=\"text-xs text-text-secondary mt-0.5\">\n Permanently delete your account and all associated data. This is handled by our\n support team and cannot be undone once processed.\n </p>\n <button\n type=\"button\"\n onClick={handleDeleteAccount}\n className=\"mt-3 rounded-lg border border-status-error-text/30 px-4 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg/10 transition-colors\"\n >\n Request Account Deletion\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n\n // ---- Billing Tab ----\n const renderBilling = () => (\n <div className=\"space-y-6\">\n <h3 className=\"text-base font-semibold text-text-primary\">Billing & Payments</h3>\n\n {/* Default Payment Method — platform billing, honestly disabled */}\n <div>\n <h4 className=\"text-sm font-semibold text-text-primary mb-3\">\n <span className=\"flex items-center gap-1.5\">\n <CreditCard className=\"h-4 w-4 text-text-secondary\" /> Default Payment Method\n </span>\n </h4>\n <div className=\"rounded-lg border border-border-subtle p-4 text-center\">\n <p className=\"text-sm text-text-secondary\">\n Saved payment methods aren&apos;t available yet.\n </p>\n <button\n type=\"button\"\n disabled\n aria-disabled=\"true\"\n title=\"Coming soon\"\n className=\"mt-2 cursor-not-allowed rounded-lg bg-bg-sunken px-4 py-2 text-sm font-medium text-text-secondary\"\n >\n Add Payment Method (coming soon)\n </button>\n </div>\n </div>\n\n {/* Auto Recharge — payment automation, honestly disabled */}\n <div>\n <h4 className=\"text-sm font-semibold text-text-primary mb-3\">Auto Recharge</h4>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Enable Auto Recharge</p>\n <p className=\"text-xs text-text-secondary\">\n Automatically add money when wallet balance is low — coming soon.\n </p>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={false}\n aria-disabled=\"true\"\n disabled\n title=\"Coming soon\"\n className=\"relative inline-flex h-6 w-11 items-center rounded-full bg-bg-sunken opacity-60 cursor-not-allowed shrink-0\"\n >\n <span className=\"inline-block h-4 w-4 translate-x-1 rounded-full bg-white\" />\n </button>\n </div>\n </div>\n\n {/* Invoice details — device-local (honest) */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n <span className=\"flex items-center gap-1.5\">\n <Receipt className=\"h-4 w-4 text-text-secondary\" /> Invoice Email\n </span>\n </label>\n <input\n type=\"email\"\n value={settings.billing.invoiceEmail}\n onChange={(e) => update('billing', 'invoiceEmail', e.target.value)}\n placeholder=\"billing@example.com\"\n className=\"w-full max-w-sm rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n\n {/* Tax Info — device-local (honest) */}\n <div>\n <h4 className=\"text-sm font-semibold text-text-primary mb-3\">\n <span className=\"flex items-center gap-1.5\">\n <Building2 className=\"h-4 w-4 text-text-secondary\" /> Tax Information\n </span>\n </h4>\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">GST Number</label>\n <input\n type=\"text\"\n value={settings.billing.gstNumber}\n onChange={(e) => update('billing', 'gstNumber', e.target.value)}\n placeholder=\"29ABCDE1234F1Z5\"\n className=\"w-full max-w-sm rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Company Name\n </label>\n <input\n type=\"text\"\n value={settings.billing.companyName}\n onChange={(e) => update('billing', 'companyName', e.target.value)}\n placeholder=\"Your Company Name\"\n className=\"w-full max-w-sm rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n <span className=\"flex items-center gap-1.5\">\n <MapPin className=\"h-4 w-4 text-text-secondary\" /> Billing Address\n </span>\n </label>\n <textarea\n rows={3}\n value={settings.billing.billingAddress}\n onChange={(e) => update('billing', 'billingAddress', e.target.value)}\n placeholder=\"Enter your complete billing address\"\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none\"\n />\n </div>\n </div>\n <p className=\"mt-3 text-xs text-text-secondary\">\n Invoice and tax details are saved on this device for your convenience.\n </p>\n </div>\n </div>\n );\n\n // ---- Render function map ----\n const renderTab: Record<TabId, () => React.ReactNode> = {\n profile: renderProfile,\n preferences: renderPreferences,\n security: renderSecurity,\n privacy: renderPrivacy,\n billing: renderBilling,\n };\n\n return (\n <PageLayout\n title={t('kadaikodi.settings.title', 'Settings')}\n description={t(\n 'kadaikodi.settings.description',\n 'Manage your preferences and account settings'\n )}\n actions={\n <div className=\"flex items-center gap-2\">\n {hasChanges && (\n <button\n type=\"button\"\n onClick={resetSettings}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <RotateCcw className=\"h-4 w-4\" />\n {t('kadaikodi.settings.reset', 'Reset')}\n </button>\n )}\n <button\n type=\"button\"\n disabled={!hasChanges}\n onClick={saveSettings}\n className={cn(\n 'flex items-center gap-1.5 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n hasChanges\n ? 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n <Save className=\"h-4 w-4\" />\n {t('kadaikodi.settings.save', 'Save Settings')}\n </button>\n </div>\n }\n >\n {/* Save message */}\n {saveMessage && (\n <div\n className={cn(\n 'mb-6 flex items-center gap-2 rounded-lg border p-3 text-sm',\n saveIsError\n ? 'border-status-error-text/30 bg-status-error-bg-subtle text-status-error-text'\n : 'border-status-success-text/30 bg-status-success-bg-subtle text-status-success-text'\n )}\n >\n {saveIsError ? (\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n ) : (\n <CheckCircle2 className=\"h-4 w-4 shrink-0\" />\n )}\n {saveMessage}\n </div>\n )}\n\n <PagePurpose className=\"mb-6\">\n {t(\n 'kadaikodi.settings.purpose',\n 'Your personal control center on Kadaikodi. Manage your profile, app preferences (language, theme, notifications), privacy choices, and billing details. Theme and language apply instantly; account identity and security are managed in Account Security.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-settings\"\n className=\"mb-6\"\n steps={[\n {\n id: 'security',\n label: t('kadaikodi.settings.next.security', 'Secure your account'),\n description: t(\n 'kadaikodi.settings.next.securityDesc',\n 'Review password, 2FA and active devices in Account Security.'\n ),\n onClick: () => setActiveTab('security'),\n },\n {\n id: 'preferences',\n label: t('kadaikodi.settings.next.preferences', 'Set your preferences'),\n description: t(\n 'kadaikodi.settings.next.preferencesDesc',\n 'Choose language, theme and notification settings.'\n ),\n onClick: () => setActiveTab('preferences'),\n },\n {\n id: 'billing',\n label: t('kadaikodi.settings.next.billing', 'Review billing'),\n description: t(\n 'kadaikodi.settings.next.billingDesc',\n 'Keep your invoice and tax details up to date.'\n ),\n onClick: () => setActiveTab('billing'),\n },\n ]}\n />\n\n <div className=\"flex flex-col gap-6 lg:flex-row\">\n {/* Sidebar (Desktop) / Tab Row (Mobile) */}\n <div className=\"shrink-0 lg:w-56\">\n {/* Mobile grid */}\n <div className=\"grid grid-cols-5 gap-1 lg:hidden\">\n {localizedTabConfig.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex flex-col items-center gap-1 rounded-lg py-2.5 text-center transition-colors',\n activeTab === tab.id\n ? 'bg-action-primary-bg/10 text-text-primary'\n : 'text-text-secondary hover:text-text-primary hover:bg-accent'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n {/* Desktop sidebar */}\n <div className=\"hidden lg:block rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"p-3 border-b border-border-subtle\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('kadaikodi.settings.title', 'Settings')}\n </p>\n </div>\n <nav className=\"p-2\">\n {localizedTabConfig.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-sm font-medium transition-colors mb-0.5',\n activeTab === tab.id\n ? 'bg-action-primary-bg/10 text-text-primary'\n : 'text-text-secondary hover:text-text-primary hover:bg-accent'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n </div>\n\n {/* Content — the one emphasis zone for this page */}\n <EmphasisPanel className=\"flex-1 p-6\">{renderTab[activeTab]()}</EmphasisPanel>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/common/SettingsPage.tsx"],"sourcesContent":["/**\n * Settings Page\n * @module kadaikodi/pages/common\n *\n * Personal control center: Profile, Preferences, Security, Privacy, Billing.\n *\n * Wiring notes (pre-launch, honest):\n * - Theme and language apply LIVE through the shared fe-libs providers\n * (ThemeProvider / I18nProvider) — they persist themselves, no Save needed.\n * - User identity (name, email, phone, avatar) and account security\n * (password, 2FA, devices, sessions) are PLATFORM-owned (global-auth). This\n * page shows them read-only and routes to Account Security for changes — it\n * never fakes those mutations.\n * - The remaining app/billing preferences have no kadaikodi backend, so Save\n * persists them on THIS DEVICE (localStorage) with honest messaging. Payment\n * method / auto-recharge (platform billing) are honestly disabled.\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport type { Locale } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useTheme } from '@burdenoff/fe-libs/shared/providers/shell/ThemeProvider';\nimport {\n User,\n Settings,\n Sun,\n Moon,\n Monitor,\n Globe,\n Bell,\n Shield,\n Eye,\n Save,\n RotateCcw,\n Lock,\n Trash2,\n CreditCard,\n Receipt,\n Building2,\n MapPin,\n Camera,\n AlertTriangle,\n CheckCircle2,\n ExternalLink,\n} from 'lucide-react';\nimport { EmphasisPanel, PagePurpose, NextSteps } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { cn } from '../../utils/cn';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ThemeRadio = 'light' | 'dark' | 'system';\ntype TabId = 'profile' | 'preferences' | 'security' | 'privacy' | 'billing';\n\n/**\n * Device-local settings only. Identity, theme, language and account-security\n * are intentionally excluded — they are owned elsewhere (see file header).\n */\ninterface UserSettings {\n profileExtra: {\n bio: string;\n dateOfBirth: string;\n gender: string;\n };\n preferences: {\n timezone: string;\n currency: string;\n notifications: {\n email: boolean;\n sms: boolean;\n push: boolean;\n orderUpdates: boolean;\n promotions: boolean;\n newsletters: boolean;\n security: boolean;\n };\n };\n privacy: {\n profileVisibility: 'public' | 'private' | 'friends';\n dataSharing: {\n analytics: boolean;\n marketing: boolean;\n thirdParty: boolean;\n };\n locationTracking: boolean;\n activityHistory: boolean;\n };\n billing: {\n invoiceEmail: string;\n gstNumber: string;\n companyName: string;\n billingAddress: string;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Defaults & persistence\n// ---------------------------------------------------------------------------\n\nconst PREFS_STORAGE_KEY = 'kadaikodi-user-prefs';\n\nconst defaultSettings: UserSettings = {\n profileExtra: {\n bio: '',\n dateOfBirth: '',\n gender: '',\n },\n preferences: {\n timezone: 'Asia/Kolkata',\n currency: 'INR',\n notifications: {\n email: true,\n sms: true,\n push: true,\n orderUpdates: true,\n promotions: false,\n newsletters: false,\n security: true,\n },\n },\n privacy: {\n profileVisibility: 'private',\n dataSharing: {\n analytics: true,\n marketing: false,\n thirdParty: false,\n },\n locationTracking: true,\n activityHistory: true,\n },\n billing: {\n invoiceEmail: '',\n gstNumber: '',\n companyName: '',\n billingAddress: '',\n },\n};\n\n/** Load device-local settings from localStorage, merged over defaults. */\nfunction loadSettings(invoiceEmail: string): UserSettings {\n const base: UserSettings = {\n ...defaultSettings,\n billing: { ...defaultSettings.billing, invoiceEmail },\n };\n try {\n const raw = localStorage.getItem(PREFS_STORAGE_KEY);\n if (!raw) return base;\n const saved = JSON.parse(raw) as Partial<UserSettings>;\n return {\n profileExtra: { ...base.profileExtra, ...(saved.profileExtra ?? {}) },\n preferences: {\n ...base.preferences,\n ...(saved.preferences ?? {}),\n notifications: {\n ...base.preferences.notifications,\n ...(saved.preferences?.notifications ?? {}),\n },\n },\n privacy: {\n ...base.privacy,\n ...(saved.privacy ?? {}),\n dataSharing: {\n ...base.privacy.dataSharing,\n ...(saved.privacy?.dataSharing ?? {}),\n },\n },\n billing: { ...base.billing, ...(saved.billing ?? {}) },\n };\n } catch {\n return base;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Tab config\n// ---------------------------------------------------------------------------\n\nconst tabConfig: { id: TabId; label: string; icon: typeof User }[] = [\n { id: 'profile', label: 'Profile', icon: User },\n { id: 'preferences', label: 'Preferences', icon: Settings },\n { id: 'security', label: 'Security', icon: Shield },\n { id: 'privacy', label: 'Privacy', icon: Eye },\n { id: 'billing', label: 'Billing', icon: CreditCard },\n];\n\n// Languages the platform actually has locale support for (fe-libs I18n Locale).\nconst LANGUAGE_OPTIONS: { value: Locale; label: string }[] = [\n { value: 'en', label: 'English' },\n { value: 'hi', label: 'Hindi' },\n { value: 'ta', label: 'Tamil' },\n];\n\n// ---------------------------------------------------------------------------\n// Toggle Switch component (inline)\n// ---------------------------------------------------------------------------\n\nfunction ToggleSwitch({\n checked,\n onChange,\n label,\n}: {\n checked: boolean;\n onChange: (val: boolean) => void;\n label?: string;\n}) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={label}\n onClick={() => onChange(!checked)}\n className={cn(\n 'relative inline-flex h-6 w-11 items-center rounded-full transition-colors shrink-0',\n checked ? 'bg-action-primary-bg' : 'bg-bg-sunken'\n )}\n >\n <span\n className={cn(\n 'inline-block h-4 w-4 transform rounded-full bg-white transition-transform',\n checked ? 'translate-x-6' : 'translate-x-1'\n )}\n />\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SettingsPage() {\n const { currentUser, navigateTo } = useKadaikodi();\n const { t: translate, locale, setLocale } = useI18n();\n const { mode, setMode } = useTheme();\n\n // Display-only identity, always sourced from the platform session.\n const identity = useMemo(() => {\n const firstName = currentUser?.firstName ?? currentUser?.name?.split(' ')[0] ?? '';\n const lastName =\n currentUser?.lastName ?? currentUser?.name?.split(' ').slice(1).join(' ') ?? '';\n const email = currentUser?.email ?? '';\n const fullName = [firstName, lastName].filter(Boolean).join(' ') || currentUser?.name || '—';\n return {\n firstName,\n lastName,\n fullName,\n email,\n phone: currentUser?.phone ?? '',\n avatar: currentUser?.avatar ?? currentUser?.profilePicture ?? '',\n initials:\n ((firstName[0] ?? '') + (lastName[0] ?? '')).toUpperCase() ||\n (email[0] ?? '?').toUpperCase(),\n };\n }, [currentUser]);\n\n const [activeTab, setActiveTab] = useState<TabId>('profile');\n const [settings, setSettings] = useState<UserSettings>(() => loadSettings(identity.email));\n const [hasChanges, setHasChanges] = useState(false);\n const [saveMessage, setSaveMessage] = useState('');\n const [saveIsError, setSaveIsError] = useState(false);\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 themeValue: ThemeRadio =\n mode === 'light' || mode === 'dark' || mode === 'system' ? mode : 'system';\n\n const localizedTabConfig = useMemo(\n () =>\n tabConfig.map((tab) => ({\n ...tab,\n label:\n tab.id === 'profile'\n ? t('kadaikodi.settings.tabs.profile', 'Profile')\n : tab.id === 'preferences'\n ? t('kadaikodi.settings.tabs.preferences', 'Preferences')\n : tab.id === 'security'\n ? t('kadaikodi.settings.tabs.security', 'Security')\n : tab.id === 'privacy'\n ? t('kadaikodi.settings.tabs.privacy', 'Privacy')\n : t('kadaikodi.settings.tabs.billing', 'Billing'),\n })),\n [t]\n );\n\n // Deep update helpers for device-local settings.\n const update = useCallback(\n <S extends keyof UserSettings, F extends keyof UserSettings[S]>(\n section: S,\n field: F,\n value: UserSettings[S][F]\n ) => {\n setSettings((prev) => ({\n ...prev,\n [section]: { ...prev[section], [field]: value },\n }));\n setHasChanges(true);\n setSaveMessage('');\n },\n []\n );\n\n const updateNested = useCallback(\n (section: keyof UserSettings, sub: string, field: string, value: boolean | string) => {\n setSettings((prev) => ({\n ...prev,\n [section]: {\n ...prev[section],\n [sub]: {\n ...((prev[section] as Record<string, unknown>)[sub] as Record<string, unknown>),\n [field]: value,\n },\n },\n }));\n setHasChanges(true);\n setSaveMessage('');\n },\n []\n );\n\n const resetSettings = useCallback(() => {\n setSettings({\n ...defaultSettings,\n billing: { ...defaultSettings.billing, invoiceEmail: identity.email },\n });\n setHasChanges(false);\n setSaveMessage('');\n setSaveIsError(false);\n }, [identity.email]);\n\n // Theme / language apply immediately via the shared providers (self-persist).\n const handleThemeChange = useCallback(\n (value: ThemeRadio) => {\n setMode(value);\n },\n [setMode]\n );\n\n const handleLanguageChange = useCallback(\n (value: Locale) => {\n setLocale(value);\n },\n [setLocale]\n );\n\n // Save persists ONLY the device-local preference subtree. Honest messaging.\n const saveSettings = useCallback(() => {\n try {\n localStorage.setItem(PREFS_STORAGE_KEY, JSON.stringify(settings));\n setHasChanges(false);\n setSaveIsError(false);\n setSaveMessage(t('kadaikodi.settings.saveSuccess', 'Preferences saved on this device.'));\n window.setTimeout(() => setSaveMessage(''), 3000);\n } catch {\n setSaveIsError(true);\n setSaveMessage(\n t(\n 'kadaikodi.settings.saveError',\n 'Could not save preferences on this device. Please check your browser storage settings.'\n )\n );\n }\n }, [settings, t]);\n\n const goToAccountSecurity = useCallback(() => {\n navigateTo('/auth/security');\n }, [navigateTo]);\n\n const handleDeleteAccount = useCallback(() => {\n if (\n window.confirm(\n t(\n 'kadaikodi.settings.deleteConfirm',\n 'Account deletion is handled by our support team. Do you want to email support@kadaikodi.com to request it? This cannot be undone once processed.'\n )\n )\n ) {\n const subject = encodeURIComponent('Account deletion request');\n const body = encodeURIComponent(\n `I would like to request deletion of my Kadaikodi account (${identity.email}).`\n );\n window.location.href = `mailto:support@kadaikodi.com?subject=${subject}&body=${body}`;\n }\n }, [t, identity.email]);\n\n // Small reusable \"managed elsewhere\" call-to-action.\n const AccountSecurityLink = ({ label }: { label: string }) => (\n <button\n type=\"button\"\n onClick={goToAccountSecurity}\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Shield className=\"h-4 w-4\" />\n {label}\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </button>\n );\n\n // ---- Profile Tab ----\n const renderProfile = () => (\n <div className=\"space-y-6\">\n <h3 className=\"text-base font-semibold text-text-primary\">Personal Information</h3>\n\n {/* Profile Picture (identity — platform managed) */}\n <div className=\"flex items-center gap-4\">\n <div className=\"relative\">\n {identity.avatar ? (\n <img\n src={identity.avatar}\n alt=\"Profile\"\n className=\"h-20 w-20 rounded-full object-cover border border-border-subtle\"\n />\n ) : (\n <div className=\"flex h-20 w-20 items-center justify-center rounded-full border border-border-subtle bg-bg-sunken text-lg font-semibold text-text-secondary\">\n {identity.initials}\n </div>\n )}\n <button\n type=\"button\"\n onClick={goToAccountSecurity}\n aria-label=\"Update profile photo in Account Security\"\n title=\"Update your photo in Account Security\"\n className=\"absolute -bottom-1 -right-1 flex h-7 w-7 items-center justify-center rounded-full bg-action-primary-bg text-action-primary-text shadow-sm hover:bg-action-primary-bg/90\"\n >\n <Camera className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Profile Picture</p>\n <p className=\"text-xs text-text-secondary\">Your photo is managed in Account Security.</p>\n </div>\n </div>\n\n {/* Identity (read-only, from session) */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 flex-1\">\n <div>\n <p className=\"text-xs text-text-secondary mb-0.5\">Full Name</p>\n <p className=\"text-sm font-medium text-text-primary\">{identity.fullName}</p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary mb-0.5\">Email Address</p>\n <p className=\"text-sm font-medium text-text-primary break-all\">\n {identity.email || '—'}\n </p>\n </div>\n <div>\n <p className=\"text-xs text-text-secondary mb-0.5\">Phone Number</p>\n <p className=\"text-sm font-medium text-text-primary\">{identity.phone || '—'}</p>\n </div>\n </div>\n <AccountSecurityLink label=\"Manage in Account Security\" />\n </div>\n <p className=\"text-xs text-text-secondary mt-3\">\n Your name, email and phone are part of your account identity and are managed centrally in\n Account Security.\n </p>\n </div>\n\n {/* Bio (device-local preference) */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Bio</label>\n <textarea\n rows={3}\n value={settings.profileExtra.bio}\n onChange={(e) => update('profileExtra', 'bio', e.target.value)}\n placeholder=\"Tell us about yourself...\"\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none\"\n />\n </div>\n\n {/* DOB & Gender (device-local preferences) */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Date of Birth\n </label>\n <input\n type=\"date\"\n value={settings.profileExtra.dateOfBirth}\n onChange={(e) => update('profileExtra', 'dateOfBirth', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Gender</label>\n <select\n value={settings.profileExtra.gender}\n onChange={(e) => update('profileExtra', 'gender', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"\">Select gender</option>\n <option value=\"male\">Male</option>\n <option value=\"female\">Female</option>\n <option value=\"other\">Other</option>\n <option value=\"prefer-not-to-say\">Prefer not to say</option>\n </select>\n </div>\n </div>\n </div>\n );\n\n // ---- Preferences Tab ----\n const renderPreferences = () => (\n <div className=\"space-y-6\">\n <h3 className=\"text-base font-semibold text-text-primary\">App Preferences</h3>\n\n {/* Language, Timezone, Currency */}\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n <span className=\"flex items-center gap-1.5\">\n <Globe className=\"h-4 w-4 text-text-secondary\" /> Language\n </span>\n </label>\n <select\n value={LANGUAGE_OPTIONS.some((o) => o.value === locale) ? locale : 'en'}\n onChange={(e) => handleLanguageChange(e.target.value as Locale)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n {LANGUAGE_OPTIONS.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n <p className=\"mt-1 text-xs text-text-secondary\">Applies instantly across the app.</p>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Timezone</label>\n <select\n value={settings.preferences.timezone}\n onChange={(e) => update('preferences', 'timezone', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"Asia/Kolkata\">India (IST)</option>\n <option value=\"Asia/Dubai\">Dubai (GST)</option>\n <option value=\"Europe/London\">London (GMT)</option>\n <option value=\"America/New_York\">New York (EST)</option>\n </select>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">Currency</label>\n <select\n value={settings.preferences.currency}\n onChange={(e) => update('preferences', 'currency', e.target.value)}\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"INR\">Indian Rupee (₹)</option>\n <option value=\"USD\">US Dollar ($)</option>\n <option value=\"EUR\">Euro (€)</option>\n <option value=\"GBP\">British Pound (£)</option>\n </select>\n </div>\n </div>\n\n {/* Theme — applies live via the shared theme provider */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-3\">Theme</label>\n <div className=\"flex gap-3 flex-wrap\">\n {(\n [\n { value: 'light', label: 'Light', Icon: Sun },\n { value: 'dark', label: 'Dark', Icon: Moon },\n { value: 'system', label: 'System', Icon: Monitor },\n ] as const\n ).map(({ value, label, Icon }) => (\n <label\n key={value}\n className={cn(\n 'flex items-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium cursor-pointer transition-colors',\n themeValue === value\n ? 'border-primary bg-action-primary-bg/10 text-text-primary'\n : 'border-border-subtle text-text-secondary hover:border-border-strong hover:text-text-primary'\n )}\n >\n <input\n type=\"radio\"\n name=\"theme\"\n value={value}\n checked={themeValue === value}\n onChange={(e) => handleThemeChange(e.target.value as ThemeRadio)}\n className=\"sr-only\"\n />\n <Icon className=\"h-4 w-4\" />\n {label}\n </label>\n ))}\n </div>\n <p className=\"mt-2 text-xs text-text-secondary\">\n Your theme applies immediately and is remembered on this device.\n </p>\n </div>\n\n {/* Notification Toggles (device-local) */}\n <div>\n <div className=\"flex items-center gap-2 mb-4\">\n <Bell className=\"h-4 w-4 text-text-secondary\" />\n <h4 className=\"text-sm font-semibold text-text-primary\">Notification Preferences</h4>\n </div>\n <div className=\"space-y-3\">\n {(\n [\n { key: 'email', label: 'Email notifications' },\n { key: 'sms', label: 'SMS notifications' },\n { key: 'push', label: 'Push notifications' },\n { key: 'orderUpdates', label: 'Order status updates' },\n { key: 'promotions', label: 'Promotional offers' },\n { key: 'newsletters', label: 'Newsletters and updates' },\n { key: 'security', label: 'Security alerts' },\n ] as const\n ).map((item) => (\n <div\n key={item.key}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle p-3\"\n >\n <span className=\"text-sm text-text-primary\">{item.label}</span>\n <ToggleSwitch\n checked={settings.preferences.notifications[item.key]}\n onChange={(val) => updateNested('preferences', 'notifications', item.key, val)}\n label={item.label}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n\n // ---- Security Tab (platform-owned; route out, no fake controls) ----\n const renderSecurity = () => (\n <div className=\"space-y-6\">\n <h3 className=\"text-base font-semibold text-text-primary\">Security Settings</h3>\n\n <div className=\"flex items-start gap-3 rounded-lg border border-status-warning-text/30 bg-status-warning-bg-subtle p-4\">\n <AlertTriangle className=\"h-5 w-5 text-status-warning-text shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n Account Security is managed centrally\n </p>\n <p className=\"text-xs text-text-secondary\">\n Your password, two-factor authentication, login alerts, active sessions and trusted\n devices are protected by the platform&apos;s Account Security. Manage them there to keep\n a single, secure source of truth for your account.\n </p>\n </div>\n </div>\n\n <div className=\"rounded-lg border border-border-subtle p-4 space-y-3\">\n {[\n { icon: Lock, label: 'Password', desc: 'Change your account password.' },\n {\n icon: Shield,\n label: 'Two-Factor Authentication',\n desc: 'Add an extra layer of security with 2FA.',\n },\n {\n icon: Monitor,\n label: 'Devices & Sessions',\n desc: 'Review active devices and sign out everywhere.',\n },\n ].map((row) => {\n const RowIcon = row.icon;\n return (\n <div key={row.label} className=\"flex items-start gap-3\">\n <RowIcon className=\"h-4 w-4 text-text-secondary shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{row.label}</p>\n <p className=\"text-xs text-text-secondary\">{row.desc}</p>\n </div>\n </div>\n );\n })}\n </div>\n\n <AccountSecurityLink label=\"Manage in Account Security\" />\n </div>\n );\n\n // ---- Privacy Tab ----\n const renderPrivacy = () => (\n <div className=\"space-y-6\">\n <h3 className=\"text-base font-semibold text-text-primary\">Privacy Controls</h3>\n\n {/* Profile Visibility */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n <span className=\"flex items-center gap-1.5\">\n <Eye className=\"h-4 w-4 text-text-secondary\" /> Profile Visibility\n </span>\n </label>\n <select\n value={settings.privacy.profileVisibility}\n onChange={(e) =>\n update(\n 'privacy',\n 'profileVisibility',\n e.target.value as 'public' | 'private' | 'friends'\n )\n }\n className=\"w-full max-w-sm rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n >\n <option value=\"public\">Public - Anyone can see your profile</option>\n <option value=\"private\">Private - Only you can see your profile</option>\n <option value=\"friends\">Friends - Only friends can see your profile</option>\n </select>\n </div>\n\n {/* Data Sharing */}\n <div>\n <h4 className=\"text-sm font-semibold text-text-primary mb-3\">Data Sharing</h4>\n <div className=\"space-y-3\">\n {(\n [\n { key: 'analytics', label: 'Share usage analytics to improve the app' },\n { key: 'marketing', label: 'Share data for personalized marketing' },\n { key: 'thirdParty', label: 'Share data with third-party partners' },\n ] as const\n ).map((item) => (\n <div\n key={item.key}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle p-3\"\n >\n <span className=\"text-sm text-text-primary\">{item.label}</span>\n <ToggleSwitch\n checked={settings.privacy.dataSharing[item.key]}\n onChange={(val) => updateNested('privacy', 'dataSharing', item.key, val)}\n label={item.label}\n />\n </div>\n ))}\n </div>\n </div>\n\n {/* Location & Activity */}\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Location Tracking</p>\n <p className=\"text-xs text-text-secondary\">\n Allow app to track your location for better service\n </p>\n </div>\n <ToggleSwitch\n checked={settings.privacy.locationTracking}\n onChange={(val) => update('privacy', 'locationTracking', val)}\n label=\"Location tracking\"\n />\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Activity History</p>\n <p className=\"text-xs text-text-secondary\">Keep track of your orders and activities</p>\n </div>\n <ToggleSwitch\n checked={settings.privacy.activityHistory}\n onChange={(val) => update('privacy', 'activityHistory', val)}\n label=\"Activity history\"\n />\n </div>\n </div>\n\n {/* Delete Account — routed to support, no fake success */}\n <div className=\"rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle p-4\">\n <div className=\"flex items-start gap-3\">\n <Trash2 className=\"h-5 w-5 text-status-error-text shrink-0 mt-0.5\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Delete Account</p>\n <p className=\"text-xs text-text-secondary mt-0.5\">\n Permanently delete your account and all associated data. This is handled by our\n support team and cannot be undone once processed.\n </p>\n <button\n type=\"button\"\n onClick={handleDeleteAccount}\n className=\"mt-3 rounded-lg border border-status-error-text/30 px-4 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg/10 transition-colors\"\n >\n Request Account Deletion\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n\n // ---- Billing Tab ----\n const renderBilling = () => (\n <div className=\"space-y-6\">\n <h3 className=\"text-base font-semibold text-text-primary\">Billing & Payments</h3>\n\n {/* Default Payment Method — platform billing, honestly disabled */}\n <div>\n <h4 className=\"text-sm font-semibold text-text-primary mb-3\">\n <span className=\"flex items-center gap-1.5\">\n <CreditCard className=\"h-4 w-4 text-text-secondary\" /> Default Payment Method\n </span>\n </h4>\n <div className=\"rounded-lg border border-border-subtle p-4 text-center\">\n <p className=\"text-sm text-text-secondary\">\n Saved payment methods aren&apos;t available yet.\n </p>\n <button\n type=\"button\"\n disabled\n aria-disabled=\"true\"\n title=\"Coming soon\"\n className=\"mt-2 cursor-not-allowed rounded-lg bg-bg-sunken px-4 py-2 text-sm font-medium text-text-secondary\"\n >\n Add Payment Method (coming soon)\n </button>\n </div>\n </div>\n\n {/* Auto Recharge — payment automation, honestly disabled */}\n <div>\n <h4 className=\"text-sm font-semibold text-text-primary mb-3\">Auto Recharge</h4>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <p className=\"text-sm font-medium text-text-primary\">Enable Auto Recharge</p>\n <p className=\"text-xs text-text-secondary\">\n Automatically add money when wallet balance is low — coming soon.\n </p>\n </div>\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={false}\n aria-disabled=\"true\"\n disabled\n title=\"Coming soon\"\n className=\"relative inline-flex h-6 w-11 items-center rounded-full bg-bg-sunken opacity-60 cursor-not-allowed shrink-0\"\n >\n <span className=\"inline-block h-4 w-4 translate-x-1 rounded-full bg-white\" />\n </button>\n </div>\n </div>\n\n {/* Invoice details — device-local (honest) */}\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n <span className=\"flex items-center gap-1.5\">\n <Receipt className=\"h-4 w-4 text-text-secondary\" /> Invoice Email\n </span>\n </label>\n <input\n type=\"email\"\n value={settings.billing.invoiceEmail}\n onChange={(e) => update('billing', 'invoiceEmail', e.target.value)}\n placeholder=\"billing@example.com\"\n className=\"w-full max-w-sm rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n\n {/* Tax Info — device-local (honest) */}\n <div>\n <h4 className=\"text-sm font-semibold text-text-primary mb-3\">\n <span className=\"flex items-center gap-1.5\">\n <Building2 className=\"h-4 w-4 text-text-secondary\" /> Tax Information\n </span>\n </h4>\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">GST Number</label>\n <input\n type=\"text\"\n value={settings.billing.gstNumber}\n onChange={(e) => update('billing', 'gstNumber', e.target.value)}\n placeholder=\"29ABCDE1234F1Z5\"\n className=\"w-full max-w-sm rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Company Name\n </label>\n <input\n type=\"text\"\n value={settings.billing.companyName}\n onChange={(e) => update('billing', 'companyName', e.target.value)}\n placeholder=\"Your Company Name\"\n className=\"w-full max-w-sm rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]\"\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n <span className=\"flex items-center gap-1.5\">\n <MapPin className=\"h-4 w-4 text-text-secondary\" /> Billing Address\n </span>\n </label>\n <textarea\n rows={3}\n value={settings.billing.billingAddress}\n onChange={(e) => update('billing', 'billingAddress', e.target.value)}\n placeholder=\"Enter your complete billing address\"\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface py-2 px-3 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] resize-none\"\n />\n </div>\n </div>\n <p className=\"mt-3 text-xs text-text-secondary\">\n Invoice and tax details are saved on this device for your convenience.\n </p>\n </div>\n </div>\n );\n\n // ---- Render function map ----\n const renderTab: Record<TabId, () => React.ReactNode> = {\n profile: renderProfile,\n preferences: renderPreferences,\n security: renderSecurity,\n privacy: renderPrivacy,\n billing: renderBilling,\n };\n\n return (\n <PageLayout\n title={t('kadaikodi.settings.title', 'Settings')}\n description={t(\n 'kadaikodi.settings.description',\n 'Manage your preferences and account settings'\n )}\n actions={\n <div className=\"flex items-center gap-2\">\n {hasChanges && (\n <button\n type=\"button\"\n onClick={resetSettings}\n className=\"flex items-center gap-1.5 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <RotateCcw className=\"h-4 w-4\" />\n {t('kadaikodi.settings.reset', 'Reset')}\n </button>\n )}\n <button\n type=\"button\"\n disabled={!hasChanges}\n onClick={saveSettings}\n className={cn(\n 'flex items-center gap-1.5 rounded-lg px-4 py-2 text-sm font-medium transition-colors',\n hasChanges\n ? 'bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90'\n : 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n )}\n >\n <Save className=\"h-4 w-4\" />\n {t('kadaikodi.settings.save', 'Save Settings')}\n </button>\n </div>\n }\n >\n {/* Save message */}\n {saveMessage && (\n <div\n className={cn(\n 'mb-6 flex items-center gap-2 rounded-lg border p-3 text-sm',\n saveIsError\n ? 'border-status-error-text/30 bg-status-error-bg-subtle text-status-error-text'\n : 'border-status-success-text/30 bg-status-success-bg-subtle text-status-success-text'\n )}\n >\n {saveIsError ? (\n <AlertTriangle className=\"h-4 w-4 shrink-0\" />\n ) : (\n <CheckCircle2 className=\"h-4 w-4 shrink-0\" />\n )}\n {saveMessage}\n </div>\n )}\n\n <PagePurpose className=\"mb-6\">\n {t(\n 'kadaikodi.settings.purpose',\n 'Your personal control center on Kadaikodi. Manage your profile, app preferences (language, theme, notifications), privacy choices, and billing details. Theme and language apply instantly; account identity and security are managed in Account Security.'\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"kadaikodi-settings\"\n className=\"mb-6\"\n steps={[\n {\n id: 'security',\n label: t('kadaikodi.settings.next.security', 'Secure your account'),\n description: t(\n 'kadaikodi.settings.next.securityDesc',\n 'Review password, 2FA and active devices in Account Security.'\n ),\n onClick: () => setActiveTab('security'),\n },\n {\n id: 'preferences',\n label: t('kadaikodi.settings.next.preferences', 'Set your preferences'),\n description: t(\n 'kadaikodi.settings.next.preferencesDesc',\n 'Choose language, theme and notification settings.'\n ),\n onClick: () => setActiveTab('preferences'),\n },\n {\n id: 'billing',\n label: t('kadaikodi.settings.next.billing', 'Review billing'),\n description: t(\n 'kadaikodi.settings.next.billingDesc',\n 'Keep your invoice and tax details up to date.'\n ),\n onClick: () => setActiveTab('billing'),\n },\n ]}\n />\n\n <div className=\"flex flex-col gap-6 lg:flex-row\">\n {/* Sidebar (Desktop) / Tab Row (Mobile) */}\n <div className=\"shrink-0 lg:w-56\">\n {/* Mobile grid */}\n <div className=\"grid grid-cols-5 gap-1 lg:hidden\">\n {localizedTabConfig.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex flex-col items-center gap-1 rounded-lg py-2.5 text-center transition-colors',\n activeTab === tab.id\n ? 'bg-action-primary-bg/10 text-text-primary'\n : 'text-text-secondary hover:text-text-primary hover:bg-accent'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n <span className=\"text-xs font-medium\">{tab.label}</span>\n </button>\n );\n })}\n </div>\n {/* Desktop sidebar */}\n <div className=\"hidden lg:block rounded-lg border border-border-subtle bg-bg-surface\">\n <div className=\"p-3 border-b border-border-subtle\">\n <p className=\"text-sm font-semibold text-text-primary\">\n {t('kadaikodi.settings.title', 'Settings')}\n </p>\n </div>\n <nav className=\"p-2\">\n {localizedTabConfig.map((tab) => {\n const TabIcon = tab.icon;\n return (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={cn(\n 'flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-sm font-medium transition-colors mb-0.5',\n activeTab === tab.id\n ? 'bg-action-primary-bg/10 text-text-primary'\n : 'text-text-secondary hover:text-text-primary hover:bg-accent'\n )}\n >\n <TabIcon className=\"h-4 w-4\" />\n {tab.label}\n </button>\n );\n })}\n </nav>\n </div>\n </div>\n\n {/* Content — the one emphasis zone for this page */}\n <EmphasisPanel className=\"flex-1 p-6\">{renderTab[activeTab]()}</EmphasisPanel>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CartDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/kadaikodi/pages/customer/CartDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAoEH,wBAAgB,cAAc,gCA0zB7B"}
1
+ {"version":3,"file":"CartDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/kadaikodi/pages/customer/CartDetailPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAoEH,wBAAgB,cAAc,gCA4zB7B"}
@@ -623,14 +623,14 @@ function O() {
623
623
  })
624
624
  ]
625
625
  }),
626
- F.serviceTypes?.includes("appointment") && /* @__PURE__ */ E("div", {
626
+ F.serviceTypes?.includes("scheduled_stop") && /* @__PURE__ */ E("div", {
627
627
  className: "rounded-lg border border-border-focus/30 bg-[var(--color-accent-soft)] p-4",
628
628
  children: [/* @__PURE__ */ E("h3", {
629
629
  className: "text-sm font-semibold text-text-primary flex items-center gap-2 mb-2",
630
- children: [/* @__PURE__ */ T(ce, { className: "h-4 w-4 text-text-primary" }), "Appointments Available"]
630
+ children: [/* @__PURE__ */ T(ce, { className: "h-4 w-4 text-text-primary" }), "Scheduled Stops"]
631
631
  }), /* @__PURE__ */ T("p", {
632
632
  className: "text-xs text-text-secondary",
633
- children: "This service provider accepts appointments. Contact them to schedule."
633
+ children: "This cart runs scheduled stops. Contact them for the current route and timings."
634
634
  })]
635
635
  }),
636
636
  I && /* @__PURE__ */ E("div", {