@fluid-app/portal-sdk 0.1.412 → 0.1.414

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 (181) hide show
  1. package/dist/{AppNavigationContext-C8hrkgZR.d.cts → AppNavigationContext-CEKWpFX5.d.cts} +7 -1
  2. package/dist/{AppNavigationContext-C8hrkgZR.d.cts.map → AppNavigationContext-CEKWpFX5.d.cts.map} +1 -1
  3. package/dist/{AppNavigationContext-Bg1_tuBN.d.mts → AppNavigationContext-Idqjc7nS.d.mts} +7 -1
  4. package/dist/{AppNavigationContext-Bg1_tuBN.d.mts.map → AppNavigationContext-Idqjc7nS.d.mts.map} +1 -1
  5. package/dist/{FluidProvider-BqGHECjV.cjs → FluidProvider-B9-5FBk0.cjs} +24 -25
  6. package/dist/{FluidProvider-BqGHECjV.cjs.map → FluidProvider-B9-5FBk0.cjs.map} +1 -1
  7. package/dist/{FluidProvider-DjGnR8al.mjs → FluidProvider-CJ_JMLmi.mjs} +24 -25
  8. package/dist/{FluidProvider-DjGnR8al.mjs.map → FluidProvider-CJ_JMLmi.mjs.map} +1 -1
  9. package/dist/{MessagingScreen-ByT-vHMd.mjs → MessagingScreen-9Ra7PLsp.mjs} +2 -2
  10. package/dist/{MessagingScreen-ByT-vHMd.mjs.map → MessagingScreen-9Ra7PLsp.mjs.map} +1 -1
  11. package/dist/{MessagingScreen-BBgqAdNX.mjs → MessagingScreen-BDvOCDQS.mjs} +2 -2
  12. package/dist/{MessagingScreen-BGtnLjT4.cjs → MessagingScreen-C_5JQSSd.cjs} +2 -2
  13. package/dist/{MessagingScreen-BGtnLjT4.cjs.map → MessagingScreen-C_5JQSSd.cjs.map} +1 -1
  14. package/dist/{MessagingScreen-uk3J5XVD.cjs → MessagingScreen-cU9ktc_D.cjs} +2 -2
  15. package/dist/{OrdersScreen-CtrWLrUM.cjs → OrdersScreen-5QwwHx6W.cjs} +9 -7
  16. package/dist/OrdersScreen-5QwwHx6W.cjs.map +1 -0
  17. package/dist/{OrdersScreen-aMZBKVkL.mjs → OrdersScreen-B8UI61Fz.mjs} +9 -7
  18. package/dist/OrdersScreen-B8UI61Fz.mjs.map +1 -0
  19. package/dist/{OrdersScreen-Bmi8aSCC.cjs → OrdersScreen-R6zzCnu8.cjs} +2 -2
  20. package/dist/{OrdersScreen-pxTDSWDR.mjs → OrdersScreen-q8oWZ3Bp.mjs} +2 -2
  21. package/dist/{ProfileScreen-Dos4v1fI.cjs → ProfileScreen-C1Xq9G8Z.cjs} +3 -3
  22. package/dist/{ProfileScreen-D2XW20np.mjs → ProfileScreen-DPr3EHvs.mjs} +3 -3
  23. package/dist/{ProfileScreen-CJV25-rw.cjs → ProfileScreen-rKzAUmVs.cjs} +8 -7
  24. package/dist/ProfileScreen-rKzAUmVs.cjs.map +1 -0
  25. package/dist/{ProfileScreen-DO52_EB6.mjs → ProfileScreen-s_k-entp.mjs} +8 -7
  26. package/dist/ProfileScreen-s_k-entp.mjs.map +1 -0
  27. package/dist/{ShopScreen-irWzbyLI.mjs → ShopScreen-BbCKSNi3.mjs} +2 -2
  28. package/dist/{ShopScreen-DZrjzgA2.cjs → ShopScreen-CRGwFdAS.cjs} +2 -2
  29. package/dist/{ShopScreen-DZrjzgA2.cjs.map → ShopScreen-CRGwFdAS.cjs.map} +1 -1
  30. package/dist/{ShopScreen-DNQ_9nQZ.mjs → ShopScreen-CSdErwph.mjs} +2 -2
  31. package/dist/{ShopScreen-DNQ_9nQZ.mjs.map → ShopScreen-CSdErwph.mjs.map} +1 -1
  32. package/dist/{ShopScreen-DG4StxRD.cjs → ShopScreen-Dkf30a6M.cjs} +2 -2
  33. package/dist/{SubscriptionsScreen-BeCCmzeM.cjs → SubscriptionsScreen--tuSJFrm.cjs} +3 -3
  34. package/dist/{SubscriptionsScreen-BeCCmzeM.cjs.map → SubscriptionsScreen--tuSJFrm.cjs.map} +1 -1
  35. package/dist/{SubscriptionsScreen-BT9yXZS-.cjs → SubscriptionsScreen-BeuX86oM.cjs} +3 -3
  36. package/dist/{SubscriptionsScreen-cOdupw4N.mjs → SubscriptionsScreen-BtIQbJ_d.mjs} +3 -3
  37. package/dist/{SubscriptionsScreen-CqOlu7n8.mjs → SubscriptionsScreen-DMQVivdm.mjs} +3 -3
  38. package/dist/{SubscriptionsScreen-CqOlu7n8.mjs.map → SubscriptionsScreen-DMQVivdm.mjs.map} +1 -1
  39. package/dist/adapters/account-api-adapter.d.ts.map +1 -1
  40. package/dist/{de-C4d7nNwd.cjs → de-DCAMr9hW.cjs} +1 -3
  41. package/dist/de-DCAMr9hW.cjs.map +1 -0
  42. package/dist/{de-BHFw87ND.mjs → de-DnVzotJs.mjs} +1 -3
  43. package/dist/de-DnVzotJs.mjs.map +1 -0
  44. package/dist/{el-C88n3QAG.mjs → el-C9bowLqt.mjs} +1 -3
  45. package/dist/el-C9bowLqt.mjs.map +1 -0
  46. package/dist/{el-okKQ5I21.cjs → el-CYlVfRsi.cjs} +1 -3
  47. package/dist/el-CYlVfRsi.cjs.map +1 -0
  48. package/dist/{es-ct8Ky3r-.cjs → es-BdaKerXP.cjs} +1 -3
  49. package/dist/es-BdaKerXP.cjs.map +1 -0
  50. package/dist/{es-CsuG3ASd.mjs → es-CdTb_l15.mjs} +1 -3
  51. package/dist/es-CdTb_l15.mjs.map +1 -0
  52. package/dist/{fr-DUigi5UP.mjs → fr-BlsMA-iU.mjs} +1 -3
  53. package/dist/fr-BlsMA-iU.mjs.map +1 -0
  54. package/dist/{fr--9vacNOs.cjs → fr-CqyJBxpw.cjs} +1 -3
  55. package/dist/fr-CqyJBxpw.cjs.map +1 -0
  56. package/dist/{he-BWP-w48u.mjs → he-DsNA9f0h.mjs} +1 -3
  57. package/dist/he-DsNA9f0h.mjs.map +1 -0
  58. package/dist/{he-CPd3vr_i.cjs → he-w_JT9Jsc.cjs} +1 -3
  59. package/dist/he-w_JT9Jsc.cjs.map +1 -0
  60. package/dist/{hu-B_GUAtJM.mjs → hu-BUWpd6fO.mjs} +1 -3
  61. package/dist/hu-BUWpd6fO.mjs.map +1 -0
  62. package/dist/{hu-DNZdMvFt.cjs → hu-BuVxSgyf.cjs} +1 -3
  63. package/dist/hu-BuVxSgyf.cjs.map +1 -0
  64. package/dist/{id-BB3gV6in.mjs → id-BTNfgdVM.mjs} +1 -3
  65. package/dist/id-BTNfgdVM.mjs.map +1 -0
  66. package/dist/{id-DaFDVA83.cjs → id-xdQHGOv8.cjs} +1 -3
  67. package/dist/id-xdQHGOv8.cjs.map +1 -0
  68. package/dist/index.cjs +18 -18
  69. package/dist/index.d.cts +1 -1
  70. package/dist/index.d.mts +1 -1
  71. package/dist/index.mjs +18 -18
  72. package/dist/{it-EMWUAr6h.cjs → it-F99TSlLv.cjs} +1 -3
  73. package/dist/it-F99TSlLv.cjs.map +1 -0
  74. package/dist/{it-WSc0EZyq.mjs → it-esAnBWbg.mjs} +1 -3
  75. package/dist/it-esAnBWbg.mjs.map +1 -0
  76. package/dist/{ja-DSrM3vx6.mjs → ja-C_S8dZlF.mjs} +1 -3
  77. package/dist/ja-C_S8dZlF.mjs.map +1 -0
  78. package/dist/{ja-D2JpWrek.cjs → ja-DATg2hna.cjs} +1 -3
  79. package/dist/ja-DATg2hna.cjs.map +1 -0
  80. package/dist/{ko-BZOGHtTd.cjs → ko-Bxg6CJyE.cjs} +1 -3
  81. package/dist/ko-Bxg6CJyE.cjs.map +1 -0
  82. package/dist/{ko-DoYEhHVL.mjs → ko-LUFEZOoM.mjs} +1 -3
  83. package/dist/ko-LUFEZOoM.mjs.map +1 -0
  84. package/dist/{nl-B_aPftuN.mjs → nl-BFfFoSzx.mjs} +1 -3
  85. package/dist/nl-BFfFoSzx.mjs.map +1 -0
  86. package/dist/{nl-mYCJVudB.cjs → nl-BipiEl2Q.cjs} +1 -3
  87. package/dist/nl-BipiEl2Q.cjs.map +1 -0
  88. package/dist/{pl-C8X_KcBY.cjs → pl-BiYdB-5a.cjs} +1 -3
  89. package/dist/pl-BiYdB-5a.cjs.map +1 -0
  90. package/dist/{pl-BdeJGNgs.mjs → pl-wYERwtr-.mjs} +1 -3
  91. package/dist/pl-wYERwtr-.mjs.map +1 -0
  92. package/dist/preview/preview-entry.cjs +2 -2
  93. package/dist/preview/preview-entry.mjs +2 -2
  94. package/dist/{pt-XiAo2hJG.cjs → pt-8tMZ4uWP.cjs} +1 -3
  95. package/dist/pt-8tMZ4uWP.cjs.map +1 -0
  96. package/dist/{pt-DbWuhYFC.mjs → pt-Z-wtg_Wc.mjs} +1 -3
  97. package/dist/pt-Z-wtg_Wc.mjs.map +1 -0
  98. package/dist/{ro-Dt2lTtw3.mjs → ro-BQWvfAUV.mjs} +1 -3
  99. package/dist/ro-BQWvfAUV.mjs.map +1 -0
  100. package/dist/{ro-2Eei8NuO.cjs → ro-CMuqphpK.cjs} +1 -3
  101. package/dist/ro-CMuqphpK.cjs.map +1 -0
  102. package/dist/{ru-C4bNnzLB.mjs → ru-DUCGsbF3.mjs} +1 -3
  103. package/dist/ru-DUCGsbF3.mjs.map +1 -0
  104. package/dist/{ru-ChzoP2mW.cjs → ru-wy-AMFvq.cjs} +1 -3
  105. package/dist/ru-wy-AMFvq.cjs.map +1 -0
  106. package/dist/screens/ProfileContentScreen.d.ts.map +1 -1
  107. package/dist/{th-Cz-TqXru.mjs → th-Aj_tbl-j.mjs} +1 -3
  108. package/dist/th-Aj_tbl-j.mjs.map +1 -0
  109. package/dist/{th-K-07qmcT.cjs → th-DdPeGktW.cjs} +1 -3
  110. package/dist/th-DdPeGktW.cjs.map +1 -0
  111. package/dist/{tl-togbrU41.mjs → tl-Bg7GQgRk.mjs} +1 -3
  112. package/dist/tl-Bg7GQgRk.mjs.map +1 -0
  113. package/dist/{tl-sHxId-jY.cjs → tl-Dc8_IxVN.cjs} +1 -3
  114. package/dist/tl-Dc8_IxVN.cjs.map +1 -0
  115. package/dist/{tr-DgBN4Opt.mjs → tr-6sQsUriK.mjs} +1 -3
  116. package/dist/tr-6sQsUriK.mjs.map +1 -0
  117. package/dist/{tr-jPzd-UeG.cjs → tr-C--ETWgS.cjs} +1 -3
  118. package/dist/tr-C--ETWgS.cjs.map +1 -0
  119. package/dist/{use-portal-card-add-3ds-flow-BLmdLBnY.cjs → use-portal-card-add-3ds-flow-D-Qw3yce.cjs} +2 -2
  120. package/dist/{use-portal-card-add-3ds-flow-BLmdLBnY.cjs.map → use-portal-card-add-3ds-flow-D-Qw3yce.cjs.map} +1 -1
  121. package/dist/{use-portal-card-add-3ds-flow-BskyYxWu.mjs → use-portal-card-add-3ds-flow-D5aOJKn7.mjs} +2 -2
  122. package/dist/{use-portal-card-add-3ds-flow-BskyYxWu.mjs.map → use-portal-card-add-3ds-flow-D5aOJKn7.mjs.map} +1 -1
  123. package/dist/{widget-package-utils-CU0YI46R.mjs → widget-package-utils-5RswkdZ0.mjs} +2 -2
  124. package/dist/{widget-package-utils-CU0YI46R.mjs.map → widget-package-utils-5RswkdZ0.mjs.map} +1 -1
  125. package/dist/{widget-package-utils-BhOU0qJk.cjs → widget-package-utils-C_B6s5dP.cjs} +2 -2
  126. package/dist/{widget-package-utils-BhOU0qJk.cjs.map → widget-package-utils-C_B6s5dP.cjs.map} +1 -1
  127. package/dist/widgets/authoring-condition.d.cts +1 -1
  128. package/dist/widgets/authoring-condition.d.mts +1 -1
  129. package/dist/{zh_CN-DPWk63wO.mjs → zh_CN-C8yQjxcL.mjs} +1 -3
  130. package/dist/zh_CN-C8yQjxcL.mjs.map +1 -0
  131. package/dist/{zh_CN-BmrPD-XD.cjs → zh_CN-DyLsy4sz.cjs} +1 -3
  132. package/dist/zh_CN-DyLsy4sz.cjs.map +1 -0
  133. package/dist/{zh_TW-BXBNoqYB.mjs → zh_TW-BMrFgd-s.mjs} +1 -3
  134. package/dist/zh_TW-BMrFgd-s.mjs.map +1 -0
  135. package/dist/{zh_TW-D0Z2_fi_.cjs → zh_TW-CWVtA4bB.cjs} +1 -3
  136. package/dist/zh_TW-CWVtA4bB.cjs.map +1 -0
  137. package/package.json +16 -16
  138. package/dist/OrdersScreen-CtrWLrUM.cjs.map +0 -1
  139. package/dist/OrdersScreen-aMZBKVkL.mjs.map +0 -1
  140. package/dist/ProfileScreen-CJV25-rw.cjs.map +0 -1
  141. package/dist/ProfileScreen-DO52_EB6.mjs.map +0 -1
  142. package/dist/de-BHFw87ND.mjs.map +0 -1
  143. package/dist/de-C4d7nNwd.cjs.map +0 -1
  144. package/dist/el-C88n3QAG.mjs.map +0 -1
  145. package/dist/el-okKQ5I21.cjs.map +0 -1
  146. package/dist/es-CsuG3ASd.mjs.map +0 -1
  147. package/dist/es-ct8Ky3r-.cjs.map +0 -1
  148. package/dist/fr--9vacNOs.cjs.map +0 -1
  149. package/dist/fr-DUigi5UP.mjs.map +0 -1
  150. package/dist/he-BWP-w48u.mjs.map +0 -1
  151. package/dist/he-CPd3vr_i.cjs.map +0 -1
  152. package/dist/hu-B_GUAtJM.mjs.map +0 -1
  153. package/dist/hu-DNZdMvFt.cjs.map +0 -1
  154. package/dist/id-BB3gV6in.mjs.map +0 -1
  155. package/dist/id-DaFDVA83.cjs.map +0 -1
  156. package/dist/it-EMWUAr6h.cjs.map +0 -1
  157. package/dist/it-WSc0EZyq.mjs.map +0 -1
  158. package/dist/ja-D2JpWrek.cjs.map +0 -1
  159. package/dist/ja-DSrM3vx6.mjs.map +0 -1
  160. package/dist/ko-BZOGHtTd.cjs.map +0 -1
  161. package/dist/ko-DoYEhHVL.mjs.map +0 -1
  162. package/dist/nl-B_aPftuN.mjs.map +0 -1
  163. package/dist/nl-mYCJVudB.cjs.map +0 -1
  164. package/dist/pl-BdeJGNgs.mjs.map +0 -1
  165. package/dist/pl-C8X_KcBY.cjs.map +0 -1
  166. package/dist/pt-DbWuhYFC.mjs.map +0 -1
  167. package/dist/pt-XiAo2hJG.cjs.map +0 -1
  168. package/dist/ro-2Eei8NuO.cjs.map +0 -1
  169. package/dist/ro-Dt2lTtw3.mjs.map +0 -1
  170. package/dist/ru-C4bNnzLB.mjs.map +0 -1
  171. package/dist/ru-ChzoP2mW.cjs.map +0 -1
  172. package/dist/th-Cz-TqXru.mjs.map +0 -1
  173. package/dist/th-K-07qmcT.cjs.map +0 -1
  174. package/dist/tl-sHxId-jY.cjs.map +0 -1
  175. package/dist/tl-togbrU41.mjs.map +0 -1
  176. package/dist/tr-DgBN4Opt.mjs.map +0 -1
  177. package/dist/tr-jPzd-UeG.cjs.map +0 -1
  178. package/dist/zh_CN-BmrPD-XD.cjs.map +0 -1
  179. package/dist/zh_CN-DPWk63wO.mjs.map +0 -1
  180. package/dist/zh_TW-BXBNoqYB.mjs.map +0 -1
  181. package/dist/zh_TW-D0Z2_fi_.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"OrdersScreen-aMZBKVkL.mjs","names":["portalTenant.orders_show","portalTenant.orders_list","PortalOrderDetailScreenContent"],"sources":["../../../orders/core/src/orders-api-context.ts","../../../orders/core/src/provider.tsx","../../../orders/core/src/query-keys.ts","../../../orders/core/src/hooks/use-infinite-customer-orders.ts","../../../orders/core/src/hooks/use-portal-tenant-order.ts","../../../orders/core/src/utils/format-order-total.ts","../../../orders/core/src/utils/build-static-map-url.ts","../src/adapters/orders-api-adapter.ts","../src/orders/PortalOrdersApiProvider.tsx","../../../orders/core/src/translation-api-context.ts","../src/providers/OrdersTranslationBridge.tsx","../../../orders/ui/src/components/status-badge.tsx","../../../orders/ui/src/lib/format.ts","../../../orders/ui/src/lib/translate-status.ts","../../../orders/ui/src/lib/effective-order-date.ts","../../../orders/ui/src/lib/fulfillment-status.ts","../../../orders/ui/src/components/fulfillment-status-badge.tsx","../../../orders/ui/src/components/static-map.tsx","../src/screens/orders/portal-orders-list-helpers.ts","../src/screens/orders/PortalOrdersList.tsx","../src/screens/OrdersListScreen.tsx","../../../payments/display/src/components/MaskedPaymentLabel.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 { createContext, use } from \"react\";\nimport type { OrdersApi } from \"./orders-api\";\n\nconst OrdersApiContext = createContext<OrdersApi | null>(null);\n\nexport const OrdersApiProvider = OrdersApiContext.Provider;\n\nexport function useOrdersApi(): OrdersApi {\n const api = use(OrdersApiContext);\n if (!api) {\n throw new Error(\"useOrdersApi must be used within an OrdersCoreProvider\");\n }\n return api;\n}\n","import type { JSX, ReactNode } from \"react\";\nimport type { OrdersApi } from \"./orders-api\";\nimport { OrdersApiProvider } from \"./orders-api-context\";\n\nexport interface OrdersCoreProviderProps {\n api: OrdersApi;\n children: ReactNode;\n}\n\nexport function OrdersCoreProvider({\n api,\n children,\n}: OrdersCoreProviderProps): JSX.Element {\n return <OrdersApiProvider value={api}>{children}</OrdersApiProvider>;\n}\n","import type { orders } from \"./types\";\n\nexport const ordersKeys = {\n all: [\"orders\"] as const,\n list: (params?: orders.FetchOrdersParams) =>\n [...ordersKeys.all, \"list\", params] as const,\n stats: (params?: orders.FetchOrderStatsParams) =>\n [...ordersKeys.all, \"stats\", params] as const,\n detail: (orderToken: string) =>\n [...ordersKeys.all, \"detail\", orderToken] as const,\n adminDetail: (id: string) => [\"order\", id] as const,\n changeLogs: (id: number, params?: { perPage?: number }) =>\n params == null\n ? ([\"order_change_logs_paginated\", id] as const)\n : ([\"order_change_logs_paginated\", id, params] as const),\n // Single-page ActivityPage cache used by subscription timelines. Keep this\n // separate from changeLogs(), which stores InfiniteData<ActivityPage>.\n changeLogsPage: (id: number, params?: { page?: number; perPage?: number }) =>\n [\"order_change_logs\", id, params] as const,\n journey: (id: string) => [\"orderJourneyV3\", id] as const,\n journeyEvents: (id: string) => [\"order-journey-events\", id] as const,\n fraudCheckDetails: (id: string) => [\"fraud-check-details\", id] as const,\n} as const;\n\nexport const portalTenantOrdersKeys = {\n all: [\"portalTenantOrders\"] as const,\n list: (params?: orders.PortalTenantFetchOrdersParams) =>\n [...portalTenantOrdersKeys.all, \"list\", params] as const,\n detail: (id: string | number) =>\n [...portalTenantOrdersKeys.all, \"detail\", id] as const,\n} as const;\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { orders } from \"../types\";\nimport { ordersKeys } from \"../query-keys\";\nimport { useOrdersApi } from \"../orders-api-context\";\n\nexport function useInfiniteCustomerOrders(\n params: Omit<orders.FetchOrdersParams, \"cursor\">,\n options?: { enabled?: boolean },\n) {\n const api = useOrdersApi();\n return useInfiniteQuery({\n queryKey: [...ordersKeys.all, \"infinite-list\", params],\n queryFn: ({ pageParam }) => {\n if (!api.fetchCustomerOrders) {\n throw new Error(\n \"fetchCustomerOrders not implemented on this OrdersApi\",\n );\n }\n return api.fetchCustomerOrders({ ...params, cursor: pageParam });\n },\n getNextPageParam: (lastPage) =>\n lastPage.meta?.pagination?.next_cursor ?? undefined,\n initialPageParam: undefined as string | undefined,\n enabled: options?.enabled ?? true,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { portalTenantOrdersKeys } from \"../query-keys\";\nimport { useOrdersApi } from \"../orders-api-context\";\n\nexport function usePortalTenantOrder(\n id: string | number,\n options?: { enabled?: boolean },\n) {\n const api = useOrdersApi();\n return useQuery({\n queryKey: portalTenantOrdersKeys.detail(id),\n queryFn: () => {\n if (!api.fetchOrderById) {\n throw new Error(\"fetchOrderById not implemented on this OrdersApi\");\n }\n return api.fetchOrderById(id);\n },\n enabled: (options?.enabled ?? true) && !!id,\n });\n}\n","import type { orders } from \"../types\";\n\nexport function formatOrderTotal(order: orders.ListOrder): string {\n if (order.order_total_after_points_redemption != null) {\n return `${order.currency_symbol || \"$\"}${Number(\n order.order_total_after_points_redemption,\n ).toFixed(2)}`;\n }\n return (\n order.total_display_amount ||\n `${order.currency_symbol || \"$\"}${Number(order.amount).toFixed(2)}`\n );\n}\n","export interface StaticMapAddress {\n address1: string | null;\n city: string | null;\n state: string | null;\n postal_code: string | null;\n}\n\nexport interface StaticMapOptions {\n width?: number;\n height?: number;\n zoom?: number;\n markerColor?: string;\n}\n\nexport function buildStaticMapUrl(\n apiKey: string,\n address: StaticMapAddress,\n options?: StaticMapOptions,\n): string | null {\n if (\n !address.address1 ||\n !address.city ||\n !address.state ||\n !address.postal_code\n ) {\n return null;\n }\n\n const formatted = `${address.address1}, ${address.city}, ${address.state} ${address.postal_code.slice(0, 5)}`;\n const encoded = encodeURIComponent(formatted);\n const width = options?.width ?? 600;\n const height = options?.height ?? 300;\n const zoom = options?.zoom ?? 15;\n const markerColor = encodeURIComponent(options?.markerColor ?? \"red\");\n\n return `https://maps.googleapis.com/maps/api/staticmap?center=${encoded}&zoom=${zoom}&size=${width}x${height}&maptype=roadmap&markers=color:${markerColor}%7C${encoded}&key=${apiKey}`;\n}\n","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[\"shipping_address\"];\ntype RawPaymentMethod = RawOrder[\"payment_method\"];\ntype RawShippingMethod = RawOrder[\"shipping_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 phone: raw.phone ?? 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_network: raw.card_network ?? null,\n last4: raw.last4 ?? null,\n logo_url: raw.logo_url ?? null,\n } satisfies orders.PortalTenantPaymentMethod;\n}\n\nfunction mapShippingMethod(\n raw: RawShippingMethod,\n): orders.PortalTenantShippingMethod | null {\n if (!raw) return null;\n return {\n id: raw.id ?? null,\n title: raw.title ?? \"\",\n } satisfies orders.PortalTenantShippingMethod;\n}\n\n/** Loose-read mapper for `tracking_informations`. Field is added to\n * the BFF by the paired Rails change but not yet in the generated\n * OpenAPI types — we read defensively so older deployments that\n * don't send the field render an empty array (block hides itself). */\nfunction mapTrackingInformations(\n raw: unknown,\n): orders.PortalTenantTrackingInformation[] {\n if (!Array.isArray(raw)) return [];\n return raw.flatMap((entry) => {\n if (typeof entry !== \"object\" || entry === null) return [];\n const e = entry as Record<string, unknown>;\n if (typeof e.tracking_number !== \"string\" || e.tracking_number.length === 0)\n return [];\n return [\n {\n id: typeof e.id === \"number\" ? e.id : 0,\n tracking_number: e.tracking_number,\n shipping_carrier:\n typeof e.shipping_carrier === \"string\" ? e.shipping_carrier : null,\n tracking_url:\n typeof e.tracking_url === \"string\" ? e.tracking_url : null,\n } satisfies orders.PortalTenantTrackingInformation,\n ];\n });\n}\n\nfunction mapToPortalTenantOrder(raw: RawOrder): orders.PortalTenantOrder {\n const subtotal = requireMoneyField(raw.subtotal, \"subtotal\");\n const discount = requireMoneyField(raw.discount, \"discount\");\n const shipping = requireMoneyField(raw.shipping, \"shipping\");\n const tax = requireMoneyField(raw.tax, \"tax\");\n const total = requireMoneyField(raw.total, \"total\");\n // order_number is in the OpenAPI spec but the generated client may not\n // yet include it before `pnpm generate` runs. Read defensively until\n // the generated types catch up. Normalize empty string to null so\n // every consumer can null-check on a single shape.\n const rawOrderNumber = (raw as Record<string, unknown>).order_number;\n return {\n id: raw.id ?? 0,\n token: raw.token ?? \"\",\n order_number:\n typeof rawOrderNumber === \"string\" && rawOrderNumber.length > 0\n ? rawOrderNumber\n : null,\n status: (raw.status ?? \"pending\") as orders.PortalTenantOrderStatus,\n // `fulfillment_status` is exposed by the BFF OrderBlueprinter but the\n // generated client may not yet include it before `pnpm generate` runs.\n // Read defensively (same as `mapToListOrder`) and fall back to\n // `unfulfilled` so the status tag renders a real fulfillment state.\n fulfillment_status:\n typeof (raw as Record<string, unknown>).fulfillment_status === \"string\"\n ? ((raw as Record<string, unknown>).fulfillment_status as string)\n : \"unfulfilled\",\n subtotal,\n subtotal_in_currency: raw.subtotal_in_currency ?? subtotal,\n discount,\n discount_in_currency: raw.discount_in_currency ?? discount,\n shipping,\n shipping_in_currency: raw.shipping_in_currency ?? shipping,\n tax,\n tax_in_currency: raw.tax_in_currency ?? tax,\n total,\n total_in_currency: raw.total_in_currency ?? total,\n currency: raw.currency ?? \"\",\n line_items: (raw.line_items ?? []).map((li) => {\n const liPrice = li.price ?? \"0\";\n const liTotal = li.total ?? \"0\";\n return {\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: liPrice,\n price_in_currency: li.price_in_currency ?? liPrice,\n total: liTotal,\n total_in_currency: li.total_in_currency ?? liTotal,\n source_subscription: li.source_subscription?.subscription_token\n ? { subscription_token: li.source_subscription.subscription_token }\n : null,\n };\n }),\n customer_name: raw.customer_name ?? null,\n customer_email: raw.customer_email ?? null,\n shipping_address: mapAddress(raw.shipping_address ?? null),\n billing_address: mapAddress(raw.billing_address ?? null),\n payment_method: mapPaymentMethod(raw.payment_method),\n shipping_method: mapShippingMethod(raw.shipping_method),\n subscription_order: raw.subscription_order ?? false,\n subscription_token: raw.subscription_token ?? null,\n // Returned by the BFF but not in the OpenAPI spec yet (added\n // alongside this UI work). Defensive read so we don't crash on\n // older deployments that haven't shipped the blueprinter change.\n tracking_informations: mapTrackingInformations(\n (raw as Record<string, unknown>).tracking_informations,\n ),\n // These fields are returned by the BFF but not yet in the OpenAPI spec.\n // Regenerate the portal-tenant client (`pnpm generate`) and drop these\n // defensive casts once the paired BE OpenAPI change lands.\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 points_applied:\n typeof (raw as Record<string, unknown>).points_applied === \"number\"\n ? ((raw as Record<string, unknown>).points_applied as number)\n : undefined,\n points_applied_amount:\n typeof (raw as Record<string, unknown>).points_applied_amount === \"number\"\n ? ((raw as Record<string, unknown>).points_applied_amount as number)\n : undefined,\n points_applied_amount_in_currency:\n typeof (raw as Record<string, unknown>)\n .points_applied_amount_in_currency === \"string\"\n ? ((raw as Record<string, unknown>)\n .points_applied_amount_in_currency as string)\n : null,\n order_total_after_points_redemption:\n typeof (raw as Record<string, unknown>)\n .order_total_after_points_redemption === \"number\"\n ? ((raw as Record<string, unknown>)\n .order_total_after_points_redemption as number)\n : undefined,\n order_total_after_points_redemption_in_currency:\n typeof (raw as Record<string, unknown>)\n .order_total_after_points_redemption_in_currency === \"string\"\n ? ((raw as Record<string, unknown>)\n .order_total_after_points_redemption_in_currency as string)\n : null,\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 // Defensive read while the generated client catches up to the OpenAPI\n // spec; mirrors the same approach used in `mapToPortalTenantOrder`.\n // `ListOrder.order_number` is typed as a non-nullable string, so fall\n // back to empty string for historical orders that predate auto-\n // generation. The UI guards on truthiness, so empty string hides the\n // row just like null would.\n const rawOrderNumber = (raw as Record<string, unknown>).order_number;\n const orderNumber = typeof rawOrderNumber === \"string\" ? rawOrderNumber : \"\";\n return {\n id: raw.id ?? 0,\n external_id: null,\n order_number: orderNumber,\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:\n (typeof (raw as Record<string, unknown>).fulfillment_status === \"string\"\n ? ((raw as Record<string, unknown>).fulfillment_status as string)\n : null) ?? \"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.total_in_currency ?? raw.total ?? \"0\",\n total_cv: 0,\n total_qv: 0,\n // BFF doesn't expose a currency symbol; leave empty so `formatOrderTotal`\n // falls back to \"$\" rather than rendering the ISO code (e.g. \"USD50.00\").\n currency_symbol: \"\",\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: raw.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 // Up to 3 product image URLs from the order's line items, in line-item\n // order, used for list-row photo stacks. Skips items without an image.\n thumbnail_image_urls:\n raw.line_items\n ?.map((li) => li.image_url)\n .filter((u): u is string => typeof u === \"string\" && u.length > 0)\n .slice(0, 3) ?? [],\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","import type { Provider } from \"react\";\nimport { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport type { OrdersDict } from \"./translation-dictionary\";\n\nconst { Provider: OrdersProvider, useTranslation } =\n createTranslationContext<OrdersDict>(\"Orders\");\n\nexport const OrdersTranslationProvider: Provider<TranslationApi<OrdersDict> | null> =\n OrdersProvider;\nexport const useOrdersTranslation = useTranslation;\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n ordersDomain,\n createOrdersTranslationAdapter,\n} from \"@fluid-app/orders-core/translation-adapter\";\nimport { OrdersTranslationProvider } from \"@fluid-app/orders-core/translation-api-context\";\n\nexport function OrdersTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(ordersDomain, locale);\n const api = useMemo(\n () => createOrdersTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <OrdersTranslationProvider value={api}>\n {children}\n </OrdersTranslationProvider>\n );\n}\n","import type React from \"react\";\nimport { cn } from \"@fluid-app/ui-primitives\";\n\nexport type BadgeColor =\n | \"green\"\n | \"yellow\"\n | \"red\"\n | \"blue\"\n | \"orange\"\n | \"gray\";\n\ntype BadgeSize = \"xs\" | \"sm\" | \"md\";\n\ninterface StatusBadgeProps {\n color: BadgeColor;\n dot?: boolean;\n size?: BadgeSize;\n className?: string;\n children: React.ReactNode;\n}\n\nconst colorStyles: Record<BadgeColor, string> = {\n green: \"bg-green-500/15 text-foreground\",\n yellow: \"bg-yellow-500/15 text-foreground\",\n red: \"bg-red-500/15 text-foreground\",\n blue: \"bg-blue-500/15 text-foreground\",\n orange: \"bg-orange-500/15 text-foreground\",\n gray: \"bg-foreground/10 text-foreground\",\n};\n\nconst dotColorStyles: Record<BadgeColor, string> = {\n green: \"bg-green-500\",\n yellow: \"bg-yellow-500\",\n red: \"bg-red-500\",\n blue: \"bg-blue-500\",\n orange: \"bg-orange-500\",\n gray: \"bg-gray-500\",\n};\n\nconst sizeStyles: Record<BadgeSize, string> = {\n xs: \"px-1.5 py-0.5 text-[10px]\",\n sm: \"px-2 py-0.5 text-xs\",\n md: \"px-2.5 py-1 text-sm\",\n};\n\nexport function StatusBadge({\n color,\n dot,\n size = \"md\",\n className,\n children,\n}: StatusBadgeProps): React.JSX.Element {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1 rounded-full font-medium whitespace-nowrap capitalize\",\n colorStyles[color],\n sizeStyles[size],\n className,\n )}\n >\n {dot && (\n <span\n className={cn(\"h-1.5 w-1.5 rounded-full\", dotColorStyles[color])}\n />\n )}\n {children}\n </span>\n );\n}\n","export function startCase(str: string | undefined | null): string {\n if (!str) return \"\";\n return str.replace(/_/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport function formatCurrency(symbol: string, value: string | number): string {\n return `${symbol}${Number(value).toFixed(2)}`;\n}\n","import type { OrdersDict } from \"@fluid-app/orders-core/translation-dictionary\";\nimport { startCase } from \"./format\";\n\n/** Status values that have a `status_*` translation key in the orders dictionary. */\nconst translatableStatuses = new Set<string>([\n \"cancelled\",\n \"completed\",\n \"fulfilled\",\n \"pending\",\n \"preparing\",\n \"processing\",\n \"returned\",\n \"shipped\",\n]);\n\n/**\n * Translate an order status using the orders `t()` function.\n * Falls back to `startCase` for statuses without a dedicated translation key.\n */\nexport function translateStatus(\n t: (key: keyof OrdersDict) => string,\n status: string,\n): string {\n if (translatableStatuses.has(status)) {\n return t(`status_${status}` as keyof OrdersDict);\n }\n return startCase(status);\n}\n","type OrderWithDates = {\n sale_date?: string | null;\n created_at: string;\n};\n\nexport function effectiveOrderDate(order: OrderWithDates): string {\n return order.sale_date ?? order.created_at;\n}\n","import type { BadgeColor } from \"../components/status-badge\";\n\n/**\n * Canonical fulfillment-status → badge color mapping.\n *\n * This is a deliberate mirror of fluid-admin's fulfillment color config\n * (`COLOR_CONFIG.fulfillment` + `getDefaultColorForUnknownStatus` in\n * `apps/fluid-admin/components/Orders/utils/formatters.ts`) so the\n * customer-facing portal renders order status tags with the SAME label\n * and color as the admin — admin is the source of truth (CURRENT-1496).\n *\n * The `Commerce::Order#fulfillment_status` enum values are:\n * `unfulfilled, in_progress, on_hold, partially_fulfilled, scheduled,\n * fulfilled`.\n */\nconst FULFILLMENT_STATUS_COLORS: Record<string, BadgeColor> = {\n fulfilled: \"gray\",\n unfulfilled: \"yellow\",\n in_progress: \"yellow\",\n on_hold: \"orange\",\n partially_fulfilled: \"yellow\",\n scheduled: \"blue\",\n // `processing` is not a fulfillment_status enum value but the BFF /\n // legacy responses can surface it; admin colors it yellow, so we match.\n processing: \"yellow\",\n};\n\n/**\n * Cancelled-family lifecycle values. These come from `order_status` (not\n * `fulfillment_status`), and the portal orders list surfaces them on the\n * same pill. Admin renders these red, so we match.\n */\nconst CANCELLED_FAMILY_COLORS: Record<string, BadgeColor> = {\n cancelled: \"red\",\n returned: \"red\",\n refunded: \"red\",\n};\n\n/**\n * Fallback for statuses not in the explicit maps. Mirrors admin's\n * `getDefaultColorForUnknownStatus` for the fulfillment type so unknown\n * values still read consistently with admin rather than defaulting to a\n * meaningless grey.\n */\nfunction defaultColor(status: string): BadgeColor {\n if (status.includes(\"fulfilled\") || status.includes(\"complete\"))\n return \"gray\";\n if (status.includes(\"hold\")) return \"orange\";\n return \"yellow\";\n}\n\n/**\n * Cancelled-family lifecycle values, derived from the color map so there is\n * a single source of truth. Membership is checked case-insensitively.\n */\nconst CANCELLED_FAMILY = new Set(Object.keys(CANCELLED_FAMILY_COLORS));\n\n/**\n * Resolve which status string should drive an order's pill. Cancelled-family\n * lifecycle values (`cancelled` / `returned` / `refunded`) come from the\n * order's lifecycle status; everything else reads off `fulfillment_status`\n * (the source of truth per `Commerce::Order#fulfillment_status`).\n *\n * Both the orders list and the order detail page use this so a cancelled\n * order renders red \"Cancelled\" instead of a misleading yellow \"Unfulfilled\"\n * — `fulfillment_status` has no cancelled-family value, so a cancelled order\n * typically carries `fulfillment_status: \"unfulfilled\"` (CURRENT-1496).\n *\n * lifecycleStatus - the order's lifecycle status (`order_status` on a list\n * order, `status` on a portal-tenant detail order).\n * fulfillmentStatus - the order's `fulfillment_status`.\n */\nexport function resolveOrderStatus(\n lifecycleStatus: string | undefined,\n fulfillmentStatus: string | undefined,\n): string {\n if (lifecycleStatus && CANCELLED_FAMILY.has(lifecycleStatus.toLowerCase())) {\n return lifecycleStatus;\n }\n return fulfillmentStatus ?? lifecycleStatus ?? \"\";\n}\n\n/**\n * Resolve the badge color for an order status tag, matching admin exactly\n * for every `fulfillment_status` enum value and the cancelled family.\n */\nexport function fulfillmentStatusColor(status: string | undefined): BadgeColor {\n if (!status) return \"gray\";\n const normalized = status.toLowerCase();\n return (\n FULFILLMENT_STATUS_COLORS[normalized] ??\n CANCELLED_FAMILY_COLORS[normalized] ??\n defaultColor(normalized)\n );\n}\n","import type React from \"react\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { StatusBadge } from \"./status-badge\";\nimport { fulfillmentStatusColor } from \"../lib/fulfillment-status\";\nimport { translateStatus } from \"../lib/translate-status\";\n\nexport interface FulfillmentStatusBadgeProps {\n /**\n * The order's `fulfillment_status` (the source of truth per\n * `Commerce::Order#fulfillment_status`). The orders list also passes\n * cancelled-family `order_status` values here for terminal orders, which\n * are colored red to match admin.\n */\n status: string;\n className?: string;\n}\n\n/**\n * Renders an order status tag whose label and color match the fluid-admin\n * fulfillment pill exactly (CURRENT-1496). Admin is the source of truth:\n * `fulfilled` is grey, `unfulfilled`/`in_progress`/`partially_fulfilled`\n * are yellow, `on_hold` is orange, and `scheduled` is blue. Labels come\n * from `translateStatus`, which yields the same start-cased text admin\n * shows (`getStatusDisplayText`) while preserving the translated\n * `status_fulfilled` copy where available.\n */\nexport function FulfillmentStatusBadge({\n status,\n className,\n}: FulfillmentStatusBadgeProps): React.JSX.Element {\n const { t } = useOrdersTranslation();\n return (\n <StatusBadge\n color={fulfillmentStatusColor(status)}\n dot\n size=\"sm\"\n className={className}\n >\n {translateStatus(t, status)}\n </StatusBadge>\n );\n}\n","import type React from \"react\";\nimport { useState } from \"react\";\nimport type {\n StaticMapAddress,\n StaticMapOptions,\n} from \"@fluid-app/orders-core\";\nimport { buildStaticMapUrl } from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\n\nexport interface StaticMapProps {\n apiKey: string;\n address: StaticMapAddress;\n options?: StaticMapOptions;\n alt?: string;\n className?: string;\n}\n\nexport function StaticMap({\n apiKey,\n address,\n options,\n alt,\n className,\n}: StaticMapProps): React.JSX.Element | null {\n const { t } = useOrdersTranslation();\n const [errored, setErrored] = useState(false);\n const url = buildStaticMapUrl(apiKey, address, options);\n\n if (!url || errored) return null;\n\n return (\n <img\n src={url}\n alt={alt ?? t(\"shipping_address_map\")}\n width={options?.width ?? 600}\n height={options?.height ?? 300}\n className={\n className ??\n \"border-border w-full rounded border object-cover shadow-xs\"\n }\n onError={() => setErrored(true)}\n />\n );\n}\n","import { resolveOrderStatus } from \"@fluid-app/orders-ui/lib/fulfillment-status\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport type { OrdersDict } from \"@fluid-app/orders-core/translation-dictionary\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\n\nexport type T = TranslationApi<OrdersDict>[\"t\"];\n\nexport type FilterKey = \"all\" | \"fulfilled\" | \"preparing\" | \"subscription\";\n\nexport type StatusKind =\n | \"fulfilled\"\n | \"preparing\"\n | \"shipped\"\n | \"cancelled\"\n | \"pending\";\n\n// Fulfillment_status enum values (the source of truth per the BFF) fold\n// into the coarse kinds used only for the filter tabs. Order_status\n// cancelled-family values stay as aliases so `statusForOrder` can fall\n// back to order_status when an order is cancelled (fulfillment_status\n// doesn't model that state).\n//\n// NOTE: this lookup no longer drives the rendered pill's label or color.\n// The pill is rendered by `FulfillmentStatusBadge`, which mirrors the\n// fluid-admin fulfillment mapping exactly (CURRENT-1496).\nconst STATUS_KIND_LOOKUP: Record<string, StatusKind> = {\n fulfilled: \"fulfilled\",\n // `completed` is an order_status lifecycle value kept as a defensive\n // alias so an order whose BFF response is missing `fulfillment_status`\n // still classifies as fulfilled instead of unknown/pending.\n completed: \"fulfilled\",\n shipped: \"shipped\",\n partially_fulfilled: \"preparing\",\n in_progress: \"preparing\",\n on_hold: \"preparing\",\n scheduled: \"preparing\",\n preparing: \"preparing\",\n cancelled: \"cancelled\",\n returned: \"cancelled\",\n refunded: \"cancelled\",\n pending: \"pending\",\n unfulfilled: \"pending\",\n processing: \"pending\",\n};\n\n/**\n * Classify a raw status string onto the internal `StatusKind` vocabulary\n * used to drive the filter tabs. This is intentionally coarser than the\n * rendered pill — the pill's label and color come from\n * `FulfillmentStatusBadge`. Unknown statuses fall back to `pending`.\n */\nexport function statusKind(orderStatus: string): StatusKind {\n return STATUS_KIND_LOOKUP[(orderStatus || \"\").toLowerCase()] ?? \"pending\";\n}\n\n/**\n * Pick the right status string to drive the pill / filter for a list order.\n * Cancelled-family lifecycle states come from `order_status`; everything\n * else is read off `fulfillment_status` (the BFF source-of-truth per the\n * `Commerce::Order#fulfillment_status` enum). Delegates to the shared\n * `resolveOrderStatus` so the list and the order detail page stay in lockstep.\n */\nexport function statusForOrder(order: orders.ListOrder): string {\n return resolveOrderStatus(order.order_status, order.fulfillment_status);\n}\n\nexport function filterPredicate(\n filter: FilterKey,\n order: orders.ListOrder,\n): boolean {\n if (filter === \"all\") return true;\n if (filter === \"subscription\") return order.subscription != null;\n const kind = statusKind(statusForOrder(order));\n if (filter === \"fulfilled\") return kind === \"fulfilled\" || kind === \"shipped\";\n if (filter === \"preparing\") return kind === \"preparing\" || kind === \"pending\";\n return true;\n}\n\nexport function countByFilter(\n list: orders.ListOrder[],\n): Record<FilterKey, number> {\n return {\n all: list.length,\n fulfilled: list.filter((o) => filterPredicate(\"fulfilled\", o)).length,\n preparing: list.filter((o) => filterPredicate(\"preparing\", o)).length,\n subscription: list.filter((o) => filterPredicate(\"subscription\", o)).length,\n };\n}\n\nexport interface OrderGroup {\n label: string;\n orders: orders.ListOrder[];\n}\n\n/**\n * The date to show reps in the order history list. Prefers `sale_date`\n * (when the sale actually happened — meaningful for historical orders\n * imported via sync, where `created_at` is just when the row landed in\n * Fluid) and falls back to `created_at` for orders placed natively.\n */\nexport function orderDisplayDate(order: orders.ListOrder): string {\n return order.sale_date ?? order.created_at;\n}\n\n/**\n * Group orders into date buckets (\"This week\", \"This month\", month name, or\n * \"{Month} {year}\" for anything older than the current year). Insertion\n * order is preserved within and between buckets so newest-first ordering\n * from the BFF carries through.\n *\n * `t` resolves the structural bucket labels (\"This week\" / \"This month\").\n * Older buckets use `toLocaleDateString` which is locale-aware on its own.\n * `now` is injectable for tests; defaults to the current wall-clock time.\n *\n * Buckets reps by `orderDisplayDate` — sale_date when set, created_at\n * otherwise — so historical imported orders land in their real-life\n * month instead of the day they were synced into Fluid.\n */\nexport function groupOrdersByDate(\n list: orders.ListOrder[],\n t: T,\n now: Date = new Date(),\n): OrderGroup[] {\n if (list.length === 0) return [];\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const sevenDaysAgo = new Date(startOfToday);\n sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n const startOfYear = new Date(now.getFullYear(), 0, 1);\n\n const buckets = new Map<string, orders.ListOrder[]>();\n const order: string[] = [];\n\n for (const o of list) {\n const bucketDate = new Date(orderDisplayDate(o));\n let label: string;\n if (bucketDate >= sevenDaysAgo) {\n label = t(\"group_this_week\");\n } else if (bucketDate >= startOfMonth) {\n label = t(\"group_this_month\");\n } else if (bucketDate >= startOfYear) {\n label = bucketDate.toLocaleDateString(undefined, {\n month: \"long\",\n });\n } else {\n label = bucketDate.toLocaleDateString(undefined, {\n month: \"long\",\n year: \"numeric\",\n });\n }\n let bucket = buckets.get(label);\n if (!bucket) {\n bucket = [];\n buckets.set(label, bucket);\n order.push(label);\n }\n bucket.push(o);\n }\n\n return order.map((label) => ({\n label,\n orders: buckets.get(label) ?? [],\n }));\n}\n\n/**\n * Render a friendly relative-time label for an order's created_at.\n * `t` resolves the relative-time templates; `{{n}}` placeholders are\n * substituted by the i18n system. Absolute dates use\n * `toLocaleDateString` which is locale-aware on its own.\n * `now` is injectable for tests.\n */\nexport function formatFriendlyDate(\n iso: string,\n t: T,\n now: Date = new Date(),\n): string {\n try {\n const d = new Date(iso);\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const startOfDate = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n const diffDays = Math.round(\n (startOfToday.getTime() - startOfDate.getTime()) / (1000 * 60 * 60 * 24),\n );\n\n if (diffDays === 0) return t(\"today\");\n if (diffDays === 1) return t(\"yesterday\");\n if (diffDays < 7) return t(\"n_days_ago\", { n: diffDays });\n if (diffDays < 14) return t(\"last_week\");\n if (diffDays < 30) return t(\"n_weeks_ago\", { n: Math.round(diffDays / 7) });\n if (d.getFullYear() === now.getFullYear()) {\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n }\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return \"\";\n }\n}\n\n/**\n * Compute the per-image transform for the photo-stack fan in `OrderRow`.\n * Index 0 is the front (centered, no rotation); index 1 peeks right;\n * index 2 peeks left.\n */\nexport function fanStyle(\n i: number,\n count: number,\n): { left: string; transform: string; zIndex: number } {\n if (i === 0) {\n return {\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 30,\n };\n }\n if (i === 1) {\n return {\n left: \"50%\",\n transform:\n count === 2\n ? \"translateX(-25%) rotate(7deg)\"\n : \"translateX(-20%) rotate(7deg)\",\n zIndex: 20,\n };\n }\n return {\n left: \"50%\",\n transform: \"translateX(-80%) rotate(-7deg)\",\n zIndex: 10,\n };\n}\n","import { type JSX, useMemo, useState } from \"react\";\nimport {\n type orders,\n useInfiniteCustomerOrders,\n formatOrderTotal,\n} from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { Search, ImageOff, Repeat, AlertCircle } from \"lucide-react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n Input,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { FulfillmentStatusBadge } from \"@fluid-app/orders-ui\";\nimport {\n type FilterKey,\n type T,\n countByFilter,\n fanStyle,\n filterPredicate,\n formatFriendlyDate,\n groupOrdersByDate,\n orderDisplayDate,\n statusForOrder,\n} from \"./portal-orders-list-helpers\";\n\nexport type { FilterKey } from \"./portal-orders-list-helpers\";\n\ninterface PortalOrdersListProps {\n customerId: number | undefined;\n onOrderClick: (order: orders.ListOrder) => void;\n /**\n * Translation function. Falls back to the context-provided `t` when\n * absent. Production callers should always supply `t` or ensure the\n * `OrdersTranslationBridge` is mounted above this component.\n */\n t?: T;\n}\n\nexport function PortalOrdersList({\n customerId,\n onOrderClick,\n t: tProp,\n}: PortalOrdersListProps): JSX.Element {\n const { t: tContext } = useOrdersTranslation();\n const t = tProp ?? tContext;\n\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [filter, setFilter] = useState<FilterKey>(\"all\");\n const {\n data,\n isLoading,\n isError,\n refetch,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n } = useInfiniteCustomerOrders(\n {\n customerId,\n limit: 10,\n search: searchTerm || undefined,\n sort: \"-created_at\",\n },\n { enabled: !!customerId },\n );\n\n const list = useMemo(\n () => data?.pages.flatMap((p) => p.orders) ?? [],\n [data],\n );\n const counts = useMemo(() => countByFilter(list), [list]);\n const filteredList = useMemo(\n () => list.filter((o) => filterPredicate(filter, o)),\n [list, filter],\n );\n const groups = useMemo(\n () => groupOrdersByDate(filteredList, t),\n [filteredList, t],\n );\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"order_history\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div className=\"relative\">\n <div className=\"relative mx-auto max-w-4xl px-5 pt-8 pb-20 md:px-8\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-foreground flex-1 truncate text-xl font-bold tracking-tight md:text-2xl\">\n {t(\"order_history\")}\n </h1>\n <div className=\"relative hidden sm:block\">\n <Search\n className=\"text-muted-foreground pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2\"\n strokeWidth={2}\n />\n <Input\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder={t(\"search_orders\")}\n className=\"ring-border h-9 w-64 rounded-md bg-transparent pl-9 text-xs\"\n />\n </div>\n </div>\n\n {list.length > 0 && (\n <FilterPills\n active={filter}\n counts={counts}\n onChange={setFilter}\n t={t}\n />\n )}\n\n {isLoading ? (\n <div className=\"ring-border mt-4 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <OrdersListSkeleton />\n </div>\n ) : isError ? (\n <div className=\"ring-border mt-4 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <ErrorState onRetry={() => refetch()} t={t} />\n </div>\n ) : filteredList.length === 0 ? (\n <div className=\"ring-border mt-4 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <EmptyState searching={!!searchTerm || filter !== \"all\"} t={t} />\n </div>\n ) : (\n <div className=\"mt-4 space-y-6\">\n {groups.map((group) => (\n <div key={group.label}>\n <div className=\"text-muted-foreground mb-2 px-1 text-xs font-semibold\">\n {group.label}\n </div>\n <div className=\"space-y-3\">\n {group.orders.map((order) => (\n <OrderRow\n key={order.id}\n order={order}\n onClick={() => onOrderClick(order)}\n t={t}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {hasNextPage && (\n <div className=\"mt-3 flex justify-center\">\n <button\n type=\"button\"\n onClick={() => fetchNextPage()}\n disabled={isFetchingNextPage}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {isFetchingNextPage ? t(\"loading\") : t(\"load_more\")}\n </button>\n </div>\n )}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Filter pills ─────────────────────────────────────────────────────────\n\nconst FILTER_KEYS: ReadonlyArray<{\n key: FilterKey;\n labelKey:\n | \"filter_all\"\n | \"filter_fulfilled\"\n | \"filter_preparing\"\n | \"filter_subscription\";\n}> = [\n { key: \"all\", labelKey: \"filter_all\" },\n { key: \"fulfilled\", labelKey: \"filter_fulfilled\" },\n { key: \"preparing\", labelKey: \"filter_preparing\" },\n { key: \"subscription\", labelKey: \"filter_subscription\" },\n];\n\nfunction FilterPills({\n active,\n counts,\n onChange,\n t,\n}: {\n active: FilterKey;\n counts: Record<FilterKey, number>;\n onChange: (k: FilterKey) => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"-mx-1 mt-5 flex flex-wrap gap-1.5 px-1\">\n {FILTER_KEYS.map((f) => {\n const isActive = f.key === active;\n const count = counts[f.key];\n return (\n <button\n key={f.key}\n type=\"button\"\n onClick={() => onChange(f.key)}\n className={`inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-bold transition-all ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"ring-border text-foreground hover:bg-muted bg-transparent ring-1\"\n }`}\n >\n {t(f.labelKey)}\n <span\n className={`text-xs tabular-nums ${\n isActive\n ? \"text-primary-foreground/70\"\n : \"text-muted-foreground\"\n }`}\n >\n {count}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\n// ─── Order row ────────────────────────────────────────────────────────────\n\nfunction OrderRow({\n order,\n onClick,\n t,\n}: {\n order: orders.ListOrder;\n onClick: () => void;\n t: T;\n}): JSX.Element {\n const dateLabel = formatFriendlyDate(orderDisplayDate(order), t);\n const total = formatOrderTotal(order);\n const titleText =\n order.first_item?.title || `${t(\"order_number\")}${order.order_number}`;\n const titleSuffix =\n order.items_count > 1 ? t(\"more_items\", { n: order.items_count - 1 }) : \"\";\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-foreground/5 hover:ring-foreground/10 focus-visible:ring-foreground/30 relative flex w-full cursor-pointer items-center gap-4 rounded-2xl bg-transparent p-4 text-left shadow-sm ring-1 transition-all duration-300 hover:-translate-y-0.5 hover:shadow-lg focus-visible:ring-2 focus-visible:outline-none\"\n >\n <div className=\"min-w-0 flex-1\">\n {order.order_number && order.first_item?.title && (\n <div className=\"text-muted-foreground truncate text-xs\">\n {t(\"order_number\")}\n {order.order_number}\n </div>\n )}\n <div className=\"flex items-center gap-2\">\n <div className=\"text-foreground truncate text-sm font-bold\">\n {titleText}\n {titleSuffix && (\n <span className=\"text-muted-foreground font-medium\">\n {titleSuffix}\n </span>\n )}\n </div>\n <FulfillmentStatusBadge status={statusForOrder(order)} />\n </div>\n <div className=\"text-muted-foreground mt-1 truncate text-xs\">\n {dateLabel} · {total}\n </div>\n </div>\n <ThumbnailStack\n fallback={order.first_item}\n urls={order.thumbnail_image_urls}\n isSubscription={order.subscription != null}\n t={t}\n />\n </button>\n );\n}\n\nfunction ThumbnailStack({\n urls,\n fallback,\n isSubscription,\n t,\n}: {\n urls: string[] | undefined;\n fallback: orders.FirstItem | null;\n isSubscription?: boolean;\n t: T;\n}): JSX.Element {\n // Prefer the explicit thumbnail array; fall back to first_item.image_url\n // for older API responses or when only one image exists.\n const effective = (\n urls && urls.length > 0\n ? urls\n : fallback?.image_url\n ? [fallback.image_url]\n : []\n ).slice(0, 3);\n\n if (effective.length === 0) {\n return (\n <div className=\"ring-border bg-muted text-muted-foreground relative flex size-12 shrink-0 items-center justify-center rounded-xl ring-1\">\n <ImageOff className=\"size-5\" strokeWidth={1.75} />\n {isSubscription && <SubscriptionBadge t={t} />}\n </div>\n );\n }\n\n if (effective.length === 1) {\n return (\n <div className=\"relative size-12 shrink-0\">\n <img\n src={effective[0]}\n alt=\"\"\n className=\"ring-background size-12 rounded-xl bg-transparent object-cover ring-[3px]\"\n />\n {isSubscription && <SubscriptionBadge t={t} />}\n </div>\n );\n }\n\n // Symmetric fan: front image centered, with up to 2 back images peeking\n // out behind on the left and right with a slight outward rotation. The\n // container is wider than a single thumb so back images can peek.\n const stackWidth = effective.length === 3 ? \"w-[80px]\" : \"w-[60px]\";\n return (\n <div className={`relative h-12 ${stackWidth} shrink-0`}>\n {effective.map((url, i) => (\n <img\n key={`${url}-${i}`}\n src={url}\n alt=\"\"\n className=\"ring-background absolute top-0 size-12 rounded-xl bg-transparent object-cover ring-[3px]\"\n style={fanStyle(i, effective.length)}\n />\n ))}\n {isSubscription && <SubscriptionBadge t={t} />}\n </div>\n );\n}\n\nfunction SubscriptionBadge({ t }: { t: T }): JSX.Element {\n return (\n <div\n className=\"bg-primary text-primary-foreground ring-background absolute -top-1 -right-1 z-40 flex size-5 items-center justify-center rounded-full ring-2\"\n title={t(\"from_subscription\")}\n >\n <Repeat className=\"size-2.5\" strokeWidth={2.75} />\n </div>\n );\n}\n\nfunction OrdersListSkeleton(): JSX.Element {\n return (\n <>\n {Array(4)\n .fill(0)\n .map((_, i) => (\n <div\n key={i}\n className={`flex items-center gap-3 px-4 py-3.5 ${i < 3 ? \"border-border border-b\" : \"\"}`}\n >\n <div className=\"bg-muted size-12 shrink-0 animate-pulse rounded-xl\" />\n <div className=\"flex-1 space-y-2\">\n <div className=\"bg-muted h-4 w-1/3 animate-pulse rounded\" />\n <div className=\"bg-muted h-3 w-1/2 animate-pulse rounded\" />\n </div>\n </div>\n ))}\n </>\n );\n}\n\nfunction EmptyState({\n searching,\n t,\n}: {\n searching: boolean;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"flex flex-col items-center gap-2 px-4 py-12 text-center\">\n <div className=\"bg-muted flex size-12 items-center justify-center rounded-full\">\n <Search className=\"text-muted-foreground size-5\" strokeWidth={2} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {searching ? t(\"no_matching_orders\") : t(\"no_orders_yet\")}\n </div>\n <div className=\"text-muted-foreground max-w-sm text-xs\">\n {searching ? t(\"search_hint\") : t(\"empty_hint\")}\n </div>\n </div>\n );\n}\n\nfunction ErrorState({\n onRetry,\n t,\n}: {\n onRetry: () => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"flex flex-col items-center gap-2 px-4 py-12 text-center\">\n <div className=\"bg-muted flex size-12 items-center justify-center rounded-full\">\n <AlertCircle className=\"text-muted-foreground size-5\" strokeWidth={2} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"load_failed_title\")}\n </div>\n <div className=\"text-muted-foreground max-w-sm text-xs\">\n {t(\"load_failed_hint\")}\n </div>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 mt-2 inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-xs font-bold transition-all\"\n >\n {t(\"try_again\")}\n </button>\n </div>\n );\n}\n","import type { orders } from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalOrdersList } from \"./orders/PortalOrdersList\";\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 const { t } = useOrdersTranslation();\n\n const handleOrderClick = (order: orders.ListOrder) => {\n navigate(`orders/${order.token}`);\n };\n\n return (\n <PortalOrdersList\n customerId={BFF_SCOPED_CUSTOMER_ID}\n onOrderClick={handleOrderClick}\n t={t}\n />\n );\n}\n","import type { CSSProperties } from \"react\";\nimport { maskedCardLabelSegments } from \"../display\";\n\nexport interface MaskedPaymentLabelProps {\n label: string;\n className?: string;\n}\n\nconst labelStyle: CSSProperties = {\n display: \"inline-flex\",\n minHeight: \"1.5rem\",\n alignItems: \"center\",\n fontSize: \"0.875rem\",\n lineHeight: 1,\n // Let long unbroken fallback labels (e.g. a masked email/handle with no\n // spaces) wrap instead of overflowing a narrow column. Inert for the\n // masked-segments path, whose children are spans rather than text.\n overflowWrap: \"anywhere\",\n};\n\nconst segmentsStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n // Wrap onto a new line in narrow containers (e.g. the checkout\n // order-confirmation grid) instead of overflowing the box.\n flexWrap: \"wrap\",\n rowGap: \"0.25rem\",\n};\n\nconst dotsStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.375rem\",\n // Let a single group's dots wrap too, so one atomic group can never\n // overflow an extremely narrow container.\n flexWrap: \"wrap\",\n};\n\nconst dotStyle: CSSProperties = {\n display: \"block\",\n width: \"0.375rem\",\n height: \"0.375rem\",\n borderRadius: \"9999px\",\n backgroundColor: \"currentColor\",\n};\n\nconst textAfterDotsStyle: CSSProperties = {\n marginLeft: \"0.125rem\",\n};\n\n// Spacing between masked groups. Applied as a trailing margin on the\n// preceding group (not a leading spacer) so a wrapped line never starts\n// with an indent.\nconst GROUP_GAP = \"0.75rem\";\n\nexport function MaskedPaymentLabel({\n label,\n className,\n}: MaskedPaymentLabelProps) {\n const segments = maskedCardLabelSegments(label);\n\n if (!segments) {\n return (\n <p className={className} style={labelStyle}>\n {label}\n </p>\n );\n }\n\n return (\n <p className={className} style={labelStyle} aria-label={label}>\n <span aria-hidden=\"true\" style={segmentsStyle}>\n {segments.map((segment, index) => {\n // Gaps are rendered as a trailing margin on the preceding group.\n if (segment.kind === \"gap\") return null;\n\n const trailingGap: CSSProperties | null =\n segments[index + 1]?.kind === \"gap\"\n ? { marginInlineEnd: GROUP_GAP }\n : null;\n\n if (segment.kind === \"dots\") {\n return (\n <span\n key={`${segment.kind}-${index}`}\n style={{ ...dotsStyle, ...trailingGap }}\n >\n {Array.from({ length: segment.count }, (_, dotIndex) => (\n <span key={dotIndex} style={dotStyle} />\n ))}\n </span>\n );\n }\n\n const textStyle: CSSProperties = {\n ...(segments[index - 1]?.kind === \"dots\"\n ? textAfterDotsStyle\n : null),\n ...trailingGap,\n };\n\n return (\n <span\n key={`${segment.kind}-${index}`}\n style={Object.keys(textStyle).length > 0 ? textStyle : undefined}\n >\n {segment.value}\n </span>\n );\n })}\n </span>\n </p>\n );\n}\n","import type React from \"react\";\nimport { useEffect, useState } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { usePortalTenantOrder } from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { usePointsLabel } from \"@fluid-app/portal-react/hooks/use-points-label\";\nimport { normalizeCardBrand } from \"@fluid-app/payments-display/brands\";\nimport {\n isCardPaymentDescriptor,\n normalizePaymentDescriptor,\n paymentDescriptorLabel,\n resolvePaymentMethodDisplay,\n} from \"@fluid-app/payments-display/display\";\nimport { MaskedPaymentLabel } from \"@fluid-app/payments-display/components/MaskedPaymentLabel\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { FulfillmentStatusBadge } from \"./fulfillment-status-badge\";\nimport { StaticMap } from \"./static-map\";\nimport { effectiveOrderDate } from \"../lib/effective-order-date\";\nimport { resolveOrderStatus } from \"../lib/fulfillment-status\";\n\n/** Capitalize the first letter for display in headings / sentence-leading copy. */\nconst capitalize = (value: string): string =>\n value.charAt(0).toUpperCase() + value.slice(1);\n\nfunction isCardPaymentMethod(\n paymentMethod: orders.PortalTenantPaymentMethod,\n): boolean {\n return (\n paymentMethod.last4 != null ||\n normalizePaymentDescriptor(paymentMethod.card_network) != null ||\n normalizeCardBrand(paymentMethod.card_network) != null ||\n isCardPaymentDescriptor(paymentMethod.source) ||\n isCardPaymentDescriptor(paymentMethod.payment_type)\n );\n}\n\nfunction fallbackPaymentLabel(\n paymentMethod: orders.PortalTenantPaymentMethod,\n): string {\n return (\n paymentDescriptorLabel(paymentMethod.payment_type, paymentMethod.source) ??\n \"Payment method\"\n );\n}\n\nfunction resolvePortalPaymentMethodDisplay(\n paymentMethod: orders.PortalTenantPaymentMethod,\n) {\n if (isCardPaymentMethod(paymentMethod)) {\n return resolvePaymentMethodDisplay({\n kind: \"card\",\n brand: normalizeCardBrand(paymentMethod.card_network),\n last4: paymentMethod.last4,\n logoUrl: paymentMethod.logo_url,\n });\n }\n\n const fallbackLabel = fallbackPaymentLabel(paymentMethod);\n return resolvePaymentMethodDisplay({\n kind: \"non_card\",\n brand: fallbackLabel,\n fallbackLabel,\n logoUrl: paymentMethod.logo_url,\n });\n}\n\nexport interface PortalOrderDetailProps {\n id: string | number;\n googleMapsApiKey?: string;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSubscriptionClick?: (subscriptionToken: string) => 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 gap-x-4\">\n <Skeleton className=\"size-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\n/**\n * Display a positive money string as a deduction (prefixed with \"-\").\n * Idempotent: if the value already starts with \"-\" we leave it alone, so\n * a future BFF that returns signed discounts can't produce \"--$10.00\".\n */\nfunction asNegative(value: string): string {\n return value.startsWith(\"-\") ? value : `-${value}`;\n}\n\n/**\n * Pick the formatted currency string when present, falling back to the raw\n * decimal so the row still renders something for orders where the BFF left\n * the field nil (e.g. a checkout where shipping was never set).\n */\nfunction moneyDisplay(formatted: string | null, fallback: string): string {\n return formatted ?? fallback;\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 if (address.phone) lines.push(address.phone);\n return lines;\n}\n\nfunction AddressBlock({\n address,\n title,\n}: {\n address: orders.PortalTenantAddress;\n title: string;\n}) {\n const lines = formatAddressLines(address);\n if (lines.length === 0) return null;\n return (\n <div>\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">{title}</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 ShippingMethodSection({\n shippingMethod,\n}: {\n shippingMethod: orders.PortalTenantShippingMethod;\n}) {\n const { t } = useOrdersTranslation();\n // Mirror the checkout's ShippingMethodDisplay null-guard: hide the row when\n // the BFF returned a method without a usable label rather than rendering an\n // empty heading.\n if (!shippingMethod.title) return null;\n return (\n <div>\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"shipping_method\")}\n </h3>\n <p className=\"text-foreground text-sm\">{shippingMethod.title}</p>\n </div>\n );\n}\n\nfunction TrackingShipmentsSection({\n trackings,\n}: {\n trackings: orders.PortalTenantTrackingInformation[];\n}) {\n const { t } = useOrdersTranslation();\n if (trackings.length === 0) return null;\n return (\n <div className=\"border-border bg-muted/40 mb-6 rounded-md border p-4\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"order_on_its_way\")}\n </h3>\n <ul className=\"flex flex-col gap-3\">\n {trackings.map((tracking) => (\n <li\n // Composite key so a malformed BFF row with id=0 (the\n // adapter's fallback) can't collide with another id=0\n // and trigger React's duplicate-key warning. tracking\n // numbers are unique within an order in practice.\n key={`${tracking.id}-${tracking.tracking_number}`}\n className=\"flex flex-row items-start justify-between gap-3\"\n >\n <div className=\"flex flex-col\">\n <span className=\"text-foreground text-sm\">\n {tracking.shipping_carrier\n ? `${tracking.shipping_carrier} · ${tracking.tracking_number}`\n : tracking.tracking_number}\n </span>\n {!tracking.shipping_carrier && (\n <span className=\"text-muted-foreground text-xs\">\n {t(\"tracking_number\")}\n </span>\n )}\n </div>\n {tracking.tracking_url && (\n <a\n href={tracking.tracking_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n // Disambiguate \"Track package\" for screen readers when\n // an order has multiple shipments — without this every\n // link reads the same.\n aria-label={\n tracking.shipping_carrier\n ? t(\"track_package_aria_with_carrier\", {\n carrier: tracking.shipping_carrier,\n number: tracking.tracking_number,\n })\n : t(\"track_package_aria\", {\n number: tracking.tracking_number,\n })\n }\n className=\"text-primary shrink-0 text-sm font-medium hover:underline\"\n >\n {t(\"track_package\")}\n </a>\n )}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nfunction PaymentMethodSection({\n paymentMethod,\n}: {\n paymentMethod: orders.PortalTenantPaymentMethod;\n}) {\n const { t } = useOrdersTranslation();\n const [logoErrored, setLogoErrored] = useState(false);\n const display = resolvePortalPaymentMethodDisplay(paymentMethod);\n const logoUrl = logoErrored\n ? display.logo.fallbackUrl\n : display.logo.primaryUrl;\n\n useEffect(() => {\n setLogoErrored(false);\n }, [\n paymentMethod.card_network,\n paymentMethod.last4,\n paymentMethod.logo_url,\n paymentMethod.payment_type,\n paymentMethod.source,\n ]);\n\n return (\n <div>\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"payment_method\")}\n </h3>\n <div className=\"flex min-h-6 items-center gap-2\">\n <span className=\"inline-flex h-6 max-w-16 shrink-0 items-center justify-center\">\n <img\n src={logoUrl}\n alt={display.accessibilityLabel}\n className=\"block max-h-6 max-w-16 object-contain align-middle\"\n onError={() => setLogoErrored(true)}\n />\n </span>\n <MaskedPaymentLabel label={display.label} className=\"text-foreground\" />\n </div>\n </div>\n );\n}\n\nfunction LineItemImage({ src, alt }: { src: string; alt: string }) {\n const { t } = useOrdersTranslation();\n const [errored, setErrored] = useState(false);\n if (errored) return <span className=\"text-xs\">{t(\"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({\n item,\n onSubscriptionClick,\n}: {\n item: orders.PortalTenantOrderLineItem;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n}) {\n const { t } = useOrdersTranslation();\n const subscriptionToken = item.source_subscription?.subscription_token;\n return (\n <div className=\"flex items-center gap-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\">{t(\"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 gap-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\">\n {moneyDisplay(item.total_in_currency, item.total)}\n </p>\n {item.quantity > 1 && (\n <p className=\"text-muted-foreground text-xs\">\n {moneyDisplay(item.price_in_currency, item.price)} x {item.quantity}\n </p>\n )}\n {subscriptionToken && onSubscriptionClick && (\n <button\n type=\"button\"\n title={subscriptionToken}\n className=\"mt-1 max-w-full cursor-pointer truncate text-left text-xs text-blue-600 transition-colors duration-200 hover:text-blue-700 hover:underline\"\n onClick={() => onSubscriptionClick(subscriptionToken)}\n >\n {t(\"subscription_hash\", { token: subscriptionToken })}\n </button>\n )}\n </div>\n </div>\n );\n}\n\nfunction ItemsSection({\n order,\n onSubscriptionClick,\n}: {\n order: orders.PortalTenantOrder;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n}) {\n const { t } = useOrdersTranslation();\n const { plural } = usePointsLabel();\n const pointsApplied =\n order.points_applied != null && order.points_applied > 0;\n // When points were redeemed, the Total reflects the post-redemption amount\n // the customer actually paid; otherwise it stays the gross total. Prefer the\n // formatted currency string, then the raw post-redemption number, and fall\n // back to the gross total if the BFF omitted the post-redemption fields.\n const totalValue = pointsApplied\n ? moneyDisplay(\n order.order_total_after_points_redemption_in_currency ?? null,\n order.order_total_after_points_redemption != null\n ? String(order.order_total_after_points_redemption)\n : moneyDisplay(order.total_in_currency, order.total),\n )\n : moneyDisplay(order.total_in_currency, order.total);\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 {t(\"items_count\", { count: String(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\n key={item.id}\n item={item}\n onSubscriptionClick={onSubscriptionClick}\n />\n ))}\n </div>\n\n <div className=\"border-border mb-4 space-y-1 border-t pt-4\">\n <SummaryRow\n label={t(\"subtotal\")}\n value={moneyDisplay(order.subtotal_in_currency, order.subtotal)}\n />\n {parseFloat(order.discount) > 0 && (\n <SummaryRow\n label={t(\"discount\")}\n value={asNegative(\n moneyDisplay(order.discount_in_currency, order.discount),\n )}\n />\n )}\n <SummaryRow\n label={t(\"shipping\")}\n value={moneyDisplay(order.shipping_in_currency, order.shipping)}\n />\n <SummaryRow\n label={t(\"tax\")}\n value={moneyDisplay(order.tax_in_currency, order.tax)}\n />\n {order.points_applied != null && order.points_applied > 0 && (\n <div className=\"flex items-center justify-between text-sm\">\n <p className=\"text-muted-foreground\">\n {t(\"points_applied\")}\n <span className=\"ml-1 text-xs\">\n ({order.points_applied.toLocaleString()}{\" \"}\n {order.points_applied === 1\n ? t(\"points_applied_singular\")\n : t(\"points_applied_plural\")}\n )\n </span>\n </p>\n <p className=\"text-foreground\">\n {asNegative(\n moneyDisplay(\n order.points_applied_amount_in_currency ?? null,\n String(order.points_applied_amount ?? 0),\n ),\n )}\n </p>\n </div>\n )}\n <div className=\"mt-2 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"total\")}\n </p>\n <p className=\"text-foreground text-base font-bold\">{totalValue}</p>\n </div>\n </div>\n\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 {t(\"points_earned\", { label: capitalize(plural) })}\n </p>\n {order.customer_points_balance != null && (\n <p className=\"text-muted-foreground text-xs\">\n {t(\"points_total\", {\n count: order.customer_points_balance.toLocaleString(),\n label: plural,\n })}\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\">\n {t(\"points\", { label: plural })}\n </p>\n </div>\n </div>\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction DetailsSection({\n order,\n googleMapsApiKey,\n}: {\n order: orders.PortalTenantOrder;\n googleMapsApiKey?: string;\n}) {\n const { t, locale } = useOrdersTranslation();\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\">\n {t(\"status_label\")}\n </span>\n <FulfillmentStatusBadge\n status={resolveOrderStatus(\n order.status,\n order.fulfillment_status,\n )}\n />\n </div>\n </div>\n </div>\n\n {googleMapsApiKey && order.shipping_address && (\n <div className=\"mb-6\">\n <StaticMap\n apiKey={googleMapsApiKey}\n address={order.shipping_address}\n />\n </div>\n )}\n\n <TrackingShipmentsSection trackings={order.tracking_informations} />\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 {t(\"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\">{t(\"order\")}</div>\n <div className=\"text-foreground font-medium\">\n #{order.order_number ?? order.id}\n </div>\n </div>\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">{t(\"date\")}</div>\n <div className=\"text-foreground font-medium\">\n {new Date(effectiveOrderDate(order)).toLocaleDateString(\n locale,\n {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n },\n )}\n </div>\n </div>\n </div>\n {order.customer_email && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">{t(\"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\">\n {t(\"customer\")}\n </div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_name}\n </div>\n </div>\n )}\n </div>\n\n {order.shipping_address && order.billing_address ? (\n <div className=\"border-border mb-6 grid grid-cols-2 gap-x-4 border-b pb-6\">\n <AddressBlock\n address={order.shipping_address}\n title={t(\"shipping_address\")}\n />\n <AddressBlock\n address={order.billing_address}\n title={t(\"billing_address\")}\n />\n </div>\n ) : (\n order.shipping_address && (\n <div className=\"border-border mb-6 border-b pb-6\">\n <AddressBlock\n address={order.shipping_address}\n title={t(\"shipping_address\")}\n />\n </div>\n )\n )}\n {(order.shipping_method || order.payment_method) && (\n <div className=\"border-border mb-6 grid grid-cols-1 gap-x-4 gap-y-4 border-b pb-6 sm:grid-cols-2\">\n {order.shipping_method && (\n <ShippingMethodSection shippingMethod={order.shipping_method} />\n )}\n {order.payment_method && (\n <PaymentMethodSection paymentMethod={order.payment_method} />\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport function PortalOrderDetail({\n id,\n googleMapsApiKey,\n onNotFound,\n onError,\n onSubscriptionClick,\n}: PortalOrderDetailProps): React.JSX.Element | null {\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} onSubscriptionClick={onSubscriptionClick} />\n <DetailsSection order={order} googleMapsApiKey={googleMapsApiKey} />\n </div>\n );\n}\n","\"use client\";\n\nimport type React from \"react\";\nimport { usePortalTenantOrder } from \"@fluid-app/orders-core\";\nimport { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { PortalOrderDetail } from \"../components/portal-order-detail\";\n\nexport interface PortalOrderDetailScreenProps {\n id: string | number;\n googleMapsApiKey?: string;\n onNavigateToList: () => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n}\n\nexport function PortalOrderDetailScreen({\n id,\n googleMapsApiKey,\n onNavigateToList,\n onNotFound,\n onError,\n onSubscriptionClick,\n}: PortalOrderDetailScreenProps): React.JSX.Element {\n const { t } = useOrdersTranslation();\n // Shares the cached query result with PortalOrderDetail below.\n // Used so the breadcrumb can render the human-readable order_number\n // instead of the URL slug we're routed with. Falls back to the DB id\n // (better than the URL slug) for historical orders with no\n // order_number, then to the URL slug only during initial load.\n const { data } = usePortalTenantOrder(id);\n const breadcrumbLabel =\n data?.order.order_number ?? data?.order.id.toString() ?? String(id);\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n {t(\"breadcrumb\")}\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb_detail\", { id: breadcrumbLabel })}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\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\n id={id}\n googleMapsApiKey={googleMapsApiKey}\n onNotFound={onNotFound}\n onError={onError}\n onSubscriptionClick={onSubscriptionClick}\n />\n </div>\n </>\n );\n}\n","import { useOrdersTranslation } from \"@fluid-app/orders-core/translation-api-context\";\nimport { PortalOrderDetailScreen as PortalOrderDetailScreenContent } from \"@fluid-app/orders-ui/screens/PortalOrderDetailScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\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 const { config } = useFluidContext();\n const { t } = useOrdersTranslation();\n\n return (\n <PortalOrderDetailScreenContent\n id={token}\n googleMapsApiKey={config.googleMapsApiKey}\n onNavigateToList={() => navigate(\"orders\")}\n onNotFound={() => {\n onToast(t(\"order_not_found\"), \"warning\");\n navigate(\"orders\");\n }}\n onError={(err) => {\n const message = err instanceof Error ? err.message : t(\"error_generic\");\n onToast(t(\"error_loading_order\", { message }), \"error\");\n }}\n onSubscriptionClick={(subscriptionToken) =>\n navigate(`subscriptions/${subscriptionToken}`)\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 { OrdersTranslationBridge } from \"../providers/OrdersTranslationBridge\";\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 <OrdersTranslationBridge>\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrderDetailScreen token={detailToken} onToast={effectiveToast} />\n </PortalOrdersApiProvider>\n </div>\n </OrdersTranslationBridge>\n );\n }\n\n return (\n <OrdersTranslationBridge>\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrdersListScreen />\n </PortalOrdersApiProvider>\n </div>\n </OrdersTranslationBridge>\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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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProfileScreen-CJV25-rw.cjs","names":["useProfileTranslation","Sparkles","Pencil","User","Mail","Phone","Quote","Link2","Copy","Dialog","DialogContent","DialogHeader","DialogTitle","LogOut","titleCaseFromSnake","brandIconUrl","GENERIC_PAYMENT_ICON_URL","maskCardNumber","Plus","MapPin","EllipsesDropdown","Linkedin","Facebook","Twitter","Instagram","Youtube","Globe","isThreeDsRequiredCreate","useProfileTranslation","useActiveLocale","usePayApi","useAccountApi","createFluidPayApiAdapter","usePortalMySiteProfile","usePortalUpdateSettings","useAccount","payKeys","mapToFluidPayPaymentMethod","useCountriesApi","useLanguagesApi","storeKeys","useStore","accountKeys","usePortalCardAdd3DSFlow","getBrowserInfo","useZodForm","z","FluidPayCoreProvider","UserInfoDialog","AddressFormDialog","AddressAutocompleteInput","ConfirmActionDialog","CreditCardFormDialog","EditPaymentMethodDialog","Dialog","DialogContent","DialogHeader","DialogTitle","Label","Input","DialogFooter","Button","useFluidContext","ProfileTranslationBridge","useProfileTranslation","ScreenHeaderBreadcrumbs","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage"],"sources":["../src/screens/profile/derive-last-name.ts","../src/screens/profile/ProfileLayout.tsx","../src/screens/profile-card-add-success.ts","../src/screens/ProfileContentScreen.tsx","../src/screens/ProfileScreen.tsx"],"sourcesContent":["export function deriveLastName(firstName: string, fullName: string): string {\n if (!firstName) return \"\";\n const prefix = `${firstName} `;\n return fullName.startsWith(prefix) ? fullName.slice(prefix.length) : \"\";\n}\n","import { type JSX, type ReactNode, useState, type ComponentType } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@fluid-app/ui-primitives\";\nimport {\n Sparkles,\n Pencil,\n Plus,\n Copy,\n Link2,\n MapPin,\n User,\n Mail,\n Phone,\n Quote,\n Linkedin,\n Facebook,\n Twitter,\n Instagram,\n Youtube,\n Globe,\n LogOut,\n} from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { PointsLedger } from \"@fluid-app/profile-core\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\nimport {\n brandIconUrl,\n GENERIC_PAYMENT_ICON_URL,\n} from \"@fluid-app/payments-display/brands\";\nimport { maskCardNumber } from \"@fluid-app/payments-display/display\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { titleCaseFromSnake } from \"@fluid-app/portal-core/format/title-case\";\n\ninterface ProfileLayoutProps {\n account: AccountRep;\n pointsBalance: number | undefined;\n pointsLedger?: PointsLedger[];\n pointsLabel: { singular: string; plural: string };\n rewardsEnabled?: boolean;\n addresses: fluidPay.CustomerAddress[];\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n mySiteDisplayUrl: string;\n socialLinks: Partial<Record<SocialKey, string>>;\n onEditPersonalInfo: () => void;\n onAddAddress: () => void;\n onEditAddress: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress: (address: fluidPay.CustomerAddress) => void;\n onAddPaymentMethod: () => void;\n onEditPaymentMethod: (method: fluidPay.CustomerPaymentMethod) => void;\n onCopyMySiteLink: () => void;\n onEditMySiteLink?: () => void;\n onConnectSocial: (key: SocialKey) => void;\n onSignOut?: () => void;\n}\n\nexport function ProfileLayout(props: ProfileLayoutProps): JSX.Element {\n const { t } = useProfileTranslation();\n const {\n account,\n pointsBalance,\n pointsLedger,\n pointsLabel,\n rewardsEnabled,\n addresses,\n paymentMethods,\n mySiteDisplayUrl,\n socialLinks,\n onEditPersonalInfo,\n onAddAddress,\n onEditAddress,\n onDeleteAddress,\n onAddPaymentMethod,\n onEditPaymentMethod,\n onCopyMySiteLink,\n onEditMySiteLink,\n onConnectSocial,\n onSignOut,\n } = props;\n\n const fullName =\n `${account.first_name ?? \"\"} ${account.last_name ?? \"\"}`.trim();\n const heroFirstName = (account.first_name || \"\").trim().split(\" \")[0] || \"\";\n const heroDisplay =\n heroFirstName || account.email?.split(\"@\")[0] || t(\"account_fallback\");\n const connectedSocialCount = Object.values(socialLinks).filter(\n (v) => typeof v === \"string\" && v.length > 0,\n ).length;\n const [isPointsHistoryOpen, setIsPointsHistoryOpen] = useState(false);\n const POINTS_PREVIEW_COUNT = 4;\n const ledger = pointsLedger ?? [];\n const ledgerPreview = ledger.slice(0, POINTS_PREVIEW_COUNT);\n const hasMoreLedger = ledger.length > POINTS_PREVIEW_COUNT;\n // Configured points label: capitalized plural for headings, count-aware form\n // (singular at 1) for \"N <label>\" amounts.\n const pointsLabelPluralCap = capitalize(pointsLabel.plural);\n const pointsCountLabel = (n: number): string =>\n n === 1 ? pointsLabel.singular : pointsLabel.plural;\n const sortedAddresses = [...addresses].sort(\n (a, b) => Number(b.default ?? false) - Number(a.default ?? false),\n );\n\n return (\n <div className=\"relative\">\n <div className=\"relative mx-auto max-w-4xl px-5 pt-8 pb-20 md:px-8\">\n {/* Hero */}\n <section className=\"flex items-center gap-3.5\">\n <div className=\"relative size-12 shrink-0 overflow-hidden rounded-full ring-1 ring-black/5 md:size-13\">\n {account.avatar_url ? (\n <img\n src={account.avatar_url}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"bg-primary text-primary-foreground flex h-full w-full items-center justify-center text-lg font-semibold\">\n {heroDisplay.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-foreground truncate text-xl font-bold tracking-tight md:text-2xl\">\n {heroDisplay}\n </h1>\n <p className=\"text-muted-foreground mt-0.5 truncate text-sm\">\n {account.email}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {rewardsEnabled && (\n <div className=\"ring-border text-foreground inline-flex items-center gap-1.5 rounded-md bg-transparent px-2.5 py-1 text-xs font-semibold ring-1\">\n <Sparkles className=\"text-primary size-3\" strokeWidth={2.25} />\n {(pointsBalance ?? 0).toLocaleString()}{\" \"}\n {pointsCountLabel(pointsBalance ?? 0)}\n </div>\n )}\n </div>\n </section>\n\n {/* Personal information */}\n <SectionHeader\n title={t(\"personal_information\")}\n action={\n <PillButton\n onClick={onEditPersonalInfo}\n icon={Pencil}\n label={t(\"edit\")}\n />\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <FieldRow\n icon={User}\n label={t(\"name\")}\n value={fullName || account.first_name || \"\"}\n />\n <FieldRow\n icon={Mail}\n label={t(\"email\")}\n value={account.email ?? \"\"}\n />\n <FieldRow\n icon={Phone}\n label={t(\"phone\")}\n value={account.phone ?? \"\"}\n placeholder={t(\"add_phone_number\")}\n />\n <FieldRow\n icon={Quote}\n label={t(\"bio\")}\n value={account.bio ?? \"\"}\n placeholder={t(\"add_a_short_bio\")}\n multiline\n isLast\n />\n </div>\n\n {/* Payment methods */}\n <SectionHeader title={t(\"payment_methods\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-3\">\n {paymentMethods.map((method) => (\n <PaymentCardVisual\n key={method.id}\n method={method}\n onClick={() => onEditPaymentMethod(method)}\n />\n ))}\n <AddPaymentTile onClick={onAddPaymentMethod} />\n </div>\n\n {/* Points history */}\n {rewardsEnabled && (\n <>\n <SectionHeader\n title={t(\"points_history\", { label: pointsLabelPluralCap })}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"pts_available\", {\n count: String((pointsBalance ?? 0).toLocaleString()),\n label: pointsCountLabel(pointsBalance ?? 0),\n })}\n </span>\n }\n />\n {ledger.length > 0 ? (\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {ledgerPreview.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={!hasMoreLedger && i === ledgerPreview.length - 1}\n pointsLabelPlural={pointsLabelPluralCap}\n />\n ))}\n {hasMoreLedger && (\n <button\n type=\"button\"\n onClick={() => setIsPointsHistoryOpen(true)}\n className=\"text-foreground hover:bg-muted flex w-full items-center justify-center gap-1 px-4 py-3 text-xs font-bold transition-colors\"\n >\n {t(\"see_all_transactions\", { count: ledger.length })}\n </button>\n )}\n </div>\n ) : (\n <div className=\"ring-dashed ring-border mt-2.5 flex flex-col items-center justify-center gap-1 rounded-2xl bg-transparent px-4 py-8 text-center ring-1\">\n <Sparkles\n className=\"text-muted-foreground/75 size-5\"\n strokeWidth={1.75}\n />\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"no_points_yet\", { label: pointsLabel.plural })}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"earn_points_hint\", { label: pointsLabel.plural })}\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Your MySite link */}\n <SectionHeader\n title={t(\"your_mysite_link\")}\n action={\n onEditMySiteLink ? (\n <PillButton\n onClick={onEditMySiteLink}\n icon={Pencil}\n label={t(\"edit_link\")}\n />\n ) : undefined\n }\n />\n <div className=\"ring-border mt-2.5 flex items-center gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"bg-muted text-foreground flex size-11 shrink-0 items-center justify-center rounded-full\">\n <Link2 className=\"size-[18px]\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {t(\"public_link\")}\n </div>\n <div className=\"text-foreground mt-0.5 truncate font-mono text-sm font-semibold\">\n {mySiteDisplayUrl || t(\"set_your_mysite_link\")}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onCopyMySiteLink}\n disabled={!mySiteDisplayUrl}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Copy className=\"size-3\" strokeWidth={2.25} />\n {t(\"copy\")}\n </button>\n </div>\n\n {/* Shipping addresses */}\n <SectionHeader title={t(\"shipping_addresses\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n {sortedAddresses.map((address) => (\n <AddressCard\n key={address.id}\n address={address}\n onEdit={() => onEditAddress(address)}\n onDelete={\n address.default ? undefined : () => onDeleteAddress(address)\n }\n />\n ))}\n <AddAddressTile onClick={onAddAddress} />\n </div>\n\n {/* Social media */}\n <SectionHeader\n title={t(\"social_media\")}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"connected_count\", { count: connectedSocialCount })}\n </span>\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {SOCIAL_ENTRIES.map((entry, i) => (\n <SocialRow\n key={entry.key}\n entry={entry}\n handle={socialLinks[entry.key] ?? \"\"}\n isLast={i === SOCIAL_ENTRIES.length - 1}\n onConnect={() => onConnectSocial(entry.key)}\n />\n ))}\n </div>\n\n <Dialog\n open={isPointsHistoryOpen}\n onOpenChange={setIsPointsHistoryOpen}\n >\n <DialogContent className=\"max-w-md md:max-w-lg\">\n <DialogHeader>\n <DialogTitle>\n {t(\"points_history\", { label: pointsLabelPluralCap })}\n </DialogTitle>\n </DialogHeader>\n <div className=\"ring-border max-h-[60vh] overflow-y-auto rounded-2xl bg-transparent ring-1\">\n {ledger.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={i === ledger.length - 1}\n pointsLabelPlural={pointsLabelPluralCap}\n />\n ))}\n </div>\n </DialogContent>\n </Dialog>\n\n {onSignOut && (\n <div className=\"ring-border mt-8 flex flex-wrap items-center justify-between gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"flex items-center gap-3\">\n <div className=\"bg-destructive/10 flex size-9 items-center justify-center rounded-md\">\n <LogOut\n className=\"text-destructive size-4\"\n strokeWidth={2.25}\n />\n </div>\n <div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"sign_out\")}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"sign_out_description\")}\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"bg-destructive/15 text-destructive hover:bg-destructive/25 rounded-md px-4 py-2 text-xs font-bold transition-colors\"\n >\n {t(\"sign_out\")}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction SectionHeader({\n title,\n action,\n}: {\n title: string;\n action?: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"mt-8 flex items-end justify-between\">\n <h2 className=\"text-foreground text-base font-bold tracking-tight\">\n {title}\n </h2>\n {action ?? null}\n </div>\n );\n}\n\nfunction PillButton({\n onClick,\n icon: Icon,\n label,\n disabled,\n}: {\n onClick: () => void;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n disabled?: boolean;\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Icon className=\"size-3\" strokeWidth={2.25} />\n {label}\n </button>\n );\n}\n\nfunction PointsLedgerRow({\n entry,\n isLast,\n pointsLabelPlural,\n}: {\n entry: PointsLedger;\n isLast: boolean;\n pointsLabelPlural: string;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const isCredit = entry.amount >= 0;\n const sign = isCredit ? \"+\" : \"−\";\n const magnitude = Math.abs(entry.amount).toLocaleString();\n const amountColor = isCredit ? \"text-emerald-600\" : \"text-destructive\";\n const sourceName = entry.metadata?.source?.name?.trim();\n const transactionType = entry.metadata?.transaction_type;\n const label =\n sourceName ||\n (transactionType\n ? titleCaseFromSnake(transactionType)\n : isCredit\n ? t(\"points_awarded\", { label: pointsLabelPlural })\n : t(\"points_redeemed\", { label: pointsLabelPlural }));\n const dateLabel = formatLedgerDate(entry.created_at);\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Sparkles\n className={`size-4 ${isCredit ? \"text-primary\" : \"text-muted-foreground\"}`}\n strokeWidth={2}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground truncate text-sm font-medium\">\n {label}\n </div>\n <div className=\"text-muted-foreground text-xs\">{dateLabel}</div>\n </div>\n <div\n className={`shrink-0 font-mono text-sm font-bold tabular-nums ${amountColor}`}\n >\n {sign}\n {magnitude}\n </div>\n </div>\n );\n}\n\n/** Capitalize the first letter for display in headings / titles. */\nfunction capitalize(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction formatLedgerDate(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nfunction FieldRow({\n icon: Icon,\n label,\n value,\n placeholder,\n isLast,\n multiline,\n}: {\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n value: string;\n placeholder?: string;\n isLast?: boolean;\n multiline?: boolean;\n}): JSX.Element {\n const display = value || placeholder || \"\";\n const isPlaceholder = !value && Boolean(placeholder);\n const valueClasses = multiline ? \"whitespace-pre-line\" : \"truncate\";\n return (\n <div\n className={`flex gap-3 px-4 py-3.5 ${multiline ? \"items-start\" : \"items-center\"} ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-muted-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {label}\n </div>\n <div\n className={`mt-0.5 ${valueClasses} text-sm font-medium ${isPlaceholder ? \"text-muted-foreground/55\" : \"text-foreground\"}`}\n >\n {display}\n </div>\n </div>\n </div>\n );\n}\n\nfunction PaymentCardVisual({\n method,\n onClick,\n}: {\n method: fluidPay.CustomerPaymentMethod;\n onClick: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const brand = (method.details.card_brand || \"\").toLowerCase();\n // Ordered, de-duplicated fallback chain: the server-provided logo, then the\n // brand-derived CDN icon, then the generic card icon. Each load failure\n // advances one step instead of collapsing straight to generic.\n const logoCandidates = [\n ...new Set(\n [\n method.details.logo_url,\n brandIconUrl(brand),\n GENERIC_PAYMENT_ICON_URL,\n ].filter((url): url is string => Boolean(url)),\n ),\n ];\n const [logoStep, setLogoStep] = useState(0);\n const logoSrc =\n logoCandidates[Math.min(logoStep, logoCandidates.length - 1)] ??\n GENERIC_PAYMENT_ICON_URL;\n const maskedNumber = maskCardNumber(method.details.last_four, brand);\n const expMonth = String(method.details.exp_month ?? \"\").padStart(2, \"0\");\n const expYear = String(method.details.exp_year ?? \"\").slice(-2);\n const exp = expMonth && expYear ? `${expMonth}/${expYear}` : \"\";\n const holder =\n method.details.card_holder || method.billing_address?.name || \"\";\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group bg-foreground text-background ring-foreground/10 relative flex aspect-[1.586/1] flex-col justify-between overflow-hidden rounded-xl p-4 text-left shadow-sm ring-1 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg\"\n >\n <div\n aria-hidden\n className=\"absolute inset-0 bg-[repeating-linear-gradient(135deg,transparent_0px,transparent_22px,currentColor_22px,currentColor_24px)] opacity-[0.04]\"\n />\n <div className=\"relative\">\n <div className=\"flex items-start justify-between\">\n <img\n src={logoSrc}\n alt={brand}\n className=\"h-7 w-auto object-contain\"\n onError={() =>\n setLogoStep((step) =>\n Math.min(step + 1, logoCandidates.length - 1),\n )\n }\n />\n {method.default && (\n <span className=\"bg-background/10 text-background/80 rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"text-background mt-3 font-mono text-lg font-bold tracking-wider\">\n {maskedNumber}\n </div>\n </div>\n <div className=\"relative flex items-end justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"cardholder\")}\n </div>\n <div className=\"text-background truncate text-xs font-semibold\">\n {holder || \" \"}\n </div>\n </div>\n <div>\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"card_expires\")}\n </div>\n <div className=\"text-background font-mono text-xs font-semibold\">\n {exp}\n </div>\n </div>\n </div>\n </button>\n );\n}\n\nfunction AddPaymentTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex aspect-[1.586/1] flex-col items-center justify-center gap-1.5 rounded-xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-xs font-bold\">\n {t(\"add_payment_method\")}\n </div>\n <div className=\"text-muted-foreground/75 text-xs\">\n {t(\"accepted_cards\")}\n </div>\n </button>\n );\n}\n\nfunction AddressCard({\n address,\n onEdit,\n onDelete,\n}: {\n address: fluidPay.CustomerAddress;\n onEdit: () => void;\n onDelete?: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const label = address.name?.trim() || t(\"address\");\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n return (\n <div className=\"ring-border hover:bg-muted focus-within:ring-foreground/40 relative flex flex-col rounded-2xl bg-transparent ring-1 transition-all duration-200 focus-within:ring-2 hover:ring-2\">\n <button\n type=\"button\"\n onClick={onEdit}\n className=\"flex w-full flex-col rounded-2xl p-4 pr-12 text-left focus-visible:outline-none\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-muted flex size-8 items-center justify-center rounded-full\">\n <MapPin\n className=\"text-muted-foreground size-4\"\n strokeWidth={2}\n />\n </div>\n <div className=\"text-foreground text-sm font-bold\">{label}</div>\n </div>\n {address.default && (\n <span className=\"bg-primary text-primary-foreground rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"text-foreground mt-3 space-y-0.5 text-sm leading-snug\">\n {address.address1 && <div>{address.address1}</div>}\n {address.address2 && <div>{address.address2}</div>}\n {cityLine && <div>{cityLine}</div>}\n {address.country_code && (\n <div className=\"text-muted-foreground\">{address.country_code}</div>\n )}\n {address.phone && (\n <div className=\"text-muted-foreground\">{address.phone}</div>\n )}\n </div>\n </button>\n <div className=\"absolute top-2 right-2 z-10\">\n <EllipsesDropdown\n onEdit={onEdit}\n onDelete={onDelete}\n editLabel={t(\"edit\")}\n deleteLabel={t(\"delete\")}\n />\n </div>\n </div>\n );\n}\n\nfunction AddAddressTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex min-h-37 flex-col items-center justify-center gap-1.5 rounded-2xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"add_an_address\")}\n </div>\n </button>\n );\n}\n\ntype SocialKey =\n | \"linkedin\"\n | \"facebook\"\n | \"x\"\n | \"instagram\"\n | \"youtube\"\n | \"pinterest\"\n | \"tiktok\";\n\ninterface SocialEntry {\n key: SocialKey;\n label: string;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n placeholder: string;\n}\n\nconst SOCIAL_ENTRIES: readonly SocialEntry[] = [\n {\n key: \"linkedin\",\n label: \"LinkedIn\",\n icon: Linkedin,\n placeholder: \"linkedin.com/in/username\",\n },\n {\n key: \"facebook\",\n label: \"Facebook\",\n icon: Facebook,\n placeholder: \"facebook.com/username\",\n },\n { key: \"x\", label: \"X\", icon: Twitter, placeholder: \"x.com/username\" },\n {\n key: \"instagram\",\n label: \"Instagram\",\n icon: Instagram,\n placeholder: \"instagram.com/username\",\n },\n {\n key: \"youtube\",\n label: \"YouTube\",\n icon: Youtube,\n placeholder: \"youtube.com/@channel\",\n },\n {\n key: \"pinterest\",\n label: \"Pinterest\",\n icon: Globe,\n placeholder: \"pinterest.com/username\",\n },\n {\n key: \"tiktok\",\n label: \"TikTok\",\n icon: Globe,\n placeholder: \"tiktok.com/@username\",\n },\n] as const;\n\nfunction SocialRow({\n entry,\n handle,\n isLast,\n onConnect,\n}: {\n entry: SocialEntry;\n handle: string;\n isLast: boolean;\n onConnect: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const Icon = entry.icon;\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground text-sm font-bold\">{entry.label}</div>\n <div\n className={`truncate text-xs ${handle ? \"text-muted-foreground\" : \"text-muted-foreground/55\"}`}\n >\n {handle || entry.placeholder}\n </div>\n </div>\n <PillButton\n onClick={onConnect}\n icon={handle ? Pencil : Plus}\n label={handle ? t(\"edit\") : t(\"connect\")}\n />\n </div>\n );\n}\n\nexport type { SocialKey };\n","import { isThreeDsRequiredCreate } from \"@fluid-app/portal-core/pay-types\";\nimport type {\n CreatePaymentMethodResponse,\n ThreeDsRequiredCreateResult,\n} from \"@fluid-app/portal-core/pay-types\";\n\n/**\n * Build the create-payment-method onSuccess handler. On three_ds_required it\n * hands off to the 3DS flow and leaves the card dialog OPEN (begin() resolves\n * at modal-open, not flow-completion). On a created PM it runs the legacy\n * created path (invalidate + close + toast).\n */\nexport function buildProfileCardAddSuccess(deps: {\n begin: (created: ThreeDsRequiredCreateResult) => Promise<void>;\n onCreated: () => void;\n}) {\n return async (response: CreatePaymentMethodResponse) => {\n if (isThreeDsRequiredCreate(response)) {\n await deps.begin(response);\n return;\n }\n deps.onCreated();\n };\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { z } from \"zod\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n AddressFormDialog,\n ConfirmActionDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n UserInfoDialog,\n socialFields,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n CreditCardFormSubmitData,\n} from \"@fluid-app/profile-ui\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport { getBrowserInfo } from \"@fluid-app/fluid-pay-core/utils/browser-info\";\nimport { TOKEN_PROVIDER_VGS } from \"@fluid-app/portal-core/pay-types\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { useAccountApi } from \"@fluid-app/portal-core/account-api-context\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport {\n usePortalMySiteProfile,\n usePortalUpdateSettings,\n} from \"@fluid-app/mysite-ui/portal/hooks/use-mysite-portal\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { useLanguagesApi } from \"@fluid-app/store-core/languages-api-context\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { accountKeys, payKeys, storeKeys } from \"../account/query-keys\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { useStore } from \"../hooks/use-store\";\nimport { deriveLastName } from \"./profile/derive-last-name\";\nimport { ProfileLayout, type SocialKey } from \"./profile/ProfileLayout\";\nimport { usePortalCardAdd3DSFlow } from \"../hooks/use-portal-card-add-3ds-flow\";\nimport { buildProfileCardAddSuccess } from \"./profile-card-add-success\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nfunction mapAccountToCustomerAccount(\n raw: AccountRep,\n): fluidPay.CustomerAccount {\n return {\n fluid_pay_account: {\n id: raw.id,\n email: raw.email,\n address_count: 0,\n payment_methods_count: 0,\n language_iso: null,\n },\n customer: {\n id: raw.id,\n active: true,\n active_subscriptions_count: 0,\n display_total_spent: \"0\",\n email: raw.email,\n first_name: raw.first_name,\n full_name: `${raw.first_name} ${raw.last_name}`.trim(),\n inactive_subscriptions_count: 0,\n is_rep: raw.member_type === \"rep\",\n phone: raw.phone,\n orders_count: 0,\n },\n };\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n phone: raw.phone,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\ntype SocialFieldKey = (typeof socialFields)[number][\"name\"];\n\nconst SOCIAL_KEY_TO_FIELD: Record<SocialKey, SocialFieldKey | null> = {\n linkedin: \"linkedin\" as SocialFieldKey,\n facebook: \"facebook\" as SocialFieldKey,\n x: \"twitter\" as SocialFieldKey,\n instagram: \"instagram\" as SocialFieldKey,\n youtube: \"youtube\" as SocialFieldKey,\n pinterest: null,\n tiktok: \"tiktok\" as SocialFieldKey,\n};\n\nconst SOCIAL_LABELS: Record<SocialKey, string> = {\n linkedin: \"LinkedIn\",\n facebook: \"Facebook\",\n x: \"X\",\n instagram: \"Instagram\",\n youtube: \"YouTube\",\n pinterest: \"Pinterest\",\n tiktok: \"TikTok\",\n};\n\nconst SOCIAL_PLACEHOLDERS: Record<SocialKey, string> = {\n linkedin: \"linkedin.com/in/username\",\n facebook: \"facebook.com/username\",\n x: \"x.com/username\",\n instagram: \"instagram.com/username\",\n youtube: \"youtube.com/@channel\",\n pinterest: \"pinterest.com/username\",\n tiktok: \"tiktok.com/@username\",\n};\n\nexport function ProfileContentScreen({\n onToast,\n countryIso,\n}: ProfileContentScreenProps): React.JSX.Element {\n const { t } = useProfileTranslation();\n const { locale } = useActiveLocale();\n const payApi = usePayApi();\n const accountApi = useAccountApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const { data: mySiteProfile } = usePortalMySiteProfile();\n const updateMySiteSettingsMutation = usePortalUpdateSettings();\n\n const mySiteUrl = mySiteProfile?.mysite_url ?? \"\";\n const mySiteDisplayUrl = mySiteUrl\n ? mySiteUrl.replace(/^https?:\\/\\//, \"\")\n : \"\";\n const mySiteLastSlash = mySiteDisplayUrl.lastIndexOf(\"/\");\n const mySiteUrlPrefix =\n mySiteLastSlash >= 0 ? mySiteDisplayUrl.slice(0, mySiteLastSlash + 1) : \"\";\n const mySiteCurrentSlug =\n mySiteLastSlash >= 0\n ? mySiteDisplayUrl.slice(mySiteLastSlash + 1)\n : mySiteDisplayUrl;\n\n // Reuse the app-wide useAccount() cache entry shared with AppShell/PageRouter.\n const {\n data: accountRep,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useAccount();\n\n const accountData = useMemo(\n () => (accountRep ? mapAccountToCustomerAccount(accountRep) : undefined),\n [accountRep],\n );\n\n const { data: addressesData } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: true,\n });\n\n const { data: paymentMethodsData } = useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n enabled: true,\n });\n\n const countriesAdapter = useCountriesApi();\n const languagesAdapter = useLanguagesApi();\n\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(locale),\n queryFn: () => countriesAdapter.listCountries({ languageIso: locale }),\n enabled: true,\n });\n\n const { data: languagesData } = useQuery({\n queryKey: storeKeys.languages(),\n queryFn: () => languagesAdapter.listLanguages(),\n enabled: true,\n });\n\n const { data: pointsLedgerData, isError: isPointsLedgerError } = useQuery({\n queryKey: payKeys.pointsLedgers.list(),\n queryFn: () => payApi.fetchPointsLedgers(),\n enabled: true,\n retry: (failureCount, error) => {\n if (\n error instanceof Error &&\n \"status\" in error &&\n (error as { status: number }).status === 403\n ) {\n return false;\n }\n return failureCount < 1;\n },\n });\n\n const rewardPointsEnabled = !isPointsLedgerError && pointsLedgerData != null;\n\n // Per-company reward-points label (defaults point/points). Drives the\n // configured label across the profile points UI.\n const { data: store } = useStore();\n const pointsLabelSingular = store?.reward_points_label_singular || \"point\";\n const pointsLabelPlural = store?.reward_points_label_plural || \"points\";\n const pointsLabel = useMemo(\n () => ({ singular: pointsLabelSingular, plural: pointsLabelPlural }),\n [pointsLabelSingular, pointsLabelPlural],\n );\n\n const adaptedPointsLedger: PointsLedger[] = useMemo(() => {\n return (pointsLedgerData?.points_ledgers ?? []).map((entry) => {\n const meta = entry.metadata as {\n transaction_type?: string | null;\n source?: {\n name: string;\n email?: string;\n reason?: string;\n user_id?: number;\n } | null;\n } | null;\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: 0,\n metadata: {\n transaction_type: meta?.transaction_type ?? undefined,\n source: meta?.source ?? undefined,\n },\n total_balance: entry.total_balance,\n updated_at: entry.created_at,\n };\n });\n }, [pointsLedgerData]);\n\n const updateCustomerMutation = useMutation({\n mutationFn: async (data: UserFormData) => {\n await accountApi.updateAccount({\n account: {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n bio: data.bio,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"profile_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_profile\"), \"error\");\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_delete_payment_method\"), \"error\");\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_update_payment_method\"), \"error\");\n },\n });\n\n const createAddressMutation = useMutation({\n // Detect a server-side dedupe (POST /api/pay/addresses returns the existing\n // record when an identical address already exists, ignoring `name`). Snapshot\n // the current id set before the request and compare against the returned id.\n mutationFn: async (body: fluidPay.CreateAddressBody) => {\n const existingIds = new Set((addressesData ?? []).map((a) => a.id));\n const address = await payApi.createAddress({\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n phone: body.address.phone,\n default: body.address.default,\n },\n });\n return { address, deduped: existingIds.has(address.id) };\n },\n onSuccess: ({ deduped }) => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n if (deduped) {\n onToast(t(\"address_already_exists\"), \"warning\");\n } else {\n onToast(t(\"address_created\"), \"success\");\n }\n },\n onError: () => {\n onToast(t(\"failed_to_create_address\"), \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n phone: body.address.phone,\n default: body.address.default,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_address\"), \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_deleted\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_delete_address\"), \"error\");\n },\n });\n\n // Orchestrates the bank-challenge step when card add returns three_ds_required.\n // begin() resolves the moment the challenge modal opens — so dialog close and\n // the success toast live ONLY here (onApproved) and on the created branch\n // (onCreated below), never on the three_ds_required branch.\n const cardAdd3DS = usePortalCardAdd3DSFlow({\n payApi,\n t: (key: string) => t(key as never),\n onApproved: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n setIsAddCardOpen(false);\n onToast(t(\"payment_method_added\"), \"success\");\n },\n onFailed: (message) => {\n setSaveCardError(message);\n },\n onCanceled: () => {},\n });\n\n const cardAddSuccess = buildProfileCardAddSuccess({\n begin: cardAdd3DS.begin,\n onCreated: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n setIsAddCardOpen(false);\n onToast(t(\"payment_method_added\"), \"success\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: CreditCardFormSubmitData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n token_provider: TOKEN_PROVIDER_VGS,\n exp_month: data.payment_method.exp_month,\n exp_year: data.payment_method.exp_year,\n cvv_token: data.payment_method.cvv_token,\n card_holder: data.payment_method.card_holder,\n default: data.set_as_default,\n ...(data.payment_method.bin ? { bin: data.payment_method.bin } : {}),\n ...(data.payment_method.last_four\n ? { last_four: data.payment_method.last_four }\n : {}),\n ...(data.payment_method.card_network\n ? { card_network: data.payment_method.card_network }\n : {}),\n },\n billing_address_id: data.billing_address_id,\n browser_info: getBrowserInfo(),\n }),\n onSuccess: cardAddSuccess,\n onError: () => {\n onToast(t(\"failed_to_add_payment_method\"), \"error\");\n },\n });\n\n const addresses = addressesData ?? [];\n const paymentMethods = paymentMethodsData ?? [];\n\n const adaptedLanguages: Language[] = (languagesData?.languages ?? []).map(\n (l, i) => ({ id: i, name: l.name, iso: l.code }),\n );\n\n const countries = countriesData?.countries;\n\n const countryOptions = useMemo(\n () =>\n [...(countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countries]);\n\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n // Dialog open state\n const [isInfoDialogOpen, setIsInfoDialogOpen] = useState(false);\n const [addressDialog, setAddressDialog] = useState<{\n open: boolean;\n selected: fluidPay.CustomerAddress | null;\n }>({ open: false, selected: null });\n const [deletingAddress, setDeletingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [isAddCardOpen, setIsAddCardOpen] = useState(false);\n const [saveCardError, setSaveCardError] = useState<string | null>(null);\n const [editPaymentMethod, setEditPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n\n // User-info form (for the existing dialog)\n const userInfoLanguage = useMemo(() => {\n return (\n adaptedLanguages.find(\n (l) => l.iso === accountData?.fluid_pay_account.language_iso,\n )?.name ?? \"\"\n );\n }, [adaptedLanguages, accountData]);\n\n const derivedLastName = useMemo(() => {\n if (!accountData) return \"\";\n const { first_name, full_name } = accountData.customer;\n return deriveLastName(first_name, full_name);\n }, [accountData]);\n\n const userInfoSchema = useMemo(\n () =>\n z.object({\n first_name: z.string().min(1, t(\"first_name_is_required\")),\n last_name: z.string().min(1, t(\"last_name_is_required\")),\n phone_number: z.string().optional(),\n language: z.string().min(1, t(\"language_is_required\")),\n bio: z.string().optional(),\n }),\n [t],\n );\n\n const userInfoForm = useZodForm<UserFormData>(userInfoSchema, {\n defaultValues: {\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n },\n });\n\n const handleOpenInfoDialog = useCallback(() => {\n userInfoForm.reset({\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n });\n setIsInfoDialogOpen(true);\n }, [\n accountData,\n accountRep,\n derivedLastName,\n userInfoLanguage,\n userInfoForm,\n ]);\n\n const onSubmitUserInfo = userInfoForm.handleSubmit(async (data) => {\n try {\n await updateCustomerMutation.mutateAsync(data);\n setIsInfoDialogOpen(false);\n } catch {\n // toast surfaced via onError\n }\n });\n\n const socialLinks = useMemo<Partial<Record<SocialKey, string>>>(() => {\n const src: Partial<Record<SocialFieldKey, string>> =\n accountRep?.social_links ?? {};\n const result: Partial<Record<SocialKey, string>> = {};\n for (const [key, field] of Object.entries(SOCIAL_KEY_TO_FIELD) as [\n SocialKey,\n SocialFieldKey | null,\n ][]) {\n if (!field) continue;\n const v = src[field];\n if (typeof v === \"string\" && v.length > 0) {\n result[key] = v;\n }\n }\n return result;\n }, [accountRep]);\n\n const handleCopyMySiteLink = useCallback(async () => {\n if (!mySiteUrl) return;\n try {\n await navigator.clipboard.writeText(mySiteUrl);\n onToast(t(\"mysite_link_copied\"), \"success\");\n } catch {\n onToast(t(\"failed_to_copy_link\"), \"error\");\n }\n }, [mySiteUrl, onToast, t]);\n\n const [isEditMySiteLinkOpen, setIsEditMySiteLinkOpen] = useState(false);\n const [mySiteSlugDraft, setMySiteSlugDraft] = useState(\"\");\n\n const handleOpenEditMySiteLink = useCallback(() => {\n setMySiteSlugDraft(mySiteCurrentSlug);\n setIsEditMySiteLinkOpen(true);\n }, [mySiteCurrentSlug]);\n\n const handleSubmitMySiteLink = useCallback(async () => {\n const trimmed = mySiteSlugDraft.trim();\n if (!trimmed) {\n onToast(t(\"mysite_link_empty\"), \"error\");\n return;\n }\n if (trimmed === mySiteCurrentSlug) {\n setIsEditMySiteLinkOpen(false);\n return;\n }\n try {\n await updateMySiteSettingsMutation.mutateAsync({ slug: trimmed });\n onToast(t(\"mysite_link_updated\"), \"success\");\n setIsEditMySiteLinkOpen(false);\n } catch {\n onToast(t(\"failed_to_update_mysite_link\"), \"error\");\n }\n }, [\n mySiteSlugDraft,\n mySiteCurrentSlug,\n updateMySiteSettingsMutation,\n onToast,\n t,\n ]);\n\n const [editingSocial, setEditingSocial] = useState<SocialKey | null>(null);\n const [socialDraft, setSocialDraft] = useState(\"\");\n\n const handleConnectSocial = useCallback(\n (key: SocialKey) => {\n const field = SOCIAL_KEY_TO_FIELD[key];\n if (!field) {\n onToast(t(\"platform_not_editable\"), \"warning\");\n return;\n }\n const current = accountRep?.social_links?.[field] ?? \"\";\n setSocialDraft(current);\n setEditingSocial(key);\n },\n [accountRep, onToast, t],\n );\n\n const updateSocialMutation = useMutation({\n mutationFn: async ({\n field,\n value,\n }: {\n field: SocialFieldKey;\n value: string;\n }) => {\n const current = accountRep?.social_links ?? {};\n await accountApi.updateAccount({\n account: {\n social_links: { ...current, [field]: value },\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"social_link_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_social_link\"), \"error\");\n },\n });\n\n const handleSubmitSocial = useCallback(async () => {\n if (!editingSocial) return;\n const field = SOCIAL_KEY_TO_FIELD[editingSocial];\n if (!field) return;\n await updateSocialMutation.mutateAsync({\n field,\n value: socialDraft.trim(),\n });\n setEditingSocial(null);\n }, [editingSocial, socialDraft, updateSocialMutation]);\n\n if (isAccountError && !isLoadingAccount) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"text-muted-foreground text-center text-sm\">\n {t(\"unable_to_load_account\")}\n </div>\n </div>\n );\n }\n\n if (isLoadingAccount || !accountData || !accountRep) {\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-16 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n const pointsBalance = rewardPointsEnabled\n ? (pointsLedgerData?.points_ledgers?.[0]?.total_balance ?? 0)\n : undefined;\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileLayout\n account={accountRep}\n pointsBalance={pointsBalance}\n pointsLedger={adaptedPointsLedger}\n pointsLabel={pointsLabel}\n rewardsEnabled={rewardPointsEnabled}\n addresses={addresses}\n paymentMethods={paymentMethods}\n mySiteDisplayUrl={mySiteDisplayUrl}\n socialLinks={socialLinks}\n onEditPersonalInfo={handleOpenInfoDialog}\n onAddAddress={() => setAddressDialog({ open: true, selected: null })}\n onEditAddress={(address) =>\n setAddressDialog({ open: true, selected: address })\n }\n onDeleteAddress={(address) => setDeletingAddress(address)}\n onAddPaymentMethod={() => {\n setSaveCardError(null);\n setIsAddCardOpen(true);\n }}\n onEditPaymentMethod={(pm) => setEditPaymentMethod(pm)}\n onCopyMySiteLink={handleCopyMySiteLink}\n onEditMySiteLink={handleOpenEditMySiteLink}\n onConnectSocial={handleConnectSocial}\n />\n\n <UserInfoDialog\n control={userInfoForm.control}\n isOpen={isInfoDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={() => setIsInfoDialogOpen(false)}\n languageOptions={adaptedLanguages.map((l) => ({\n name: l.name,\n value: l.name,\n }))}\n errorMsg={undefined}\n isSubmitting={updateCustomerMutation.isPending}\n email={accountRep.email ?? \"\"}\n />\n\n <AddressFormDialog\n isOpen={addressDialog.open}\n onClose={() => setAddressDialog({ open: false, selected: null })}\n selectedAddress={addressDialog.selected}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ?? countryIso\n }\n languageIso={locale}\n t={(key: string) => t(key as never)}\n onSubmit={async (formData) => {\n if (addressDialog.selected) {\n await updateAddressMutation.mutateAsync({\n addressId: addressDialog.selected.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n setAddressDialog({ open: false, selected: null });\n }}\n isSubmitting={\n createAddressMutation.isPending || updateAddressMutation.isPending\n }\n onDelete={\n addressDialog.selected && !addressDialog.selected.default\n ? async () => {\n if (!addressDialog.selected) return;\n try {\n await deleteAddressMutation.mutateAsync(\n addressDialog.selected.id,\n );\n setAddressDialog({ open: false, selected: null });\n } catch {\n // toast surfaced via onError\n }\n }\n : undefined\n }\n isDeleting={deleteAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n renderAddressAutocomplete={({\n control,\n setValue,\n countryCode,\n stateOptions,\n }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"postal_code\"\n stateOptions={stateOptions}\n />\n )}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n openDialog={deletingAddress !== null}\n setOpenDialog={(open) => {\n if (!open) setDeletingAddress(null);\n }}\n onAction={async () => {\n if (!deletingAddress) return;\n try {\n await deleteAddressMutation.mutateAsync(deletingAddress.id);\n setDeletingAddress(null);\n } catch {\n // toast surfaced via onError\n }\n }}\n isLoading={deleteAddressMutation.isPending}\n actionText={t(\"delete\")}\n />\n\n <CreditCardFormDialog\n isOpen={isAddCardOpen}\n onClose={() => {\n // Don't let the card dialog close while a 3DS challenge is in flight —\n // the bank-verification modal renders behind it and would be stranded.\n if (cardAdd3DS.isActive) return;\n setSaveCardError(null);\n setIsAddCardOpen(false);\n }}\n error={saveCardError ?? undefined}\n t={(key: string) => t(key as never)}\n onSubmit={async (data) => {\n setSaveCardError(null);\n try {\n // Closure happens in cardAddSuccess (created PM) / the 3DS\n // onApproved branch — NOT here, since a three_ds_required response\n // resolves successfully while the bank check is still pending.\n await addCreditCardMutation.mutateAsync(data);\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={addCreditCardMutation.isPending}\n jwt=\"\"\n savedAddresses={addresses}\n defaultBillingAddressId={addresses.find((a) => a.default)?.id}\n renderAddressFormDialog={({ isOpen, onClose, onAddressCreated }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={null}\n onSubmit={async (data) => {\n try {\n const { address } =\n await createAddressMutation.mutateAsync(data);\n onAddressCreated(mapToFluidPayAddress(address));\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={createAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n languageIso={locale}\n t={(key: string) => t(key as never)}\n renderAddressAutocomplete={({\n control,\n setValue,\n countryCode,\n stateOptions,\n }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"postal_code\"\n stateOptions={stateOptions}\n />\n )}\n />\n )}\n />\n\n {cardAdd3DS.modal}\n\n {editPaymentMethod && (\n <EditPaymentMethodDialog\n isOpen\n onClose={() => setEditPaymentMethod(null)}\n paymentMethod={editPaymentMethod}\n billingAddress={editPaymentMethod.billing_address}\n countries={countryOptions}\n onSubmit={(data) => {\n updatePaymentMethodMutation.mutate(\n { paymentMethodId: editPaymentMethod.id, data },\n { onSuccess: () => setEditPaymentMethod(null) },\n );\n }}\n isSubmitting={updatePaymentMethodMutation.isPending}\n onDelete={() => {\n deletePaymentMethodMutation.mutate(editPaymentMethod.id, {\n onSuccess: () => setEditPaymentMethod(null),\n });\n }}\n isDeleting={deletePaymentMethodMutation.isPending}\n />\n )}\n\n <Dialog\n open={isEditMySiteLinkOpen}\n onOpenChange={(open) => {\n if (!open && updateMySiteSettingsMutation.isPending) return;\n setIsEditMySiteLinkOpen(open);\n }}\n >\n <DialogContent className=\"max-w-sm md:max-w-md\">\n <DialogHeader>\n <DialogTitle>{t(\"edit_link\")}</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"mysite-slug\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"your_mysite_link\")}\n </Label>\n <div className=\"ring-border focus-within:ring-foreground/40 flex items-center gap-1 rounded-md bg-transparent px-3 py-2 ring-1 transition-all focus-within:ring-2\">\n {mySiteUrlPrefix && (\n <span className=\"text-muted-foreground shrink-0 text-sm\">\n {mySiteUrlPrefix}\n </span>\n )}\n <Input\n id=\"mysite-slug\"\n value={mySiteSlugDraft}\n onChange={(e) => setMySiteSlugDraft(e.target.value)}\n onKeyDown={(e) => {\n if (\n e.key === \"Enter\" &&\n !updateMySiteSettingsMutation.isPending\n ) {\n e.preventDefault();\n void handleSubmitMySiteLink();\n }\n }}\n className=\"h-auto min-w-0 flex-1 border-0 p-0 shadow-none focus-visible:ring-0\"\n autoFocus\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsEditMySiteLinkOpen(false)}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitMySiteLink();\n }}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {updateMySiteSettingsMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n\n <Dialog\n open={editingSocial !== null}\n onOpenChange={(open) => !open && setEditingSocial(null)}\n >\n <DialogContent className=\"max-w-sm md:max-w-md\">\n <DialogHeader>\n <DialogTitle>\n {editingSocial\n ? t(\"edit_platform_link\", {\n platform: SOCIAL_LABELS[editingSocial] ?? \"\",\n })\n : t(\"edit_social_link\")}\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"social-handle\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"url\")}\n </Label>\n <Input\n id=\"social-handle\"\n value={socialDraft}\n onChange={(e) => setSocialDraft(e.target.value)}\n placeholder={\n editingSocial ? SOCIAL_PLACEHOLDERS[editingSocial] : \"\"\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void handleSubmitSocial();\n }\n }}\n autoFocus\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setEditingSocial(null)}\n disabled={updateSocialMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitSocial();\n }}\n disabled={updateSocialMutation.isPending}\n >\n {updateSocialMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </FluidPayCoreProvider>\n );\n}\n","import type { ComponentProps } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = 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 ProfileScreen({\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}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n return (\n <ProfileTranslationBridge>\n <ProfileScreenContent\n onToast={effectiveToast}\n countryIso={countryIso}\n divProps={divProps}\n />\n </ProfileTranslationBridge>\n );\n}\n\nfunction ProfileScreenContent({\n onToast,\n countryIso,\n divProps,\n}: {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n divProps: ComponentProps<\"div\">;\n}): React.JSX.Element {\n const { t } = useProfileTranslation();\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div {...divProps}>\n <ProfileContentScreen onToast={onToast} countryIso={countryIso} />\n </div>\n </>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}