@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.
- package/dist/kadaikodi/hooks/useKadaikodiApi.d.ts +3 -1
- package/dist/kadaikodi/hooks/useKadaikodiApi.d.ts.map +1 -1
- package/dist/kadaikodi/hooks/useKadaikodiApi.js +9 -4
- package/dist/kadaikodi/hooks/useKadaikodiApi.js.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDetailPage.d.ts.map +1 -1
- package/dist/kadaikodi/pages/customer/CartDetailPage.js +233 -231
- package/dist/kadaikodi/pages/customer/CartDetailPage.js.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.d.ts.map +1 -1
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js +122 -63
- package/dist/kadaikodi/pages/customer/OrderTrackingPage.js.map +1 -1
- package/dist/kadaikodi/store/index.d.ts +1 -0
- package/dist/kadaikodi/store/index.d.ts.map +1 -1
- package/dist/kadaikodi/store/kadaikodiStore.d.ts +35 -0
- package/dist/kadaikodi/store/kadaikodiStore.d.ts.map +1 -1
- package/dist/kadaikodi/store/kadaikodiStore.js +18 -2
- package/dist/kadaikodi/store/kadaikodiStore.js.map +1 -1
- package/dist/kadaikodi/utils/index.d.ts +1 -0
- package/dist/kadaikodi/utils/index.d.ts.map +1 -1
- package/dist/kadaikodi/utils/orderStatusNotifier.d.ts +43 -0
- package/dist/kadaikodi/utils/orderStatusNotifier.d.ts.map +1 -0
- package/dist/kadaikodi/utils/orderStatusNotifier.js +28 -0
- package/dist/kadaikodi/utils/orderStatusNotifier.js.map +1 -0
- package/dist/node_modules/@capacitor/core/dist/index.js +270 -0
- package/dist/node_modules/@capacitor/core/dist/index.js.map +1 -0
- package/package.json +6 -4
|
@@ -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
|
|
7
|
-
import { formatCurrency as
|
|
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 {
|
|
12
|
-
import {
|
|
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 } =
|
|
41
|
-
|
|
42
|
-
},
|
|
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
|
-
|
|
72
|
+
K("Please sign in to rate this order.");
|
|
45
73
|
return;
|
|
46
74
|
}
|
|
47
|
-
|
|
75
|
+
L.mutate({
|
|
48
76
|
providerId: P.cartId,
|
|
49
77
|
orderId: P.id,
|
|
50
78
|
customerId: N.id,
|
|
51
|
-
rating:
|
|
52
|
-
review:
|
|
79
|
+
rating: B,
|
|
80
|
+
review: H.trim() || void 0
|
|
53
81
|
}, {
|
|
54
82
|
onSuccess: () => {
|
|
55
|
-
|
|
83
|
+
z(!1), U(""), K("Thanks! Your rating has been submitted.");
|
|
56
84
|
},
|
|
57
|
-
onError: () =>
|
|
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__ */
|
|
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(
|
|
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
|
|
85
|
-
let r = n <
|
|
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(
|
|
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:
|
|
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:
|
|
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
|
-
}),
|
|
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",
|
|
160
|
-
children: [
|
|
161
|
-
className: t("text-sm font-medium",
|
|
162
|
-
children:
|
|
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
|
-
!
|
|
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
|
-
}), !
|
|
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(
|
|
236
|
+
/* @__PURE__ */ w(g, { className: "h-3.5 w-3.5" }),
|
|
178
237
|
"Arriving in ~",
|
|
179
|
-
|
|
238
|
+
$,
|
|
180
239
|
" min"
|
|
181
240
|
]
|
|
182
241
|
})]
|
|
183
242
|
}),
|
|
184
243
|
/* @__PURE__ */ w(u, {
|
|
185
|
-
progress:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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" :
|
|
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:
|
|
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: ["-",
|
|
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:
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
450
|
+
children: [/* @__PURE__ */ w(y, { className: "h-4 w-4" }), "Call Support"]
|
|
392
451
|
}),
|
|
393
|
-
|
|
452
|
+
Q && !P.rating && /* @__PURE__ */ T("button", {
|
|
394
453
|
type: "button",
|
|
395
|
-
onClick: () =>
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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:
|
|
468
|
+
children: W
|
|
410
469
|
})]
|
|
411
470
|
}),
|
|
412
|
-
|
|
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: () =>
|
|
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(
|
|
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: () =>
|
|
505
|
+
onClick: () => V(e),
|
|
447
506
|
className: "p-0.5",
|
|
448
507
|
"aria-label": `${e} star${e > 1 ? "s" : ""}`,
|
|
449
|
-
children: /* @__PURE__ */ w(
|
|
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:
|
|
464
|
-
onChange: (e) =>
|
|
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:
|
|
474
|
-
disabled:
|
|
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",
|
|
476
|
-
children: [
|
|
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: () =>
|
|
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'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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"}
|
|
@@ -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"}
|