@fluid-app/portal-sdk 0.1.190 → 0.1.192

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/{ContactsScreen-Dw9G8Q3n.mjs → ContactsScreen-BtBNMZzG.mjs} +68 -71
  2. package/dist/ContactsScreen-BtBNMZzG.mjs.map +1 -0
  3. package/dist/{ContactsScreen-Euvu6Y8H.cjs → ContactsScreen-Cheiwaxn.cjs} +3 -4
  4. package/dist/{ContactsScreen-D2rOJ9Ra.cjs → ContactsScreen-DvohvoOE.cjs} +67 -70
  5. package/dist/ContactsScreen-DvohvoOE.cjs.map +1 -0
  6. package/dist/{FluidProvider-bZ4dm-UF.cjs → FluidProvider-BWBEdHQQ.cjs} +30 -2
  7. package/dist/{FluidProvider-bZ4dm-UF.cjs.map → FluidProvider-BWBEdHQQ.cjs.map} +1 -1
  8. package/dist/{FluidProvider-ClxrzJDf.mjs → FluidProvider-dp9q6oRM.mjs} +30 -2
  9. package/dist/FluidProvider-dp9q6oRM.mjs.map +1 -0
  10. package/dist/InfiniteScrollSentinel-CU801UfD.cjs +36 -0
  11. package/dist/InfiniteScrollSentinel-CU801UfD.cjs.map +1 -0
  12. package/dist/InfiniteScrollSentinel-MgF-ldXy.mjs +30 -0
  13. package/dist/InfiniteScrollSentinel-MgF-ldXy.mjs.map +1 -0
  14. package/dist/{MessagingScreen-Bu8KvZrz.mjs → MessagingScreen-BNsaLpzu.mjs} +2 -2
  15. package/dist/{MessagingScreen-Bu8KvZrz.mjs.map → MessagingScreen-BNsaLpzu.mjs.map} +1 -1
  16. package/dist/{MessagingScreen-CZIMNXUy.cjs → MessagingScreen-CJ3p3ZHq.cjs} +2 -2
  17. package/dist/{MessagingScreen-B4OtJ908.cjs → MessagingScreen-DX8A0ahD.cjs} +2 -2
  18. package/dist/{MessagingScreen-B4OtJ908.cjs.map → MessagingScreen-DX8A0ahD.cjs.map} +1 -1
  19. package/dist/{OrdersScreen-DtO4r_th.mjs → OrdersScreen-BgyMsZpn.mjs} +245 -84
  20. package/dist/OrdersScreen-BgyMsZpn.mjs.map +1 -0
  21. package/dist/{OrdersScreen-DlCLRqEK.cjs → OrdersScreen-CCVPgVWa.cjs} +244 -83
  22. package/dist/OrdersScreen-CCVPgVWa.cjs.map +1 -0
  23. package/dist/{OrdersScreen-CV6umNnp.cjs → OrdersScreen-DWNylH_i.cjs} +3 -2
  24. package/dist/{PortalContentApiProvider-DGkP0Vk6.mjs → PortalContentApiProvider-Bwi7FOTs.mjs} +72 -75
  25. package/dist/PortalContentApiProvider-Bwi7FOTs.mjs.map +1 -0
  26. package/dist/{PortalContentApiProvider-CH87-pE5.cjs → PortalContentApiProvider-Cb-DGxBo.cjs} +72 -75
  27. package/dist/PortalContentApiProvider-Cb-DGxBo.cjs.map +1 -0
  28. package/dist/{PortalProductsApiProvider-CTLKKRqy.cjs → PortalProductsApiProvider-CRN-i8Rh.cjs} +2 -2
  29. package/dist/{PortalProductsApiProvider-CTLKKRqy.cjs.map → PortalProductsApiProvider-CRN-i8Rh.cjs.map} +1 -1
  30. package/dist/{PortalProductsApiProvider-CY6CUq6x.mjs → PortalProductsApiProvider-D0jul2Fh.mjs} +2 -2
  31. package/dist/{PortalProductsApiProvider-CY6CUq6x.mjs.map → PortalProductsApiProvider-D0jul2Fh.mjs.map} +1 -1
  32. package/dist/{ProductsScreen-a1Bcvc3U.cjs → ProductsScreen-BQqP8-N9.cjs} +3 -3
  33. package/dist/{ProductsScreen-a1Bcvc3U.cjs.map → ProductsScreen-BQqP8-N9.cjs.map} +1 -1
  34. package/dist/{ProductsScreen-DWpcieDU.mjs → ProductsScreen-Cd8hpH-3.mjs} +3 -3
  35. package/dist/{ProductsScreen-DWpcieDU.mjs.map → ProductsScreen-Cd8hpH-3.mjs.map} +1 -1
  36. package/dist/{ProductsScreen-DLrDpYau.mjs → ProductsScreen-CdbwRM5O.mjs} +4 -4
  37. package/dist/{ProductsScreen-DmhLYjZD.cjs → ProductsScreen-DgPjO-HY.cjs} +4 -4
  38. package/dist/{ProfileScreen-Dx8KAKbU.cjs → ProfileScreen-BsjuHCor.cjs} +2 -2
  39. package/dist/{ProfileScreen-Dx8KAKbU.cjs.map → ProfileScreen-BsjuHCor.cjs.map} +1 -1
  40. package/dist/{ProfileScreen-BCDSo1pW.cjs → ProfileScreen-DL-C2R6R.cjs} +2 -2
  41. package/dist/{ProfileScreen-DoCcIaDI.mjs → ProfileScreen-eJvfI2YW.mjs} +2 -2
  42. package/dist/{ProfileScreen-DoCcIaDI.mjs.map → ProfileScreen-eJvfI2YW.mjs.map} +1 -1
  43. package/dist/{ShareablesScreen-B-OPO65F.cjs → ShareablesScreen-BEm7wQaI.cjs} +4 -4
  44. package/dist/{ShareablesScreen-CXchqCpx.mjs → ShareablesScreen-BUuuUpDS.mjs} +3 -3
  45. package/dist/{ShareablesScreen-CXchqCpx.mjs.map → ShareablesScreen-BUuuUpDS.mjs.map} +1 -1
  46. package/dist/{ShareablesScreen-D8tsuynn.cjs → ShareablesScreen-C1PQmDVa.cjs} +3 -3
  47. package/dist/{ShareablesScreen-D8tsuynn.cjs.map → ShareablesScreen-C1PQmDVa.cjs.map} +1 -1
  48. package/dist/{ShareablesScreen-Bvx2nkO5.mjs → ShareablesScreen-DoJ8EIDG.mjs} +4 -4
  49. package/dist/{ShopScreen-D__IvAj7.mjs → ShopScreen-5AXTCtLQ.mjs} +3 -3
  50. package/dist/{ShopScreen-D__IvAj7.mjs.map → ShopScreen-5AXTCtLQ.mjs.map} +1 -1
  51. package/dist/{ShopScreen-D6YHqL2Z.cjs → ShopScreen-DEFhDrcd.cjs} +3 -3
  52. package/dist/{ShopScreen-CcmvJ3mF.cjs → ShopScreen-X802gHEX.cjs} +3 -3
  53. package/dist/{ShopScreen-CcmvJ3mF.cjs.map → ShopScreen-X802gHEX.cjs.map} +1 -1
  54. package/dist/{SubscriptionsScreen-CshfzE9Z.mjs → SubscriptionsScreen-BwRoXYF8.mjs} +44 -34
  55. package/dist/SubscriptionsScreen-BwRoXYF8.mjs.map +1 -0
  56. package/dist/{SubscriptionsScreen-CEiVF1iQ.cjs → SubscriptionsScreen-DbcnEDD0.cjs} +43 -33
  57. package/dist/SubscriptionsScreen-DbcnEDD0.cjs.map +1 -0
  58. package/dist/{SubscriptionsScreen-C32rbhAZ.cjs → SubscriptionsScreen-mhTl7OIp.cjs} +3 -3
  59. package/dist/{dist-Ib6pM5r3.cjs → dist-bL3uiYn3.cjs} +1 -1
  60. package/dist/{dist-Ib6pM5r3.cjs.map → dist-bL3uiYn3.cjs.map} +1 -1
  61. package/dist/{dist-DhOQb8en.mjs → dist-wzcShuuv.mjs} +1 -1
  62. package/dist/{dist-DhOQb8en.mjs.map → dist-wzcShuuv.mjs.map} +1 -1
  63. package/dist/index.cjs +30 -30
  64. package/dist/index.d.cts.map +1 -1
  65. package/dist/index.d.mts.map +1 -1
  66. package/dist/index.mjs +30 -30
  67. package/dist/{order-status-badge-DvZns1LY.cjs → order-status-badge-Crk9UGpl.cjs} +23 -151
  68. package/dist/order-status-badge-Crk9UGpl.cjs.map +1 -0
  69. package/dist/{order-status-badge-DK9GG8H-.mjs → order-status-badge-DiQDwwSp.mjs} +28 -150
  70. package/dist/order-status-badge-DiQDwwSp.mjs.map +1 -0
  71. package/dist/{portal_tenant-BrihTN41.mjs → portal_tenant-CWKHVgID.mjs} +14 -4
  72. package/dist/portal_tenant-CWKHVgID.mjs.map +1 -0
  73. package/dist/{portal_tenant-DjN8hwJb.cjs → portal_tenant-pozf8Ht6.cjs} +19 -3
  74. package/dist/portal_tenant-pozf8Ht6.cjs.map +1 -0
  75. package/package.json +18 -18
  76. package/dist/ContactsScreen-D2rOJ9Ra.cjs.map +0 -1
  77. package/dist/ContactsScreen-Dw9G8Q3n.mjs.map +0 -1
  78. package/dist/FluidProvider-ClxrzJDf.mjs.map +0 -1
  79. package/dist/OrdersScreen-DlCLRqEK.cjs.map +0 -1
  80. package/dist/OrdersScreen-DtO4r_th.mjs.map +0 -1
  81. package/dist/PortalContentApiProvider-CH87-pE5.cjs.map +0 -1
  82. package/dist/PortalContentApiProvider-DGkP0Vk6.mjs.map +0 -1
  83. package/dist/SubscriptionsScreen-CEiVF1iQ.cjs.map +0 -1
  84. package/dist/SubscriptionsScreen-CshfzE9Z.mjs.map +0 -1
  85. package/dist/order-status-badge-DK9GG8H-.mjs.map +0 -1
  86. package/dist/order-status-badge-DvZns1LY.cjs.map +0 -1
  87. package/dist/portal_tenant-BrihTN41.mjs.map +0 -1
  88. package/dist/portal_tenant-DjN8hwJb.cjs.map +0 -1
  89. package/dist/src-DOYe5GAF.cjs +0 -3
  90. package/dist/src-HUkXWdaF.mjs +0 -3
