@burdenoff/microfe-kadaikodi 2026.730.1 → 2026.731.2

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.
@@ -3,13 +3,16 @@ import { cn as t } from "../../utils/cn.js";
3
3
  import { PageLayout as n } from "../../components/PageLayout.js";
4
4
  import { StatusBadge as r } from "../../components/StatusBadge.js";
5
5
  import { EmptyState as i } from "../../components/EmptyState.js";
6
- import { useCreateReview as a, useOrder as o } from "../../hooks/useKadaikodiApi.js";
7
- import { formatCurrency as s, formatDate as c } from "../../utils/formatters.js";
6
+ import { useCreateReview as ee, useOrder as a } from "../../hooks/useKadaikodiApi.js";
7
+ import { formatCurrency as o, formatDate as s } from "../../utils/formatters.js";
8
+ import { useKadaikodiStore as c } from "../../store/kadaikodiStore.js";
9
+ import "../../store/index.js";
8
10
  import { Timeline as l } from "../../components/viz/Timeline.js";
9
11
  import "../../components/viz/index.js";
10
12
  import { StylizedRouteMap as u } from "./shared.js";
11
- import { useState as d } from "react";
12
- import { ArrowLeft as f, CheckCircle2 as p, Clock as m, Loader2 as h, MapPin as g, MessageCircle as _, Phone as v, ShoppingBag as y, Star as b, X as x, XCircle as S } from "lucide-react";
13
+ import { notifyOrderStatusChange as te } from "../../utils/orderStatusNotifier.js";
14
+ import { useEffect as d, useRef as f, useState as p } from "react";
15
+ import { ArrowLeft as m, CheckCircle2 as h, Clock as g, Loader2 as _, MapPin as ne, MessageCircle as v, Phone as y, ShoppingBag as b, Star as x, WifiOff as re, X as ie, XCircle as S } from "lucide-react";
13
16
  import { useParams as C } from "react-router-dom";
14
17
  import { jsx as w, jsxs as T } from "react/jsx-runtime";
15
18
  import { GlassCard as E, PagePurpose as D } from "@burdenoff/fe-libs/ui";
@@ -37,24 +40,49 @@ var O = [
37
40
  delivered: "Order has been delivered"
38
41
  };
39
42
  function j() {
40
- let { orderId: j } = C(), { navigateTo: M, currentUser: N } = e(), { data: P, isLoading: F } = o(j), I = a(), [L, R] = d(!1), [z, B] = d(5), [V, H] = d(""), [U, W] = d(null), G = (e) => {
41
- W(e), setTimeout(() => W(null), 3e3);
42
- }, K = () => {
43
+ let { orderId: j } = C(), { navigateTo: M, currentUser: N } = e(), { data: P, isLoading: F, isError: I } = a(j, { pollWhileActive: !0 }), L = ee(), [R, z] = p(!1), [B, V] = p(5), [H, U] = p(""), [W, G] = p(null), K = (e) => {
44
+ G(e), setTimeout(() => G(null), 3e3);
45
+ }, q = c((e) => j ? e.lastKnownOrderStatus[j] : void 0), J = c((e) => e.setLastKnownOrderStatus), Y = f(/* @__PURE__ */ new Set());
46
+ d(() => {
47
+ if (!P || !j) return;
48
+ let e = q?.status, t = e !== void 0 && e !== P.status, n = `${j}:${P.status}`;
49
+ if (t && !Y.current.has(n)) {
50
+ Y.current.add(n);
51
+ let e = k[P.status] ?? P.status;
52
+ K(`Order status updated: ${e}`), te({
53
+ orderId: j,
54
+ title: `${P.cartName} — ${e}`,
55
+ body: A[P.status] ?? `Your order is now ${e.toLowerCase()}.`
56
+ });
57
+ }
58
+ J(j, {
59
+ status: P.status,
60
+ orderNumber: P.id,
61
+ cartName: P.cartName,
62
+ total: P.total,
63
+ cachedAt: (/* @__PURE__ */ new Date()).toISOString()
64
+ });
65
+ }, [
66
+ P?.status,
67
+ P?.id,
68
+ j
69
+ ]);
70
+ let ae = () => {
43
71
  if (!P || !N?.id) {
44
- G("Please sign in to rate this order.");
72
+ K("Please sign in to rate this order.");
45
73
  return;
46
74
  }
47
- I.mutate({
75
+ L.mutate({
48
76
  providerId: P.cartId,
49
77
  orderId: P.id,
50
78
  customerId: N.id,
51
- rating: z,
52
- review: V.trim() || void 0
79
+ rating: B,
80
+ review: H.trim() || void 0
53
81
  }, {
54
82
  onSuccess: () => {
55
- R(!1), H(""), G("Thanks! Your rating has been submitted.");
83
+ z(!1), U(""), K("Thanks! Your rating has been submitted.");
56
84
  },
57
- onError: () => G("Could not submit your rating. Please try again.")
85
+ onError: () => K("Could not submit your rating. Please try again.")
58
86
  });
59
87
  };
60
88
  if (F) return /* @__PURE__ */ w(n, {
@@ -67,10 +95,41 @@ function j() {
67
95
  })]
68
96
  })
69
97
  });
