@burdenoff/microfe-billing 2026.901.2 → 2026.903.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { useCreateShippingAddress as e, useEstimateOrderShipping as t, useMyShippingAddresses as n, useShippingMethods as r } from "../hooks/useStoreShipping.js";
|
|
2
2
|
import { useEffect as i, useMemo as a, useRef as o, useState as s } from "react";
|
|
3
3
|
import { Check as c, Loader2 as l, MapPin as u, Plus as d, Truck as f, X as p } from "lucide-react";
|
|
4
|
-
import { Fragment as
|
|
4
|
+
import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
5
5
|
//#region src/billing/modules/checkout/components/StoreShippingSection.tsx
|
|
6
|
-
var
|
|
6
|
+
var _ = [
|
|
7
7
|
{
|
|
8
8
|
value: "IN",
|
|
9
9
|
label: "India"
|
|
@@ -40,7 +40,7 @@ var g = [
|
|
|
40
40
|
value: "AE",
|
|
41
41
|
label: "UAE"
|
|
42
42
|
}
|
|
43
|
-
],
|
|
43
|
+
], v = {
|
|
44
44
|
fullName: "",
|
|
45
45
|
phone: "",
|
|
46
46
|
addressLine1: "",
|
|
@@ -50,7 +50,7 @@ var g = [
|
|
|
50
50
|
postalCode: "",
|
|
51
51
|
country: "IN"
|
|
52
52
|
};
|
|
53
|
-
function
|
|
53
|
+
function y(e, t) {
|
|
54
54
|
try {
|
|
55
55
|
return e.toLocaleString("en", {
|
|
56
56
|
style: "currency",
|
|
@@ -60,29 +60,31 @@ function v(e, t) {
|
|
|
60
60
|
return `${t || "USD"} ${e.toFixed(2)}`;
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
|
-
function
|
|
63
|
+
function b(e, t) {
|
|
64
64
|
if (e == null && t == null) return null;
|
|
65
65
|
if (e != null && t != null) return e === t ? `${e} days` : `${e}–${t} days`;
|
|
66
66
|
let n = e ?? t;
|
|
67
67
|
return n == null ? null : `${n} days`;
|
|
68
68
|
}
|
|
69
|
-
var
|
|
70
|
-
let { addresses:
|
|
69
|
+
var x = ({ storeOrderId: x, currency: S, onChange: C }) => {
|
|
70
|
+
let { addresses: w, loading: T, refetch: E } = n(), { createShippingAddress: D, loading: O } = e(), { methods: k, loading: ee } = r(), [A, { data: j, loading: M }] = t(), [N, P] = s(null), [F, I] = s(null), [L, R] = s(!1), [z, B] = s(v), [V, H] = s({}), [U, W] = s(null), G = o(C);
|
|
71
71
|
i(() => {
|
|
72
|
-
G.current =
|
|
72
|
+
G.current = C;
|
|
73
73
|
});
|
|
74
|
-
let K = a(() =>
|
|
74
|
+
let K = a(() => w.find((e) => e.id === N), [w, N]), q = a(() => {
|
|
75
75
|
if (!K) return [];
|
|
76
76
|
let e = K.country;
|
|
77
|
-
return
|
|
78
|
-
}, [
|
|
77
|
+
return k.filter((t) => t.isActive && (t.availableCountries.length === 0 || t.availableCountries.includes(e)) && !t.excludedCountries.includes(e)).sort((e, t) => e.displayOrder - t.displayOrder);
|
|
78
|
+
}, [k, K]);
|
|
79
79
|
i(() => {
|
|
80
|
-
!N &&
|
|
81
|
-
}, [
|
|
80
|
+
!N && w.length > 0 && P((w.find((e) => e.isDefault) ?? w[0]).id);
|
|
81
|
+
}, [w, N]), i(() => {
|
|
82
82
|
F && !q.some((e) => e.id === F) && I(null);
|
|
83
|
+
}, [q, F]), i(() => {
|
|
84
|
+
!F && q.length === 1 && I(q[0].id);
|
|
83
85
|
}, [q, F]), i(() => {
|
|
84
86
|
K && F && A({ variables: { input: {
|
|
85
|
-
orderId:
|
|
87
|
+
orderId: x,
|
|
86
88
|
shippingMethodId: F,
|
|
87
89
|
destinationCountry: K.country,
|
|
88
90
|
destinationPostalCode: K.postalCode
|
|
@@ -92,7 +94,7 @@ var b = ({ storeOrderId: b, currency: x, onChange: S }) => {
|
|
|
92
94
|
K?.country,
|
|
93
95
|
K?.postalCode,
|
|
94
96
|
F,
|
|
95
|
-
|
|
97
|
+
x,
|
|
96
98
|
A,
|
|
97
99
|
K
|
|
98
100
|
]);
|
|
@@ -121,7 +123,7 @@ var b = ({ storeOrderId: b, currency: x, onChange: S }) => {
|
|
|
121
123
|
if (Z()) {
|
|
122
124
|
W(null);
|
|
123
125
|
try {
|
|
124
|
-
let e = await
|
|
126
|
+
let e = await D({
|
|
125
127
|
fullName: z.fullName.trim(),
|
|
126
128
|
...z.phone.trim() ? { phone: z.phone.trim() } : {},
|
|
127
129
|
addressLine1: z.addressLine1.trim(),
|
|
@@ -130,66 +132,66 @@ var b = ({ storeOrderId: b, currency: x, onChange: S }) => {
|
|
|
130
132
|
...z.state.trim() ? { state: z.state.trim() } : {},
|
|
131
133
|
postalCode: z.postalCode.trim(),
|
|
132
134
|
country: z.country,
|
|
133
|
-
isDefault:
|
|
135
|
+
isDefault: w.length === 0
|
|
134
136
|
});
|
|
135
137
|
if (!e) {
|
|
136
138
|
W("Failed to save address. Please try again.");
|
|
137
139
|
return;
|
|
138
140
|
}
|
|
139
|
-
await
|
|
141
|
+
await E(), P(e.id), I(null), B(v), H({}), R(!1);
|
|
140
142
|
} catch {
|
|
141
143
|
W("Failed to save address. Please try again.");
|
|
142
144
|
}
|
|
143
145
|
}
|
|
144
146
|
}, $ = (e) => `w-full px-3 py-2 text-sm border rounded-input bg-bg-surface text-text-primary placeholder:text-text-placeholder focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] ${e ? "border-status-error-border" : "border-border-subtle"}`;
|
|
145
|
-
return /* @__PURE__ */
|
|
147
|
+
return /* @__PURE__ */ g("div", {
|
|
146
148
|
className: "rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6 space-y-5",
|
|
147
149
|
children: [
|
|
148
|
-
/* @__PURE__ */
|
|
150
|
+
/* @__PURE__ */ g("div", {
|
|
149
151
|
className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
|
|
150
|
-
children: [/* @__PURE__ */
|
|
152
|
+
children: [/* @__PURE__ */ h(f, { className: "size-4 text-text-secondary" }), "Shipping"]
|
|
151
153
|
}),
|
|
152
|
-
/* @__PURE__ */
|
|
154
|
+
/* @__PURE__ */ g("section", {
|
|
153
155
|
className: "space-y-3",
|
|
154
156
|
children: [
|
|
155
|
-
/* @__PURE__ */
|
|
157
|
+
/* @__PURE__ */ g("div", {
|
|
156
158
|
className: "flex items-center justify-between",
|
|
157
|
-
children: [/* @__PURE__ */
|
|
159
|
+
children: [/* @__PURE__ */ g("div", {
|
|
158
160
|
className: "flex items-center gap-2 text-sm font-medium text-text-primary",
|
|
159
|
-
children: [/* @__PURE__ */
|
|
160
|
-
}), !L && /* @__PURE__ */
|
|
161
|
+
children: [/* @__PURE__ */ h(u, { className: "size-4 text-text-secondary" }), "Delivery address"]
|
|
162
|
+
}), !L && /* @__PURE__ */ g("button", {
|
|
161
163
|
type: "button",
|
|
162
164
|
onClick: () => {
|
|
163
165
|
R(!0), W(null);
|
|
164
166
|
},
|
|
165
167
|
className: "inline-flex items-center gap-1 text-xs font-medium text-text-link hover:underline",
|
|
166
|
-
children: [/* @__PURE__ */
|
|
168
|
+
children: [/* @__PURE__ */ h(d, { className: "size-3.5" }), "Add address"]
|
|
167
169
|
})]
|
|
168
170
|
}),
|
|
169
|
-
|
|
171
|
+
T && w.length === 0 ? /* @__PURE__ */ g("div", {
|
|
170
172
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
171
|
-
children: [/* @__PURE__ */
|
|
172
|
-
}) : /* @__PURE__ */
|
|
173
|
+
children: [/* @__PURE__ */ h(l, { className: "size-4 animate-spin" }), "Loading addresses…"]
|
|
174
|
+
}) : /* @__PURE__ */ g(m, { children: [w.length === 0 && !L && /* @__PURE__ */ h("p", {
|
|
173
175
|
className: "text-sm text-text-secondary",
|
|
174
176
|
children: "No saved delivery addresses yet. Add one to continue."
|
|
175
|
-
}),
|
|
177
|
+
}), w.length > 0 && /* @__PURE__ */ h("div", {
|
|
176
178
|
className: "space-y-2",
|
|
177
|
-
children:
|
|
179
|
+
children: w.map((e) => {
|
|
178
180
|
let t = e.id === N;
|
|
179
|
-
return /* @__PURE__ */
|
|
181
|
+
return /* @__PURE__ */ h("button", {
|
|
180
182
|
type: "button",
|
|
181
183
|
onClick: () => {
|
|
182
184
|
P(e.id), I(null);
|
|
183
185
|
},
|
|
184
186
|
className: `w-full text-left p-3 rounded-input border transition-colors ${t ? "border-action-primary-bg bg-bg-sunken" : "border-border-subtle hover:bg-bg-sunken"}`,
|
|
185
|
-
children: /* @__PURE__ */
|
|
187
|
+
children: /* @__PURE__ */ g("div", {
|
|
186
188
|
className: "flex items-start justify-between gap-2",
|
|
187
|
-
children: [/* @__PURE__ */
|
|
189
|
+
children: [/* @__PURE__ */ g("div", {
|
|
188
190
|
className: "text-sm",
|
|
189
191
|
children: [
|
|
190
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ g("p", {
|
|
191
193
|
className: "font-medium text-text-primary",
|
|
192
|
-
children: [e.fullName, e.label ? /* @__PURE__ */
|
|
194
|
+
children: [e.fullName, e.label ? /* @__PURE__ */ g("span", {
|
|
193
195
|
className: "ml-2 text-xs text-text-muted",
|
|
194
196
|
children: [
|
|
195
197
|
"(",
|
|
@@ -198,7 +200,7 @@ var b = ({ storeOrderId: b, currency: x, onChange: S }) => {
|
|
|
198
200
|
]
|
|
199
201
|
}) : null]
|
|
200
202
|
}),
|
|
201
|
-
/* @__PURE__ */
|
|
203
|
+
/* @__PURE__ */ h("p", {
|
|
202
204
|
className: "text-text-secondary text-xs mt-0.5",
|
|
203
205
|
children: [
|
|
204
206
|
e.addressLine1,
|
|
@@ -209,134 +211,134 @@ var b = ({ storeOrderId: b, currency: x, onChange: S }) => {
|
|
|
209
211
|
e.country
|
|
210
212
|
].filter(Boolean).join(", ")
|
|
211
213
|
}),
|
|
212
|
-
e.phone && /* @__PURE__ */
|
|
214
|
+
e.phone && /* @__PURE__ */ h("p", {
|
|
213
215
|
className: "text-text-muted text-xs mt-0.5",
|
|
214
216
|
children: e.phone
|
|
215
217
|
})
|
|
216
218
|
]
|
|
217
|
-
}), t && /* @__PURE__ */
|
|
219
|
+
}), t && /* @__PURE__ */ h(c, { className: "size-4 text-action-primary-bg shrink-0 mt-0.5" })]
|
|
218
220
|
})
|
|
219
221
|
}, e.id);
|
|
220
222
|
})
|
|
221
223
|
})] }),
|
|
222
|
-
L && /* @__PURE__ */
|
|
224
|
+
L && /* @__PURE__ */ g("div", {
|
|
223
225
|
className: "rounded-input border border-border-subtle p-3 space-y-3 bg-bg-sunken",
|
|
224
226
|
children: [
|
|
225
|
-
/* @__PURE__ */
|
|
227
|
+
/* @__PURE__ */ g("div", {
|
|
226
228
|
className: "flex items-center justify-between",
|
|
227
|
-
children: [/* @__PURE__ */
|
|
229
|
+
children: [/* @__PURE__ */ h("span", {
|
|
228
230
|
className: "text-sm font-medium text-text-primary",
|
|
229
231
|
children: "New delivery address"
|
|
230
|
-
}), /* @__PURE__ */
|
|
232
|
+
}), /* @__PURE__ */ h("button", {
|
|
231
233
|
type: "button",
|
|
232
234
|
onClick: () => {
|
|
233
235
|
R(!1), H({}), W(null);
|
|
234
236
|
},
|
|
235
237
|
className: "p-1 text-text-secondary hover:text-text-primary rounded-button",
|
|
236
|
-
children: /* @__PURE__ */
|
|
238
|
+
children: /* @__PURE__ */ h(p, { className: "size-4" })
|
|
237
239
|
})]
|
|
238
240
|
}),
|
|
239
|
-
U && /* @__PURE__ */
|
|
241
|
+
U && /* @__PURE__ */ h("div", {
|
|
240
242
|
className: "p-2 rounded-lg bg-status-error-bg-subtle border border-status-error-border text-xs text-status-error-text",
|
|
241
243
|
children: U
|
|
242
244
|
}),
|
|
243
|
-
/* @__PURE__ */
|
|
244
|
-
/* @__PURE__ */
|
|
245
|
+
/* @__PURE__ */ g("div", { children: [
|
|
246
|
+
/* @__PURE__ */ h("label", {
|
|
245
247
|
className: "block text-xs text-text-secondary mb-1",
|
|
246
248
|
children: "Recipient name"
|
|
247
249
|
}),
|
|
248
|
-
/* @__PURE__ */
|
|
250
|
+
/* @__PURE__ */ h("input", {
|
|
249
251
|
type: "text",
|
|
250
252
|
value: z.fullName,
|
|
251
253
|
onChange: (e) => X("fullName", e.target.value),
|
|
252
254
|
placeholder: "Jane Doe",
|
|
253
255
|
className: $(!!V.fullName)
|
|
254
256
|
}),
|
|
255
|
-
V.fullName && /* @__PURE__ */
|
|
257
|
+
V.fullName && /* @__PURE__ */ h("p", {
|
|
256
258
|
className: "mt-1 text-xs text-status-error-text",
|
|
257
259
|
children: V.fullName
|
|
258
260
|
})
|
|
259
261
|
] }),
|
|
260
|
-
/* @__PURE__ */
|
|
262
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("label", {
|
|
261
263
|
className: "block text-xs text-text-secondary mb-1",
|
|
262
|
-
children: ["Phone ", /* @__PURE__ */
|
|
264
|
+
children: ["Phone ", /* @__PURE__ */ h("span", {
|
|
263
265
|
className: "text-text-muted",
|
|
264
266
|
children: "(optional)"
|
|
265
267
|
})]
|
|
266
|
-
}), /* @__PURE__ */
|
|
268
|
+
}), /* @__PURE__ */ h("input", {
|
|
267
269
|
type: "tel",
|
|
268
270
|
value: z.phone,
|
|
269
271
|
onChange: (e) => X("phone", e.target.value),
|
|
270
272
|
placeholder: "+91 98765 43210",
|
|
271
273
|
className: $(!1)
|
|
272
274
|
})] }),
|
|
273
|
-
/* @__PURE__ */
|
|
275
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
274
276
|
className: "block text-xs text-text-secondary mb-1",
|
|
275
277
|
children: "Country"
|
|
276
|
-
}), /* @__PURE__ */
|
|
278
|
+
}), /* @__PURE__ */ h("select", {
|
|
277
279
|
value: z.country,
|
|
278
280
|
onChange: (e) => X("country", e.target.value),
|
|
279
281
|
className: $(!!V.country),
|
|
280
|
-
children:
|
|
282
|
+
children: _.map((e) => /* @__PURE__ */ h("option", {
|
|
281
283
|
value: e.value,
|
|
282
284
|
children: e.label
|
|
283
285
|
}, e.value))
|
|
284
286
|
})] }),
|
|
285
|
-
/* @__PURE__ */
|
|
286
|
-
/* @__PURE__ */
|
|
287
|
+
/* @__PURE__ */ g("div", { children: [
|
|
288
|
+
/* @__PURE__ */ h("label", {
|
|
287
289
|
className: "block text-xs text-text-secondary mb-1",
|
|
288
290
|
children: "Street address"
|
|
289
291
|
}),
|
|
290
|
-
/* @__PURE__ */
|
|
292
|
+
/* @__PURE__ */ h("input", {
|
|
291
293
|
type: "text",
|
|
292
294
|
value: z.addressLine1,
|
|
293
295
|
onChange: (e) => X("addressLine1", e.target.value),
|
|
294
296
|
placeholder: "123 Main St",
|
|
295
297
|
className: $(!!V.addressLine1)
|
|
296
298
|
}),
|
|
297
|
-
V.addressLine1 && /* @__PURE__ */
|
|
299
|
+
V.addressLine1 && /* @__PURE__ */ h("p", {
|
|
298
300
|
className: "mt-1 text-xs text-status-error-text",
|
|
299
301
|
children: V.addressLine1
|
|
300
302
|
})
|
|
301
303
|
] }),
|
|
302
|
-
/* @__PURE__ */
|
|
304
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("label", {
|
|
303
305
|
className: "block text-xs text-text-secondary mb-1",
|
|
304
|
-
children: ["Apartment, suite, etc. ", /* @__PURE__ */
|
|
306
|
+
children: ["Apartment, suite, etc. ", /* @__PURE__ */ h("span", {
|
|
305
307
|
className: "text-text-muted",
|
|
306
308
|
children: "(optional)"
|
|
307
309
|
})]
|
|
308
|
-
}), /* @__PURE__ */
|
|
310
|
+
}), /* @__PURE__ */ h("input", {
|
|
309
311
|
type: "text",
|
|
310
312
|
value: z.addressLine2,
|
|
311
313
|
onChange: (e) => X("addressLine2", e.target.value),
|
|
312
314
|
placeholder: "Apt 4B",
|
|
313
315
|
className: $(!1)
|
|
314
316
|
})] }),
|
|
315
|
-
/* @__PURE__ */
|
|
317
|
+
/* @__PURE__ */ g("div", {
|
|
316
318
|
className: "grid grid-cols-2 gap-3",
|
|
317
|
-
children: [/* @__PURE__ */
|
|
318
|
-
/* @__PURE__ */
|
|
319
|
+
children: [/* @__PURE__ */ g("div", { children: [
|
|
320
|
+
/* @__PURE__ */ h("label", {
|
|
319
321
|
className: "block text-xs text-text-secondary mb-1",
|
|
320
322
|
children: "City"
|
|
321
323
|
}),
|
|
322
|
-
/* @__PURE__ */
|
|
324
|
+
/* @__PURE__ */ h("input", {
|
|
323
325
|
type: "text",
|
|
324
326
|
value: z.city,
|
|
325
327
|
onChange: (e) => X("city", e.target.value),
|
|
326
328
|
placeholder: "Mumbai",
|
|
327
329
|
className: $(!!V.city)
|
|
328
330
|
}),
|
|
329
|
-
V.city && /* @__PURE__ */
|
|
331
|
+
V.city && /* @__PURE__ */ h("p", {
|
|
330
332
|
className: "mt-1 text-xs text-status-error-text",
|
|
331
333
|
children: V.city
|
|
332
334
|
})
|
|
333
|
-
] }), /* @__PURE__ */
|
|
335
|
+
] }), /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("label", {
|
|
334
336
|
className: "block text-xs text-text-secondary mb-1",
|
|
335
|
-
children: ["State ", /* @__PURE__ */
|
|
337
|
+
children: ["State ", /* @__PURE__ */ h("span", {
|
|
336
338
|
className: "text-text-muted",
|
|
337
339
|
children: "(optional)"
|
|
338
340
|
})]
|
|
339
|
-
}), /* @__PURE__ */
|
|
341
|
+
}), /* @__PURE__ */ h("input", {
|
|
340
342
|
type: "text",
|
|
341
343
|
value: z.state,
|
|
342
344
|
onChange: (e) => X("state", e.target.value),
|
|
@@ -344,92 +346,116 @@ var b = ({ storeOrderId: b, currency: x, onChange: S }) => {
|
|
|
344
346
|
className: $(!1)
|
|
345
347
|
})] })]
|
|
346
348
|
}),
|
|
347
|
-
/* @__PURE__ */
|
|
348
|
-
/* @__PURE__ */
|
|
349
|
+
/* @__PURE__ */ g("div", { children: [
|
|
350
|
+
/* @__PURE__ */ h("label", {
|
|
349
351
|
className: "block text-xs text-text-secondary mb-1",
|
|
350
352
|
children: "Postal code"
|
|
351
353
|
}),
|
|
352
|
-
/* @__PURE__ */
|
|
354
|
+
/* @__PURE__ */ h("input", {
|
|
353
355
|
type: "text",
|
|
354
356
|
value: z.postalCode,
|
|
355
357
|
onChange: (e) => X("postalCode", e.target.value),
|
|
356
358
|
placeholder: "400001",
|
|
357
359
|
className: $(!!V.postalCode)
|
|
358
360
|
}),
|
|
359
|
-
V.postalCode && /* @__PURE__ */
|
|
361
|
+
V.postalCode && /* @__PURE__ */ h("p", {
|
|
360
362
|
className: "mt-1 text-xs text-status-error-text",
|
|
361
363
|
children: V.postalCode
|
|
362
364
|
})
|
|
363
365
|
] }),
|
|
364
|
-
/* @__PURE__ */
|
|
366
|
+
/* @__PURE__ */ h("div", {
|
|
365
367
|
className: "flex justify-end",
|
|
366
|
-
children: /* @__PURE__ */
|
|
368
|
+
children: /* @__PURE__ */ g("button", {
|
|
367
369
|
type: "button",
|
|
368
370
|
onClick: Q,
|
|
369
|
-
disabled:
|
|
371
|
+
disabled: O,
|
|
370
372
|
className: "inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-action-primary-text bg-action-primary-bg hover:bg-action-primary-bgHover rounded-lg transition-colors disabled:opacity-50",
|
|
371
|
-
children: [
|
|
373
|
+
children: [O && /* @__PURE__ */ h(l, { className: "size-4 animate-spin" }), "Save address"]
|
|
372
374
|
})
|
|
373
375
|
})
|
|
374
376
|
]
|
|
375
377
|
})
|
|
376
378
|
]
|
|
377
379
|
}),
|
|
378
|
-
/* @__PURE__ */
|
|
380
|
+
/* @__PURE__ */ g("section", {
|
|
379
381
|
className: "space-y-3",
|
|
380
382
|
children: [
|
|
381
|
-
/* @__PURE__ */
|
|
383
|
+
/* @__PURE__ */ g("div", {
|
|
382
384
|
className: "flex items-center gap-2 text-sm font-medium text-text-primary",
|
|
383
|
-
children: [/* @__PURE__ */
|
|
385
|
+
children: [/* @__PURE__ */ h(f, { className: "size-4 text-text-secondary" }), "Shipping method"]
|
|
384
386
|
}),
|
|
385
|
-
K ?
|
|
387
|
+
K ? ee && k.length === 0 ? /* @__PURE__ */ g("div", {
|
|
386
388
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
387
|
-
children: [/* @__PURE__ */
|
|
388
|
-
}) : q.length === 0 ? /* @__PURE__ */
|
|
389
|
+
children: [/* @__PURE__ */ h(l, { className: "size-4 animate-spin" }), "Loading options…"]
|
|
390
|
+
}) : q.length === 0 ? /* @__PURE__ */ g("p", {
|
|
389
391
|
className: "text-sm text-text-secondary",
|
|
390
392
|
children: [
|
|
391
393
|
"No shipping methods available for ",
|
|
392
394
|
K.country,
|
|
393
395
|
". Try a different address."
|
|
394
396
|
]
|
|
395
|
-
}) :
|
|
397
|
+
}) : q.length === 1 ? (() => {
|
|
398
|
+
let e = q[0], t = b(e.estimatedMinDays, e.estimatedMaxDays), n = Y && J;
|
|
399
|
+
return /* @__PURE__ */ h("div", {
|
|
400
|
+
className: "w-full p-3 rounded-input border border-action-primary-bg bg-bg-sunken",
|
|
401
|
+
children: /* @__PURE__ */ g("div", {
|
|
402
|
+
className: "flex items-start justify-between gap-3",
|
|
403
|
+
children: [/* @__PURE__ */ g("div", {
|
|
404
|
+
className: "text-sm",
|
|
405
|
+
children: [/* @__PURE__ */ h("p", {
|
|
406
|
+
className: "font-medium text-text-primary",
|
|
407
|
+
children: e.name
|
|
408
|
+
}), /* @__PURE__ */ g("p", {
|
|
409
|
+
className: "text-text-secondary text-xs mt-0.5",
|
|
410
|
+
children: [e.carrier ? `${e.carrier} · ` : "", t ?? "Delivery time varies"]
|
|
411
|
+
})]
|
|
412
|
+
}), /* @__PURE__ */ g("div", {
|
|
413
|
+
className: "flex items-center gap-2 shrink-0",
|
|
414
|
+
children: [M ? /* @__PURE__ */ h(l, { className: "size-4 animate-spin text-text-secondary" }) : /* @__PURE__ */ h("span", {
|
|
415
|
+
className: "text-sm font-semibold text-text-primary",
|
|
416
|
+
children: n ? y(J.cost, J.currency || S) : y(e.baseCost, e.currency || S)
|
|
417
|
+
}), /* @__PURE__ */ h(c, { className: "size-4 text-action-primary-bg" })]
|
|
418
|
+
})]
|
|
419
|
+
})
|
|
420
|
+
});
|
|
421
|
+
})() : /* @__PURE__ */ h("div", {
|
|
396
422
|
className: "space-y-2",
|
|
397
423
|
children: q.map((e) => {
|
|
398
|
-
let t = e.id === F, n =
|
|
399
|
-
return /* @__PURE__ */
|
|
424
|
+
let t = e.id === F, n = b(e.estimatedMinDays, e.estimatedMaxDays), r = t && Y && J;
|
|
425
|
+
return /* @__PURE__ */ h("button", {
|
|
400
426
|
type: "button",
|
|
401
427
|
onClick: () => I(e.id),
|
|
402
428
|
className: `w-full text-left p-3 rounded-input border transition-colors ${t ? "border-action-primary-bg bg-bg-sunken" : "border-border-subtle hover:bg-bg-sunken"}`,
|
|
403
|
-
children: /* @__PURE__ */
|
|
429
|
+
children: /* @__PURE__ */ g("div", {
|
|
404
430
|
className: "flex items-start justify-between gap-3",
|
|
405
|
-
children: [/* @__PURE__ */
|
|
431
|
+
children: [/* @__PURE__ */ g("div", {
|
|
406
432
|
className: "text-sm",
|
|
407
|
-
children: [/* @__PURE__ */
|
|
433
|
+
children: [/* @__PURE__ */ h("p", {
|
|
408
434
|
className: "font-medium text-text-primary",
|
|
409
435
|
children: e.name
|
|
410
|
-
}), /* @__PURE__ */
|
|
436
|
+
}), /* @__PURE__ */ g("p", {
|
|
411
437
|
className: "text-text-secondary text-xs mt-0.5",
|
|
412
438
|
children: [e.carrier ? `${e.carrier} · ` : "", n ?? "Delivery time varies"]
|
|
413
439
|
})]
|
|
414
|
-
}), /* @__PURE__ */
|
|
440
|
+
}), /* @__PURE__ */ h("div", {
|
|
415
441
|
className: "text-right shrink-0",
|
|
416
|
-
children: t && M ? /* @__PURE__ */
|
|
442
|
+
children: t && M ? /* @__PURE__ */ h(l, { className: "size-4 animate-spin text-text-secondary" }) : /* @__PURE__ */ h("span", {
|
|
417
443
|
className: "text-sm font-semibold text-text-primary",
|
|
418
|
-
children: r ?
|
|
444
|
+
children: r ? y(J.cost, J.currency || S) : y(e.baseCost, e.currency || S)
|
|
419
445
|
})
|
|
420
446
|
})]
|
|
421
447
|
})
|
|
422
448
|
}, e.id);
|
|
423
449
|
})
|
|
424
|
-
}) : /* @__PURE__ */
|
|
450
|
+
}) : /* @__PURE__ */ h("p", {
|
|
425
451
|
className: "text-sm text-text-secondary",
|
|
426
452
|
children: "Select a delivery address to see options."
|
|
427
453
|
}),
|
|
428
|
-
Y && J && /* @__PURE__ */
|
|
454
|
+
Y && J && /* @__PURE__ */ g("p", {
|
|
429
455
|
className: "text-xs text-text-secondary",
|
|
430
456
|
children: [
|
|
431
457
|
"Estimated shipping: ",
|
|
432
|
-
|
|
458
|
+
y(J.cost, J.currency || S),
|
|
433
459
|
J.estimatedDeliveryDate ? ` · arrives around ${new Date(J.estimatedDeliveryDate).toLocaleDateString()}` : ""
|
|
434
460
|
]
|
|
435
461
|
})
|
|
@@ -439,6 +465,6 @@ var b = ({ storeOrderId: b, currency: x, onChange: S }) => {
|
|
|
439
465
|
});
|
|
440
466
|
};
|
|
441
467
|
//#endregion
|
|
442
|
-
export {
|
|
468
|
+
export { x as StoreShippingSection };
|
|
443
469
|
|
|
444
470
|
//# sourceMappingURL=StoreShippingSection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StoreShippingSection.js","names":[],"sources":["../../../../../src/billing/modules/checkout/components/StoreShippingSection.tsx"],"sourcesContent":["/**\n * StoreShippingSection\n * ============================================================================\n * Physical-store-order-only shipping picker rendered inside the checkout\n * left column. Lets the buyer pick (or add) a delivery address and a shipping\n * method, then fetches a DISPLAY-ONLY cost estimate. The authoritative cost is\n * recomputed and persisted server-side via `setStoreOrderShipping` at\n * proceed-to-payment time (see CheckoutPage.handleProceedToPayment).\n *\n * This component is only ever mounted for store orders that contain a PHYSICAL\n * line item, so nothing here runs on the digital/plan/addon/credits checkout\n * path.\n *\n * Field set / validation / country list mirror\n * `components/CompleteBillingAccountModal.tsx` for visual + behavioural\n * consistency (shipping adds a required recipient `fullName`).\n */\n\nimport { type FC, useEffect, useMemo, useRef, useState } from 'react';\nimport { MapPin, Truck, Plus, Loader2, Check, X } from 'lucide-react';\nimport {\n useMyShippingAddresses,\n useCreateShippingAddress,\n useShippingMethods,\n useEstimateOrderShipping,\n type ShippingAddress,\n} from '../hooks/useStoreShipping';\n\n// Mirror of CompleteBillingAccountModal COUNTRY_OPTIONS.\nconst COUNTRY_OPTIONS = [\n { value: 'IN', label: 'India' },\n { value: 'US', label: 'United States' },\n { value: 'GB', label: 'United Kingdom' },\n { value: 'AU', label: 'Australia' },\n { value: 'CA', label: 'Canada' },\n { value: 'SG', label: 'Singapore' },\n { value: 'DE', label: 'Germany' },\n { value: 'FR', label: 'France' },\n { value: 'AE', label: 'UAE' },\n];\n\nexport interface StoreShippingSelection {\n shippingAddressId: string | null;\n shippingMethodId: string | null;\n /** DISPLAY-ONLY estimate in the order currency; backend recomputes on submit. */\n shippingCost: number;\n destinationCountry: string | null;\n}\n\ninterface Props {\n storeOrderId: string;\n /** Order/checkout currency, used only for formatting the estimate. */\n currency: string;\n onChange: (selection: StoreShippingSelection) => void;\n}\n\ninterface AddressFormState {\n fullName: string;\n phone: string;\n addressLine1: string;\n addressLine2: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n}\n\ninterface AddressFormErrors {\n fullName?: string;\n addressLine1?: string;\n city?: string;\n postalCode?: string;\n country?: string;\n}\n\nconst EMPTY_FORM: AddressFormState = {\n fullName: '',\n phone: '',\n addressLine1: '',\n addressLine2: '',\n city: '',\n state: '',\n postalCode: '',\n country: 'IN',\n};\n\nfunction formatCost(amount: number, currency: string): string {\n try {\n return amount.toLocaleString('en', { style: 'currency', currency: currency || 'USD' });\n } catch {\n return `${currency || 'USD'} ${amount.toFixed(2)}`;\n }\n}\n\nfunction formatEta(minDays?: number | null, maxDays?: number | null): string | null {\n if (minDays == null && maxDays == null) return null;\n if (minDays != null && maxDays != null) {\n return minDays === maxDays ? `${minDays} days` : `${minDays}–${maxDays} days`;\n }\n const single = minDays ?? maxDays;\n return single != null ? `${single} days` : null;\n}\n\nexport const StoreShippingSection: FC<Props> = ({ storeOrderId, currency, onChange }) => {\n const {\n addresses,\n loading: addressesLoading,\n refetch: refetchAddresses,\n } = useMyShippingAddresses();\n const { createShippingAddress, loading: creatingAddress } = useCreateShippingAddress();\n const { methods, loading: methodsLoading } = useShippingMethods();\n const [runEstimate, { data: estData, loading: estimateLoading }] = useEstimateOrderShipping();\n\n const [selectedAddressId, setSelectedAddressId] = useState<string | null>(null);\n const [selectedMethodId, setSelectedMethodId] = useState<string | null>(null);\n\n const [showAddForm, setShowAddForm] = useState(false);\n const [form, setForm] = useState<AddressFormState>(EMPTY_FORM);\n const [formErrors, setFormErrors] = useState<AddressFormErrors>({});\n const [formServerError, setFormServerError] = useState<string | null>(null);\n\n // Keep onChange in a ref so the emit effect never depends on its identity.\n const onChangeRef = useRef(onChange);\n useEffect(() => {\n onChangeRef.current = onChange;\n });\n\n const selectedAddress = useMemo<ShippingAddress | undefined>(\n () => addresses.find((a) => a.id === selectedAddressId),\n [addresses, selectedAddressId]\n );\n\n // Methods available for the selected address' destination country.\n // Empty availableCountries is treated as \"available everywhere\".\n const availableMethods = useMemo(() => {\n if (!selectedAddress) return [];\n const country = selectedAddress.country;\n return methods\n .filter(\n (m) =>\n m.isActive &&\n (m.availableCountries.length === 0 || m.availableCountries.includes(country)) &&\n !m.excludedCountries.includes(country)\n )\n .sort((a, b) => a.displayOrder - b.displayOrder);\n }, [methods, selectedAddress]);\n\n // Default the address selection to the user's default (or first) address.\n useEffect(() => {\n if (!selectedAddressId && addresses.length > 0) {\n const preferred = addresses.find((a) => a.isDefault) ?? addresses[0];\n setSelectedAddressId(preferred.id);\n }\n }, [addresses, selectedAddressId]);\n\n // Drop a selected method that is no longer valid for the chosen destination.\n useEffect(() => {\n if (selectedMethodId && !availableMethods.some((m) => m.id === selectedMethodId)) {\n setSelectedMethodId(null);\n }\n }, [availableMethods, selectedMethodId]);\n\n // Fetch a fresh estimate whenever address + method are both chosen.\n useEffect(() => {\n if (selectedAddress && selectedMethodId) {\n void runEstimate({\n variables: {\n input: {\n orderId: storeOrderId,\n shippingMethodId: selectedMethodId,\n destinationCountry: selectedAddress.country,\n destinationPostalCode: selectedAddress.postalCode,\n },\n },\n });\n }\n }, [\n selectedAddress?.id,\n selectedAddress?.country,\n selectedAddress?.postalCode,\n selectedMethodId,\n storeOrderId,\n runEstimate,\n selectedAddress,\n ]);\n\n const estimate = estData?.estimateOrderShipping;\n const estimateReady = Boolean(\n selectedAddressId &&\n selectedMethodId &&\n !estimateLoading &&\n estimate &&\n estimate.shippingMethodId === selectedMethodId\n );\n\n // Emit the current selection upward. Method id + cost are only surfaced once a\n // matching estimate has resolved, so the parent's proceed gate stays disabled\n // while an estimate is in flight (free shipping resolves with cost 0, which is\n // still \"ready\").\n useEffect(() => {\n onChangeRef.current({\n shippingAddressId: selectedAddressId,\n shippingMethodId: estimateReady ? selectedMethodId : null,\n shippingCost: estimateReady && estimate ? estimate.cost : 0,\n destinationCountry: selectedAddress?.country ?? null,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- emit derived selection; estimate object identity excluded intentionally\n }, [\n selectedAddressId,\n selectedMethodId,\n estimateReady,\n estimate?.cost,\n selectedAddress?.country,\n ]);\n\n const setField = (field: keyof AddressFormState, value: string) =>\n setForm((prev) => ({ ...prev, [field]: value }));\n\n const validateForm = (): boolean => {\n const e: AddressFormErrors = {};\n if (!form.fullName.trim()) e.fullName = 'Recipient name is required';\n if (!form.addressLine1.trim()) e.addressLine1 = 'Street address is required';\n if (!form.city.trim()) e.city = 'City is required';\n if (!form.postalCode.trim()) e.postalCode = 'Postal code is required';\n if (!form.country.trim()) e.country = 'Country is required';\n setFormErrors(e);\n return Object.keys(e).length === 0;\n };\n\n const handleCreateAddress = async () => {\n if (!validateForm()) return;\n setFormServerError(null);\n try {\n const created = await createShippingAddress({\n fullName: form.fullName.trim(),\n ...(form.phone.trim() ? { phone: form.phone.trim() } : {}),\n addressLine1: form.addressLine1.trim(),\n ...(form.addressLine2.trim() ? { addressLine2: form.addressLine2.trim() } : {}),\n city: form.city.trim(),\n ...(form.state.trim() ? { state: form.state.trim() } : {}),\n postalCode: form.postalCode.trim(),\n country: form.country,\n isDefault: addresses.length === 0,\n });\n if (!created) {\n setFormServerError('Failed to save address. Please try again.');\n return;\n }\n await refetchAddresses();\n setSelectedAddressId(created.id);\n setSelectedMethodId(null);\n setForm(EMPTY_FORM);\n setFormErrors({});\n setShowAddForm(false);\n } catch {\n setFormServerError('Failed to save address. Please try again.');\n }\n };\n\n const inputClass = (hasError: boolean) =>\n `w-full px-3 py-2 text-sm border rounded-input bg-bg-surface text-text-primary placeholder:text-text-placeholder focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] ${\n hasError ? 'border-status-error-border' : 'border-border-subtle'\n }`;\n\n return (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6 space-y-5\">\n <div className=\"flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Truck className=\"size-4 text-text-secondary\" />\n Shipping\n </div>\n\n {/* Delivery address */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <MapPin className=\"size-4 text-text-secondary\" />\n Delivery address\n </div>\n {!showAddForm && (\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(true);\n setFormServerError(null);\n }}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-text-link hover:underline\"\n >\n <Plus className=\"size-3.5\" />\n Add address\n </button>\n )}\n </div>\n\n {addressesLoading && addresses.length === 0 ? (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Loader2 className=\"size-4 animate-spin\" />\n Loading addresses…\n </div>\n ) : (\n <>\n {addresses.length === 0 && !showAddForm && (\n <p className=\"text-sm text-text-secondary\">\n No saved delivery addresses yet. Add one to continue.\n </p>\n )}\n {addresses.length > 0 && (\n <div className=\"space-y-2\">\n {addresses.map((addr) => {\n const selected = addr.id === selectedAddressId;\n return (\n <button\n key={addr.id}\n type=\"button\"\n onClick={() => {\n setSelectedAddressId(addr.id);\n setSelectedMethodId(null);\n }}\n className={`w-full text-left p-3 rounded-input border transition-colors ${\n selected\n ? 'border-action-primary-bg bg-bg-sunken'\n : 'border-border-subtle hover:bg-bg-sunken'\n }`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">\n {addr.fullName}\n {addr.label ? (\n <span className=\"ml-2 text-xs text-text-muted\">({addr.label})</span>\n ) : null}\n </p>\n <p className=\"text-text-secondary text-xs mt-0.5\">\n {[\n addr.addressLine1,\n addr.addressLine2,\n addr.city,\n addr.state,\n addr.postalCode,\n addr.country,\n ]\n .filter(Boolean)\n .join(', ')}\n </p>\n {addr.phone && (\n <p className=\"text-text-muted text-xs mt-0.5\">{addr.phone}</p>\n )}\n </div>\n {selected && (\n <Check className=\"size-4 text-action-primary-bg shrink-0 mt-0.5\" />\n )}\n </div>\n </button>\n );\n })}\n </div>\n )}\n </>\n )}\n\n {/* Inline add-address form */}\n {showAddForm && (\n <div className=\"rounded-input border border-border-subtle p-3 space-y-3 bg-bg-sunken\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-primary\">New delivery address</span>\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(false);\n setFormErrors({});\n setFormServerError(null);\n }}\n className=\"p-1 text-text-secondary hover:text-text-primary rounded-button\"\n >\n <X className=\"size-4\" />\n </button>\n </div>\n\n {formServerError && (\n <div className=\"p-2 rounded-lg bg-status-error-bg-subtle border border-status-error-border text-xs text-status-error-text\">\n {formServerError}\n </div>\n )}\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Recipient name</label>\n <input\n type=\"text\"\n value={form.fullName}\n onChange={(e) => setField('fullName', e.target.value)}\n placeholder=\"Jane Doe\"\n className={inputClass(Boolean(formErrors.fullName))}\n />\n {formErrors.fullName && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.fullName}</p>\n )}\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n Phone <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"tel\"\n value={form.phone}\n onChange={(e) => setField('phone', e.target.value)}\n placeholder=\"+91 98765 43210\"\n className={inputClass(false)}\n />\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Country</label>\n <select\n value={form.country}\n onChange={(e) => setField('country', e.target.value)}\n className={inputClass(Boolean(formErrors.country))}\n >\n {COUNTRY_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>\n {c.label}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Street address</label>\n <input\n type=\"text\"\n value={form.addressLine1}\n onChange={(e) => setField('addressLine1', e.target.value)}\n placeholder=\"123 Main St\"\n className={inputClass(Boolean(formErrors.addressLine1))}\n />\n {formErrors.addressLine1 && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.addressLine1}</p>\n )}\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n Apartment, suite, etc. <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={form.addressLine2}\n onChange={(e) => setField('addressLine2', e.target.value)}\n placeholder=\"Apt 4B\"\n className={inputClass(false)}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">City</label>\n <input\n type=\"text\"\n value={form.city}\n onChange={(e) => setField('city', e.target.value)}\n placeholder=\"Mumbai\"\n className={inputClass(Boolean(formErrors.city))}\n />\n {formErrors.city && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.city}</p>\n )}\n </div>\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n State <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={form.state}\n onChange={(e) => setField('state', e.target.value)}\n placeholder=\"Maharashtra\"\n className={inputClass(false)}\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Postal code</label>\n <input\n type=\"text\"\n value={form.postalCode}\n onChange={(e) => setField('postalCode', e.target.value)}\n placeholder=\"400001\"\n className={inputClass(Boolean(formErrors.postalCode))}\n />\n {formErrors.postalCode && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.postalCode}</p>\n )}\n </div>\n\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={handleCreateAddress}\n disabled={creatingAddress}\n className=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-action-primary-text bg-action-primary-bg hover:bg-action-primary-bgHover rounded-lg transition-colors disabled:opacity-50\"\n >\n {creatingAddress && <Loader2 className=\"size-4 animate-spin\" />}\n Save address\n </button>\n </div>\n </div>\n )}\n </section>\n\n {/* Shipping method */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <Truck className=\"size-4 text-text-secondary\" />\n Shipping method\n </div>\n\n {!selectedAddress ? (\n <p className=\"text-sm text-text-secondary\">Select a delivery address to see options.</p>\n ) : methodsLoading && methods.length === 0 ? (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Loader2 className=\"size-4 animate-spin\" />\n Loading options…\n </div>\n ) : availableMethods.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n No shipping methods available for {selectedAddress.country}. Try a different address.\n </p>\n ) : (\n <div className=\"space-y-2\">\n {availableMethods.map((method) => {\n const selected = method.id === selectedMethodId;\n const eta = formatEta(method.estimatedMinDays, method.estimatedMaxDays);\n const showEstimate = selected && estimateReady && estimate;\n return (\n <button\n key={method.id}\n type=\"button\"\n onClick={() => setSelectedMethodId(method.id)}\n className={`w-full text-left p-3 rounded-input border transition-colors ${\n selected\n ? 'border-action-primary-bg bg-bg-sunken'\n : 'border-border-subtle hover:bg-bg-sunken'\n }`}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">{method.name}</p>\n <p className=\"text-text-secondary text-xs mt-0.5\">\n {method.carrier ? `${method.carrier} · ` : ''}\n {eta ?? 'Delivery time varies'}\n </p>\n </div>\n <div className=\"text-right shrink-0\">\n {selected && estimateLoading ? (\n <Loader2 className=\"size-4 animate-spin text-text-secondary\" />\n ) : (\n <span className=\"text-sm font-semibold text-text-primary\">\n {showEstimate\n ? formatCost(estimate.cost, estimate.currency || currency)\n : formatCost(method.baseCost, method.currency || currency)}\n </span>\n )}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n\n {estimateReady && estimate && (\n <p className=\"text-xs text-text-secondary\">\n Estimated shipping: {formatCost(estimate.cost, estimate.currency || currency)}\n {estimate.estimatedDeliveryDate\n ? ` · arrives around ${new Date(estimate.estimatedDeliveryDate).toLocaleDateString()}`\n : ''}\n </p>\n )}\n </section>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"StoreShippingSection.js","names":[],"sources":["../../../../../src/billing/modules/checkout/components/StoreShippingSection.tsx"],"sourcesContent":["/**\n * StoreShippingSection\n * ============================================================================\n * Physical-store-order-only shipping picker rendered inside the checkout\n * left column. Lets the buyer pick (or add) a delivery address and a shipping\n * method, then fetches a DISPLAY-ONLY cost estimate. The authoritative cost is\n * recomputed and persisted server-side via `setStoreOrderShipping` at\n * proceed-to-payment time (see CheckoutPage.handleProceedToPayment).\n *\n * This component is only ever mounted for store orders that contain a PHYSICAL\n * line item, so nothing here runs on the digital/plan/addon/credits checkout\n * path.\n *\n * Field set / validation / country list mirror\n * `components/CompleteBillingAccountModal.tsx` for visual + behavioural\n * consistency (shipping adds a required recipient `fullName`).\n */\n\nimport { type FC, useEffect, useMemo, useRef, useState } from 'react';\nimport { MapPin, Truck, Plus, Loader2, Check, X } from 'lucide-react';\nimport {\n useMyShippingAddresses,\n useCreateShippingAddress,\n useShippingMethods,\n useEstimateOrderShipping,\n type ShippingAddress,\n} from '../hooks/useStoreShipping';\n\n// Mirror of CompleteBillingAccountModal COUNTRY_OPTIONS.\nconst COUNTRY_OPTIONS = [\n { value: 'IN', label: 'India' },\n { value: 'US', label: 'United States' },\n { value: 'GB', label: 'United Kingdom' },\n { value: 'AU', label: 'Australia' },\n { value: 'CA', label: 'Canada' },\n { value: 'SG', label: 'Singapore' },\n { value: 'DE', label: 'Germany' },\n { value: 'FR', label: 'France' },\n { value: 'AE', label: 'UAE' },\n];\n\nexport interface StoreShippingSelection {\n shippingAddressId: string | null;\n shippingMethodId: string | null;\n /** DISPLAY-ONLY estimate in the order currency; backend recomputes on submit. */\n shippingCost: number;\n destinationCountry: string | null;\n}\n\ninterface Props {\n storeOrderId: string;\n /** Order/checkout currency, used only for formatting the estimate. */\n currency: string;\n onChange: (selection: StoreShippingSelection) => void;\n}\n\ninterface AddressFormState {\n fullName: string;\n phone: string;\n addressLine1: string;\n addressLine2: string;\n city: string;\n state: string;\n postalCode: string;\n country: string;\n}\n\ninterface AddressFormErrors {\n fullName?: string;\n addressLine1?: string;\n city?: string;\n postalCode?: string;\n country?: string;\n}\n\nconst EMPTY_FORM: AddressFormState = {\n fullName: '',\n phone: '',\n addressLine1: '',\n addressLine2: '',\n city: '',\n state: '',\n postalCode: '',\n country: 'IN',\n};\n\nfunction formatCost(amount: number, currency: string): string {\n try {\n return amount.toLocaleString('en', { style: 'currency', currency: currency || 'USD' });\n } catch {\n return `${currency || 'USD'} ${amount.toFixed(2)}`;\n }\n}\n\nfunction formatEta(minDays?: number | null, maxDays?: number | null): string | null {\n if (minDays == null && maxDays == null) return null;\n if (minDays != null && maxDays != null) {\n return minDays === maxDays ? `${minDays} days` : `${minDays}–${maxDays} days`;\n }\n const single = minDays ?? maxDays;\n return single != null ? `${single} days` : null;\n}\n\nexport const StoreShippingSection: FC<Props> = ({ storeOrderId, currency, onChange }) => {\n const {\n addresses,\n loading: addressesLoading,\n refetch: refetchAddresses,\n } = useMyShippingAddresses();\n const { createShippingAddress, loading: creatingAddress } = useCreateShippingAddress();\n const { methods, loading: methodsLoading } = useShippingMethods();\n const [runEstimate, { data: estData, loading: estimateLoading }] = useEstimateOrderShipping();\n\n const [selectedAddressId, setSelectedAddressId] = useState<string | null>(null);\n const [selectedMethodId, setSelectedMethodId] = useState<string | null>(null);\n\n const [showAddForm, setShowAddForm] = useState(false);\n const [form, setForm] = useState<AddressFormState>(EMPTY_FORM);\n const [formErrors, setFormErrors] = useState<AddressFormErrors>({});\n const [formServerError, setFormServerError] = useState<string | null>(null);\n\n // Keep onChange in a ref so the emit effect never depends on its identity.\n const onChangeRef = useRef(onChange);\n useEffect(() => {\n onChangeRef.current = onChange;\n });\n\n const selectedAddress = useMemo<ShippingAddress | undefined>(\n () => addresses.find((a) => a.id === selectedAddressId),\n [addresses, selectedAddressId]\n );\n\n // Methods available for the selected address' destination country.\n // Empty availableCountries is treated as \"available everywhere\".\n const availableMethods = useMemo(() => {\n if (!selectedAddress) return [];\n const country = selectedAddress.country;\n return methods\n .filter(\n (m) =>\n m.isActive &&\n (m.availableCountries.length === 0 || m.availableCountries.includes(country)) &&\n !m.excludedCountries.includes(country)\n )\n .sort((a, b) => a.displayOrder - b.displayOrder);\n }, [methods, selectedAddress]);\n\n // Default the address selection to the user's default (or first) address.\n useEffect(() => {\n if (!selectedAddressId && addresses.length > 0) {\n const preferred = addresses.find((a) => a.isDefault) ?? addresses[0];\n setSelectedAddressId(preferred.id);\n }\n }, [addresses, selectedAddressId]);\n\n // Drop a selected method that is no longer valid for the chosen destination.\n useEffect(() => {\n if (selectedMethodId && !availableMethods.some((m) => m.id === selectedMethodId)) {\n setSelectedMethodId(null);\n }\n }, [availableMethods, selectedMethodId]);\n\n // Default the method selection when there's exactly one option — nothing to\n // actually choose between, so don't make the buyer click it.\n useEffect(() => {\n if (!selectedMethodId && availableMethods.length === 1) {\n setSelectedMethodId(availableMethods[0].id);\n }\n }, [availableMethods, selectedMethodId]);\n\n // Fetch a fresh estimate whenever address + method are both chosen.\n useEffect(() => {\n if (selectedAddress && selectedMethodId) {\n void runEstimate({\n variables: {\n input: {\n orderId: storeOrderId,\n shippingMethodId: selectedMethodId,\n destinationCountry: selectedAddress.country,\n destinationPostalCode: selectedAddress.postalCode,\n },\n },\n });\n }\n }, [\n selectedAddress?.id,\n selectedAddress?.country,\n selectedAddress?.postalCode,\n selectedMethodId,\n storeOrderId,\n runEstimate,\n selectedAddress,\n ]);\n\n const estimate = estData?.estimateOrderShipping;\n const estimateReady = Boolean(\n selectedAddressId &&\n selectedMethodId &&\n !estimateLoading &&\n estimate &&\n estimate.shippingMethodId === selectedMethodId\n );\n\n // Emit the current selection upward. Method id + cost are only surfaced once a\n // matching estimate has resolved, so the parent's proceed gate stays disabled\n // while an estimate is in flight (free shipping resolves with cost 0, which is\n // still \"ready\").\n useEffect(() => {\n onChangeRef.current({\n shippingAddressId: selectedAddressId,\n shippingMethodId: estimateReady ? selectedMethodId : null,\n shippingCost: estimateReady && estimate ? estimate.cost : 0,\n destinationCountry: selectedAddress?.country ?? null,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps -- emit derived selection; estimate object identity excluded intentionally\n }, [\n selectedAddressId,\n selectedMethodId,\n estimateReady,\n estimate?.cost,\n selectedAddress?.country,\n ]);\n\n const setField = (field: keyof AddressFormState, value: string) =>\n setForm((prev) => ({ ...prev, [field]: value }));\n\n const validateForm = (): boolean => {\n const e: AddressFormErrors = {};\n if (!form.fullName.trim()) e.fullName = 'Recipient name is required';\n if (!form.addressLine1.trim()) e.addressLine1 = 'Street address is required';\n if (!form.city.trim()) e.city = 'City is required';\n if (!form.postalCode.trim()) e.postalCode = 'Postal code is required';\n if (!form.country.trim()) e.country = 'Country is required';\n setFormErrors(e);\n return Object.keys(e).length === 0;\n };\n\n const handleCreateAddress = async () => {\n if (!validateForm()) return;\n setFormServerError(null);\n try {\n const created = await createShippingAddress({\n fullName: form.fullName.trim(),\n ...(form.phone.trim() ? { phone: form.phone.trim() } : {}),\n addressLine1: form.addressLine1.trim(),\n ...(form.addressLine2.trim() ? { addressLine2: form.addressLine2.trim() } : {}),\n city: form.city.trim(),\n ...(form.state.trim() ? { state: form.state.trim() } : {}),\n postalCode: form.postalCode.trim(),\n country: form.country,\n isDefault: addresses.length === 0,\n });\n if (!created) {\n setFormServerError('Failed to save address. Please try again.');\n return;\n }\n await refetchAddresses();\n setSelectedAddressId(created.id);\n setSelectedMethodId(null);\n setForm(EMPTY_FORM);\n setFormErrors({});\n setShowAddForm(false);\n } catch {\n setFormServerError('Failed to save address. Please try again.');\n }\n };\n\n const inputClass = (hasError: boolean) =>\n `w-full px-3 py-2 text-sm border rounded-input bg-bg-surface text-text-primary placeholder:text-text-placeholder focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] ${\n hasError ? 'border-status-error-border' : 'border-border-subtle'\n }`;\n\n return (\n <div className=\"rounded-lg border border-border-subtle bg-bg-surface p-4 sm:p-6 space-y-5\">\n <div className=\"flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Truck className=\"size-4 text-text-secondary\" />\n Shipping\n </div>\n\n {/* Delivery address */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <MapPin className=\"size-4 text-text-secondary\" />\n Delivery address\n </div>\n {!showAddForm && (\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(true);\n setFormServerError(null);\n }}\n className=\"inline-flex items-center gap-1 text-xs font-medium text-text-link hover:underline\"\n >\n <Plus className=\"size-3.5\" />\n Add address\n </button>\n )}\n </div>\n\n {addressesLoading && addresses.length === 0 ? (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Loader2 className=\"size-4 animate-spin\" />\n Loading addresses…\n </div>\n ) : (\n <>\n {addresses.length === 0 && !showAddForm && (\n <p className=\"text-sm text-text-secondary\">\n No saved delivery addresses yet. Add one to continue.\n </p>\n )}\n {addresses.length > 0 && (\n <div className=\"space-y-2\">\n {addresses.map((addr) => {\n const selected = addr.id === selectedAddressId;\n return (\n <button\n key={addr.id}\n type=\"button\"\n onClick={() => {\n setSelectedAddressId(addr.id);\n setSelectedMethodId(null);\n }}\n className={`w-full text-left p-3 rounded-input border transition-colors ${\n selected\n ? 'border-action-primary-bg bg-bg-sunken'\n : 'border-border-subtle hover:bg-bg-sunken'\n }`}\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">\n {addr.fullName}\n {addr.label ? (\n <span className=\"ml-2 text-xs text-text-muted\">({addr.label})</span>\n ) : null}\n </p>\n <p className=\"text-text-secondary text-xs mt-0.5\">\n {[\n addr.addressLine1,\n addr.addressLine2,\n addr.city,\n addr.state,\n addr.postalCode,\n addr.country,\n ]\n .filter(Boolean)\n .join(', ')}\n </p>\n {addr.phone && (\n <p className=\"text-text-muted text-xs mt-0.5\">{addr.phone}</p>\n )}\n </div>\n {selected && (\n <Check className=\"size-4 text-action-primary-bg shrink-0 mt-0.5\" />\n )}\n </div>\n </button>\n );\n })}\n </div>\n )}\n </>\n )}\n\n {/* Inline add-address form */}\n {showAddForm && (\n <div className=\"rounded-input border border-border-subtle p-3 space-y-3 bg-bg-sunken\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-primary\">New delivery address</span>\n <button\n type=\"button\"\n onClick={() => {\n setShowAddForm(false);\n setFormErrors({});\n setFormServerError(null);\n }}\n className=\"p-1 text-text-secondary hover:text-text-primary rounded-button\"\n >\n <X className=\"size-4\" />\n </button>\n </div>\n\n {formServerError && (\n <div className=\"p-2 rounded-lg bg-status-error-bg-subtle border border-status-error-border text-xs text-status-error-text\">\n {formServerError}\n </div>\n )}\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Recipient name</label>\n <input\n type=\"text\"\n value={form.fullName}\n onChange={(e) => setField('fullName', e.target.value)}\n placeholder=\"Jane Doe\"\n className={inputClass(Boolean(formErrors.fullName))}\n />\n {formErrors.fullName && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.fullName}</p>\n )}\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n Phone <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"tel\"\n value={form.phone}\n onChange={(e) => setField('phone', e.target.value)}\n placeholder=\"+91 98765 43210\"\n className={inputClass(false)}\n />\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Country</label>\n <select\n value={form.country}\n onChange={(e) => setField('country', e.target.value)}\n className={inputClass(Boolean(formErrors.country))}\n >\n {COUNTRY_OPTIONS.map((c) => (\n <option key={c.value} value={c.value}>\n {c.label}\n </option>\n ))}\n </select>\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Street address</label>\n <input\n type=\"text\"\n value={form.addressLine1}\n onChange={(e) => setField('addressLine1', e.target.value)}\n placeholder=\"123 Main St\"\n className={inputClass(Boolean(formErrors.addressLine1))}\n />\n {formErrors.addressLine1 && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.addressLine1}</p>\n )}\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n Apartment, suite, etc. <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={form.addressLine2}\n onChange={(e) => setField('addressLine2', e.target.value)}\n placeholder=\"Apt 4B\"\n className={inputClass(false)}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">City</label>\n <input\n type=\"text\"\n value={form.city}\n onChange={(e) => setField('city', e.target.value)}\n placeholder=\"Mumbai\"\n className={inputClass(Boolean(formErrors.city))}\n />\n {formErrors.city && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.city}</p>\n )}\n </div>\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">\n State <span className=\"text-text-muted\">(optional)</span>\n </label>\n <input\n type=\"text\"\n value={form.state}\n onChange={(e) => setField('state', e.target.value)}\n placeholder=\"Maharashtra\"\n className={inputClass(false)}\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-xs text-text-secondary mb-1\">Postal code</label>\n <input\n type=\"text\"\n value={form.postalCode}\n onChange={(e) => setField('postalCode', e.target.value)}\n placeholder=\"400001\"\n className={inputClass(Boolean(formErrors.postalCode))}\n />\n {formErrors.postalCode && (\n <p className=\"mt-1 text-xs text-status-error-text\">{formErrors.postalCode}</p>\n )}\n </div>\n\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={handleCreateAddress}\n disabled={creatingAddress}\n className=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-action-primary-text bg-action-primary-bg hover:bg-action-primary-bgHover rounded-lg transition-colors disabled:opacity-50\"\n >\n {creatingAddress && <Loader2 className=\"size-4 animate-spin\" />}\n Save address\n </button>\n </div>\n </div>\n )}\n </section>\n\n {/* Shipping method */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-text-primary\">\n <Truck className=\"size-4 text-text-secondary\" />\n Shipping method\n </div>\n\n {!selectedAddress ? (\n <p className=\"text-sm text-text-secondary\">Select a delivery address to see options.</p>\n ) : methodsLoading && methods.length === 0 ? (\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Loader2 className=\"size-4 animate-spin\" />\n Loading options…\n </div>\n ) : availableMethods.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n No shipping methods available for {selectedAddress.country}. Try a different address.\n </p>\n ) : availableMethods.length === 1 ? (\n (() => {\n const method = availableMethods[0];\n const eta = formatEta(method.estimatedMinDays, method.estimatedMaxDays);\n const showEstimate = estimateReady && estimate;\n return (\n <div className=\"w-full p-3 rounded-input border border-action-primary-bg bg-bg-sunken\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">{method.name}</p>\n <p className=\"text-text-secondary text-xs mt-0.5\">\n {method.carrier ? `${method.carrier} · ` : ''}\n {eta ?? 'Delivery time varies'}\n </p>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {estimateLoading ? (\n <Loader2 className=\"size-4 animate-spin text-text-secondary\" />\n ) : (\n <span className=\"text-sm font-semibold text-text-primary\">\n {showEstimate\n ? formatCost(estimate.cost, estimate.currency || currency)\n : formatCost(method.baseCost, method.currency || currency)}\n </span>\n )}\n <Check className=\"size-4 text-action-primary-bg\" />\n </div>\n </div>\n </div>\n );\n })()\n ) : (\n <div className=\"space-y-2\">\n {availableMethods.map((method) => {\n const selected = method.id === selectedMethodId;\n const eta = formatEta(method.estimatedMinDays, method.estimatedMaxDays);\n const showEstimate = selected && estimateReady && estimate;\n return (\n <button\n key={method.id}\n type=\"button\"\n onClick={() => setSelectedMethodId(method.id)}\n className={`w-full text-left p-3 rounded-input border transition-colors ${\n selected\n ? 'border-action-primary-bg bg-bg-sunken'\n : 'border-border-subtle hover:bg-bg-sunken'\n }`}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"text-sm\">\n <p className=\"font-medium text-text-primary\">{method.name}</p>\n <p className=\"text-text-secondary text-xs mt-0.5\">\n {method.carrier ? `${method.carrier} · ` : ''}\n {eta ?? 'Delivery time varies'}\n </p>\n </div>\n <div className=\"text-right shrink-0\">\n {selected && estimateLoading ? (\n <Loader2 className=\"size-4 animate-spin text-text-secondary\" />\n ) : (\n <span className=\"text-sm font-semibold text-text-primary\">\n {showEstimate\n ? formatCost(estimate.cost, estimate.currency || currency)\n : formatCost(method.baseCost, method.currency || currency)}\n </span>\n )}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n )}\n\n {estimateReady && estimate && (\n <p className=\"text-xs text-text-secondary\">\n Estimated shipping: {formatCost(estimate.cost, estimate.currency || currency)}\n {estimate.estimatedDeliveryDate\n ? ` · arrives around ${new Date(estimate.estimatedDeliveryDate).toLocaleDateString()}`\n : ''}\n </p>\n )}\n </section>\n </div>\n );\n};\n"],"mappings":";;;;;AA6BA,IAAM,IAAkB;CACtB;EAAE,OAAO;EAAM,OAAO;CAAQ;CAC9B;EAAE,OAAO;EAAM,OAAO;CAAgB;CACtC;EAAE,OAAO;EAAM,OAAO;CAAiB;CACvC;EAAE,OAAO;EAAM,OAAO;CAAY;CAClC;EAAE,OAAO;EAAM,OAAO;CAAS;CAC/B;EAAE,OAAO;EAAM,OAAO;CAAY;CAClC;EAAE,OAAO;EAAM,OAAO;CAAU;CAChC;EAAE,OAAO;EAAM,OAAO;CAAS;CAC/B;EAAE,OAAO;EAAM,OAAO;CAAM;AAC9B,GAoCM,IAA+B;CACnC,UAAU;CACV,OAAO;CACP,cAAc;CACd,cAAc;CACd,MAAM;CACN,OAAO;CACP,YAAY;CACZ,SAAS;AACX;AAEA,SAAS,EAAW,GAAgB,GAA0B;CAC5D,IAAI;EACF,OAAO,EAAO,eAAe,MAAM;GAAE,OAAO;GAAY,UAAU,KAAY;EAAM,CAAC;CACvF,QAAQ;EACN,OAAO,GAAG,KAAY,MAAM,GAAG,EAAO,QAAQ,CAAC;CACjD;AACF;AAEA,SAAS,EAAU,GAAyB,GAAwC;CAClF,IAAI,KAAW,QAAQ,KAAW,MAAM,OAAO;CAC/C,IAAI,KAAW,QAAQ,KAAW,MAChC,OAAO,MAAY,IAAU,GAAG,EAAQ,SAAS,GAAG,EAAQ,GAAG,EAAQ;CAEzE,IAAM,IAAS,KAAW;CAC1B,OAAO,KAAU,OAA0B,OAAnB,GAAG,EAAO;AACpC;AAEA,IAAa,KAAmC,EAAE,iBAAc,aAAU,kBAAe;CACvF,IAAM,EACJ,cACA,SAAS,GACT,SAAS,MACP,EAAuB,GACrB,EAAE,0BAAuB,SAAS,MAAoB,EAAyB,GAC/E,EAAE,YAAS,SAAS,OAAmB,EAAmB,GAC1D,CAAC,GAAa,EAAE,MAAM,GAAS,SAAS,OAAqB,EAAyB,GAEtF,CAAC,GAAmB,KAAwB,EAAwB,IAAI,GACxE,CAAC,GAAkB,KAAuB,EAAwB,IAAI,GAEtE,CAAC,GAAa,KAAkB,EAAS,EAAK,GAC9C,CAAC,GAAM,KAAW,EAA2B,CAAU,GACvD,CAAC,GAAY,KAAiB,EAA4B,CAAC,CAAC,GAC5D,CAAC,GAAiB,KAAsB,EAAwB,IAAI,GAGpE,IAAc,EAAO,CAAQ;CACnC,QAAgB;EACd,EAAY,UAAU;CACxB,CAAC;CAED,IAAM,IAAkB,QAChB,EAAU,MAAM,MAAM,EAAE,OAAO,CAAiB,GACtD,CAAC,GAAW,CAAiB,CAC/B,GAIM,IAAmB,QAAc;EACrC,IAAI,CAAC,GAAiB,OAAO,CAAC;EAC9B,IAAM,IAAU,EAAgB;EAChC,OAAO,EACJ,QACE,MACC,EAAE,aACD,EAAE,mBAAmB,WAAW,KAAK,EAAE,mBAAmB,SAAS,CAAO,MAC3E,CAAC,EAAE,kBAAkB,SAAS,CAAO,CACzC,EACC,MAAM,GAAG,MAAM,EAAE,eAAe,EAAE,YAAY;CACnD,GAAG,CAAC,GAAS,CAAe,CAAC;CA0B7B,AAvBA,QAAgB;EACd,AAAI,CAAC,KAAqB,EAAU,SAAS,KAE3C,GADkB,EAAU,MAAM,MAAM,EAAE,SAAS,KAAK,EAAU,IACnC,EAAE;CAErC,GAAG,CAAC,GAAW,CAAiB,CAAC,GAGjC,QAAgB;EACd,AAAI,KAAoB,CAAC,EAAiB,MAAM,MAAM,EAAE,OAAO,CAAgB,KAC7E,EAAoB,IAAI;CAE5B,GAAG,CAAC,GAAkB,CAAgB,CAAC,GAIvC,QAAgB;EACd,AAAI,CAAC,KAAoB,EAAiB,WAAW,KACnD,EAAoB,EAAiB,GAAG,EAAE;CAE9C,GAAG,CAAC,GAAkB,CAAgB,CAAC,GAGvC,QAAgB;EACd,AAAI,KAAmB,KACrB,EAAiB,EACf,WAAW,EACT,OAAO;GACL,SAAS;GACT,kBAAkB;GAClB,oBAAoB,EAAgB;GACpC,uBAAuB,EAAgB;EACzC,EACF,EACF,CAAC;CAEL,GAAG;EACD,GAAiB;EACjB,GAAiB;EACjB,GAAiB;EACjB;EACA;EACA;EACA;CACF,CAAC;CAED,IAAM,IAAW,GAAS,uBACpB,IAAgB,GACpB,KACA,KACA,CAAC,KACD,KACA,EAAS,qBAAqB;CAOhC,QAAgB;EACd,EAAY,QAAQ;GAClB,mBAAmB;GACnB,kBAAkB,IAAgB,IAAmB;GACrD,cAAc,KAAiB,IAAW,EAAS,OAAO;GAC1D,oBAAoB,GAAiB,WAAW;EAClD,CAAC;CAEH,GAAG;EACD;EACA;EACA;EACA,GAAU;EACV,GAAiB;CACnB,CAAC;CAED,IAAM,KAAY,GAA+B,MAC/C,GAAS,OAAU;EAAE,GAAG;GAAO,IAAQ;CAAM,EAAE,GAE3C,UAA8B;EAClC,IAAM,IAAuB,CAAC;EAO9B,OANK,EAAK,SAAS,KAAK,MAAG,EAAE,WAAW,+BACnC,EAAK,aAAa,KAAK,MAAG,EAAE,eAAe,+BAC3C,EAAK,KAAK,KAAK,MAAG,EAAE,OAAO,qBAC3B,EAAK,WAAW,KAAK,MAAG,EAAE,aAAa,4BACvC,EAAK,QAAQ,KAAK,MAAG,EAAE,UAAU,wBACtC,EAAc,CAAC,GACR,OAAO,KAAK,CAAC,EAAE,WAAW;CACnC,GAEM,IAAsB,YAAY;EACjC,MAAa,GAClB;KAAmB,IAAI;GACvB,IAAI;IACF,IAAM,IAAU,MAAM,EAAsB;KAC1C,UAAU,EAAK,SAAS,KAAK;KAC7B,GAAI,EAAK,MAAM,KAAK,IAAI,EAAE,OAAO,EAAK,MAAM,KAAK,EAAE,IAAI,CAAC;KACxD,cAAc,EAAK,aAAa,KAAK;KACrC,GAAI,EAAK,aAAa,KAAK,IAAI,EAAE,cAAc,EAAK,aAAa,KAAK,EAAE,IAAI,CAAC;KAC7E,MAAM,EAAK,KAAK,KAAK;KACrB,GAAI,EAAK,MAAM,KAAK,IAAI,EAAE,OAAO,EAAK,MAAM,KAAK,EAAE,IAAI,CAAC;KACxD,YAAY,EAAK,WAAW,KAAK;KACjC,SAAS,EAAK;KACd,WAAW,EAAU,WAAW;IAClC,CAAC;IACD,IAAI,CAAC,GAAS;KACZ,EAAmB,2CAA2C;KAC9D;IACF;IAMA,AALA,MAAM,EAAiB,GACvB,EAAqB,EAAQ,EAAE,GAC/B,EAAoB,IAAI,GACxB,EAAQ,CAAU,GAClB,EAAc,CAAC,CAAC,GAChB,EAAe,EAAK;GACtB,QAAQ;IACN,EAAmB,2CAA2C;GAChE;EAzBuB;CA0BzB,GAEM,KAAc,MAClB,wLACE,IAAW,+BAA+B;CAG9C,OACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAO,WAAU,6BAA8B,CAAA,GAAC,UAE7C;;GAGL,kBAAC,WAAD;IAAS,WAAU;cAAnB;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,6BAA8B,CAAA,GAAC,kBAE9C;UACJ,CAAC,KACA,kBAAC,UAAD;OACE,MAAK;OACL,eAAe;QAEb,AADA,EAAe,EAAI,GACnB,EAAmB,IAAI;OACzB;OACA,WAAU;iBANZ,CAQE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,GAAC,aAEvB;QAEP;;KAEJ,KAAoB,EAAU,WAAW,IACxC,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAS,WAAU,sBAAuB,CAAA,GAAC,oBAExC;UAEL,kBAAA,GAAA,EAAA,UAAA,CACG,EAAU,WAAW,KAAK,CAAC,KAC1B,kBAAC,KAAD;MAAG,WAAU;gBAA8B;KAExC,CAAA,GAEJ,EAAU,SAAS,KAClB,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAU,KAAK,MAAS;OACvB,IAAM,IAAW,EAAK,OAAO;OAC7B,OACE,kBAAC,UAAD;QAEE,MAAK;QACL,eAAe;SAEb,AADA,EAAqB,EAAK,EAAE,GAC5B,EAAoB,IAAI;QAC1B;QACA,WAAW,+DACT,IACI,0CACA;kBAGN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBAAC,KAAD;YAAG,WAAU;sBAAb,CACG,EAAK,UACL,EAAK,QACJ,kBAAC,QAAD;aAAM,WAAU;uBAAhB;cAA+C;cAAE,EAAK;cAAM;aAAO;iBACjE,IACH;;WACH,kBAAC,KAAD;YAAG,WAAU;sBACV;aACC,EAAK;aACL,EAAK;aACL,EAAK;aACL,EAAK;aACL,EAAK;aACL,EAAK;YACP,EACG,OAAO,OAAO,EACd,KAAK,IAAI;WACX,CAAA;WACF,EAAK,SACJ,kBAAC,KAAD;YAAG,WAAU;sBAAkC,EAAK;WAAS,CAAA;UAE5D;aACJ,KACC,kBAAC,GAAD,EAAO,WAAU,gDAAiD,CAAA,CAEjE;;OACC,GAxCD,EAAK,EAwCJ;MAEZ,CAAC;KACE,CAAA,CAEP,EAAA,CAAA;KAIH,KACC,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAwC;QAA0B,CAAA,GAClF,kBAAC,UAAD;SACE,MAAK;SACL,eAAe;UAGb,AAFA,EAAe,EAAK,GACpB,EAAc,CAAC,CAAC,GAChB,EAAmB,IAAI;SACzB;SACA,WAAU;mBAEV,kBAAC,GAAD,EAAG,WAAU,SAAU,CAAA;QACjB,CAAA,CACL;;OAEJ,KACC,kBAAC,OAAD;QAAK,WAAU;kBACZ;OACE,CAAA;OAGP,kBAAC,OAAD,EAAA,UAAA;QACE,kBAAC,SAAD;SAAO,WAAU;mBAAyC;QAAqB,CAAA;QAC/E,kBAAC,SAAD;SACE,MAAK;SACL,OAAO,EAAK;SACZ,WAAW,MAAM,EAAS,YAAY,EAAE,OAAO,KAAK;SACpD,aAAY;SACZ,WAAW,EAAW,EAAQ,EAAW,QAAS;QACnD,CAAA;QACA,EAAW,YACV,kBAAC,KAAD;SAAG,WAAU;mBAAuC,EAAW;QAAY,CAAA;OAE1E,EAAA,CAAA;OAEL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAjB,CAA0D,UAClD,kBAAC,QAAD;SAAM,WAAU;mBAAkB;QAAgB,CAAA,CACnD;WACP,kBAAC,SAAD;QACE,MAAK;QACL,OAAO,EAAK;QACZ,WAAW,MAAM,EAAS,SAAS,EAAE,OAAO,KAAK;QACjD,aAAY;QACZ,WAAW,EAAW,EAAK;OAC5B,CAAA,CACE,EAAA,CAAA;OAEL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAyC;OAAc,CAAA,GACxE,kBAAC,UAAD;QACE,OAAO,EAAK;QACZ,WAAW,MAAM,EAAS,WAAW,EAAE,OAAO,KAAK;QACnD,WAAW,EAAW,EAAQ,EAAW,OAAQ;kBAEhD,EAAgB,KAAK,MACpB,kBAAC,UAAD;SAAsB,OAAO,EAAE;mBAC5B,EAAE;QACG,GAFK,EAAE,KAEP,CACT;OACK,CAAA,CACL,EAAA,CAAA;OAEL,kBAAC,OAAD,EAAA,UAAA;QACE,kBAAC,SAAD;SAAO,WAAU;mBAAyC;QAAqB,CAAA;QAC/E,kBAAC,SAAD;SACE,MAAK;SACL,OAAO,EAAK;SACZ,WAAW,MAAM,EAAS,gBAAgB,EAAE,OAAO,KAAK;SACxD,aAAY;SACZ,WAAW,EAAW,EAAQ,EAAW,YAAa;QACvD,CAAA;QACA,EAAW,gBACV,kBAAC,KAAD;SAAG,WAAU;mBAAuC,EAAW;QAAgB,CAAA;OAE9E,EAAA,CAAA;OAEL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAjB,CAA0D,2BACjC,kBAAC,QAAD;SAAM,WAAU;mBAAkB;QAAgB,CAAA,CACpE;WACP,kBAAC,SAAD;QACE,MAAK;QACL,OAAO,EAAK;QACZ,WAAW,MAAM,EAAS,gBAAgB,EAAE,OAAO,KAAK;QACxD,aAAY;QACZ,WAAW,EAAW,EAAK;OAC5B,CAAA,CACE,EAAA,CAAA;OAEL,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD,EAAA,UAAA;SACE,kBAAC,SAAD;UAAO,WAAU;oBAAyC;SAAW,CAAA;SACrE,kBAAC,SAAD;UACE,MAAK;UACL,OAAO,EAAK;UACZ,WAAW,MAAM,EAAS,QAAQ,EAAE,OAAO,KAAK;UAChD,aAAY;UACZ,WAAW,EAAW,EAAQ,EAAW,IAAK;SAC/C,CAAA;SACA,EAAW,QACV,kBAAC,KAAD;UAAG,WAAU;oBAAuC,EAAW;SAAQ,CAAA;QAEtE,EAAA,CAAA,GACL,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;SAAO,WAAU;mBAAjB,CAA0D,UAClD,kBAAC,QAAD;UAAM,WAAU;oBAAkB;SAAgB,CAAA,CACnD;YACP,kBAAC,SAAD;SACE,MAAK;SACL,OAAO,EAAK;SACZ,WAAW,MAAM,EAAS,SAAS,EAAE,OAAO,KAAK;SACjD,aAAY;SACZ,WAAW,EAAW,EAAK;QAC5B,CAAA,CACE,EAAA,CAAA,CACF;;OAEL,kBAAC,OAAD,EAAA,UAAA;QACE,kBAAC,SAAD;SAAO,WAAU;mBAAyC;QAAkB,CAAA;QAC5E,kBAAC,SAAD;SACE,MAAK;SACL,OAAO,EAAK;SACZ,WAAW,MAAM,EAAS,cAAc,EAAE,OAAO,KAAK;SACtD,aAAY;SACZ,WAAW,EAAW,EAAQ,EAAW,UAAW;QACrD,CAAA;QACA,EAAW,cACV,kBAAC,KAAD;SAAG,WAAU;mBAAuC,EAAW;QAAc,CAAA;OAE5E,EAAA,CAAA;OAEL,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,UAAD;SACE,MAAK;SACL,SAAS;SACT,UAAU;SACV,WAAU;mBAJZ,CAMG,KAAmB,kBAAC,GAAD,EAAS,WAAU,sBAAuB,CAAA,GAAE,cAE1D;;OACL,CAAA;MACF;;IAEA;;GAGT,kBAAC,WAAD;IAAS,WAAU;cAAnB;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAO,WAAU,6BAA8B,CAAA,GAAC,iBAE7C;;KAEH,IAEE,MAAkB,EAAQ,WAAW,IACvC,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAS,WAAU,sBAAuB,CAAA,GAAC,kBAExC;UACH,EAAiB,WAAW,IAC9B,kBAAC,KAAD;MAAG,WAAU;gBAAb;OAA2C;OACN,EAAgB;OAAQ;MAC1D;UACD,EAAiB,WAAW,WACvB;MACL,IAAM,IAAS,EAAiB,IAC1B,IAAM,EAAU,EAAO,kBAAkB,EAAO,gBAAgB,GAChE,IAAe,KAAiB;MACtC,OACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,KAAD;UAAG,WAAU;oBAAiC,EAAO;SAAQ,CAAA,GAC7D,kBAAC,KAAD;UAAG,WAAU;oBAAb,CACG,EAAO,UAAU,GAAG,EAAO,QAAQ,OAAO,IAC1C,KAAO,sBACP;WACA;YACL,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACG,IACC,kBAAC,GAAD,EAAS,WAAU,0CAA2C,CAAA,IAE9D,kBAAC,QAAD;UAAM,WAAU;oBACb,IACG,EAAW,EAAS,MAAM,EAAS,YAAY,CAAQ,IACvD,EAAW,EAAO,UAAU,EAAO,YAAY,CAAQ;SACvD,CAAA,GAER,kBAAC,GAAD,EAAO,WAAU,gCAAiC,CAAA,CAC/C;UACF;;MACF,CAAA;KAET,GAAG,IAEH,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAiB,KAAK,MAAW;OAChC,IAAM,IAAW,EAAO,OAAO,GACzB,IAAM,EAAU,EAAO,kBAAkB,EAAO,gBAAgB,GAChE,IAAe,KAAY,KAAiB;OAClD,OACE,kBAAC,UAAD;QAEE,MAAK;QACL,eAAe,EAAoB,EAAO,EAAE;QAC5C,WAAW,+DACT,IACI,0CACA;kBAGN,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,KAAD;WAAG,WAAU;qBAAiC,EAAO;UAAQ,CAAA,GAC7D,kBAAC,KAAD;WAAG,WAAU;qBAAb,CACG,EAAO,UAAU,GAAG,EAAO,QAAQ,OAAO,IAC1C,KAAO,sBACP;YACA;aACL,kBAAC,OAAD;UAAK,WAAU;oBACZ,KAAY,IACX,kBAAC,GAAD,EAAS,WAAU,0CAA2C,CAAA,IAE9D,kBAAC,QAAD;WAAM,WAAU;qBACb,IACG,EAAW,EAAS,MAAM,EAAS,YAAY,CAAQ,IACvD,EAAW,EAAO,UAAU,EAAO,YAAY,CAAQ;UACvD,CAAA;SAEL,CAAA,CACF;;OACC,GA7BD,EAAO,EA6BN;MAEZ,CAAC;KACE,CAAA,IAjFL,kBAAC,KAAD;MAAG,WAAU;gBAA8B;KAA4C,CAAA;KAoFxF,KAAiB,KAChB,kBAAC,KAAD;MAAG,WAAU;gBAAb;OAA2C;OACpB,EAAW,EAAS,MAAM,EAAS,YAAY,CAAQ;OAC3E,EAAS,wBACN,qBAAqB,IAAI,KAAK,EAAS,qBAAqB,EAAE,mBAAmB,MACjF;MACH;;IAEE;;EACN;;AAET"}
|