@@ -1,30 +1,75 @@
1
1
  require("./chunk-9hOWP6kD.cjs");
2
- const require_portal_tenant = require("./portal_tenant-DjN8hwJb.cjs");
2
+ const require_portal_tenant = require("./portal_tenant-pozf8Ht6.cjs");
3
3
  const require_PortalTenantClientProvider = require("./PortalTenantClientProvider-CVv-4rQ9.cjs");
4
4
  const require_src = require("./src-D57IFKXU.cjs");
5
5
  const require_ScreenHeaderContext = require("./ScreenHeaderContext-BXgWydjB.cjs");
6
6
  const require_AppNavigationContext = require("./AppNavigationContext-CbK8uCjS.cjs");
7
- const require_order_status_badge = require("./order-status-badge-DvZns1LY.cjs");
7
+ const require_order_status_badge = require("./order-status-badge-Crk9UGpl.cjs");
8
8
  let react = require("react");
9
9
  let react_jsx_runtime = require("react/jsx-runtime");
10
10
  //#region src/adapters/orders-api-adapter.ts
11
+ /**
12
+ * Requires a BFF money field to be present. The BFF contract guarantees
13
+ * subtotal/discount/shipping/tax on every Order, so a missing value signals
14
+ * a broken contract. Mirrors the fail-loud pattern in subscriptions-api-adapter
15
+ * (see the `BFF returned a successful response but subscription data was
16
+ * missing` throw) and avoids silently rendering $0.00 in the UI, which a
17
+ * customer cannot distinguish from a legitimately free line.
18
+ */
19
+ function requireMoneyField(value, field) {
20
+ if (value == null) throw new Error(`BFF returned an order without required money field "${field}"`);
21
+ return value;
22
+ }
23
+ function mapAddress(raw) {
24
+ if (!raw) return null;
25
+ return {
26
+ id: raw.id ?? 0,
27
+ name: raw.name ?? null,
28
+ address1: raw.address1 ?? null,
29
+ address2: raw.address2 ?? null,
30
+ city: raw.city ?? null,
31
+ state: raw.state ?? null,
32
+ postal_code: raw.postal_code ?? null,
33
+ country_code: raw.country_code ?? null
34
+ };
35
+ }
36
+ function mapPaymentMethod(raw) {
37
+ if (!raw) return null;
38
+ return {
39
+ id: raw.id ?? 0,
40
+ source: raw.source ?? "",
41
+ payment_type: raw.payment_type ?? "",
42
+ card_type: raw.card_type ?? null,
43
+ last4: raw.last4 ?? null
44
+ };
45
+ }
11
46
  function mapToPortalTenantOrder(raw) {
12
47
  return {
13
48
  id: raw.id ?? 0,
14
49
  token: raw.token ?? "",
15
50
  status: raw.status ?? "pending",
16
- total: raw.total ?? "0",
51
+ subtotal: requireMoneyField(raw.subtotal, "subtotal"),
52
+ discount: requireMoneyField(raw.discount, "discount"),
53
+ shipping: requireMoneyField(raw.shipping, "shipping"),
54
+ tax: requireMoneyField(raw.tax, "tax"),
55
+ total: requireMoneyField(raw.total, "total"),
17
56
  currency: raw.currency ?? "",
18
57
  line_items: (raw.line_items ?? []).map((li) => ({
19
58
  id: li.id ?? 0,
20
59
  product_id: li.product_id ?? 0,
21
60
  product_name: li.product_name ?? "",
61
+ variant_id: li.variant_id ?? null,
62
+ variant_name: li.variant_name ?? null,
63
+ sku: li.sku ?? null,
64
+ image_url: li.image_url ?? null,
22
65
  quantity: li.quantity ?? 0,
23
66
  price: li.price ?? "0",
24
67
  total: li.total ?? "0"
25
68
  })),
26
69
  customer_name: raw.customer_name ?? null,
27
70
  customer_email: raw.customer_email ?? null,
71
+ address: mapAddress(raw.address),
72
+ payment_method: mapPaymentMethod(raw.payment_method),
28
73
  subscription_order: raw.subscription_order ?? false,
29
74
  subscription_token: raw.subscription_token ?? null,
30
75
  total_points_credited: typeof raw.total_points_credited === "number" ? raw.total_points_credited : void 0,
@@ -65,7 +110,7 @@ function mapToListOrder(raw) {
65
110
  customer: null,
66
111
  first_item: firstLineItem ? {
67
112
  title: firstLineItem.product_name ?? "",
68
- image_url: ""
113
+ image_url: firstLineItem.image_url ?? ""
69
114
  } : null,
70
115
  subscription: raw.subscription_order && raw.subscription_token ? {
71
116
  subscription_token: raw.subscription_token,
@@ -104,8 +149,7 @@ function createPortalOrdersAdapter(client) {
104
149
  cursor: response.meta?.pagination?.cursor ?? null,
105
150
  limit: response.meta?.pagination?.limit ?? 25,
106
151
  next_cursor: response.meta?.pagination?.next_cursor ?? null,
107
- prev_cursor: response.meta?.pagination?.prev_cursor ?? null,
108
- total_count: response.meta?.pagination?.total_count ?? 0
152
+ prev_cursor: response.meta?.pagination?.prev_cursor ?? null
109
153
  }
110
154
  }
111
155
  };
@@ -186,6 +230,20 @@ function OrdersListScreen() {
186
230
  }
187
231
  //#endregion
188
232
  //#region ../../orders/ui/src/components/portal-order-detail.tsx
233
+ const PAYMENT_TYPE_LABELS = {
234
+ apple_pay: "Apple Pay",
235
+ google_pay: "Google Pay",
236
+ paypal: "PayPal",
237
+ braintree_paypal: "PayPal",
238
+ affirm: "Affirm",
239
+ klarna: "Klarna",
240
+ bread: "Bread",
241
+ iap: "In-App Purchase",
242
+ citcon: "Citcon",
243
+ ppro: "PPRO",
244
+ dlocal: "dLocal",
245
+ droplet: "Droplet"
246
+ };
189
247
  function DetailSkeleton() {
190
248
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
191
249
  className: "flex flex-col lg:grid lg:grid-cols-8",
@@ -223,6 +281,75 @@ function DetailSkeleton() {
223
281
  })]
224
282
  });