70
- if (!P) return /* @__PURE__ */ w(n, {
98
+ if (!P) return I && q ? /* @__PURE__ */ T(n, {
99
+ title: "Track Order",
100
+ children: [/* @__PURE__ */ T("div", {
101
+ className: "mb-4 flex items-start gap-3 rounded-lg border border-status-warning-text/30 bg-status-warning-bg-subtle p-4",
102
+ children: [/* @__PURE__ */ w(re, { className: "h-5 w-5 text-status-warning-text mt-0.5 shrink-0" }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
103
+ className: "text-sm font-medium text-status-warning-text",
104
+ children: "You're offline — showing the last known status"
105
+ }), /* @__PURE__ */ T("p", {
106
+ className: "text-xs text-status-warning-text/80 mt-0.5",
107
+ children: [
108
+ "Cached ",
109
+ s(q.cachedAt),
110
+ ". Reconnect to see live updates."
111
+ ]
112
+ })] })]
113
+ }), /* @__PURE__ */ T("div", {
114
+ className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
115
+ children: [/* @__PURE__ */ T("div", {
116
+ className: "flex items-center justify-between gap-3",
117
+ children: [/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ T("h2", {
118
+ className: "text-lg font-semibold text-text-primary",
119
+ children: ["Order #", q.orderNumber]
120
+ }), /* @__PURE__ */ w("p", {
121
+ className: "text-sm text-text-secondary",
122
+ children: q.cartName
123
+ })] }), /* @__PURE__ */ w(r, { status: q.status })]
124
+ }), /* @__PURE__ */ T("p", {
125
+ className: "mt-3 text-sm text-text-primary",
126
+ children: ["Last known total: ", o(q.total, { minimumFractionDigits: 0 })]
127
+ })]
128
+ })]
129
+ }) : /* @__PURE__ */ w(n, {
71
130
  title: "Order Not Found",
72
131
  children: /* @__PURE__ */ w(i, {
73
- icon: /* @__PURE__ */ w(y, { className: "h-12 w-12" }),
132
+ icon: /* @__PURE__ */ w(b, { className: "h-12 w-12" }),
74
133
  title: "Order not found",
75
134
  description: "The order you're looking for doesn't exist.",
76
135
  action: /* @__PURE__ */ w("button", {
@@ -81,8 +140,8 @@ function j() {
81
140
  })
82
141
  })
83
142
  });
84
- let q = O.indexOf(P.status), J = P.status === "cancelled", Y = P.status === "delivered", X = P.estimatedDeliveryTime ? Math.max(0, Math.round((new Date(P.estimatedDeliveryTime).getTime() - Date.now()) / 6e4)) : null, Z = q < 0 ? 0 : q / (O.length - 1), Q = O.map((e, n) => {
85
- let r = n < q ? "success" : n === q ? "accent" : "muted", i = n === q;
143
+ let X = O.indexOf(P.status), Z = P.status === "cancelled", Q = P.status === "delivered", $ = P.estimatedDeliveryTime ? Math.max(0, Math.round((new Date(P.estimatedDeliveryTime).getTime() - Date.now()) / 6e4)) : null, oe = X < 0 ? 0 : X / (O.length - 1), se = O.map((e, n) => {
144
+ let r = n < X ? "success" : n === X ? "accent" : "muted", i = n === X;
86
145
  return {
87
146
  id: e,
88
147
  title: k[e],
@@ -100,7 +159,7 @@ function j() {
100
159
  type: "button",
101
160
  onClick: () => M("/customer/orders"),
102
161
  className: "rounded-md p-1 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors",
103
- children: /* @__PURE__ */ w(f, { className: "h-5 w-5" })
162
+ children: /* @__PURE__ */ w(m, { className: "h-5 w-5" })
104
163
  }), /* @__PURE__ */ w("span", { children: "Track Order" })]
105
164
  }),
106
165
  actions: /* @__PURE__ */ w(r, { status: P.status }),
@@ -133,20 +192,20 @@ function j() {
133
192
  }),
134
193
  /* @__PURE__ */ w("p", {
135
194
  className: "text-xs text-text-secondary mt-0.5",
136
- children: c(P.orderDate)
195
+ children: s(P.orderDate)
137
196
  })
138
197
  ]
139
198
  }), /* @__PURE__ */ T("div", {
140
199
  className: "text-left sm:text-right",
141
200
  children: [/* @__PURE__ */ w("p", {
142
201
  className: "text-xl font-bold text-text-primary",
143
- children: s(P.total, { minimumFractionDigits: 0 })
202
+ children: o(P.total, { minimumFractionDigits: 0 })
144
203
  }), /* @__PURE__ */ w("p", {
145
204
  className: "text-xs text-text-secondary uppercase",
146
205
  children: P.paymentMethod
147
206
  })]
148
207
  })]
