@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":"MerchantOnboardingPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/MerchantOnboardingPage.tsx"],"sourcesContent":["/**\n * MerchantOnboardingPage — guided first-time merchant setup.\n *\n * A real StepProgress wizard that creates a live ServiceProvider (via\n * kadaikodiCreateServiceProvider) across Business details → Location & hours →\n * Fulfilment → Review & submit. Verification is honest: submitting creates the\n * provider (status DRAFT/ACTIVE) for admin review — no fabricated KYC upload.\n */\nimport { useMemo, useState } from 'react';\nimport {\n Store,\n MapPin,\n Truck,\n CheckCircle2,\n ShieldCheck,\n ArrowRight,\n ArrowLeft,\n} from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useProviders, useCreateProvider } from '../../hooks/useKadaikodiApi';\nimport { StepProgress } from '../../components/viz';\n\nconst CATEGORIES = [\n ['FOOD_BEVERAGE', 'Food & Beverage'],\n ['GROCERY_ESSENTIALS', 'Grocery & Essentials'],\n ['CLOTHING_FASHION', 'Clothing & Fashion'],\n ['RETAIL_MERCHANDISE', 'Retail & Merchandise'],\n ['PERSONAL_CARE_BEAUTY', 'Personal Care & Beauty'],\n ['REPAIR_MAINTENANCE', 'Repair & Maintenance'],\n ['HOME_SERVICES', 'Home Services'],\n ['HEALTH_WELLNESS', 'Health & Wellness'],\n ['EDUCATION_SKILLS', 'Education & Skills'],\n] as const;\n\nconst FULFILMENTS = [\n ['PICKUP', 'Pickup'],\n ['DELIVERY', 'Delivery'],\n ['CART_DISPATCH', 'Cart dispatch'],\n ['ON_LOCATION', 'On-location'],\n ['HOME_SERVICE', 'Home service'],\n] as const;\n\nconst STEPS = [\n { label: 'Business details' },\n { label: 'Location & hours' },\n { label: 'Fulfilment' },\n { label: 'Review & submit' },\n];\n\nconst slugify = (s: string) =>\n s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 40) +\n '-' +\n Math.random().toString(36).slice(2, 7);\n\nexport function MerchantOnboardingPage() {\n const { navigateTo, currentUser } = useKadaikodi();\n const { data: providers = [] } = useProviders();\n const createProvider = useCreateProvider();\n const alreadyHasProvider = useMemo(\n () => providers.some((p) => p.ownerId === currentUser?.id),\n [providers, currentUser?.id]\n );\n\n const [step, setStep] = useState(0);\n const [done, setDone] = useState(false);\n const [error, setError] = useState('');\n const [form, setForm] = useState({\n name: '',\n category: 'FOOD_BEVERAGE' as (typeof CATEGORIES)[number][0],\n description: '',\n address: '',\n open: '08:00',\n close: '22:00',\n fulfilments: ['PICKUP', 'DELIVERY'] as string[],\n });\n const set = <K extends keyof typeof form>(k: K, v: (typeof form)[K]) =>\n setForm((f) => ({ ...f, [k]: v }));\n const inputCls =\n 'w-full rounded-lg border border-border-subtle bg-bg-canvas px-3 py-2 text-sm text-text-primary outline-none focus:border-border-strong';\n\n const canNext =\n step === 0 ? form.name.trim().length > 1 : step === 1 ? form.address.trim().length > 3 : true;\n\n const submit = () => {\n setError('');\n createProvider.mutate(\n {\n ownerId: currentUser?.id,\n name: form.name.trim(),\n slug: slugify(form.name),\n description: form.description.trim() || undefined,\n category: form.category,\n offeringType: 'both',\n serviceTypes: [],\n location: { address: form.address.trim() },\n businessHours: { open: form.open, close: form.close },\n },\n {\n onSuccess: () => setDone(true),\n onError: (e) => setError(e instanceof Error ? e.message : 'Could not create your cart.'),\n }\n );\n };\n\n if (done) {\n return (\n <PageLayout title=\"You're all set\" description=\"Your cart has been submitted\">\n <div className=\"mx-auto max-w-xl\">\n <GlassCard treatment=\"glass\" className=\"p-8 text-center\">\n <div className=\"mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-status-success-bg-subtle\">\n <CheckCircle2 className=\"h-7 w-7 text-status-success-text\" />\n </div>\n <h3 className=\"text-lg font-semibold text-text-primary\">Submitted for verification</h3>\n <p className=\"mx-auto mt-2 max-w-md text-sm text-text-secondary\">\n “{form.name}” has been created and sent for admin review. You can add offerings, set\n detailed hours and open your service from the dashboard now.\n </p>\n <div className=\"mt-6 flex flex-col justify-center gap-3 sm:flex-row\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/inventory')}\n className=\"rounded-lg border border-border-default bg-bg-surface px-5 py-2.5 text-sm font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n Add offerings\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/dashboard')}\n className=\"rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover\"\n >\n Go to Dashboard\n </button>\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Set up your cart\"\n description=\"Get your business live and discoverable on the marketplace\"\n >\n <div className=\"mx-auto max-w-2xl space-y-6\">\n {alreadyHasProvider && (\n <div className=\"flex items-center gap-2 rounded-lg border border-status-info-text/30 bg-status-info-bg-subtle p-3 text-sm text-text-secondary\">\n <ShieldCheck className=\"h-4 w-4 text-status-info-text\" />\n You already have a cart — this creates an additional one.\n </div>\n )}\n\n <StepProgress steps={STEPS} current={step} />\n\n <GlassCard treatment=\"plain\" className=\"p-6\">\n {step === 0 && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <Store className=\"h-5 w-5 text-accent-primary\" />{' '}\n <h3 className=\"font-semibold\">Business details</h3>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Business name\n </label>\n <input\n className={inputCls}\n value={form.name}\n onChange={(e) => set('name', e.target.value)}\n placeholder=\"Anna Nagar Tiffin Cart\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Category\n </label>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {CATEGORIES.map(([val, label]) => (\n <button\n key={val}\n type=\"button\"\n onClick={() => set('category', val)}\n className={\n 'rounded-lg border px-3 py-2 text-xs font-medium transition ' +\n (form.category === val\n ? 'border-accent-primary bg-accent-primary/10 text-accent-primary'\n : 'border-border-subtle bg-bg-canvas text-text-secondary hover:bg-bg-sunken')\n }\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Description\n </label>\n <textarea\n className={inputCls}\n rows={3}\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"What you sell and what makes you special.\"\n />\n </div>\n </div>\n )}\n\n {step === 1 && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <MapPin className=\"h-5 w-5 text-accent-primary\" />{' '}\n <h3 className=\"font-semibold\">Location & hours</h3>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Address\n </label>\n <input\n className={inputCls}\n value={form.address}\n onChange={(e) => set('address', e.target.value)}\n placeholder=\"24 North Usman Rd, Anna Nagar, Chennai\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Opens\n </label>\n <input\n type=\"time\"\n className={inputCls}\n value={form.open}\n onChange={(e) => set('open', e.target.value)}\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Closes\n </label>\n <input\n type=\"time\"\n className={inputCls}\n value={form.close}\n onChange={(e) => set('close', e.target.value)}\n />\n </div>\n </div>\n <p className=\"text-xs text-text-muted\">\n You can set detailed per-day hours later in Service Config.\n </p>\n </div>\n )}\n\n {step === 2 && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <Truck className=\"h-5 w-5 text-accent-primary\" />{' '}\n <h3 className=\"font-semibold\">Fulfilment modes</h3>\n </div>\n <p className=\"text-sm text-text-secondary\">\n How will customers receive their orders?\n </p>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {FULFILMENTS.map(([val, label]) => {\n const on = form.fulfilments.includes(val);\n return (\n <button\n key={val}\n type=\"button\"\n onClick={() =>\n set(\n 'fulfilments',\n on\n ? form.fulfilments.filter((x) => x !== val)\n : [...form.fulfilments, val]\n )\n }\n className={\n 'rounded-lg border px-3 py-2 text-sm font-medium transition ' +\n (on\n ? 'border-accent-primary bg-accent-primary/10 text-accent-primary'\n : 'border-border-subtle bg-bg-canvas text-text-secondary hover:bg-bg-sunken')\n }\n >\n {label}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {step === 3 && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <ShieldCheck className=\"h-5 w-5 text-accent-primary\" />{' '}\n <h3 className=\"font-semibold\">Review & submit</h3>\n </div>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between border-b border-border-subtle py-2\">\n <dt className=\"text-text-secondary\">Business</dt>\n <dd className=\"font-medium text-text-primary\">{form.name || '—'}</dd>\n </div>\n <div className=\"flex justify-between border-b border-border-subtle py-2\">\n <dt className=\"text-text-secondary\">Category</dt>\n <dd className=\"font-medium text-text-primary\">\n {CATEGORIES.find((c) => c[0] === form.category)?.[1]}\n </dd>\n </div>\n <div className=\"flex justify-between border-b border-border-subtle py-2\">\n <dt className=\"text-text-secondary\">Address</dt>\n <dd className=\"max-w-[60%] text-right font-medium text-text-primary\">\n {form.address || '—'}\n </dd>\n </div>\n <div className=\"flex justify-between border-b border-border-subtle py-2\">\n <dt className=\"text-text-secondary\">Hours</dt>\n <dd className=\"font-medium text-text-primary\">\n {form.open}–{form.close}\n </dd>\n </div>\n <div className=\"flex justify-between py-2\">\n <dt className=\"text-text-secondary\">Fulfilment</dt>\n <dd className=\"max-w-[60%] text-right font-medium text-text-primary\">\n {form.fulfilments\n .map((f) => FULFILMENTS.find((x) => x[0] === f)?.[1])\n .join(', ') || '—'}\n </dd>\n </div>\n </dl>\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/50 p-3 text-xs text-text-secondary\">\n On submit, your cart is created and sent to platform admins for verification.\n Verification documents (GST, licences) can be added from your profile once that step\n is enabled.\n </div>\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n )}\n\n {/* Wizard controls */}\n <div className=\"mt-6 flex items-center justify-between border-t border-border-subtle pt-4\">\n <button\n type=\"button\"\n onClick={() =>\n step === 0 ? navigateTo('/cart-owner/dashboard') : setStep((s) => s - 1)\n }\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-default bg-bg-surface px-4 py-2 text-sm font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> {step === 0 ? 'Cancel' : 'Back'}\n </button>\n {step < STEPS.length - 1 ? (\n <button\n type=\"button\"\n disabled={!canNext}\n onClick={() => setStep((s) => s + 1)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-5 py-2 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover disabled:opacity-50\"\n >\n Continue <ArrowRight className=\"h-4 w-4\" />\n </button>\n ) : (\n <button\n type=\"button\"\n disabled={createProvider.isPending}\n onClick={submit}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-5 py-2 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover disabled:opacity-60\"\n >\n <ShieldCheck className=\"h-4 w-4\" />{' '}\n {createProvider.isPending ? 'Submitting…' : 'Submit for Verification'}\n </button>\n )}\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MerchantOnboardingPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/cart-owner/MerchantOnboardingPage.tsx"],"sourcesContent":["/**\n * MerchantOnboardingPage — guided first-time merchant setup.\n *\n * A real StepProgress wizard that creates a live ServiceProvider (via\n * kadaikodiCreateServiceProvider) across Business details → Location & hours →\n * Fulfilment → Review & submit, alongside a live storefront preview of what the\n * merchant is about to create.\n *\n * The fulfilment picker writes to the provider's `serviceTypes`, using the same\n * vocabulary CartServiceConfigPage reads and writes — previously the selection\n * was collected and then dropped on submit, so the control did nothing.\n *\n * Verification is honest: submitting creates the provider for admin review and\n * the confirmation reports the provider's real returned status. There is no\n * document upload because the service stores no verification documents.\n */\nimport { useMemo, useState } from 'react';\nimport {\n Store,\n MapPin,\n Truck,\n Clock,\n Image as ImageIcon,\n CheckCircle2,\n ShieldCheck,\n ArrowRight,\n ArrowLeft,\n} from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useProviders, useCreateProvider } from '../../hooks/useKadaikodiApi';\nimport { StepProgress } from '../../components/viz';\n\nconst CATEGORIES = [\n ['FOOD_BEVERAGE', 'Food & Beverage'],\n ['GROCERY_ESSENTIALS', 'Grocery & Essentials'],\n ['CLOTHING_FASHION', 'Clothing & Fashion'],\n ['RETAIL_MERCHANDISE', 'Retail & Merchandise'],\n ['PERSONAL_CARE_BEAUTY', 'Personal Care & Beauty'],\n ['REPAIR_MAINTENANCE', 'Repair & Maintenance'],\n ['HOME_SERVICES', 'Home Services'],\n ['HEALTH_WELLNESS', 'Health & Wellness'],\n ['EDUCATION_SKILLS', 'Education & Skills'],\n] as const;\n\n/**\n * Fulfilment modes, keyed by the exact `serviceTypes` strings the rest of the\n * product uses (CartServiceConfigPage writes and the customer cards read these).\n * Adding a mode here that Service Config does not know would silently drop it on\n * the merchant's next save, so the two lists are kept in step.\n */\nconst FULFILMENTS = [\n ['pickup', 'Pickup'],\n ['delivery', 'Delivery'],\n ['scheduled_stop', 'Scheduled stop'],\n ['direct_service', 'Direct service'],\n] as const;\n\nconst STEPS = [\n { label: 'Business details' },\n { label: 'Location & hours' },\n { label: 'Fulfilment' },\n { label: 'Review & submit' },\n];\n\nconst slugify = (s: string) =>\n s\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '')\n .slice(0, 40) +\n '-' +\n Math.random().toString(36).slice(2, 7);\n\nexport function MerchantOnboardingPage() {\n const { navigateTo, currentUser } = useKadaikodi();\n const { data: providers = [] } = useProviders();\n const createProvider = useCreateProvider();\n const alreadyHasProvider = useMemo(\n () => providers.some((p) => p.ownerId === currentUser?.id),\n [providers, currentUser?.id]\n );\n\n const [step, setStep] = useState(0);\n const [done, setDone] = useState(false);\n const [createdStatus, setCreatedStatus] = useState<string | null>(null);\n const [error, setError] = useState('');\n const [form, setForm] = useState({\n name: '',\n category: 'FOOD_BEVERAGE' as (typeof CATEGORIES)[number][0],\n description: '',\n address: '',\n open: '08:00',\n close: '22:00',\n fulfilments: ['pickup', 'delivery'] as string[],\n });\n const set = <K extends keyof typeof form>(k: K, v: (typeof form)[K]) =>\n setForm((f) => ({ ...f, [k]: v }));\n const inputCls =\n 'w-full rounded-lg border border-border-subtle bg-bg-canvas px-3 py-2 text-sm text-text-primary outline-none focus:border-border-strong';\n\n const canNext =\n step === 0 ? form.name.trim().length > 1 : step === 1 ? form.address.trim().length > 3 : true;\n\n const submit = () => {\n setError('');\n createProvider.mutate(\n {\n ownerId: currentUser?.id,\n name: form.name.trim(),\n slug: slugify(form.name),\n description: form.description.trim() || undefined,\n category: form.category,\n offeringType: 'both',\n // The chosen fulfilment modes are what `serviceTypes` means everywhere\n // else in the product — persist them instead of discarding the picker.\n serviceTypes: form.fulfilments,\n location: { address: form.address.trim() },\n businessHours: { open: form.open, close: form.close },\n },\n {\n onSuccess: (provider) => {\n setCreatedStatus(provider.status);\n setDone(true);\n },\n onError: (e) => setError(e instanceof Error ? e.message : 'Could not create your cart.'),\n }\n );\n };\n\n const categoryLabel = CATEGORIES.find((c) => c[0] === form.category)?.[1] ?? '';\n const fulfilmentLabels = form.fulfilments.flatMap((f) => {\n const label = FULFILMENTS.find((x) => x[0] === f)?.[1];\n return label ? [label] : [];\n });\n\n /**\n * Live storefront preview — a rendering of what the merchant has typed so far,\n * not a lookup. Nothing here is invented: every value is form state.\n *\n * Held as an element rather than a nested component so it re-renders with the\n * form instead of remounting on every keystroke.\n */\n const storefrontPreview = (\n <GlassCard treatment=\"plain\" className=\"p-5\">\n <p className=\"mb-3 text-xs font-medium uppercase tracking-wide text-text-muted\">\n Storefront preview\n </p>\n <div className=\"mb-4 flex h-28 items-center justify-center rounded-lg border border-border-subtle bg-bg-sunken text-text-muted\">\n <ImageIcon className=\"h-8 w-8\" />\n </div>\n <h4 className=\"text-base font-semibold text-text-primary\">\n {form.name.trim() || 'Your cart name'}\n </h4>\n <p className=\"mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-text-secondary\">\n <span className=\"inline-flex items-center gap-1\">\n <Store className=\"h-3 w-3\" />\n {categoryLabel}\n </span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"inline-flex items-center gap-1\">\n <Clock className=\"h-3 w-3\" />\n {form.open}–{form.close}\n </span>\n </p>\n {form.address.trim() && (\n <p className=\"mt-1 flex items-start gap-1 text-xs text-text-secondary\">\n <MapPin className=\"mt-0.5 h-3 w-3 shrink-0\" />\n {form.address.trim()}\n </p>\n )}\n {form.description.trim() && (\n <p className=\"mt-2 text-xs text-text-secondary\">{form.description.trim()}</p>\n )}\n {fulfilmentLabels.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1.5\">\n {fulfilmentLabels.map((label) => (\n <span\n key={label}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-[11px] text-text-secondary\"\n >\n {label}\n </span>\n ))}\n </div>\n )}\n <p className=\"mt-4 border-t border-border-subtle pt-3 text-xs text-text-muted\">\n This is how your cart will read to customers once an admin verifies it.\n </p>\n </GlassCard>\n );\n\n if (done) {\n return (\n <PageLayout title=\"You're all set\" description=\"Your cart has been submitted\">\n <div className=\"mx-auto max-w-xl\">\n <GlassCard treatment=\"glass\" className=\"p-8 text-center\">\n <div className=\"mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-status-success-bg-subtle\">\n <CheckCircle2 className=\"h-7 w-7 text-status-success-text\" />\n </div>\n <h3 className=\"text-lg font-semibold text-text-primary\">Submitted for verification</h3>\n <p className=\"mx-auto mt-2 max-w-md text-sm text-text-secondary\">\n “{form.name}” has been created and sent for admin review. You can add offerings, set\n detailed hours and open your service from the dashboard now.\n </p>\n {createdStatus && (\n <p className=\"mt-3 inline-flex items-center gap-1.5 rounded-full bg-status-warning-bg-subtle px-3 py-1 text-xs font-medium text-status-warning-text\">\n <ShieldCheck className=\"h-3.5 w-3.5\" />\n Verification status: {createdStatus.toLowerCase()}\n </p>\n )}\n <div className=\"mt-6 flex flex-col justify-center gap-3 sm:flex-row\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/inventory')}\n className=\"rounded-lg border border-border-default bg-bg-surface px-5 py-2.5 text-sm font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n Add offerings\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/cart-owner/dashboard')}\n className=\"rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover\"\n >\n Go to Dashboard\n </button>\n </div>\n </GlassCard>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout\n title=\"Set up your cart\"\n description=\"Get your business live and discoverable on the marketplace\"\n >\n <div className=\"mx-auto max-w-4xl space-y-6\">\n {alreadyHasProvider && (\n <div className=\"flex items-center gap-2 rounded-lg border border-status-info-text/30 bg-status-info-bg-subtle p-3 text-sm text-text-secondary\">\n <ShieldCheck className=\"h-4 w-4 text-status-info-text\" />\n You already have a cart — this creates an additional one.\n </div>\n )}\n\n <StepProgress steps={STEPS} current={step} />\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]\">\n <GlassCard treatment=\"plain\" className=\"p-6\">\n {step === 0 && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <Store className=\"h-5 w-5 text-accent-primary\" />{' '}\n <h3 className=\"font-semibold\">Business details</h3>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Business name\n </label>\n <input\n className={inputCls}\n value={form.name}\n onChange={(e) => set('name', e.target.value)}\n placeholder=\"Anna Nagar Tiffin Cart\"\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Category\n </label>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {CATEGORIES.map(([val, label]) => (\n <button\n key={val}\n type=\"button\"\n onClick={() => set('category', val)}\n className={\n 'rounded-lg border px-3 py-2 text-xs font-medium transition ' +\n (form.category === val\n ? 'border-accent-primary bg-accent-primary/10 text-accent-primary'\n : 'border-border-subtle bg-bg-canvas text-text-secondary hover:bg-bg-sunken')\n }\n >\n {label}\n </button>\n ))}\n </div>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Description\n </label>\n <textarea\n className={inputCls}\n rows={3}\n value={form.description}\n onChange={(e) => set('description', e.target.value)}\n placeholder=\"What you sell and what makes you special.\"\n />\n </div>\n </div>\n )}\n\n {step === 1 && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <MapPin className=\"h-5 w-5 text-accent-primary\" />{' '}\n <h3 className=\"font-semibold\">Location & hours</h3>\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Address\n </label>\n <input\n className={inputCls}\n value={form.address}\n onChange={(e) => set('address', e.target.value)}\n placeholder=\"24 North Usman Rd, Anna Nagar, Chennai\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Opens\n </label>\n <input\n type=\"time\"\n className={inputCls}\n value={form.open}\n onChange={(e) => set('open', e.target.value)}\n />\n </div>\n <div>\n <label className=\"mb-1 block text-sm font-medium text-text-secondary\">\n Closes\n </label>\n <input\n type=\"time\"\n className={inputCls}\n value={form.close}\n onChange={(e) => set('close', e.target.value)}\n />\n </div>\n </div>\n <p className=\"text-xs text-text-muted\">\n You can set detailed per-day hours later in Service Config.\n </p>\n </div>\n )}\n\n {step === 2 && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <Truck className=\"h-5 w-5 text-accent-primary\" />{' '}\n <h3 className=\"font-semibold\">Fulfilment modes</h3>\n </div>\n <p className=\"text-sm text-text-secondary\">\n How will customers receive their orders?\n </p>\n <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-3\">\n {FULFILMENTS.map(([val, label]) => {\n const on = form.fulfilments.includes(val);\n return (\n <button\n key={val}\n type=\"button\"\n onClick={() =>\n set(\n 'fulfilments',\n on\n ? form.fulfilments.filter((x) => x !== val)\n : [...form.fulfilments, val]\n )\n }\n className={\n 'rounded-lg border px-3 py-2 text-sm font-medium transition ' +\n (on\n ? 'border-accent-primary bg-accent-primary/10 text-accent-primary'\n : 'border-border-subtle bg-bg-canvas text-text-secondary hover:bg-bg-sunken')\n }\n >\n {label}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {step === 3 && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-2 text-text-primary\">\n <ShieldCheck className=\"h-5 w-5 text-accent-primary\" />{' '}\n <h3 className=\"font-semibold\">Review & submit</h3>\n </div>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between border-b border-border-subtle py-2\">\n <dt className=\"text-text-secondary\">Business</dt>\n <dd className=\"font-medium text-text-primary\">{form.name || '—'}</dd>\n </div>\n <div className=\"flex justify-between border-b border-border-subtle py-2\">\n <dt className=\"text-text-secondary\">Category</dt>\n <dd className=\"font-medium text-text-primary\">\n {CATEGORIES.find((c) => c[0] === form.category)?.[1]}\n </dd>\n </div>\n <div className=\"flex justify-between border-b border-border-subtle py-2\">\n <dt className=\"text-text-secondary\">Address</dt>\n <dd className=\"max-w-[60%] text-right font-medium text-text-primary\">\n {form.address || '—'}\n </dd>\n </div>\n <div className=\"flex justify-between border-b border-border-subtle py-2\">\n <dt className=\"text-text-secondary\">Hours</dt>\n <dd className=\"font-medium text-text-primary\">\n {form.open}–{form.close}\n </dd>\n </div>\n <div className=\"flex justify-between py-2\">\n <dt className=\"text-text-secondary\">Fulfilment</dt>\n <dd className=\"max-w-[60%] text-right font-medium text-text-primary\">\n {form.fulfilments\n .map((f) => FULFILMENTS.find((x) => x[0] === f)?.[1])\n .join(', ') || '—'}\n </dd>\n </div>\n </dl>\n <div className=\"rounded-lg border border-border-subtle bg-bg-sunken/50 p-3 text-xs text-text-secondary\">\n On submit, your cart is created and sent to platform admins for verification.\n Verification documents (GST, licences) can be added from your profile once that\n step is enabled.\n </div>\n {error && <p className=\"text-sm text-status-error-text\">{error}</p>}\n </div>\n )}\n\n {/* Wizard controls */}\n <div className=\"mt-6 flex items-center justify-between border-t border-border-subtle pt-4\">\n <button\n type=\"button\"\n onClick={() =>\n step === 0 ? navigateTo('/cart-owner/dashboard') : setStep((s) => s - 1)\n }\n className=\"inline-flex items-center gap-1.5 rounded-lg border border-border-default bg-bg-surface px-4 py-2 text-sm font-medium text-text-secondary hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> {step === 0 ? 'Cancel' : 'Back'}\n </button>\n {step < STEPS.length - 1 ? (\n <button\n type=\"button\"\n disabled={!canNext}\n onClick={() => setStep((s) => s + 1)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-5 py-2 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover disabled:opacity-50\"\n >\n Continue <ArrowRight className=\"h-4 w-4\" />\n </button>\n ) : (\n <button\n type=\"button\"\n disabled={createProvider.isPending}\n onClick={submit}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-5 py-2 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover disabled:opacity-60\"\n >\n <ShieldCheck className=\"h-4 w-4\" />{' '}\n {createProvider.isPending ? 'Submitting…' : 'Submit for Verification'}\n </button>\n )}\n </div>\n </GlassCard>\n\n {storefrontPreview}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -3,8 +3,13 @@
3
3
  *
4
4
  * Team overview and roster for the signed-in owner's own service provider (cart).
5
5
  * Lists the provider's real workers (useProviderWorkers) with role/status filters
6
- * and search, and invites new workers (useCreateProviderWorker). No fabricated
7
- * staff, performance metrics, or earnings.
6
+ * and search, invites new workers (useCreateProviderWorker) and edits a worker's
7
+ * stored contact details (useUpdateProviderWorker).
8
+ *
9
+ * Per-worker task load comes from the real `ProviderWorker.tasks` resolver — no
10
+ * fabricated performance metrics or earnings. Role, employment status and worker
11
+ * removal are deliberately absent: `kadaikodiUpdateProviderWorker` accepts only
12
+ * `metadata`, and the service exposes no delete mutation for a worker.
8
13
  *
9
14
  * @module kadaikodi/pages/cart-owner
10
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"StaffManagementPage.d.ts","sourceRoot":"","sources":["../../../../src/kadaikodi/pages/cart-owner/StaffManagementPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmGH,eAAO,MAAM,mBAAmB,mCA2b/B,CAAC"}
1
+ {"version":3,"file":"StaffManagementPage.d.ts","sourceRoot":"","sources":["../../../../src/kadaikodi/pages/cart-owner/StaffManagementPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAuJH,eAAO,MAAM,mBAAmB,mCA6kB/B,CAAC"}