225
283
  }
284
+ function SummaryRow({ label, value }) {
285
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
286
+ className: "flex items-center justify-between text-sm",
287
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
288
+ className: "text-muted-foreground",
289
+ children: label
290
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
291
+ className: "text-foreground",
292
+ children: value
293
+ })]
294
+ });
295
+ }
296
+ function formatAddressLines(address) {
297
+ const lines = [];
298
+ if (address.name) lines.push(address.name);
299
+ if (address.address1) lines.push(address.address1);
300
+ if (address.address2) lines.push(address.address2);
301
+ const cityLine = [
302
+ address.city,
303
+ address.state,
304
+ address.postal_code
305
+ ].filter(Boolean).join(", ");
306
+ if (cityLine) lines.push(cityLine);
307
+ if (address.country_code) lines.push(address.country_code);
308
+ return lines;
309
+ }
310
+ function AddressSection({ address }) {
311
+ const lines = formatAddressLines(address);
312
+ if (lines.length === 0) return null;
313
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
314
+ className: "border-border mb-6 border-b pb-6",
315
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
316
+ className: "text-foreground mb-3 text-sm/6 font-semibold",
317
+ children: "Shipping Address"
318
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
319
+ className: "text-foreground space-y-0.5 text-sm",
320
+ children: lines.map((line, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", { children: line }, index))
321
+ })]
322
+ });
323
+ }
324
+ function PaymentMethodSection({ paymentMethod }) {
325
+ const { card_type, last4 } = paymentMethod;
326
+ const brand = card_type ? card_type.toUpperCase() : PAYMENT_TYPE_LABELS[paymentMethod.payment_type] ?? paymentMethod.payment_type;
327
+ const label = last4 ? `${brand} ending in ${last4}` : brand;
328
+ if (!label) return null;
329
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
330
+ className: "border-border mb-6 border-b pb-6",
331
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
332
+ className: "text-foreground mb-3 text-sm/6 font-semibold",
333
+ children: "Payment Method"
334
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
335
+ className: "text-foreground text-sm",
336
+ children: label
337
+ })]
338
+ });
339
+ }
340
+ function LineItemImage({ src, alt }) {
341
+ const [errored, setErrored] = (0, react.useState)(false);
342
+ if (errored) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
343
+ className: "text-xs",
344
+ children: "No image"
345
+ });
346
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
347
+ src,
348
+ alt,
349
+ className: "h-full w-full object-cover",
350
+ onError: () => setErrored(true)
351
+ });
352
+ }
226
353
  function ItemRow({ item }) {
227
354
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
228
355
  className: "flex items-center space-x-4 py-4",
@@ -230,7 +357,13 @@ function ItemRow({ item }) {
230
357
  className: "relative shrink-0",
231
358
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
232
359
  className: "bg-muted text-muted-foreground flex h-24 w-24 items-center justify-center overflow-hidden rounded",
233
- children: "No image"
360
+ children: item.image_url ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LineItemImage, {
361
+ src: item.image_url,
362
+ alt: item.product_name
363
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
364
+ className: "text-xs",
365
+ children: "No image"
366
+ })
234
367
  }), item.quantity > 1 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
