@fluid-app/portal-sdk 0.1.455 → 0.1.457

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 (74) hide show
  1. package/dist/{AlertWidget-CdWJXZn1.mjs → AlertWidget-BtkVIGr9.mjs} +2 -2
  2. package/dist/{AlertWidget-CdWJXZn1.mjs.map → AlertWidget-BtkVIGr9.mjs.map} +1 -1
  3. package/dist/{AlertWidget-BJekf1r1.cjs → AlertWidget-C5sAMhqU.cjs} +2 -2
  4. package/dist/{AlertWidget-BJekf1r1.cjs.map → AlertWidget-C5sAMhqU.cjs.map} +1 -1
  5. package/dist/{ContactsScreen-DsHXXYfF.cjs → ContactsScreen-BTCUeDHl.cjs} +1 -1
  6. package/dist/{ContactsScreen-TO0LAuHz.cjs → ContactsScreen-Cu6-ckm9.cjs} +23 -13
  7. package/dist/ContactsScreen-Cu6-ckm9.cjs.map +1 -0
  8. package/dist/{ContactsScreen-DhMQm4w2.mjs → ContactsScreen-D0l3-Xof.mjs} +23 -13
  9. package/dist/ContactsScreen-D0l3-Xof.mjs.map +1 -0
  10. package/dist/{FluidProvider-BULkBuyn.cjs → FluidProvider-Dm5QH6EP.cjs} +2 -2
  11. package/dist/{FluidProvider-BULkBuyn.cjs.map → FluidProvider-Dm5QH6EP.cjs.map} +1 -1
  12. package/dist/{FluidProvider-CA_HAl9a.mjs → FluidProvider-KBZgRXjL.mjs} +2 -2
  13. package/dist/{FluidProvider-CA_HAl9a.mjs.map → FluidProvider-KBZgRXjL.mjs.map} +1 -1
  14. package/dist/{MessagingScreen-DWH9xBbq.cjs → MessagingScreen-BrbkMeld.cjs} +2 -2
  15. package/dist/{MessagingScreen-DWH9xBbq.cjs.map → MessagingScreen-BrbkMeld.cjs.map} +1 -1
  16. package/dist/{MessagingScreen-CYOGaqKX.mjs → MessagingScreen-BtoXnSqJ.mjs} +2 -2
  17. package/dist/{MessagingScreen-CYOGaqKX.mjs.map → MessagingScreen-BtoXnSqJ.mjs.map} +1 -1
  18. package/dist/{MessagingScreen-BG6clVDQ.mjs → MessagingScreen-CYqzOl6D.mjs} +6 -6
  19. package/dist/{MessagingScreen-B_nyIg2b.cjs → MessagingScreen-uuydnJEi.cjs} +5 -5
  20. package/dist/{OrdersScreen-DMlrdteQ.mjs → OrdersScreen-CutgAgyO.mjs} +6 -6
  21. package/dist/{OrdersScreen-Dh_nsi8j.cjs → OrdersScreen-DKQmax51.cjs} +2 -2
  22. package/dist/{OrdersScreen-Dh_nsi8j.cjs.map → OrdersScreen-DKQmax51.cjs.map} +1 -1
  23. package/dist/{OrdersScreen-CfchcnYB.cjs → OrdersScreen-UaQcR3IU.cjs} +5 -5
  24. package/dist/{OrdersScreen-CBF6uZSk.mjs → OrdersScreen-eqJy6_m3.mjs} +2 -2
  25. package/dist/{OrdersScreen-CBF6uZSk.mjs.map → OrdersScreen-eqJy6_m3.mjs.map} +1 -1
  26. package/dist/{ProfileScreen-t2V-W4Dv.cjs → ProfileScreen-B5DcNq7i.cjs} +6 -6
  27. package/dist/{ProfileScreen-CbYASEr9.mjs → ProfileScreen-C4SiOL-k.mjs} +7 -7
  28. package/dist/{ProfileScreen-DlPK9S_Q.mjs → ProfileScreen-CealQbpo.mjs} +3 -3
  29. package/dist/{ProfileScreen-DlPK9S_Q.mjs.map → ProfileScreen-CealQbpo.mjs.map} +1 -1
  30. package/dist/{ProfileScreen-CXqMOEza.cjs → ProfileScreen-DXSnyfCO.cjs} +3 -3
  31. package/dist/{ProfileScreen-CXqMOEza.cjs.map → ProfileScreen-DXSnyfCO.cjs.map} +1 -1
  32. package/dist/{ShopScreen-1vtAE4X7.mjs → ShopScreen-B6cf4gW-.mjs} +6 -6
  33. package/dist/{ShopScreen-CrObPeSv.cjs → ShopScreen-CcupxIut.cjs} +2 -2
  34. package/dist/{ShopScreen-CrObPeSv.cjs.map → ShopScreen-CcupxIut.cjs.map} +1 -1
  35. package/dist/{ShopScreen-BWDYXw4Q.cjs → ShopScreen-DH_TcNMs.cjs} +5 -5
  36. package/dist/{ShopScreen-BnuiYHKY.mjs → ShopScreen-z2J4fRfs.mjs} +3 -3
  37. package/dist/{ShopScreen-BnuiYHKY.mjs.map → ShopScreen-z2J4fRfs.mjs.map} +1 -1
  38. package/dist/{ShopWidget-CwiD88Sr.mjs → ShopWidget-DXVNRrFY.mjs} +2 -2
  39. package/dist/{ShopWidget-CwiD88Sr.mjs.map → ShopWidget-DXVNRrFY.mjs.map} +1 -1
  40. package/dist/{SubscriptionsScreen-CBIjEFKA.mjs → SubscriptionsScreen-CBEULwpU.mjs} +7 -7
  41. package/dist/{SubscriptionsScreen-Bjdz5fx-.cjs → SubscriptionsScreen-CTrOXRIz.cjs} +3 -3
  42. package/dist/{SubscriptionsScreen-Bjdz5fx-.cjs.map → SubscriptionsScreen-CTrOXRIz.cjs.map} +1 -1
  43. package/dist/{SubscriptionsScreen-BlB3Ppoa.cjs → SubscriptionsScreen-DdlwKkJ1.cjs} +6 -6
  44. package/dist/{SubscriptionsScreen-DyjmAOvJ.mjs → SubscriptionsScreen-DyL-7oeE.mjs} +3 -3
  45. package/dist/{SubscriptionsScreen-DyjmAOvJ.mjs.map → SubscriptionsScreen-DyL-7oeE.mjs.map} +1 -1
  46. package/dist/{TextWidget-CY71e66E.cjs → TextWidget-CNks2l1S.cjs} +4 -3
  47. package/dist/TextWidget-CNks2l1S.cjs.map +1 -0
  48. package/dist/{TextWidget-B-2RFD_g.mjs → TextWidget-cnDl92rJ.mjs} +4 -3
  49. package/dist/TextWidget-cnDl92rJ.mjs.map +1 -0
  50. package/dist/{build-widget-registry-L8a9-O3A.cjs → build-widget-registry-Bg8G7GQF.cjs} +29 -5
  51. package/dist/build-widget-registry-Bg8G7GQF.cjs.map +1 -0
  52. package/dist/{build-widget-registry-Dy8S7Ggy.mjs → build-widget-registry-fQIvocLa.mjs} +26 -8
  53. package/dist/build-widget-registry-fQIvocLa.mjs.map +1 -0
  54. package/dist/index.cjs +215 -24
  55. package/dist/index.cjs.map +1 -1
  56. package/dist/index.d.cts +7 -0
  57. package/dist/index.d.cts.map +1 -1
  58. package/dist/index.d.mts +7 -0
  59. package/dist/index.d.mts.map +1 -1
  60. package/dist/index.mjs +215 -24
  61. package/dist/index.mjs.map +1 -1
  62. package/dist/{use-portal-card-add-3ds-flow-B4wqRVNt.mjs → use-portal-card-add-3ds-flow-Caupep6C.mjs} +2 -2
  63. package/dist/{use-portal-card-add-3ds-flow-B4wqRVNt.mjs.map → use-portal-card-add-3ds-flow-Caupep6C.mjs.map} +1 -1
  64. package/dist/{use-portal-card-add-3ds-flow-Dt29-X8z.cjs → use-portal-card-add-3ds-flow-Cl3H-Dp7.cjs} +2 -2
  65. package/dist/{use-portal-card-add-3ds-flow-Dt29-X8z.cjs.map → use-portal-card-add-3ds-flow-Cl3H-Dp7.cjs.map} +1 -1
  66. package/dist/utils/build-remote-widget-plugin-manifests.cjs +3 -3
  67. package/dist/utils/build-remote-widget-plugin-manifests.mjs +4 -4
  68. package/package.json +9 -9
  69. package/dist/ContactsScreen-DhMQm4w2.mjs.map +0 -1
  70. package/dist/ContactsScreen-TO0LAuHz.cjs.map +0 -1
  71. package/dist/TextWidget-B-2RFD_g.mjs.map +0 -1
  72. package/dist/TextWidget-CY71e66E.cjs.map +0 -1
  73. package/dist/build-widget-registry-Dy8S7Ggy.mjs.map +0 -1
  74. package/dist/build-widget-registry-L8a9-O3A.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"OrdersScreen-Dh_nsi8j.cjs","names":["usePortalTenantClient","createTranslationContext","useActiveLocale","useDomainDict","ordersDomain","createOrdersTranslationAdapter","cn","ScreenHeaderBreadcrumbs","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage","Search","Input","ImageOff","Repeat","AlertCircle","useAppNavigation","maskedCardLabelSegments","normalizePaymentDescriptor","normalizeCardBrand","isCardPaymentDescriptor","paymentDescriptorLabel","resolvePaymentMethodDisplay","Skeleton","usePointsLabel","ScreenHeaderBreadcrumbs","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","useAppNavigation","useFluidContext","PortalOrderDetailScreenContent","useAppNavigation"],"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 // Normalize the served totals to a single shape: a non-null object passes\n // through, anything else (absent, or an explicit `null`/non-object) becomes\n // undefined — matching how every other out-of-spec field in this file guards\n // before use.\n const rawTotals = (raw as Record<string, unknown>).totals;\n const totals =\n rawTotals && typeof rawTotals === \"object\"\n ? (rawTotals as orders.PortalTenantOrder[\"totals\"])\n : undefined;\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 // STU2-2580: the display-ready Commerce::Totals breakdown (gross catalog\n // subtotal + inclusive-tax split). Read defensively — the BFF serves it on\n // the detail view, but the generated client types may not include it until\n // `pnpm generate` runs. Passed through so PortalOrderDetail can render the\n // gross subtotal; absent on payloads that predate the field.\n totals,\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 if (!response.order) {\n throw new Error(\n \"BFF returned a successful response without order data\",\n );\n }\n\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\n/** Capitalize the first letter for display in headings / sentence-leading copy. */\nexport function capitalize(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1);\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 { capitalize } from \"../lib/format\";\nimport { effectiveOrderDate } from \"../lib/effective-order-date\";\nimport { resolveOrderStatus } from \"../lib/fulfillment-status\";\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 { singular, 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(\n order.totals?.gross_subtotal_in_currency ??\n order.subtotal_in_currency,\n order.totals?.gross_subtotal ?? order.subtotal,\n )}\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={\n // STU2-2580: when the served totals are tax-inclusive, the gross\n // Subtotal above already contains this VAT, so the Tax row is\n // informational (\"VAT included\") — not an amount added on top.\n // Keeping it a plain added row beside a GROSS subtotal would make\n // the rows visually sum above the authoritative Total.\n order.totals?.price_inclusive_of_tax && order.totals.tax_label\n ? `${t(\"tax\")} (${t(\"tax_included\", { name: order.totals.tax_label })})`\n : t(\"tax\")\n }\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\", { label: capitalize(plural) })}\n <span className=\"ml-1 text-xs\">\n ({order.points_applied.toLocaleString()}{\" \"}\n {order.points_applied === 1 ? singular : plural})\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