149
- }), J ? /* @__PURE__ */ T("div", {
208
+ }), Z ? /* @__PURE__ */ T("div", {
150
209
  className: "mt-4 flex items-start gap-3 rounded-lg bg-status-error-bg/10 p-4 border border-status-error-border/20",
151
210
  children: [/* @__PURE__ */ w(S, { className: "h-5 w-5 text-status-error-text mt-0.5 shrink-0" }), /* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("p", {
152
211
  className: "font-medium text-status-error-text",
@@ -156,14 +215,14 @@ function j() {
156
215
  children: P.cancellationReason
157
216
  })] })]
158
217
  }) : /* @__PURE__ */ T("div", {
159
- className: t("mt-4 flex items-start gap-3 rounded-lg p-4 border", Y ? "bg-status-success-bg-subtle border-status-success-text/20" : "bg-[var(--color-accent-soft)] border-border-focus/20"),
160
- children: [Y ? /* @__PURE__ */ w(p, { className: "h-5 w-5 text-status-success-text mt-0.5 shrink-0" }) : /* @__PURE__ */ w(m, { className: "h-5 w-5 text-text-primary mt-0.5 shrink-0" }), /* @__PURE__ */ w("p", {
161
- className: t("text-sm font-medium", Y ? "text-status-success-text" : "text-text-primary"),
162
- children: Y ? `Delivered at ${c(P.actualDeliveryTime)}` : P.estimatedDeliveryTime ? `Estimated delivery by ${c(P.estimatedDeliveryTime)}` : "Estimated delivery time: TBD"
218
+ className: t("mt-4 flex items-start gap-3 rounded-lg p-4 border", Q ? "bg-status-success-bg-subtle border-status-success-text/20" : "bg-[var(--color-accent-soft)] border-border-focus/20"),
219
+ children: [Q ? /* @__PURE__ */ w(h, { className: "h-5 w-5 text-status-success-text mt-0.5 shrink-0" }) : /* @__PURE__ */ w(g, { className: "h-5 w-5 text-text-primary mt-0.5 shrink-0" }), /* @__PURE__ */ w("p", {
220
+ className: t("text-sm font-medium", Q ? "text-status-success-text" : "text-text-primary"),
221
+ children: Q ? `Delivered at ${s(P.actualDeliveryTime)}` : P.estimatedDeliveryTime ? `Estimated delivery by ${s(P.estimatedDeliveryTime)}` : "Estimated delivery time: TBD"
163
222
  })]
164
223
  })]
165
224
  }),
166
- !J && /* @__PURE__ */ T("div", {
225
+ !Z && /* @__PURE__ */ T("div", {
167
226
  className: "rounded-lg border border-border-subtle bg-bg-surface p-5",
168
227
  children: [
169
228
  /* @__PURE__ */ T("div", {
@@ -171,23 +230,23 @@ function j() {
171
230
  children: [/* @__PURE__ */ w("h3", {
172
231
  className: "text-base font-semibold text-text-primary",
173
232
  children: "Order Status"
174
- }), !Y && X != null && /* @__PURE__ */ T("span", {
233
+ }), !Q && $ != null && /* @__PURE__ */ T("span", {
175
234
  className: "inline-flex items-center gap-1.5 rounded-full bg-[var(--color-accent-soft)] px-3 py-1 text-sm font-semibold text-accent-primary",
176
235
  children: [
177
- /* @__PURE__ */ w(m, { className: "h-3.5 w-3.5" }),
236
+ /* @__PURE__ */ w(g, { className: "h-3.5 w-3.5" }),
178
237
  "Arriving in ~",
179
- X,
238
+ $,
180
239
  " min"
181
240
  ]
182
241
  })]
183
242
  }),
184
243
  /* @__PURE__ */ w(u, {
185
- progress: Z,
244
+ progress: oe,
186
245
  originLabel: P.cartName,
187
246
  destinationLabel: "You",
188
247
  className: "mb-6 h-44"
189
248
  }),
190
- /* @__PURE__ */ w(l, { items: Q })
249
+ /* @__PURE__ */ w(l, { items: se })
191
250
  ]
192
251
  }),
193
252
  /* @__PURE__ */ T("div", {
@@ -215,7 +274,7 @@ function j() {
215
274
  /* @__PURE__ */ T("p", {
216
275
  className: "text-xs text-text-secondary",
217
276
  children: [
218
- s(e.price, { minimumFractionDigits: 0 }),
277
+ o(e.price, { minimumFractionDigits: 0 }),
219
278
  " x ",
220
279
  e.quantity
221
280
  ]
@@ -223,7 +282,7 @@ function j() {
223
282
  ]
224
283
  }), /* @__PURE__ */ w("p", {
225
284
  className: "text-sm font-medium text-text-primary",
226
- children: s(e.price * e.quantity, { minimumFractionDigits: 0 })
285
+ children: o(e.price * e.quantity, { minimumFractionDigits: 0 })
227
286
  })]
228
287
  }, t))
229
288
  }),
@@ -232,23 +291,23 @@ function j() {
232
291
  children: [
233
292
  /* @__PURE__ */ T("div", {
234
293
  className: "flex justify-between text-text-secondary",
235
- children: [/* @__PURE__ */ w("span", { children: "Subtotal" }), /* @__PURE__ */ w("span", { children: s(P.subtotal, { minimumFractionDigits: 0 }) })]
294
+ children: [/* @__PURE__ */ w("span", { children: "Subtotal" }), /* @__PURE__ */ w("span", { children: o(P.subtotal, { minimumFractionDigits: 0 }) })]
236
295
  }),
237
296
  /* @__PURE__ */ T("div", {
238
297
  className: "flex justify-between text-text-secondary",
239
- children: [/* @__PURE__ */ w("span", { children: "Delivery Fee" }), /* @__PURE__ */ w("span", { children: P.deliveryFee === 0 ? "FREE" : s(P.deliveryFee, { minimumFractionDigits: 0 }) })]
298
+ children: [/* @__PURE__ */ w("span", { children: "Delivery Fee" }), /* @__PURE__ */ w("span", { children: P.deliveryFee === 0 ? "FREE" : o(P.deliveryFee, { minimumFractionDigits: 0 }) })]
240
299
  }),
241
300
  /* @__PURE__ */ T("div", {
242
301
  className: "flex justify-between text-text-secondary",
243
- children: [/* @__PURE__ */ w("span", { children: "Tax" }), /* @__PURE__ */ w("span", { children: s(P.taxes, { minimumFractionDigits: 0 }) })]
302
+ children: [/* @__PURE__ */ w("span", { children: "Tax" }), /* @__PURE__ */ w("span", { children: o(P.taxes, { minimumFractionDigits: 0 }) })]
244
303
  }),
245
304
  P.discount && P.discount > 0 && /* @__PURE__ */ T("div", {
246
305
  className: "flex justify-between text-status-success-text",
247
- children: [/* @__PURE__ */ w("span", { children: "Discount" }), /* @__PURE__ */ T("span", { children: ["-", s(P.discount, { minimumFractionDigits: 0 })] })]
306
+ children: [/* @__PURE__ */ w("span", { children: "Discount" }), /* @__PURE__ */ T("span", { children: ["-", o(P.discount, { minimumFractionDigits: 0 })] })]
248
307
  }),
249
308
  /* @__PURE__ */ T("div", {
250
309
  className: "flex justify-between font-semibold pt-2 border-t border-border-subtle text-text-primary",
251
- children: [/* @__PURE__ */ w("span", { children: "Total" }), /* @__PURE__ */ w("span", { children: s(P.total, { minimumFractionDigits: 0 }) })]
310
+ children: [/* @__PURE__ */ w("span", { children: "Total" }), /* @__PURE__ */ w("span", { children: o(P.total, { minimumFractionDigits: 0 }) })]
252
311
  })
253
312
  ]
254
313
  })
@@ -268,7 +327,7 @@ function j() {
268
327
  children: [
269
328
  /* @__PURE__ */ T("div", {
270
329
  className: "flex items-start gap-2",
271
- children: [/* @__PURE__ */ w(g, { className: "mt-0.5 h-4 w-4 shrink-0 text-text-secondary" }), /* @__PURE__ */ T("div", { children: [
330
+ children: [/* @__PURE__ */ w(ne, { className: "mt-0.5 h-4 w-4 shrink-0 text-text-secondary" }), /* @__PURE__ */ T("div", { children: [
272
331
  /* @__PURE__ */ w("p", {
273
332
  className: "text-xs text-text-secondary",
274
333
  children: "Delivery Address"
@@ -343,7 +402,7 @@ function j() {
343
402
  children: P.assignedWorker.name
344
403
  }), /* @__PURE__ */ T("div", {
345
404
  className: "flex items-center gap-1.5 mt-0.5",
346
- children: [/* @__PURE__ */ w(b, { className: "h-3 w-3 fill-status-warning-text text-status-warning-text" }), /* @__PURE__ */ T("span", {
405
+ children: [/* @__PURE__ */ w(x, { className: "h-3 w-3 fill-status-warning-text text-status-warning-text" }), /* @__PURE__ */ T("span", {
347
406
  className: "text-xs text-text-secondary",
348
407
  children: [P.assignedWorker.rating, "/5"]
349
408
  })]
@@ -352,7 +411,7 @@ function j() {
352
411
  /* @__PURE__ */ w("a", {
353
412
  href: `tel:${P.assignedWorker.phone}`,
354
413
  className: "flex h-9 w-9 items-center justify-center rounded-full bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary transition-colors",
355
- children: /* @__PURE__ */ w(v, { className: "h-4 w-4" })
414
+ children: /* @__PURE__ */ w(y, { className: "h-4 w-4" })
356
415
  })
357
416
  ]
358
417
  }), /* @__PURE__ */ T("div", {
@@ -360,13 +419,13 @@ function j() {
360
419
  children: [/* @__PURE__ */ T("a", {
361
420
  href: `tel:${P.assignedWorker.phone}`,
362
421
  className: "flex items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-3 py-2.5 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover transition-colors",
363
- children: [/* @__PURE__ */ w(v, { className: "h-4 w-4" }), "Call"]
422
+ children: [/* @__PURE__ */ w(y, { className: "h-4 w-4" }), "Call"]
364
423
  }), /* @__PURE__ */ T("button", {
365
424
  type: "button",
366
425
  disabled: !0,
367
426
  title: "In-app chat is coming soon",
368
427
  className: "flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm font-medium text-text-secondary cursor-not-allowed opacity-70",
369
- children: [/* @__PURE__ */ w(_, { className: "h-4 w-4" }), "Chat"]
428
+ children: [/* @__PURE__ */ w(v, { className: "h-4 w-4" }), "Chat"]
370
429
  })]
371
430
  })]
372
431
  })]
@@ -382,19 +441,19 @@ function j() {
382
441
  /* @__PURE__ */ T("a", {
383
442
  href: "mailto:support@kadaikodi.com",
384
443
  className: "w-full flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
385
- children: [/* @__PURE__ */ w(_, { className: "h-4 w-4" }), "Email Support"]
444
+ children: [/* @__PURE__ */ w(v, { className: "h-4 w-4" }), "Email Support"]
386
445
  }),
387
446
  /* @__PURE__ */ T("button", {
388
447
  type: "button",
389
448
  onClick: () => window.location.href = "tel:7012270561",
390
449
  className: "w-full flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
391
- children: [/* @__PURE__ */ w(v, { className: "h-4 w-4" }), "Call Support"]
450
+ children: [/* @__PURE__ */ w(y, { className: "h-4 w-4" }), "Call Support"]
392
451
  }),
393
- Y && !P.rating && /* @__PURE__ */ T("button", {
452
+ Q && !P.rating && /* @__PURE__ */ T("button", {
394
453
  type: "button",
395
- onClick: () => R(!0),
454
+ onClick: () => z(!0),
396
455
  className: "w-full flex items-center justify-center gap-2 rounded-lg bg-foreground px-3 py-2.5 text-sm font-medium text-background hover:opacity-90 transition-opacity",
397
- children: [/* @__PURE__ */ w(b, { className: "h-4 w-4" }), "Rate Order"]
456
+ children: [/* @__PURE__ */ w(x, { className: "h-4 w-4" }), "Rate Order"]
398
457
  })
399
458
  ]
400
459
  })]
@@ -402,14 +461,14 @@ function j() {
402
461
  ]
403
462
  })]
404
463
  }),
405
- U && /* @__PURE__ */ T("div", {
464
+ W && /* @__PURE__ */ T("div", {
406
465
  className: "fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle px-4 py-3 shadow-lg flex items-center gap-2",
407
- children: [/* @__PURE__ */ w(p, { className: "h-4 w-4 text-status-success-text shrink-0" }), /* @__PURE__ */ w("p", {
466
+ children: [/* @__PURE__ */ w(h, { className: "h-4 w-4 text-status-success-text shrink-0" }), /* @__PURE__ */ w("p", {
408
467
  className: "text-sm text-status-success-text",
409
- children: U
468
+ children: W
410
469
  })]
411
470
  }),
412
- L && /* @__PURE__ */ w("div", {
471
+ R && /* @__PURE__ */ w("div", {
413
472
  className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4",
414
473
  children: /* @__PURE__ */ w("div", {
415
474
  className: "w-full max-w-md rounded-lg border border-border-subtle bg-bg-surface shadow-lg",
@@ -423,9 +482,9 @@ function j() {
423
482
  children: "Rate your order"
424
483
  }), /* @__PURE__ */ w("button", {
425
484
  type: "button",
426
- onClick: () => R(!1),
485
+ onClick: () => z(!1),
427
486
  className: "rounded-md p-2 text-text-secondary hover:bg-accent hover:text-text-primary transition-colors",
428
- children: /* @__PURE__ */ w(x, { className: "h-4 w-4" })
487
+ children: /* @__PURE__ */ w(ie, { className: "h-4 w-4" })
429
488
  })]
430
489
  }),
431
490
  /* @__PURE__ */ T("div", {
@@ -443,10 +502,10 @@ function j() {
443
502
  5
444
503
  ].map((e) => /* @__PURE__ */ w("button", {
445
504
  type: "button",
446
- onClick: () => B(e),
505
+ onClick: () => V(e),
447
506
  className: "p-0.5",
448
507
  "aria-label": `${e} star${e > 1 ? "s" : ""}`,
449
- children: /* @__PURE__ */ w(b, { className: t("h-7 w-7", e <= z ? "fill-status-warning-text text-status-warning-text" : "fill-none text-text-secondary/40") })
508
+ children: /* @__PURE__ */ w(x, { className: t("h-7 w-7", e <= B ? "fill-status-warning-text text-status-warning-text" : "fill-none text-text-secondary/40") })
450
509
  }, e))
451
510
  })]
452
511
  }),
@@ -460,8 +519,8 @@ function j() {
460
519
  })]
461
520
  }), /* @__PURE__ */ w("textarea", {
462
521
  rows: 4,
463
- value: V,
464
- onChange: (e) => H(e.target.value),
522
+ value: H,
523
+ onChange: (e) => U(e.target.value),
465
524
  placeholder: "How was your order?",
466
525
  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"
467
526
  })]
@@ -470,13 +529,13 @@ function j() {
470
529
  className: "flex items-center gap-3",
471
530
  children: [/* @__PURE__ */ T("button", {
472
531
  type: "button",
473
- onClick: K,
474
- disabled: I.isPending,
475
- className: t("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", I.isPending ? "opacity-60 cursor-not-allowed" : "hover:opacity-90"),
476
- children: [I.isPending && /* @__PURE__ */ w(h, { className: "h-4 w-4 animate-spin" }), "Submit Rating"]
532
+ onClick: ae,
533
+ disabled: L.isPending,
534
+ className: t("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", L.isPending ? "opacity-60 cursor-not-allowed" : "hover:opacity-90"),
535
+ children: [L.isPending && /* @__PURE__ */ w(_, { className: "h-4 w-4 animate-spin" }), "Submit Rating"]
477
536
  }), /* @__PURE__ */ w("button", {
478
537
  type: "button",
479
- onClick: () => R(!1),
538
+ onClick: () => z(!1),
480
539
  className: "rounded-lg border border-border-subtle px-4 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors",
481
540
  children: "Cancel"
482
541
  })]
@@ -1 +1 @@
1
- {"version":3,"file":"OrderTrackingPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/customer/OrderTrackingPage.tsx"],"sourcesContent":["/**\n * Order Tracking Page\n * @module kadaikodi/pages/customer\n *\n * Real-time order tracking with status timeline, delivery partner info,\n * price breakdown, Need Help sidebar, and rate order functionality.\n */\n\nimport { useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n CheckCircle2,\n Clock,\n MapPin,\n Phone,\n Star,\n ShoppingBag,\n XCircle,\n MessageCircle,\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 } from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\nimport type { OrderStatus } from '../../types';\nimport { StylizedRouteMap } from './shared';\n\nconst statusOrder: OrderStatus[] = [\n 'pending',\n 'confirmed',\n 'preparing',\n 'ready',\n 'out_for_delivery',\n 'delivered',\n];\n\nconst statusLabels: Record<string, string> = {\n pending: 'Order Placed',\n confirmed: 'Confirmed',\n preparing: 'Preparing',\n ready: 'Ready',\n out_for_delivery: 'Out for Delivery',\n delivered: 'Delivered',\n};\n\nconst statusDescriptions: Record<string, string> = {\n pending: 'Your order has been received',\n confirmed: 'Cart has accepted your order',\n preparing: 'Your food is being prepared',\n ready: 'Order is ready for pickup/delivery',\n out_for_delivery: 'Your order is on the way',\n delivered: 'Order has been delivered',\n};\n\nexport function OrderTrackingPage() {\n const { orderId } = useParams<{ orderId: string }>();\n const { navigateTo, currentUser } = useKadaikodi();\n const { data: order, isLoading } = useOrder(orderId);\n const createReview = useCreateReview();\n const [showRateModal, setShowRateModal] = useState(false);\n const [rating, setRating] = useState(5);\n const [reviewText, setReviewText] = useState('');\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 const handleSubmitRating = () => {\n if (!order || !currentUser?.id) {\n showStatus('Please sign in to rate this order.');\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 if (isLoading) {\n return (\n <PageLayout title=\"Track Order\">\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-foreground mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">Loading order details...</p>\n </div>\n </PageLayout>\n );\n }\n\n if (!order) {\n return (\n <PageLayout title=\"Order Not Found\">\n <EmptyState\n icon={<ShoppingBag className=\"h-12 w-12\" />}\n title=\"Order not found\"\n description={`The order you're looking for doesn't exist.`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n View All Orders\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const currentStatusIndex = statusOrder.indexOf(order.status);\n const isCancelled = order.status === 'cancelled';\n const isDelivered = order.status === 'delivered';\n\n // Honest ETA: only derived when the backend supplies a real estimated time.\n const etaMinutes = order.estimatedDeliveryTime\n ? Math.max(\n 0,\n Math.round((new Date(order.estimatedDeliveryTime).getTime() - Date.now()) / 60000)\n )\n : null;\n\n // Route progress along the illustrative map (0..1) from the live status index.\n const routeProgress = currentStatusIndex < 0 ? 0 : currentStatusIndex / (statusOrder.length - 1);\n\n const timelineItems: TimelineItem[] = statusOrder.map((stepStatus, i) => {\n const tone = i < currentStatusIndex ? 'success' : i === currentStatusIndex ? 'accent' : 'muted';\n const isCurrent = i === currentStatusIndex;\n return {\n id: stepStatus,\n title: statusLabels[stepStatus],\n tone,\n meta: (\n <span className={cn(isCurrent ? 'text-text-primary' : undefined)}>\n {statusDescriptions[stepStatus]}\n </span>\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/orders')}\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>Track Order</span>\n </div>\n }\n actions={<StatusBadge status={order.status} />}\n >\n <PagePurpose className=\"mb-6\">\n Follow your order in real time — see exactly where it is from kitchen to doorstep, who's\n delivering it, and reach out for help if anything looks off. The live status updates as your\n order moves through each stage.\n </PagePurpose>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Order Details & Timeline */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Order Header — the one emphasis zone (live status) */}\n <GlassCard treatment=\"glass\" glow className=\"p-5\">\n <div className=\"flex flex-col sm:flex-row sm:justify-between sm:items-start gap-3\">\n <div className=\"flex-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Order #{order.id}</h2>\n <p className=\"text-sm text-text-secondary\">{order.cartName}</p>\n <p className=\"text-xs text-text-secondary mt-0.5\">{formatDate(order.orderDate)}</p>\n </div>\n <div className=\"text-left sm:text-right\">\n <p className=\"text-xl font-bold text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"text-xs text-text-secondary uppercase\">{order.paymentMethod}</p>\n </div>\n </div>\n\n {/* Status Banner */}\n {isCancelled ? (\n <div className=\"mt-4 flex items-start gap-3 rounded-lg bg-status-error-bg/10 p-4 border border-status-error-border/20\">\n <XCircle className=\"h-5 w-5 text-status-error-text mt-0.5 shrink-0\" />\n <div>\n <p className=\"font-medium text-status-error-text\">Order Cancelled</p>\n {order.cancellationReason && (\n <p className=\"text-sm text-status-error-text/80 mt-0.5\">\n {order.cancellationReason}\n </p>\n )}\n </div>\n </div>\n ) : (\n <div\n className={cn(\n 'mt-4 flex items-start gap-3 rounded-lg p-4 border',\n isDelivered\n ? 'bg-status-success-bg-subtle border-status-success-text/20'\n : 'bg-[var(--color-accent-soft)] border-border-focus/20'\n )}\n >\n {isDelivered ? (\n <CheckCircle2 className=\"h-5 w-5 text-status-success-text mt-0.5 shrink-0\" />\n ) : (\n <Clock className=\"h-5 w-5 text-text-primary mt-0.5 shrink-0\" />\n )}\n <p\n className={cn(\n 'text-sm font-medium',\n isDelivered ? 'text-status-success-text' : 'text-text-primary'\n )}\n >\n {isDelivered\n ? `Delivered at ${formatDate(order.actualDeliveryTime!)}`\n : order.estimatedDeliveryTime\n ? `Estimated delivery by ${formatDate(order.estimatedDeliveryTime)}`\n : 'Estimated delivery time: TBD'}\n </p>\n </div>\n )}\n </GlassCard>\n\n {/* Live tracking: ETA + stylised route + status timeline */}\n {!isCancelled && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <div className=\"mb-4 flex flex-wrap items-center justify-between gap-2\">\n <h3 className=\"text-base font-semibold text-text-primary\">Order Status</h3>\n {!isDelivered && etaMinutes != null && (\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-[var(--color-accent-soft)] px-3 py-1 text-sm font-semibold text-accent-primary\">\n <Clock className=\"h-3.5 w-3.5\" />\n Arriving in ~{etaMinutes} min\n </span>\n )}\n </div>\n <StylizedRouteMap\n progress={routeProgress}\n originLabel={order.cartName}\n destinationLabel=\"You\"\n className=\"mb-6 h-44\"\n />\n <Timeline items={timelineItems} />\n </div>\n )}\n\n {/* Order Items & 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\">Order Items</h3>\n <div className=\"space-y-2\">\n {order.items.map((item, index) => (\n <div\n key={index}\n className=\"flex justify-between items-start pb-2 border-b border-border-subtle last:border-b-0\"\n >\n <div className=\"flex-1 pr-2\">\n <p className=\"text-sm font-medium text-text-primary\">{item.name}</p>\n {item.customizations && item.customizations.length > 0 && (\n <p className=\"text-xs text-text-secondary\">\n {item.customizations.join(', ')}\n </p>\n )}\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(item.price, { minimumFractionDigits: 0 })} x {item.quantity}\n </p>\n </div>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(item.price * item.quantity, { minimumFractionDigits: 0 })}\n </p>\n </div>\n ))}\n </div>\n\n {/* Price Breakdown */}\n <div className=\"mt-4 pt-4 border-t border-border-subtle space-y-2 text-sm\">\n <div className=\"flex justify-between text-text-secondary\">\n <span>Subtotal</span>\n <span>{formatCurrency(order.subtotal, { minimumFractionDigits: 0 })}</span>\n </div>\n <div className=\"flex justify-between text-text-secondary\">\n <span>Delivery Fee</span>\n <span>\n {order.deliveryFee === 0\n ? 'FREE'\n : formatCurrency(order.deliveryFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between text-text-secondary\">\n <span>Tax</span>\n <span>{formatCurrency(order.taxes, { minimumFractionDigits: 0 })}</span>\n </div>\n {order.discount && order.discount > 0 && (\n <div className=\"flex justify-between text-status-success-text\">\n <span>Discount</span>\n <span>-{formatCurrency(order.discount, { minimumFractionDigits: 0 })}</span>\n </div>\n )}\n <div className=\"flex justify-between font-semibold pt-2 border-t border-border-subtle text-text-primary\">\n <span>Total</span>\n <span>{formatCurrency(order.total, { minimumFractionDigits: 0 })}</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Right: Sidebar */}\n <div className=\"lg:col-span-1 space-y-6\">\n {/* Delivery Details */}\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\">Delivery Details</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-start gap-2\">\n <MapPin className=\"mt-0.5 h-4 w-4 shrink-0 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Delivery Address</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {order.deliveryAddress.street}\n </p>\n <p className=\"text-sm text-text-secondary\">{order.deliveryAddress.area}</p>\n <p className=\"text-sm text-text-secondary\">\n {order.deliveryAddress.city}, {order.deliveryAddress.pincode}\n </p>\n {order.deliveryAddress.landmark && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n Landmark: {order.deliveryAddress.landmark}\n </p>\n )}\n </div>\n </div>\n\n {/* Customer Notes */}\n {order.customerNotes && (\n <div>\n <p className=\"text-xs text-text-secondary\">Customer Notes</p>\n <p className=\"text-sm text-text-primary\">{order.customerNotes}</p>\n </div>\n )}\n\n {/* Payment */}\n <div>\n <p className=\"text-xs text-text-secondary\">Payment Method</p>\n <p className=\"text-sm font-medium text-text-primary capitalize\">\n {order.paymentMethod}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {order.paymentStatus === 'completed' ? 'Paid' : 'Payment Pending'}\n </p>\n </div>\n </div>\n </div>\n\n {/* Delivery Partner */}\n {order.assignedWorker && (\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\">Delivery Partner</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <span className=\"text-sm font-semibold\">\n {order.assignedWorker.name.charAt(0)}\n </span>\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">\n {order.assignedWorker.name}\n </p>\n <div className=\"flex items-center gap-1.5 mt-0.5\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs text-text-secondary\">\n {order.assignedWorker.rating}/5\n </span>\n </div>\n </div>\n <a\n href={`tel:${order.assignedWorker.phone}`}\n className=\"flex h-9 w-9 items-center justify-center rounded-full bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n </a>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <a\n href={`tel:${order.assignedWorker.phone}`}\n className=\"flex items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-3 py-2.5 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n Call\n </a>\n <button\n type=\"button\"\n disabled\n title=\"In-app chat is coming soon\"\n className=\"flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm font-medium text-text-secondary cursor-not-allowed opacity-70\"\n >\n <MessageCircle className=\"h-4 w-4\" />\n Chat\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Need Help */}\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\">Need Help?</h3>\n <div className=\"space-y-2\">\n <a\n href=\"mailto:support@kadaikodi.com\"\n className=\"w-full flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <MessageCircle className=\"h-4 w-4\" />\n Email Support\n </a>\n <button\n type=\"button\"\n onClick={() => (window.location.href = 'tel:7012270561')}\n className=\"w-full flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n Call Support\n </button>\n {isDelivered && !order.rating && (\n <button\n type=\"button\"\n onClick={() => setShowRateModal(true)}\n className=\"w-full flex items-center justify-center gap-2 rounded-lg bg-foreground px-3 py-2.5 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Star className=\"h-4 w-4\" />\n Rate Order\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* Status message */}\n {statusMessage && (\n <div className=\"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle px-4 py-3 shadow-lg 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 {/* Rate Order 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 your order</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=\"How was your order?\"\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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"}
1
+ {"version":3,"file":"OrderTrackingPage.js","names":[],"sources":["../../../../src/kadaikodi/pages/customer/OrderTrackingPage.tsx"],"sourcesContent":["/**\n * Order Tracking Page\n * @module kadaikodi/pages/customer\n *\n * Real-time order tracking with status timeline, delivery partner info,\n * price breakdown, Need Help sidebar, and rate order functionality.\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n CheckCircle2,\n Clock,\n MapPin,\n Phone,\n Star,\n ShoppingBag,\n WifiOff,\n XCircle,\n MessageCircle,\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 } from '../../hooks/useKadaikodiApi';\nimport { cn } from '../../utils/cn';\nimport { formatCurrency, formatDate } from '../../utils/formatters';\nimport { notifyOrderStatusChange } from '../../utils/orderStatusNotifier';\nimport { useKadaikodiStore } from '../../store';\nimport type { OrderStatus } from '../../types';\nimport { StylizedRouteMap } from './shared';\n\nconst statusOrder: OrderStatus[] = [\n 'pending',\n 'confirmed',\n 'preparing',\n 'ready',\n 'out_for_delivery',\n 'delivered',\n];\n\nconst statusLabels: Record<string, string> = {\n pending: 'Order Placed',\n confirmed: 'Confirmed',\n preparing: 'Preparing',\n ready: 'Ready',\n out_for_delivery: 'Out for Delivery',\n delivered: 'Delivered',\n};\n\nconst statusDescriptions: Record<string, string> = {\n pending: 'Your order has been received',\n confirmed: 'Cart has accepted your order',\n preparing: 'Your food is being prepared',\n ready: 'Order is ready for pickup/delivery',\n out_for_delivery: 'Your order is on the way',\n delivered: 'Order has been delivered',\n};\n\nexport function OrderTrackingPage() {\n const { orderId } = useParams<{ orderId: string }>();\n const { navigateTo, currentUser } = useKadaikodi();\n const { data: order, isLoading, isError } = useOrder(orderId, { pollWhileActive: true });\n const createReview = useCreateReview();\n const [showRateModal, setShowRateModal] = useState(false);\n const [rating, setRating] = useState(5);\n const [reviewText, setReviewText] = useState('');\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 // Offline-cached order status (BOFF-4301). `cachedOrder` is what OS-level\n // notifications and the offline fallback view below both key off; it\n // outlives an app kill/reload because it's persisted, unlike the\n // in-memory react-query cache `order` comes from.\n const cachedOrder = useKadaikodiStore((s) =>\n orderId ? s.lastKnownOrderStatus[orderId] : undefined\n );\n const setLastKnownOrderStatus = useKadaikodiStore((s) => s.setLastKnownOrderStatus);\n const hasNotifiedRef = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n if (!order || !orderId) return;\n const previousStatus = cachedOrder?.status;\n const changed = previousStatus !== undefined && previousStatus !== order.status;\n // De-dupe within a single mount: React Query's polling can re-fire the\n // same status more than once before the store write is observed.\n const changeKey = `${orderId}:${order.status}`;\n if (changed && !hasNotifiedRef.current.has(changeKey)) {\n hasNotifiedRef.current.add(changeKey);\n const label = statusLabels[order.status] ?? order.status;\n showStatus(`Order status updated: ${label}`);\n void notifyOrderStatusChange({\n orderId,\n title: `${order.cartName} — ${label}`,\n body: statusDescriptions[order.status] ?? `Your order is now ${label.toLowerCase()}.`,\n });\n }\n setLastKnownOrderStatus(orderId, {\n status: order.status,\n orderNumber: order.id,\n cartName: order.cartName,\n total: order.total,\n cachedAt: new Date().toISOString(),\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- only order.status changes should re-run this; cachedOrder/setLastKnownOrderStatus would otherwise loop against the write this effect itself performs.\n }, [order?.status, order?.id, orderId]);\n\n const handleSubmitRating = () => {\n if (!order || !currentUser?.id) {\n showStatus('Please sign in to rate this order.');\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 if (isLoading) {\n return (\n <PageLayout title=\"Track Order\">\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-foreground mx-auto mb-4\" />\n <p className=\"text-sm text-text-secondary\">Loading order details...</p>\n </div>\n </PageLayout>\n );\n }\n\n if (!order) {\n // BOFF-4301: the live fetch failed (most likely offline) but a\n // previous session cached this order's last-known status on-device —\n // show that instead of a bare \"not found\", which would be misleading\n // (the order does exist; we just can't reach the network right now).\n if (isError && cachedOrder) {\n return (\n <PageLayout title=\"Track Order\">\n <div className=\"mb-4 flex items-start gap-3 rounded-lg border border-status-warning-text/30 bg-status-warning-bg-subtle p-4\">\n <WifiOff className=\"h-5 w-5 text-status-warning-text mt-0.5 shrink-0\" />\n <div>\n <p className=\"text-sm font-medium text-status-warning-text\">\n You&apos;re offline — showing the last known status\n </p>\n <p className=\"text-xs text-status-warning-text/80 mt-0.5\">\n Cached {formatDate(cachedOrder.cachedAt)}. Reconnect to see live updates.\n </p>\n </div>\n </div>\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">\n Order #{cachedOrder.orderNumber}\n </h2>\n <p className=\"text-sm text-text-secondary\">{cachedOrder.cartName}</p>\n </div>\n <StatusBadge status={cachedOrder.status as OrderStatus} />\n </div>\n <p className=\"mt-3 text-sm text-text-primary\">\n Last known total: {formatCurrency(cachedOrder.total, { minimumFractionDigits: 0 })}\n </p>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PageLayout title=\"Order Not Found\">\n <EmptyState\n icon={<ShoppingBag className=\"h-12 w-12\" />}\n title=\"Order not found\"\n description={`The order you're looking for doesn't exist.`}\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo('/customer/orders')}\n className=\"rounded-lg bg-foreground px-4 py-2 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n View All Orders\n </button>\n }\n />\n </PageLayout>\n );\n }\n\n const currentStatusIndex = statusOrder.indexOf(order.status);\n const isCancelled = order.status === 'cancelled';\n const isDelivered = order.status === 'delivered';\n\n // Honest ETA: only derived when the backend supplies a real estimated time.\n const etaMinutes = order.estimatedDeliveryTime\n ? Math.max(\n 0,\n Math.round((new Date(order.estimatedDeliveryTime).getTime() - Date.now()) / 60000)\n )\n : null;\n\n // Route progress along the illustrative map (0..1) from the live status index.\n const routeProgress = currentStatusIndex < 0 ? 0 : currentStatusIndex / (statusOrder.length - 1);\n\n const timelineItems: TimelineItem[] = statusOrder.map((stepStatus, i) => {\n const tone = i < currentStatusIndex ? 'success' : i === currentStatusIndex ? 'accent' : 'muted';\n const isCurrent = i === currentStatusIndex;\n return {\n id: stepStatus,\n title: statusLabels[stepStatus],\n tone,\n meta: (\n <span className={cn(isCurrent ? 'text-text-primary' : undefined)}>\n {statusDescriptions[stepStatus]}\n </span>\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/orders')}\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>Track Order</span>\n </div>\n }\n actions={<StatusBadge status={order.status} />}\n >\n <PagePurpose className=\"mb-6\">\n Follow your order in real time — see exactly where it is from kitchen to doorstep, who's\n delivering it, and reach out for help if anything looks off. The live status updates as your\n order moves through each stage.\n </PagePurpose>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left: Order Details & Timeline */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Order Header — the one emphasis zone (live status) */}\n <GlassCard treatment=\"glass\" glow className=\"p-5\">\n <div className=\"flex flex-col sm:flex-row sm:justify-between sm:items-start gap-3\">\n <div className=\"flex-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Order #{order.id}</h2>\n <p className=\"text-sm text-text-secondary\">{order.cartName}</p>\n <p className=\"text-xs text-text-secondary mt-0.5\">{formatDate(order.orderDate)}</p>\n </div>\n <div className=\"text-left sm:text-right\">\n <p className=\"text-xl font-bold text-text-primary\">\n {formatCurrency(order.total, { minimumFractionDigits: 0 })}\n </p>\n <p className=\"text-xs text-text-secondary uppercase\">{order.paymentMethod}</p>\n </div>\n </div>\n\n {/* Status Banner */}\n {isCancelled ? (\n <div className=\"mt-4 flex items-start gap-3 rounded-lg bg-status-error-bg/10 p-4 border border-status-error-border/20\">\n <XCircle className=\"h-5 w-5 text-status-error-text mt-0.5 shrink-0\" />\n <div>\n <p className=\"font-medium text-status-error-text\">Order Cancelled</p>\n {order.cancellationReason && (\n <p className=\"text-sm text-status-error-text/80 mt-0.5\">\n {order.cancellationReason}\n </p>\n )}\n </div>\n </div>\n ) : (\n <div\n className={cn(\n 'mt-4 flex items-start gap-3 rounded-lg p-4 border',\n isDelivered\n ? 'bg-status-success-bg-subtle border-status-success-text/20'\n : 'bg-[var(--color-accent-soft)] border-border-focus/20'\n )}\n >\n {isDelivered ? (\n <CheckCircle2 className=\"h-5 w-5 text-status-success-text mt-0.5 shrink-0\" />\n ) : (\n <Clock className=\"h-5 w-5 text-text-primary mt-0.5 shrink-0\" />\n )}\n <p\n className={cn(\n 'text-sm font-medium',\n isDelivered ? 'text-status-success-text' : 'text-text-primary'\n )}\n >\n {isDelivered\n ? `Delivered at ${formatDate(order.actualDeliveryTime!)}`\n : order.estimatedDeliveryTime\n ? `Estimated delivery by ${formatDate(order.estimatedDeliveryTime)}`\n : 'Estimated delivery time: TBD'}\n </p>\n </div>\n )}\n </GlassCard>\n\n {/* Live tracking: ETA + stylised route + status timeline */}\n {!isCancelled && (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-5\">\n <div className=\"mb-4 flex flex-wrap items-center justify-between gap-2\">\n <h3 className=\"text-base font-semibold text-text-primary\">Order Status</h3>\n {!isDelivered && etaMinutes != null && (\n <span className=\"inline-flex items-center gap-1.5 rounded-full bg-[var(--color-accent-soft)] px-3 py-1 text-sm font-semibold text-accent-primary\">\n <Clock className=\"h-3.5 w-3.5\" />\n Arriving in ~{etaMinutes} min\n </span>\n )}\n </div>\n <StylizedRouteMap\n progress={routeProgress}\n originLabel={order.cartName}\n destinationLabel=\"You\"\n className=\"mb-6 h-44\"\n />\n <Timeline items={timelineItems} />\n </div>\n )}\n\n {/* Order Items & 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\">Order Items</h3>\n <div className=\"space-y-2\">\n {order.items.map((item, index) => (\n <div\n key={index}\n className=\"flex justify-between items-start pb-2 border-b border-border-subtle last:border-b-0\"\n >\n <div className=\"flex-1 pr-2\">\n <p className=\"text-sm font-medium text-text-primary\">{item.name}</p>\n {item.customizations && item.customizations.length > 0 && (\n <p className=\"text-xs text-text-secondary\">\n {item.customizations.join(', ')}\n </p>\n )}\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(item.price, { minimumFractionDigits: 0 })} x {item.quantity}\n </p>\n </div>\n <p className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(item.price * item.quantity, { minimumFractionDigits: 0 })}\n </p>\n </div>\n ))}\n </div>\n\n {/* Price Breakdown */}\n <div className=\"mt-4 pt-4 border-t border-border-subtle space-y-2 text-sm\">\n <div className=\"flex justify-between text-text-secondary\">\n <span>Subtotal</span>\n <span>{formatCurrency(order.subtotal, { minimumFractionDigits: 0 })}</span>\n </div>\n <div className=\"flex justify-between text-text-secondary\">\n <span>Delivery Fee</span>\n <span>\n {order.deliveryFee === 0\n ? 'FREE'\n : formatCurrency(order.deliveryFee, { minimumFractionDigits: 0 })}\n </span>\n </div>\n <div className=\"flex justify-between text-text-secondary\">\n <span>Tax</span>\n <span>{formatCurrency(order.taxes, { minimumFractionDigits: 0 })}</span>\n </div>\n {order.discount && order.discount > 0 && (\n <div className=\"flex justify-between text-status-success-text\">\n <span>Discount</span>\n <span>-{formatCurrency(order.discount, { minimumFractionDigits: 0 })}</span>\n </div>\n )}\n <div className=\"flex justify-between font-semibold pt-2 border-t border-border-subtle text-text-primary\">\n <span>Total</span>\n <span>{formatCurrency(order.total, { minimumFractionDigits: 0 })}</span>\n </div>\n </div>\n </div>\n </div>\n\n {/* Right: Sidebar */}\n <div className=\"lg:col-span-1 space-y-6\">\n {/* Delivery Details */}\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\">Delivery Details</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-start gap-2\">\n <MapPin className=\"mt-0.5 h-4 w-4 shrink-0 text-text-secondary\" />\n <div>\n <p className=\"text-xs text-text-secondary\">Delivery Address</p>\n <p className=\"text-sm font-medium text-text-primary\">\n {order.deliveryAddress.street}\n </p>\n <p className=\"text-sm text-text-secondary\">{order.deliveryAddress.area}</p>\n <p className=\"text-sm text-text-secondary\">\n {order.deliveryAddress.city}, {order.deliveryAddress.pincode}\n </p>\n {order.deliveryAddress.landmark && (\n <p className=\"text-xs text-text-secondary mt-0.5\">\n Landmark: {order.deliveryAddress.landmark}\n </p>\n )}\n </div>\n </div>\n\n {/* Customer Notes */}\n {order.customerNotes && (\n <div>\n <p className=\"text-xs text-text-secondary\">Customer Notes</p>\n <p className=\"text-sm text-text-primary\">{order.customerNotes}</p>\n </div>\n )}\n\n {/* Payment */}\n <div>\n <p className=\"text-xs text-text-secondary\">Payment Method</p>\n <p className=\"text-sm font-medium text-text-primary capitalize\">\n {order.paymentMethod}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {order.paymentStatus === 'completed' ? 'Paid' : 'Payment Pending'}\n </p>\n </div>\n </div>\n </div>\n\n {/* Delivery Partner */}\n {order.assignedWorker && (\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\">Delivery Partner</h3>\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-bg-sunken text-text-secondary\">\n <span className=\"text-sm font-semibold\">\n {order.assignedWorker.name.charAt(0)}\n </span>\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-text-primary\">\n {order.assignedWorker.name}\n </p>\n <div className=\"flex items-center gap-1.5 mt-0.5\">\n <Star className=\"h-3 w-3 fill-status-warning-text text-status-warning-text\" />\n <span className=\"text-xs text-text-secondary\">\n {order.assignedWorker.rating}/5\n </span>\n </div>\n </div>\n <a\n href={`tel:${order.assignedWorker.phone}`}\n className=\"flex h-9 w-9 items-center justify-center rounded-full bg-bg-sunken text-text-secondary hover:bg-accent hover:text-text-primary transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n </a>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <a\n href={`tel:${order.assignedWorker.phone}`}\n className=\"flex items-center justify-center gap-2 rounded-lg bg-action-primary-bg px-3 py-2.5 text-sm font-semibold text-action-primary-text hover:bg-action-primary-bg-hover transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n Call\n </a>\n <button\n type=\"button\"\n disabled\n title=\"In-app chat is coming soon\"\n className=\"flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm font-medium text-text-secondary cursor-not-allowed opacity-70\"\n >\n <MessageCircle className=\"h-4 w-4\" />\n Chat\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Need Help */}\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\">Need Help?</h3>\n <div className=\"space-y-2\">\n <a\n href=\"mailto:support@kadaikodi.com\"\n className=\"w-full flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <MessageCircle className=\"h-4 w-4\" />\n Email Support\n </a>\n <button\n type=\"button\"\n onClick={() => (window.location.href = 'tel:7012270561')}\n className=\"w-full flex items-center justify-center gap-2 rounded-lg border border-border-subtle px-3 py-2.5 text-sm font-medium text-text-primary hover:bg-accent transition-colors\"\n >\n <Phone className=\"h-4 w-4\" />\n Call Support\n </button>\n {isDelivered && !order.rating && (\n <button\n type=\"button\"\n onClick={() => setShowRateModal(true)}\n className=\"w-full flex items-center justify-center gap-2 rounded-lg bg-foreground px-3 py-2.5 text-sm font-medium text-background hover:opacity-90 transition-opacity\"\n >\n <Star className=\"h-4 w-4\" />\n Rate Order\n </button>\n )}\n </div>\n </div>\n </div>\n </div>\n\n {/* Status message */}\n {statusMessage && (\n <div className=\"fixed bottom-4 left-1/2 z-50 -translate-x-1/2 rounded-lg border border-status-success-text/30 bg-status-success-bg-subtle px-4 py-3 shadow-lg 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 {/* Rate Order 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 your order</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=\"How was your order?\"\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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"}
@@ -3,4 +3,5 @@
3
3
  * @module kadaikodi/store
4
4
  */
5
5
  export { useKadaikodiStore } from './kadaikodiStore';
6
+ export type { PersistedCartItem, OrderStatusSnapshot } from './kadaikodiStore';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/kadaikodi/store/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/kadaikodi/store/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}