235
368
  className: "bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium",
236
369
  children: item.quantity
@@ -243,6 +376,11 @@ function ItemRow({ item }) {
243
376
  title: item.product_name,
244
377
  children: item.product_name
245
378
  }),
379
+ item.variant_name && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
380
+ className: "text-muted-foreground truncate text-xs",
381
+ title: item.variant_name,
382
+ children: item.variant_name
383
+ }),
246
384
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
247
385
  className: "text-foreground text-sm font-medium",
248
386
  children: item.total
@@ -280,22 +418,40 @@ function ItemsSection({ order }) {
280
418
  className: "divide-border divide-y",
281
419
  children: order.line_items.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ItemRow, { item }, item.id))
282
420
  }),
283
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
284
- className: "border-border mb-4 border-t pt-4",
285
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
286
- className: "mt-4 flex items-center justify-between text-base font-medium",
287
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
288
- className: "text-muted-foreground text-sm font-medium",
289
- children: "Total"
290
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
291
- className: "text-foreground text-base font-bold",
292
- children: [
293
- order.currency,
294
- " ",
295
- order.total
296
- ]
297
- })]
298
- })
421
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
422
+ className: "border-border mb-4 space-y-1 border-t pt-4",
423
+ children: [
424
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SummaryRow, {
425
+ label: "Subtotal",
426
+ value: `${order.currency} ${order.subtotal}`
427
+ }),
428
+ parseFloat(order.discount) > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SummaryRow, {
429
+ label: "Discount",
430
+ value: `${order.currency} -${order.discount}`
431
+ }),
432
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SummaryRow, {
433
+ label: "Shipping",
434
+ value: `${order.currency} ${order.shipping}`
435
+ }),
436
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(SummaryRow, {
437
+ label: "Tax",
438
+ value: `${order.currency} ${order.tax}`
439
+ }),
440
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
441
+ className: "mt-2 flex items-center justify-between text-base font-medium",
442
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
443
+ className: "text-muted-foreground text-sm font-medium",
444
+ children: "Total"
445
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
446
+ className: "text-foreground text-base font-bold",
447
+ children: [
448
+ order.currency,
449
+ " ",
450
+ order.total
451
+ ]
452
+ })]
453
+ })
454
+ ]
299
455
  }),
300
456
  order.total_points_credited != null && order.total_points_credited > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
301
457
  className: "border-border mb-4 border-t pt-4",
@@ -328,73 +484,78 @@ function DetailsSection({ order }) {
328
484
  className: "bg-background px-8 pt-4 lg:col-span-4",
329
485
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
330
486
  className: "mx-auto max-w-lg lg:mx-0 lg:mr-auto",
331
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
332
- className: "border-border mb-6 border-b pb-6",
333
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
334
- className: "flex flex-wrap items-center gap-3",
335
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
336
- className: "flex items-center gap-2",
337
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
338
- className: "text-muted-foreground text-sm",
339
- children: "Status:"
340
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_order_status_badge.OrderStatusBadge, { status: order.status })]
487
+ children: [
488
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
489
+ className: "border-border mb-6 border-b pb-6",
490
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
491
+ className: "flex flex-wrap items-center gap-3",
492
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
493
+ className: "flex items-center gap-2",
494
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
495
+ className: "text-muted-foreground text-sm",
496
+ children: "Status:"
497
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_order_status_badge.OrderStatusBadge, { status: order.status })]
498
+ })
341
499
  })
342
- })
343
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
344
- className: "border-border mb-6 border-b pb-6",
345
- children: [
346
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
347
- className: "text-foreground mb-3 text-sm/6 font-semibold",
348
- children: "Order Info"
349
- }),
350
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
351
- className: "divide-border flex divide-x",
352
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
353
- className: "flex-1 pr-4",
500
+ }),
501
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
502
+ className: "border-border mb-6 border-b pb-6",
503
+ children: [
504
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
505
+ className: "text-foreground mb-3 text-sm/6 font-semibold",
506
+ children: "Order Info"
507
+ }),
508
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
509
+ className: "divide-border flex divide-x",
510
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
511
+ className: "flex-1 pr-4",
512
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
513
+ className: "text-muted-foreground text-sm",
514
+ children: "Order"
515
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
516
+ className: "text-foreground font-medium",
517
+ children: ["#", order.id]
518
+ })]
519
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
520
+ className: "flex-1 pl-4 text-right",
521
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
522
+ className: "text-muted-foreground text-sm",
523
+ children: "Date"
524
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
525
+ className: "text-foreground font-medium",
526
+ children: new Date(order.created_at).toLocaleDateString("en-US", {
527
+ year: "numeric",
528
+ month: "short",
529
+ day: "numeric"
530
+ })
531
+ })]
532
+ })]
533
+ }),
534
+ order.customer_email && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
535
+ className: "mt-3",
354
536
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
355
537
  className: "text-muted-foreground text-sm",