+ {"version":3,"file":"OrdersScreen-DKQmax51.cjs","names":["usePortalTenantClient","createTranslationContext","useActiveLocale","useDomainDict","ordersDomain","createOrdersTranslationAdapter","cn","ScreenHeaderBreadcrumbs","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage","Search","Input","ImageOff","Repeat","AlertCircle","useAppNavigation","maskedCardLabelSegments","normalizePaymentDescriptor","normalizeCardBrand","isCardPaymentDescriptor","paymentDescriptorLabel","resolvePaymentMethodDisplay","Skeleton","usePointsLabel","ScreenHeaderBreadcrumbs","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","useAppNavigation","useFluidContext","PortalOrderDetailScreenContent","useAppNavigation"],"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 // Normalize the served totals to a single shape: a non-null object passes\n // through, anything else (absent, or an explicit `null`/non-object) becomes\n // undefined — matching how every other out-of-spec field in this file guards\n // before use.\n const rawTotals = (raw as Record<string, unknown>).totals;\n const totals =\n rawTotals && typeof rawTotals === \"object\"\n ? (rawTotals as orders.PortalTenantOrder[\"totals\"])\n : undefined;\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 // STU2-2580: the display-ready Commerce::Totals breakdown (gross catalog\n // subtotal + inclusive-tax split). Read defensively — the BFF serves it on\n // the detail view, but the generated client types may not include it until\n // `pnpm generate` runs. Passed through so PortalOrderDetail can render the\n // gross subtotal; absent on payloads that predate the field.\n totals,\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 if (!response.order) {\n throw new Error(\n \"BFF returned a successful response without order data\",\n );\n }\n\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\n/** Capitalize the first letter for display in headings / sentence-leading copy. */\nexport function capitalize(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1);\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 { capitalize } from \"../lib/format\";\nimport { effectiveOrderDate } from \"../lib/effective-order-date\";\nimport { resolveOrderStatus } from \"../lib/fulfillment-status\";\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 { singular, 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(\n order.totals?.gross_subtotal_in_currency ??\n order.subtotal_in_currency,\n order.totals?.gross_subtotal ?? order.subtotal,\n )}\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={\n // STU2-2580: when the served totals are tax-inclusive, the gross\n // Subtotal above already contains this VAT, so the Tax row is\n // informational (\"VAT included\") — not an amount added on top.\n // Keeping it a plain added row beside a GROSS subtotal would make\n // the rows visually sum above the authoritative Total.\n order.totals?.price_inclusive_of_tax && order.totals.tax_label\n ? `${t(\"tax\")} (${t(\"tax_included\", { name: order.totals.tax_label })})`\n : t(\"tax\")\n }\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\", { label: capitalize(plural) })}\n <span className=\"ml-1 text-xs\">\n ({order.points_applied.toLocaleString()}{\" \"}\n {order.points_applied === 1 ? singular : plural})\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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"}