@burdenoff/microfe-kadaikodi 2026.704.3 → 2026.704.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/dist/kadaikodi/KadaikodiRoutes.js +34 -26
  2. package/dist/kadaikodi/KadaikodiRoutes.js.map +1 -1
  3. package/dist/kadaikodi/components/viz/AllocationBar.js +68 -0
  4. package/dist/kadaikodi/components/viz/AllocationBar.js.map +1 -0
  5. package/dist/kadaikodi/components/viz/AreaChart.js +102 -0
  6. package/dist/kadaikodi/components/viz/AreaChart.js.map +1 -0
  7. package/dist/kadaikodi/components/viz/AvatarStack.js +36 -0
  8. package/dist/kadaikodi/components/viz/AvatarStack.js.map +1 -0
  9. package/dist/kadaikodi/components/viz/BarChart.js +83 -0
  10. package/dist/kadaikodi/components/viz/BarChart.js.map +1 -0
  11. package/dist/kadaikodi/components/viz/CertificateCard.js +4 -0
  12. package/dist/kadaikodi/components/viz/DonutChart.js +109 -0
  13. package/dist/kadaikodi/components/viz/DonutChart.js.map +1 -0
  14. package/dist/kadaikodi/components/viz/HBarFunnel.js +54 -0
  15. package/dist/kadaikodi/components/viz/HBarFunnel.js.map +1 -0
  16. package/dist/kadaikodi/components/viz/Heatmap.js +3 -0
  17. package/dist/kadaikodi/components/viz/KanbanBoard.js +50 -0
  18. package/dist/kadaikodi/components/viz/KanbanBoard.js.map +1 -0
  19. package/dist/kadaikodi/components/viz/LineChart.js +4 -0
  20. package/dist/kadaikodi/components/viz/OrgTree.js +2 -0
  21. package/dist/kadaikodi/components/viz/PathSteps.js +3 -0
  22. package/dist/kadaikodi/components/viz/ProgressRing.js +68 -0
  23. package/dist/kadaikodi/components/viz/ProgressRing.js.map +1 -0
  24. package/dist/kadaikodi/components/viz/RatingStars.js +51 -0
  25. package/dist/kadaikodi/components/viz/RatingStars.js.map +1 -0
  26. package/dist/kadaikodi/components/viz/SegmentedTabs.js +69 -0
  27. package/dist/kadaikodi/components/viz/SegmentedTabs.js.map +1 -0
  28. package/dist/kadaikodi/components/viz/SkillBar.js +3 -0
  29. package/dist/kadaikodi/components/viz/Sparkline.js +74 -0
  30. package/dist/kadaikodi/components/viz/Sparkline.js.map +1 -0
  31. package/dist/kadaikodi/components/viz/StatCard.js +60 -0
  32. package/dist/kadaikodi/components/viz/StatCard.js.map +1 -0
  33. package/dist/kadaikodi/components/viz/StepProgress.js +64 -0
  34. package/dist/kadaikodi/components/viz/StepProgress.js.map +1 -0
  35. package/dist/kadaikodi/components/viz/Timeline.js +66 -0
  36. package/dist/kadaikodi/components/viz/Timeline.js.map +1 -0
  37. package/dist/kadaikodi/components/viz/index.js +23 -0
  38. package/dist/kadaikodi/components/viz/lib/Avatar.js +30 -0
  39. package/dist/kadaikodi/components/viz/lib/Avatar.js.map +1 -0
  40. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js +119 -0
  41. package/dist/kadaikodi/components/viz/lib/CartesianFrame.js.map +1 -0
  42. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js +35 -0
  43. package/dist/kadaikodi/components/viz/lib/ResponsiveSvg.js.map +1 -0
  44. package/dist/kadaikodi/components/viz/lib/format.js +21 -0
  45. package/dist/kadaikodi/components/viz/lib/format.js.map +1 -0
  46. package/dist/kadaikodi/components/viz/lib/geometry.js +61 -0
  47. package/dist/kadaikodi/components/viz/lib/geometry.js.map +1 -0
  48. package/dist/kadaikodi/components/viz/lib/hooks.js +39 -0
  49. package/dist/kadaikodi/components/viz/lib/hooks.js.map +1 -0
  50. package/dist/kadaikodi/components/viz/lib/palette.js +27 -0
  51. package/dist/kadaikodi/components/viz/lib/palette.js.map +1 -0
  52. package/dist/kadaikodi/hooks/useKadaikodiApi.js +84 -6
  53. package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
  54. package/dist/kadaikodi/pages/HomePage.js +373 -631
  55. package/dist/kadaikodi/pages/HomePage.js.map +1 -1
  56. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js +304 -169
  57. package/dist/kadaikodi/pages/admin/AdminAnalyticsPage.js.map +1 -1
  58. package/dist/kadaikodi/pages/admin/AdminDashboard.js +255 -271
  59. package/dist/kadaikodi/pages/admin/AdminDashboard.js.map +1 -1
  60. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js +185 -125
  61. package/dist/kadaikodi/pages/admin/AdminFinancialPage.js.map +1 -1
  62. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js +141 -102
  63. package/dist/kadaikodi/pages/admin/AdminOrdersPage.js.map +1 -1
  64. package/dist/kadaikodi/pages/admin/AdminProfilePage.js.map +1 -1
  65. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js +332 -276
  66. package/dist/kadaikodi/pages/admin/AdminSettingsPage.js.map +1 -1
  67. package/dist/kadaikodi/pages/admin/CartManagementPage.js +564 -729
  68. package/dist/kadaikodi/pages/admin/CartManagementPage.js.map +1 -1
  69. package/dist/kadaikodi/pages/admin/UserManagementPage.js +310 -366
  70. package/dist/kadaikodi/pages/admin/UserManagementPage.js.map +1 -1
  71. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js +201 -120
  72. package/dist/kadaikodi/pages/cart-owner/AnalyticsDashboard.js.map +1 -1
  73. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js +290 -257
  74. package/dist/kadaikodi/pages/cart-owner/BusinessSettingsPage.js.map +1 -1
  75. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js +173 -194
  76. package/dist/kadaikodi/pages/cart-owner/CartOwnerDashboard.js.map +1 -1
  77. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js +270 -228
  78. package/dist/kadaikodi/pages/cart-owner/CartOwnerProfilePage.js.map +1 -1
  79. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js +194 -173
  80. package/dist/kadaikodi/pages/cart-owner/CartServiceConfigPage.js.map +1 -1
  81. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js +428 -347
  82. package/dist/kadaikodi/pages/cart-owner/InventoryManagementPage.js.map +1 -1
  83. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js +332 -0
  84. package/dist/kadaikodi/pages/cart-owner/InvestmentListingPage.js.map +1 -0
  85. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js +373 -0
  86. package/dist/kadaikodi/pages/cart-owner/MerchantOnboardingPage.js.map +1 -0
  87. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js +294 -162
  88. package/dist/kadaikodi/pages/cart-owner/OrderManagementPage.js.map +1 -1
  89. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js +180 -181
  90. package/dist/kadaikodi/pages/cart-owner/StaffManagementPage.js.map +1 -1
  91. package/dist/kadaikodi/pages/common/HelpSupportPage.js +310 -317
  92. package/dist/kadaikodi/pages/common/HelpSupportPage.js.map +1 -1
  93. package/dist/kadaikodi/pages/common/NotificationCenterPage.js.map +1 -1
  94. package/dist/kadaikodi/pages/common/SettingsPage.js +502 -586
  95. package/dist/kadaikodi/pages/common/SettingsPage.js.map +1 -1
  96. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js +239 -156
  97. package/dist/kadaikodi/pages/customer/BookingDetailsPage.js.map +1 -1
  98. package/dist/kadaikodi/pages/customer/CartDetailPage.js +405 -248
  99. package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
  100. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js +258 -232
  101. package/dist/kadaikodi/pages/customer/CartDiscoveryPage.js.map +1 -1
  102. package/dist/kadaikodi/pages/customer/CheckoutPage.js +254 -205
  103. package/dist/kadaikodi/pages/customer/CheckoutPage.js.map +1 -1
  104. package/dist/kadaikodi/pages/customer/CustomerDashboard.js +5 -5
  105. package/dist/kadaikodi/pages/customer/CustomerDashboard.js.map +1 -1
  106. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js +189 -199
  107. package/dist/kadaikodi/pages/customer/CustomerProfilePage.js.map +1 -1
  108. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js +272 -230
  109. package/dist/kadaikodi/pages/customer/DirectServiceBookingPage.js.map +1 -1
  110. package/dist/kadaikodi/pages/customer/FavoritesPage.js +150 -413
  111. package/dist/kadaikodi/pages/customer/FavoritesPage.js.map +1 -1
  112. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js +173 -134
  113. package/dist/kadaikodi/pages/customer/OrderHistoryPage.js.map +1 -1
  114. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +411 -305
  115. package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
  116. package/dist/kadaikodi/pages/customer/ReviewsPage.js +310 -406
  117. package/dist/kadaikodi/pages/customer/ReviewsPage.js.map +1 -1
  118. package/dist/kadaikodi/pages/customer/SavedAddressesPage.js.map +1 -1
  119. package/dist/kadaikodi/pages/customer/shared.js +181 -0
  120. package/dist/kadaikodi/pages/customer/shared.js.map +1 -0
  121. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js +438 -311
  122. package/dist/kadaikodi/pages/investor/InvestmentDetailsPage.js.map +1 -1
  123. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js +320 -293
  124. package/dist/kadaikodi/pages/investor/InvestmentOpportunitiesPage.js.map +1 -1
  125. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js +159 -91
  126. package/dist/kadaikodi/pages/investor/InvestorAnalyticsPage.js.map +1 -1
  127. package/dist/kadaikodi/pages/investor/InvestorDashboard.js +137 -107
  128. package/dist/kadaikodi/pages/investor/InvestorDashboard.js.map +1 -1
  129. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js +157 -135
  130. package/dist/kadaikodi/pages/investor/InvestorInvestmentsPage.js.map +1 -1
  131. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js +280 -206
  132. package/dist/kadaikodi/pages/investor/InvestorPortfolioPage.js.map +1 -1
  133. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js +441 -514
  134. package/dist/kadaikodi/pages/investor/InvestorProfilePage.js.map +1 -1
  135. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js +428 -431
  136. package/dist/kadaikodi/pages/worker/TaskDetailsPage.js.map +1 -1
  137. package/dist/kadaikodi/pages/worker/WorkerDashboard.js +328 -445
  138. package/dist/kadaikodi/pages/worker/WorkerDashboard.js.map +1 -1
  139. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js +141 -164
  140. package/dist/kadaikodi/pages/worker/WorkerOrdersPage.js.map +1 -1
  141. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js +360 -288
  142. package/dist/kadaikodi/pages/worker/WorkerProfilePage.js.map +1 -1
  143. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js +303 -281
  144. package/dist/kadaikodi/pages/worker/WorkerSchedulePage.js.map +1 -1
  145. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"BookingDetailsPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/customer/BookingDetailsPage.tsx"],"sourcesContent":["/**\n * Booking Details Page\n * @module kadaikodi/pages/customer\n *\n * Detailed view of a service booking with service name, provider info,\n * scheduled date/time, booking status timeline, location info,\n * price breakdown, Contact Support button, Rate Service button (when completed),\n * Cart Information sidebar, cancel button.\n * Uses route param :bookingId from useParams().\n */\n\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n MapPin,\n Star,\n CheckCircle2,\n Circle,\n XCircle,\n ShoppingBag,\n CalendarCheck,\n Headphones,\n} from 'lucide-react';\nimport { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useOrder } from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface BookingTimelineEvent {\n status: string;\n label: string;\n timestamp: string | null;\n completed: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BookingDetailsPage() {\n const { bookingId } = useParams<{ bookingId: string }>();\n const { navigateTo } = useKadaikodi();\n const { data: order, isLoading } = useOrder(bookingId);\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n\n const showStatus = (msg: string) => {\n setStatusMessage(msg);\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n // Build the timeline from the order's real recorded events; fall back to a\n // single \"order placed\" milestone derived from the order date.\n const timeline = useMemo<BookingTimelineEvent[]>(() => {\n if (!order) return [];\n if (order.timeline.length > 0) {\n return order.timeline.map((e) => ({\n status: e.status,\n label: e.description || e.status,\n timestamp: e.timestamp,\n completed: true,\n }));\n }\n return [\n { status: 'placed', label: 'Order placed', timestamp: order.orderDate, completed: true },\n ];\n }, [order]);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Booking Details\">\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"h-12 w-12 animate-spin rounded-full border-b-2 border-foreground\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!order) {\n return (\n <PageLayout title=\"Booking Not Found\">\n <EmptyState\n icon={<CalendarCheck className=\"h-12 w-12\" />}\n title=\"Booking not found\"\n description={`No booking found with ID \"${bookingId}\".`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const isCancelled = order.status === 'cancelled';\n const isCompleted = order.status === 'delivered';\n const canCancel = !isCancelled && !isCompleted;\n const addr = order.deliveryAddress;\n const hasAddress = Boolean(addr.street || addr.area || addr.city);\n\n const handleContactSupport = () => {\n showStatus('Support team will contact you shortly.');\n };\n\n const handleRateService = () => {\n showStatus('Thank you! Rating feature coming soon.');\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Booking #{order.id}</span>\n </div>\n }\n actions={<StatusBadge status={order.status} />}\n >\n <PagePurpose className=\"mb-4\">\n The full picture of one service booking — who&apos;s providing it, what was ordered, what it\n costs, and the actions you can take such as contacting support or cancelling.\n </PagePurpose>\n\n {/* Status message */}\n {statusMessage && (\n <div className=\"mb-4 rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-3 flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text shrink-0\" />\n <p className=\"text-sm text-status-success-text\">{statusMessage}</p>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Main Content */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Service Info — the one emphasis zone */}\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{order.cartName}</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Order placed on {formatDate(order.orderDate)}\n </p>\n\n {order.items.length > 0 && (\n <div className=\"mt-4 space-y-1.5\">\n {order.items.map((item, index) => (\n <div key={item.id || index} className=\"flex justify-between text-sm\">\n <span className=\"text-text-primary\">\n {item.quantity}x {item.name}\n </span>\n <span className=\"text-text-secondary\">\n {formatCurrency(item.price * item.quantity, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n )}\n </GlassCard>\n\n {/* Provider Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Service Provider</h2>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <ShoppingBag className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{order.cartName}</p>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${order.cartId}`)}\n className=\"rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Cart\n </button>\n </div>\n </div>\n\n {/* Booking Status Timeline */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"text-base font-semibold text-text-primary mb-5\">Booking Timeline</h2>\n <div className=\"relative\">\n {timeline.map((event, index) => {\n const isLast = index === timeline.length - 1;\n const isCancelledEvent = event.status === 'cancelled';\n const Icon = isCancelledEvent ? XCircle : event.completed ? CheckCircle2 : Circle;\n\n return (\n <div key={`${event.status}-${index}`} className=\"flex gap-4\">\n <div className=\"flex flex-col items-center\">\n <div\n className={cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-full',\n isCancelledEvent\n ? 'bg-status-error-bg-subtle text-status-error-text'\n : event.completed\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : 'bg-bg-sunken text-text-secondary'\n )}\n >\n <Icon className=\"h-4 w-4\" />\n </div>\n {!isLast && (\n <div\n className={cn(\n 'w-0.5 flex-1 my-1',\n event.completed ? 'bg-status-success-bg-subtle' : 'bg-border'\n )}\n />\n )}\n </div>\n <div className={cn('pb-6', isLast && 'pb-0')}>\n <p className=\"text-sm font-medium text-text-primary\">{event.label}</p>\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {event.timestamp ? formatDate(event.timestamp) : 'Pending'}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {/* Action Buttons: Contact Support + Rate Service */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <button\n type=\"button\"\n onClick={handleContactSupport}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Headphones className=\"h-4 w-4\" />\n Contact Support\n </button>\n\n {isCompleted && (\n <button\n type=\"button\"\n onClick={handleRateService}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg bg-foreground px-4 py-3 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Star className=\"h-4 w-4\" />\n Rate Service\n </button>\n )}\n </div>\n </div>\n\n {/* Right: Sidebar */}\n <div className=\"space-y-6\">\n {/* Cart Information */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Cart Information</h3>\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"flex h-14 w-14 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary\">\n <ShoppingBag className=\"h-6 w-6\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{order.cartName}</p>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/carts/${order.cartId}`)}\n className=\"w-full rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Cart Menu\n </button>\n </div>\n\n {/* Location Info */}\n {hasAddress && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Service Location</h3>\n <div className=\"flex items-start gap-3\">\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-text-secondary\" />\n <div>\n {addr.street && <p className=\"text-sm text-text-primary\">{addr.street}</p>}\n <p className=\"text-sm text-text-secondary\">\n {[addr.area, addr.city].filter(Boolean).join(', ')}\n {addr.pincode ? ` - ${addr.pincode}` : ''}\n </p>\n {addr.landmark && (\n <p className=\"text-xs text-text-secondary mt-1\">Landmark: {addr.landmark}</p>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Price Breakdown */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Price Breakdown</h3>\n <div className=\"space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Subtotal</span>\n <span className=\"text-text-primary\">\n {formatCurrency(order.subtotal, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Delivery Fee</span>\n <span className=\"text-text-primary\">\n {order.deliveryFee === 0\n ? 'FREE'\n : formatCurrency(order.deliveryFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tax</span>\n <span className=\"text-text-primary\">\n {formatCurrency(order.taxes, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {order.discount != null && order.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-status-success-text\">Discount</span>\n <span className=\"text-status-success-text\">\n -{formatCurrency(order.discount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n <div className=\"flex justify-between border-t border-border-subtle pt-2.5\">\n <span className=\"font-semibold text-text-primary\">Total</span>\n <span className=\"font-bold text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Booking Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Booking Info</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <CalendarCheck className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Booked On</p>\n <p className=\"text-sm text-text-primary\">{formatDate(order.orderDate)}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Payment</p>\n <p className=\"text-sm text-text-primary capitalize\">\n {order.paymentMethod} &middot; {order.paymentStatus}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Cancel Button */}\n {canCancel && (\n <button\n type=\"button\"\n className=\"w-full inline-flex items-center justify-center gap-2 rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-3 text-sm font-medium text-status-error-text hover:bg-status-error-bg-subtle transition-colors\"\n >\n <XCircle className=\"h-4 w-4\" />\n Cancel Booking\n </button>\n )}\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BookingDetailsPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/customer/BookingDetailsPage.tsx"],"sourcesContent":["/**\n * Booking Details Page\n * @module kadaikodi/pages/customer\n *\n * Detailed view of a service booking with service name, provider info,\n * scheduled date/time, booking status timeline, location info,\n * price breakdown, Contact Support button, Rate Service button (when completed),\n * Cart Information sidebar, cancel button.\n * Uses route param :bookingId from useParams().\n */\n\nimport { useMemo, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n MapPin,\n Star,\n CheckCircle2,\n XCircle,\n ShoppingBag,\n CalendarCheck,\n Headphones,\n Loader2,\n X,\n} from 'lucide-react';\nimport { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { Timeline, type TimelineItem } from '../../components/viz';\nimport { useKadaikodi } from '../../context/KadaikodiContext';\nimport { useOrder, useCreateReview, useUpdateOrderStatus } from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\n\nconst SUPPORT_EMAIL = 'support@kadaikodi.com';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface BookingTimelineEvent {\n status: string;\n label: string;\n timestamp: string | null;\n completed: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function BookingDetailsPage() {\n const { bookingId } = useParams<{ bookingId: string }>();\n const { navigateTo, currentUser } = useKadaikodi();\n const { data: order, isLoading } = useOrder(bookingId);\n const createReview = useCreateReview();\n const cancelOrder = useUpdateOrderStatus();\n const [statusMessage, setStatusMessage] = useState<string | null>(null);\n const [showRateModal, setShowRateModal] = useState(false);\n const [rating, setRating] = useState(5);\n const [reviewText, setReviewText] = useState('');\n\n const showStatus = (msg: string) => {\n setStatusMessage(msg);\n setTimeout(() => setStatusMessage(null), 3000);\n };\n\n // Build the timeline from the order's real recorded events; fall back to a\n // single \"order placed\" milestone derived from the order date.\n const timeline = useMemo<BookingTimelineEvent[]>(() => {\n if (!order) return [];\n if (order.timeline.length > 0) {\n return order.timeline.map((e) => ({\n status: e.status,\n label: e.description || e.status,\n timestamp: e.timestamp,\n completed: true,\n }));\n }\n return [\n { status: 'placed', label: 'Order placed', timestamp: order.orderDate, completed: true },\n ];\n }, [order]);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Booking Details\">\n <div className=\"flex items-center justify-center py-20\">\n <div className=\"h-12 w-12 animate-spin rounded-full border-b-2 border-foreground\" />\n </div>\n </PageLayout>\n );\n }\n\n if (!order) {\n return (\n <PageLayout title=\"Booking Not Found\">\n <EmptyState\n icon={<CalendarCheck className=\"h-12 w-12\" />}\n title=\"Booking not found\"\n description={`No booking found with ID \"${bookingId}\".`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n Go to Dashboard\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const isCancelled = order.status === 'cancelled';\n const isCompleted = order.status === 'delivered';\n const canCancel = !isCancelled && !isCompleted;\n const addr = order.deliveryAddress;\n const hasAddress = Boolean(addr.street || addr.area || addr.city);\n\n const alreadyRated = order.rating != null && order.rating > 0;\n\n const handleSubmitRating = () => {\n if (!currentUser?.id) {\n showStatus('Please sign in to rate this service.');\n return;\n }\n createReview.mutate(\n {\n providerId: order.cartId,\n orderId: order.id,\n customerId: currentUser.id,\n rating,\n review: reviewText.trim() || undefined,\n },\n {\n onSuccess: () => {\n setShowRateModal(false);\n setReviewText('');\n showStatus('Thanks! Your rating has been submitted.');\n },\n onError: () => showStatus('Could not submit your rating. Please try again.'),\n }\n );\n };\n\n const handleCancelBooking = () => {\n if (!window.confirm('Cancel this booking? This cannot be undone.')) return;\n cancelOrder.mutate(\n { id: order.id, status: 'CANCELLED' },\n {\n onSuccess: () => showStatus('Your booking has been cancelled.'),\n onError: () => showStatus('Could not cancel the booking. Please try again.'),\n }\n );\n };\n\n return (\n <PageLayout\n title={\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/dashboard')}\n className=\"rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n <span>Booking #{order.id}</span>\n </div>\n }\n actions={<StatusBadge status={order.status} />}\n >\n <PagePurpose className=\"mb-4\">\n The full picture of one service booking — who&apos;s providing it, what was ordered, what it\n costs, and the actions you can take such as contacting support or cancelling.\n </PagePurpose>\n\n {/* Status message */}\n {statusMessage && (\n <div className=\"mb-4 rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle p-3 flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-status-success-text shrink-0\" />\n <p className=\"text-sm text-status-success-text\">{statusMessage}</p>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Main Content */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Service Info — the one emphasis zone */}\n <GlassCard treatment=\"glass\" glow className=\"p-6\">\n <h2 className=\"text-lg font-semibold text-text-primary\">{order.cartName}</h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Order placed on {formatDate(order.orderDate)}\n </p>\n\n {order.items.length > 0 && (\n <div className=\"mt-4 space-y-1.5\">\n {order.items.map((item, index) => (\n <div key={item.id || index} className=\"flex justify-between text-sm\">\n <span className=\"text-text-primary\">\n {item.quantity}x {item.name}\n </span>\n <span className=\"text-text-secondary\">\n {formatCurrency(item.price * item.quantity, { minimumFractionDigits: 0 })}\n </span>\n </div>\n ))}\n </div>\n )}\n </GlassCard>\n\n {/* Provider Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"text-base font-semibold text-text-primary mb-4\">Service Provider</h2>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex h-12 w-12 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <ShoppingBag className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{order.cartName}</p>\n </div>\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${order.cartId}`)}\n className=\"rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Cart\n </button>\n </div>\n </div>\n\n {/* Booking Status Timeline */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-6\">\n <h2 className=\"text-base font-semibold text-text-primary mb-5\">Booking Timeline</h2>\n <Timeline\n items={timeline.map(\n (event, index): TimelineItem => ({\n id: `${event.status}-${index}`,\n title: event.label,\n tone:\n event.status === 'cancelled'\n ? 'danger'\n : event.completed\n ? 'success'\n : 'muted',\n time: event.timestamp ? formatDate(event.timestamp) : 'Pending',\n })\n )}\n />\n </div>\n\n {/* Action Buttons: Contact Support + Rate Service */}\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <a\n href={`mailto:${SUPPORT_EMAIL}?subject=${encodeURIComponent(\n `Support request — Booking #${order.id}`\n )}`}\n className=\"flex-1 flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-4 py-3 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Headphones className=\"h-4 w-4\" />\n Contact Support\n </a>\n\n {isCompleted && (\n <button\n type=\"button\"\n disabled={alreadyRated}\n onClick={() => setShowRateModal(true)}\n className={cn(\n 'flex-1 flex items-center justify-center gap-2 rounded-lg px-4 py-3 text-sm font-medium transition-opacity',\n alreadyRated\n ? 'bg-bg-sunken text-text-secondary cursor-not-allowed'\n : 'bg-foreground text-background hover:opacity-90'\n )}\n >\n <Star className=\"h-4 w-4\" />\n {alreadyRated ? 'Rated' : 'Rate Service'}\n </button>\n )}\n </div>\n </div>\n\n {/* Right: Sidebar */}\n <div className=\"space-y-6\">\n {/* Cart Information */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Cart Information</h3>\n <div className=\"flex items-center gap-3 mb-4\">\n <div className=\"flex h-14 w-14 shrink-0 items-center justify-center rounded-lg bg-bg-sunken text-text-secondary\">\n <ShoppingBag className=\"h-6 w-6\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-semibold text-text-primary\">{order.cartName}</p>\n </div>\n </div>\n\n <button\n type=\"button\"\n onClick={() => navigateTo(`/customer/cart/${order.cartId}`)}\n className=\"w-full rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n View Cart Menu\n </button>\n </div>\n\n {/* Location Info */}\n {hasAddress && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Service Location</h3>\n <div className=\"flex items-start gap-3\">\n <MapPin className=\"mt-0.5 h-5 w-5 shrink-0 text-text-secondary\" />\n <div>\n {addr.street && <p className=\"text-sm text-text-primary\">{addr.street}</p>}\n <p className=\"text-sm text-text-secondary\">\n {[addr.area, addr.city].filter(Boolean).join(', ')}\n {addr.pincode ? ` - ${addr.pincode}` : ''}\n </p>\n {addr.landmark && (\n <p className=\"text-xs text-text-secondary mt-1\">Landmark: {addr.landmark}</p>\n )}\n </div>\n </div>\n </div>\n )}\n\n {/* Price Breakdown */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Price Breakdown</h3>\n <div className=\"space-y-2.5 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Subtotal</span>\n <span className=\"text-text-primary\">\n {formatCurrency(order.subtotal, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Delivery Fee</span>\n <span className=\"text-text-primary\">\n {order.deliveryFee === 0\n ? 'FREE'\n : formatCurrency(order.deliveryFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">Tax</span>\n <span className=\"text-text-primary\">\n {formatCurrency(order.taxes, { minimumFractionDigits: 0 })}\n </span>\n </div>\n {order.discount != null && order.discount > 0 && (\n <div className=\"flex justify-between\">\n <span className=\"text-status-success-text\">Discount</span>\n <span className=\"text-status-success-text\">\n -{formatCurrency(order.discount, { minimumFractionDigits: 0 })}\n </span>\n </div>\n )}\n <div className=\"flex justify-between border-t border-border-subtle pt-2.5\">\n <span className=\"font-semibold text-text-primary\">Total</span>\n <span className=\"font-bold text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </span>\n </div>\n </div>\n </div>\n\n {/* Booking Info */}\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <h3 className=\"text-base font-semibold text-text-primary mb-3\">Booking Info</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <CalendarCheck className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Booked On</p>\n <p className=\"text-sm text-text-primary\">{formatDate(order.orderDate)}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Payment</p>\n <p className=\"text-sm text-text-primary capitalize\">\n {order.paymentMethod} &middot; {order.paymentStatus}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Cancel Button */}\n {canCancel && (\n <button\n type=\"button\"\n onClick={handleCancelBooking}\n disabled={cancelOrder.isPending}\n className={cn(\n 'w-full inline-flex items-center justify-center gap-2 rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-3 text-sm font-medium text-status-error-text transition-colors',\n cancelOrder.isPending\n ? 'opacity-60 cursor-not-allowed'\n : 'hover:bg-status-error-bg-subtle'\n )}\n >\n {cancelOrder.isPending ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <XCircle className=\"h-4 w-4\" />\n )}\n Cancel Booking\n </button>\n )}\n </div>\n </div>\n\n {/* Rate Service Modal */}\n {showRateModal && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\">\n <div className=\"w-full max-w-md rounded-lg border border-border-subtle bg-bg-surface shadow-lg\">\n <div className=\"p-5\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-lg font-semibold text-text-primary\">Rate this service</h3>\n <button\n type=\"button\"\n onClick={() => setShowRateModal(false)}\n className=\"rounded-md p-2 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n\n <div className=\"mb-4\">\n <label className=\"block text-sm font-medium text-text-primary mb-2\">\n Your rating\n </label>\n <div className=\"flex items-center gap-1\">\n {[1, 2, 3, 4, 5].map((star) => (\n <button\n key={star}\n type=\"button\"\n onClick={() => setRating(star)}\n className=\"p-0.5\"\n aria-label={`${star} star${star > 1 ? 's' : ''}`}\n >\n <Star\n className={cn(\n 'h-7 w-7',\n star <= rating\n ? 'fill-status-warning-text text-status-warning-text'\n : 'fill-none text-text-secondary/40'\n )}\n />\n </button>\n ))}\n </div>\n </div>\n\n <div className=\"mb-5\">\n <label className=\"block text-sm font-medium text-text-primary mb-1.5\">\n Review <span className=\"text-text-secondary font-normal\">(optional)</span>\n </label>\n <textarea\n rows={4}\n value={reviewText}\n onChange={(e) => setReviewText(e.target.value)}\n placeholder=\"Share your experience with this service...\"\n className=\"w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 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 <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={handleSubmitRating}\n disabled={createReview.isPending}\n className={cn(\n 'flex-1 inline-flex items-center justify-center gap-2 rounded-lg bg-foreground px-4 py-2.5 text-sm font-medium text-background transition-opacity',\n createReview.isPending ? 'opacity-60 cursor-not-allowed' : 'hover:opacity-90'\n )}\n >\n {createReview.isPending && <Loader2 className=\"h-4 w-4 animate-spin\" />}\n Submit Rating\n </button>\n <button\n type=\"button\"\n onClick={() => setShowRateModal(false)}\n className=\"rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n Cancel\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n </PageLayout>\n );\n}\n"],"mappings":"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"}