356
- children: "Order"
357
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
358
- className: "text-foreground font-medium",
359
- children: ["#", order.id]
538
+ children: "Email"
539
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
540
+ className: "text-foreground text-sm font-medium",
541
+ children: order.customer_email
360
542
  })]
361
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
362
- className: "flex-1 pl-4 text-right",
543
+ }),
544
+ order.customer_name && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
545
+ className: "mt-3",
363
546
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
364
547
  className: "text-muted-foreground text-sm",
365
- children: "Date"
548
+ children: "Customer"
366
549
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
367
- className: "text-foreground font-medium",
368
- children: new Date(order.created_at).toLocaleDateString("en-US", {
369
- year: "numeric",
370
- month: "short",
371
- day: "numeric"
372
- })
550
+ className: "text-foreground text-sm font-medium",
551
+ children: order.customer_name
373
552
  })]
374
- })]
375
- }),
376
- order.customer_email && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
377
- className: "mt-3",
378
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
379
- className: "text-muted-foreground text-sm",
380
- children: "Email"
381
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
382
- className: "text-foreground text-sm font-medium",
383
- children: order.customer_email
384
- })]
385
- }),
386
- order.customer_name && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
387
- className: "mt-3",
388
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
389
- className: "text-muted-foreground text-sm",
390
- children: "Customer"
391
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
392
- className: "text-foreground text-sm font-medium",
393
- children: order.customer_name
394
- })]
395
- })
396
- ]
397
- })]
553
+ })
554
+ ]
555
+ }),
556
+ order.address && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AddressSection, { address: order.address }),
557
+ order.payment_method && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PaymentMethodSection, { paymentMethod: order.payment_method })
558
+ ]
398
559
  })
399
560
  });
400
561
  }
@@ -516,4 +677,4 @@ Object.defineProperty(exports, "ordersScreenPropertySchema", {
516
677
  }
517
678
  });
518
679
 
519
- //# sourceMappingURL=OrdersScreen-DlCLRqEK.cjs.map
680
+ //# sourceMappingURL=OrdersScreen-CCVPgVWa.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrdersScreen-CCVPgVWa.cjs","names":["usePortalTenantClient","OrdersCoreProvider","OrdersListScreen","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage","OrdersList","useAppNavigation","OrdersListScreenContent","Skeleton","OrderStatusBadge","usePortalTenantOrder","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","useAppNavigation","PortalOrderDetailScreenContent","useAppNavigation"],"sources":["../src/adapters/orders-api-adapter.ts","../src/orders/PortalOrdersApiProvider.tsx","../../../orders/ui/src/screens/OrdersListScreen.tsx","../src/screens/OrdersListScreen.tsx","../../../orders/ui/src/components/portal-order-detail.tsx","../../../orders/ui/src/screens/PortalOrderDetailScreen.tsx","../src/screens/OrderDetailScreen.tsx","../src/screens/OrdersScreen.tsx"],"sourcesContent":["import type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport type { OrdersApi } from \"@fluid-app/orders-core\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Creates an OrdersApi adapter backed by the portal-tenant BFF.\n *\n * Provides two methods:\n * - fetchOrderById -> PortalTenantOrderResponse (for PortalOrderDetail screen)\n * - fetchCustomerOrders -> CustomerOrdersResponse with ListOrder[] (for shared OrdersList)\n *\n * The BFF uses a single Order schema for both endpoints, but consumers need\n * different shapes: the detail screen works with PortalTenantOrder (matches the\n * BFF's limited data), while the list screen needs the canonical ListOrder so\n * the shared OrdersList component works unchanged.\n */\n\ntype RawOrder = NonNullable<\n Awaited<ReturnType<typeof portalTenant.orders_show>>[\"order\"]\n>;\n\ntype RawAddress = RawOrder[\"address\"];\ntype RawPaymentMethod = RawOrder[\"payment_method\"];\n\n/**\n * Requires a BFF money field to be present. The BFF contract guarantees\n * subtotal/discount/shipping/tax on every Order, so a missing value signals\n * a broken contract. Mirrors the fail-loud pattern in subscriptions-api-adapter\n * (see the `BFF returned a successful response but subscription data was\n * missing` throw) and avoids silently rendering $0.00 in the UI, which a\n * customer cannot distinguish from a legitimately free line.\n */\nfunction requireMoneyField(\n value: string | null | undefined,\n field: string,\n): string {\n if (value == null) {\n throw new Error(\n `BFF returned an order without required money field \"${field}\"`,\n );\n }\n return value;\n}\n\nfunction mapAddress(raw: RawAddress): orders.PortalTenantAddress | null {\n if (!raw) return null;\n return {\n id: raw.id ?? 0,\n name: raw.name ?? null,\n address1: raw.address1 ?? null,\n address2: raw.address2 ?? null,\n city: raw.city ?? null,\n state: raw.state ?? null,\n postal_code: raw.postal_code ?? null,\n country_code: raw.country_code ?? null,\n } satisfies orders.PortalTenantAddress;\n}\n\nfunction mapPaymentMethod(\n raw: RawPaymentMethod,\n): orders.PortalTenantPaymentMethod | null {\n if (!raw) return null;\n return {\n id: raw.id ?? 0,\n source: raw.source ?? \"\",\n payment_type: raw.payment_type ?? \"\",\n card_type: raw.card_type ?? null,\n last4: raw.last4 ?? null,\n } satisfies orders.PortalTenantPaymentMethod;\n}\n\nfunction mapToPortalTenantOrder(raw: RawOrder): orders.PortalTenantOrder {\n return {\n id: raw.id ?? 0,\n token: raw.token ?? \"\",\n status: (raw.status ?? \"pending\") as orders.PortalTenantOrderStatus,\n subtotal: requireMoneyField(raw.subtotal, \"subtotal\"),\n discount: requireMoneyField(raw.discount, \"discount\"),\n shipping: requireMoneyField(raw.shipping, \"shipping\"),\n tax: requireMoneyField(raw.tax, \"tax\"),\n total: requireMoneyField(raw.total, \"total\"),\n currency: raw.currency ?? \"\",\n line_items: (raw.line_items ?? []).map((li) => ({\n id: li.id ?? 0,\n product_id: li.product_id ?? 0,\n product_name: li.product_name ?? \"\",\n variant_id: li.variant_id ?? null,\n variant_name: li.variant_name ?? null,\n sku: li.sku ?? null,\n image_url: li.image_url ?? null,\n quantity: li.quantity ?? 0,\n price: li.price ?? \"0\",\n total: li.total ?? \"0\",\n })),\n customer_name: raw.customer_name ?? null,\n customer_email: raw.customer_email ?? null,\n address: mapAddress(raw.address),\n payment_method: mapPaymentMethod(raw.payment_method),\n subscription_order: raw.subscription_order ?? false,\n subscription_token: raw.subscription_token ?? null,\n // These fields are returned by the BFF but not yet in the OpenAPI spec.\n total_points_credited:\n typeof (raw as Record<string, unknown>).total_points_credited === \"number\"\n ? ((raw as Record<string, unknown>).total_points_credited as number)\n : undefined,\n customer_points_balance:\n typeof (raw as Record<string, unknown>).customer_points_balance ===\n \"number\"\n ? ((raw as Record<string, unknown>).customer_points_balance as number)\n : undefined,\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n } satisfies orders.PortalTenantOrder;\n}\n\nfunction mapToListOrder(raw: RawOrder): orders.ListOrder {\n const firstLineItem = raw.line_items?.[0];\n return {\n id: raw.id ?? 0,\n external_id: null,\n order_number: \"\",\n email: raw.customer_email ?? null,\n first_name: raw.customer_name?.split(\" \")[0] ?? null,\n last_name: raw.customer_name?.split(\" \").slice(1).join(\" \") || null,\n amount: raw.total ?? \"0\",\n status: raw.status ?? \"pending\",\n order_status: raw.status ?? \"pending\",\n fulfillment_status: \"unfulfilled\",\n financial_status: \"pending\",\n currency_code: raw.currency ?? \"\",\n note: null,\n token: raw.token ?? \"\",\n warehouse_id: null,\n source: \"web\",\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n total_display_amount: `${raw.currency ?? \"\"} ${raw.total ?? \"0\"}`,\n total_cv: 0,\n total_qv: 0,\n currency_symbol: raw.currency ?? \"\",\n items_count: raw.line_items?.length ?? 0,\n quantity_count:\n raw.line_items?.reduce((sum, li) => sum + (li.quantity ?? 0), 0) ?? 0,\n order_on_behalf_of: false,\n sale_date: null,\n customer: null,\n first_item: firstLineItem\n ? {\n title: firstLineItem.product_name ?? \"\",\n image_url: firstLineItem.image_url ?? \"\",\n }\n : null,\n // The BFF indicates subscription_order but doesn't expose the\n // subscription's lifecycle status. We set \"active\" because the order's\n // existence implies the subscription was active at purchase time. The\n // real status is shown on the subscription detail screen.\n subscription:\n raw.subscription_order && raw.subscription_token\n ? { subscription_token: raw.subscription_token, status: \"active\" }\n : raw.subscription_order\n ? { subscription_token: \"\", status: \"active\" }\n : null,\n };\n}\n\nexport function createPortalOrdersAdapter(\n client: FetchClient,\n): Required<Pick<OrdersApi, \"fetchOrderById\" | \"fetchCustomerOrders\">> {\n return {\n fetchOrderById: async (id: string | number) => {\n const response = await portalTenant.orders_show(client, id);\n return {\n order: mapToPortalTenantOrder(response.order ?? {}),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies orders.PortalTenantOrderResponse;\n },\n\n fetchCustomerOrders: async (params: orders.FetchOrdersParams) => {\n const response = await portalTenant.orders_list(client, {\n \"page[cursor]\": params.cursor,\n \"page[limit]\": params.limit,\n status: params.status,\n q: params.search,\n });\n return {\n orders: (response.orders ?? []).map(mapToListOrder),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n pagination: {\n cursor: response.meta?.pagination?.cursor ?? null,\n limit: response.meta?.pagination?.limit ?? 25,\n next_cursor: response.meta?.pagination?.next_cursor ?? null,\n prev_cursor: response.meta?.pagination?.prev_cursor ?? null,\n },\n },\n } satisfies orders.CustomerOrdersResponse;\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { OrdersCoreProvider } from \"@fluid-app/orders-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalOrdersAdapter } from \"../adapters/orders-api-adapter\";\n\nexport function PortalOrdersApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalOrdersAdapter(client), [client]);\n\n return <OrdersCoreProvider api={api}>{children}</OrdersCoreProvider>;\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { OrdersList } from \"../components/orders-list\";\n\nexport interface OrdersListScreenProps {\n customerId: number | undefined;\n onOrderClick: (order: orders.ListOrder) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n t: (key: string) => string;\n isLoadingCustomer?: boolean;\n}\n\nexport function OrdersListScreen({\n customerId,\n onOrderClick,\n onSubscriptionClick,\n t,\n isLoadingCustomer,\n}: OrdersListScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Orders</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n if (isLoadingCustomer) {\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"space-y-3\">\n <div className=\"bg-muted h-10 animate-pulse rounded\" />\n <div className=\"bg-muted h-64 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <OrdersList\n customerId={customerId}\n onOrderClick={onOrderClick}\n onSubscriptionClick={onSubscriptionClick}\n t={t}\n />\n </div>\n );\n}\n","import type { orders } from \"@fluid-app/orders-core\";\nimport { OrdersListScreen as OrdersListScreenContent } from \"@fluid-app/orders-ui/screens/OrdersListScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\nconst translations: Record<string, string> = {\n search_orders: \"Search orders...\",\n order_number: \"Order #\",\n date: \"Date\",\n status: \"Status\",\n product: \"Product\",\n no_orders_found: \"No orders found\",\n no_matching_orders: \"No matching orders\",\n no_image_available: \"No image available\",\n this_product_no_longer_exists: \"This product no longer exists\",\n subscription: \"Subscription\",\n view_subscription: \"View Subscription\",\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n};\n\n// The portal-tenant BFF scopes orders to the logged-in user server-side,\n// so customerId is not used by the adapter. We pass a sentinel value to\n// satisfy the enabled guard in useCustomerOrders.\nconst BFF_SCOPED_CUSTOMER_ID = 1;\n\nexport function OrdersListScreen(): React.JSX.Element {\n const { navigate } = useAppNavigation();\n\n const handleOrderClick = (order: orders.ListOrder) => {\n navigate(`orders/${order.token}`);\n };\n\n const handleSubscriptionClick = (subscriptionToken: string) => {\n navigate(`subscriptions/${subscriptionToken}`);\n };\n\n return (\n <OrdersListScreenContent\n customerId={BFF_SCOPED_CUSTOMER_ID}\n onOrderClick={handleOrderClick}\n onSubscriptionClick={handleSubscriptionClick}\n t={(key) => translations[key] ?? key}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { usePortalTenantOrder } from \"@fluid-app/orders-core\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { OrderStatusBadge } from \"./order-status-badge\";\n\n// Human-readable labels for the non-card entries of PaymentMethod.payment_type.\n// Card payments render via card_type (uppercased) and bypass this map entirely.\nconst PAYMENT_TYPE_LABELS: Record<string, string> = {\n apple_pay: \"Apple Pay\",\n google_pay: \"Google Pay\",\n paypal: \"PayPal\",\n braintree_paypal: \"PayPal\",\n affirm: \"Affirm\",\n klarna: \"Klarna\",\n bread: \"Bread\",\n iap: \"In-App Purchase\",\n citcon: \"Citcon\",\n ppro: \"PPRO\",\n dlocal: \"dLocal\",\n droplet: \"Droplet\",\n};\n\nexport interface PortalOrderDetailProps {\n id: string | number;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nfunction DetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <div className=\"bg-muted flex flex-col items-center px-8 lg:col-span-4\">\n <div className=\"w-full max-w-lg py-6\">\n <Skeleton className=\"mb-4 h-6 w-48\" />\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-4\">\n <Skeleton className=\"h-24 w-24 rounded\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n <Skeleton className=\"mb-4 h-10 w-full rounded\" />\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction SummaryRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between text-sm\">\n <p className=\"text-muted-foreground\">{label}</p>\n <p className=\"text-foreground\">{value}</p>\n </div>\n );\n}\n\nfunction formatAddressLines(address: orders.PortalTenantAddress): string[] {\n const lines: string[] = [];\n if (address.name) lines.push(address.name);\n if (address.address1) lines.push(address.address1);\n if (address.address2) lines.push(address.address2);\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n if (cityLine) lines.push(cityLine);\n if (address.country_code) lines.push(address.country_code);\n return lines;\n}\n\nfunction AddressSection({ address }: { address: orders.PortalTenantAddress }) {\n const lines = formatAddressLines(address);\n if (lines.length === 0) return null;\n return (\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Shipping Address\n </h3>\n <div className=\"text-foreground space-y-0.5 text-sm\">\n {lines.map((line, index) => (\n <p key={index}>{line}</p>\n ))}\n </div>\n </div>\n );\n}\n\nfunction PaymentMethodSection({\n paymentMethod,\n}: {\n paymentMethod: orders.PortalTenantPaymentMethod;\n}) {\n const { card_type, last4 } = paymentMethod;\n const brand = card_type\n ? card_type.toUpperCase()\n : (PAYMENT_TYPE_LABELS[paymentMethod.payment_type] ??\n paymentMethod.payment_type);\n const label = last4 ? `${brand} ending in ${last4}` : brand;\n if (!label) return null;\n return (\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Payment Method\n </h3>\n <p className=\"text-foreground text-sm\">{label}</p>\n </div>\n );\n}\n\nfunction LineItemImage({ src, alt }: { src: string; alt: string }) {\n const [errored, setErrored] = useState(false);\n if (errored) return <span className=\"text-xs\">No image</span>;\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-full w-full object-cover\"\n onError={() => setErrored(true)}\n />\n );\n}\n\nfunction ItemRow({ item }: { item: orders.PortalTenantOrderLineItem }) {\n return (\n <div className=\"flex items-center space-x-4 py-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted text-muted-foreground flex h-24 w-24 items-center justify-center overflow-hidden rounded\">\n {item.image_url ? (\n <LineItemImage src={item.image_url} alt={item.product_name} />\n ) : (\n <span className=\"text-xs\">No image</span>\n )}\n </div>\n {item.quantity > 1 && (\n <span className=\"bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\">\n {item.quantity}\n </span>\n )}\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col space-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={item.product_name}\n >\n {item.product_name}\n </p>\n {item.variant_name && (\n <p\n className=\"text-muted-foreground truncate text-xs\"\n title={item.variant_name}\n >\n {item.variant_name}\n </p>\n )}\n <p className=\"text-foreground text-sm font-medium\">{item.total}</p>\n {item.quantity > 1 && (\n <p className=\"text-muted-foreground text-xs\">\n {item.price} x {item.quantity}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nfunction ItemsSection({ order }: { order: orders.PortalTenantOrder }) {\n return (\n <section className=\"bg-muted flex w-full flex-col items-center px-8 lg:col-span-4\">\n <div className=\"flex w-full max-w-lg flex-col\">\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n Items ({order.line_items.length})\n </h2>\n <hr className=\"border-border\" />\n </div>\n\n <div className=\"divide-border divide-y\">\n {order.line_items.map((item) => (\n <ItemRow key={item.id} item={item} />\n ))}\n </div>\n\n <div className=\"border-border mb-4 space-y-1 border-t pt-4\">\n <SummaryRow\n label=\"Subtotal\"\n value={`${order.currency} ${order.subtotal}`}\n />\n {parseFloat(order.discount) > 0 && (\n <SummaryRow\n label=\"Discount\"\n value={`${order.currency} -${order.discount}`}\n />\n )}\n <SummaryRow\n label=\"Shipping\"\n value={`${order.currency} ${order.shipping}`}\n />\n <SummaryRow label=\"Tax\" value={`${order.currency} ${order.tax}`} />\n <div className=\"mt-2 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">Total</p>\n <p className=\"text-foreground text-base font-bold\">\n {order.currency} {order.total}\n </p>\n </div>\n </div>\n\n {/* TODO: i18n */}\n {/* TODO: gate on reward_points_enabled when available on PortalTenantOrder */}\n {order.total_points_credited != null &&\n order.total_points_credited > 0 && (\n <div className=\"border-border mb-4 border-t pt-4\">\n <div className=\"flex items-baseline justify-between\">\n <div>\n <p className=\"text-foreground text-sm font-semibold\">\n points earned on this order!\n </p>\n {order.customer_points_balance != null && (\n <p className=\"text-muted-foreground text-xs\">\n {order.customer_points_balance.toLocaleString()} points\n total\n </p>\n )}\n </div>\n <div className=\"text-right\">\n <p className=\"text-foreground text-sm font-semibold\">\n +{order.total_points_credited.toLocaleString()}\n </p>\n <p className=\"text-muted-foreground text-xs\">points</p>\n </div>\n </div>\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction DetailsSection({ order }: { order: orders.PortalTenantOrder }) {\n return (\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Order Status */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Status:</span>\n <OrderStatusBadge status={order.status} />\n </div>\n </div>\n </div>\n\n {/* Order Info */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order Info\n </h3>\n <div className=\"divide-border flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">Order</div>\n <div className=\"text-foreground font-medium\">#{order.id}</div>\n </div>\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">Date</div>\n <div className=\"text-foreground font-medium\">\n {new Date(order.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })}\n </div>\n </div>\n </div>\n {order.customer_email && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Email</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_email}\n </div>\n </div>\n )}\n {order.customer_name && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Customer</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_name}\n </div>\n </div>\n )}\n </div>\n\n {order.address && <AddressSection address={order.address} />}\n {order.payment_method && (\n <PaymentMethodSection paymentMethod={order.payment_method} />\n )}\n </div>\n </div>\n );\n}\n\nexport function PortalOrderDetail({\n id,\n onNotFound,\n onError,\n}: PortalOrderDetailProps) {\n const { data, isLoading, error } = usePortalTenantOrder(id);\n const order = data?.order;\n\n useEffect(() => {\n if (!isLoading && error) {\n onError?.(error as Error);\n }\n }, [isLoading, error, onError]);\n\n useEffect(() => {\n if (!isLoading && !error && !order) {\n onNotFound?.();\n }\n }, [isLoading, error, order, onNotFound]);\n\n if (isLoading) {\n return <DetailSkeleton />;\n }\n\n if (!order) {\n return null;\n }\n\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <ItemsSection order={order} />\n <DetailsSection order={order} />\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { PortalOrderDetail } from \"../components/portal-order-detail\";\n\nexport interface PortalOrderDetailScreenProps {\n id: string | number;\n onNavigateToList: () => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport function PortalOrderDetailScreen({\n id,\n onNavigateToList,\n onNotFound,\n onError,\n}: PortalOrderDetailScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n Orders\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n Order #{id}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [id, onNavigateToList],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <PortalOrderDetail id={id} onNotFound={onNotFound} onError={onError} />\n </div>\n );\n}\n","import { PortalOrderDetailScreen as PortalOrderDetailScreenContent } from \"@fluid-app/orders-ui/screens/PortalOrderDetailScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface OrderDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function OrderDetailScreen({\n token,\n onToast,\n}: OrderDetailScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n\n return (\n <PortalOrderDetailScreenContent\n id={token}\n onNavigateToList={() => navigate(\"orders\")}\n onNotFound={() => {\n onToast(\"Order not found\", \"warning\");\n navigate(\"orders\");\n }}\n onError={(err) => {\n const message =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`Failed to load order: ${message}`, \"error\");\n }}\n />\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalOrdersApiProvider } from \"../orders/PortalOrdersApiProvider\";\nimport { OrdersListScreen } from \"./OrdersListScreen\";\nimport { OrderDetailScreen } from \"./OrderDetailScreen\";\n\ntype OrdersScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function OrdersScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: OrdersScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const effectiveToast = onToast ?? defaultToast;\n\n // Parse slug: \"orders\" → list, \"orders/{token}\" → detail\n const detailToken = currentSlug.split(\"/\")[1];\n const isDetailView = detailToken !== undefined;\n\n if (isDetailView) {\n return (\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrderDetailScreen token={detailToken} onToast={effectiveToast} />\n </PortalOrdersApiProvider>\n </div>\n );\n }\n\n return (\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrdersListScreen />\n </PortalOrdersApiProvider>\n </div>\n );\n}\n\nexport const ordersScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"OrdersScreen\",\n displayName: \"Orders Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
@@ -2,7 +2,8 @@ require("./chunk-9hOWP6kD.cjs");
2
2
  require("./src-D57IFKXU.cjs");
3
3
  require("./ScreenHeaderContext-BXgWydjB.cjs");
4
4
  require("./SearchSort-CUDMZIkf.cjs");
5
- require("./order-status-badge-DvZns1LY.cjs");
6
- const require_OrdersScreen = require("./OrdersScreen-DlCLRqEK.cjs");
5
+ require("./InfiniteScrollSentinel-CU801UfD.cjs");
6
+ require("./order-status-badge-Crk9UGpl.cjs");
7
+ const require_OrdersScreen = require("./OrdersScreen-CCVPgVWa.cjs");
7
8
  exports.OrdersScreen = require_OrdersScreen.OrdersScreen;
8
9
  exports.ordersScreenPropertySchema = require_OrdersScreen.ordersScreenPropertySchema;