@fluid-app/portal-sdk 0.1.177 → 0.1.178

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 (64) hide show
  1. package/dist/{FluidProvider-MjOyxZEf.cjs → FluidProvider-CIuinUdw.cjs} +13 -31
  2. package/dist/FluidProvider-CIuinUdw.cjs.map +1 -0
  3. package/dist/{FluidProvider-C6NlPdMA.mjs → FluidProvider-TKGU3gSm.mjs} +13 -31
  4. package/dist/FluidProvider-TKGU3gSm.mjs.map +1 -0
  5. package/dist/{MessagingScreen-BNXVwQwN.mjs → MessagingScreen-BUC8Fwaz.mjs} +2 -2
  6. package/dist/{MessagingScreen-BNXVwQwN.mjs.map → MessagingScreen-BUC8Fwaz.mjs.map} +1 -1
  7. package/dist/{MessagingScreen-DRzVl0ux.cjs → MessagingScreen-CwMR1WJG.cjs} +2 -2
  8. package/dist/{MessagingScreen-DRzVl0ux.cjs.map → MessagingScreen-CwMR1WJG.cjs.map} +1 -1
  9. package/dist/{MessagingScreen-fMLfvDCY.cjs → MessagingScreen-XzPsvsXP.cjs} +2 -2
  10. package/dist/{OrdersScreen-Dz4XHnSA.mjs → OrdersScreen-BYs3uo-1.mjs} +2 -2
  11. package/dist/{OrdersScreen-Dz4XHnSA.mjs.map → OrdersScreen-BYs3uo-1.mjs.map} +1 -1
  12. package/dist/{OrdersScreen-DI1un1xT.cjs → OrdersScreen-COGBqaif.cjs} +1 -1
  13. package/dist/{OrdersScreen-DBaIwXoT.cjs → OrdersScreen-tEz4rZn_.cjs} +2 -2
  14. package/dist/{OrdersScreen-DBaIwXoT.cjs.map → OrdersScreen-tEz4rZn_.cjs.map} +1 -1
  15. package/dist/{PortalContentApiProvider-BvreyuHL.cjs → PortalContentApiProvider-BBGpjTFn.cjs} +11 -12
  16. package/dist/{PortalContentApiProvider-BvreyuHL.cjs.map → PortalContentApiProvider-BBGpjTFn.cjs.map} +1 -1
  17. package/dist/{PortalContentApiProvider-mXe3JFMW.mjs → PortalContentApiProvider-D15sSN1l.mjs} +11 -12
  18. package/dist/{PortalContentApiProvider-mXe3JFMW.mjs.map → PortalContentApiProvider-D15sSN1l.mjs.map} +1 -1
  19. package/dist/{PortalProductsApiProvider-BXmVqeTK.mjs → PortalProductsApiProvider-BALswRao.mjs} +2 -2
  20. package/dist/{PortalProductsApiProvider-BXmVqeTK.mjs.map → PortalProductsApiProvider-BALswRao.mjs.map} +1 -1
  21. package/dist/{PortalProductsApiProvider-jbh8K-Yu.cjs → PortalProductsApiProvider-Duj-EjQj.cjs} +2 -2
  22. package/dist/{PortalProductsApiProvider-jbh8K-Yu.cjs.map → PortalProductsApiProvider-Duj-EjQj.cjs.map} +1 -1
  23. package/dist/{ProductsScreen-B3zrg-M4.mjs → ProductsScreen-BnS0MbzY.mjs} +3 -3
  24. package/dist/{ProductsScreen-B3zrg-M4.mjs.map → ProductsScreen-BnS0MbzY.mjs.map} +1 -1
  25. package/dist/{ProductsScreen-4PpCihOF.mjs → ProductsScreen-C0KlCDt_.mjs} +3 -3
  26. package/dist/{ProductsScreen-BJ_OpulB.cjs → ProductsScreen-CWqkme1L.cjs} +3 -3
  27. package/dist/{ProductsScreen-BJ_OpulB.cjs.map → ProductsScreen-CWqkme1L.cjs.map} +1 -1
  28. package/dist/{ProductsScreen-BxFPdYyG.cjs → ProductsScreen-DjzkmBOS.cjs} +3 -3
  29. package/dist/{ProfileScreen-D6tv5Qp8.mjs → ProfileScreen-BuDwsZ3f.mjs} +2 -2
  30. package/dist/{ProfileScreen-D6tv5Qp8.mjs.map → ProfileScreen-BuDwsZ3f.mjs.map} +1 -1
  31. package/dist/{ProfileScreen-4BbG1vpk.cjs → ProfileScreen-CD0p8061.cjs} +2 -2
  32. package/dist/{ProfileScreen-OhOlDDDj.cjs → ProfileScreen-De6Xdkr4.cjs} +2 -2
  33. package/dist/{ProfileScreen-OhOlDDDj.cjs.map → ProfileScreen-De6Xdkr4.cjs.map} +1 -1
  34. package/dist/{ShareablesScreen-D0hdY5cY.cjs → ShareablesScreen-BZG-rFuT.cjs} +3 -3
  35. package/dist/{ShareablesScreen-BVb5BkiC.cjs → ShareablesScreen-B_tGIt_X.cjs} +3 -3
  36. package/dist/{ShareablesScreen-BVb5BkiC.cjs.map → ShareablesScreen-B_tGIt_X.cjs.map} +1 -1
  37. package/dist/{ShareablesScreen-xak6DHSf.mjs → ShareablesScreen-_S-OESoe.mjs} +3 -3
  38. package/dist/{ShareablesScreen-DCbx4JwR.mjs → ShareablesScreen-svmMjJII.mjs} +3 -3
  39. package/dist/{ShareablesScreen-DCbx4JwR.mjs.map → ShareablesScreen-svmMjJII.mjs.map} +1 -1
  40. package/dist/{ShopScreen-DmkJgGqK.mjs → ShopScreen-Bg5pr5RL.mjs} +3 -3
  41. package/dist/{ShopScreen-DmkJgGqK.mjs.map → ShopScreen-Bg5pr5RL.mjs.map} +1 -1
  42. package/dist/{ShopScreen-BYEB_E5B.cjs → ShopScreen-DqUle1Zv.cjs} +3 -3
  43. package/dist/{ShopScreen-2Fm9c-Nc.cjs → ShopScreen-z1kE-juB.cjs} +3 -3
  44. package/dist/{ShopScreen-2Fm9c-Nc.cjs.map → ShopScreen-z1kE-juB.cjs.map} +1 -1
  45. package/dist/{SubscriptionsScreen-B3Z13alr.mjs → SubscriptionsScreen-BCxNFOZv.mjs} +2 -2
  46. package/dist/{SubscriptionsScreen-B3Z13alr.mjs.map → SubscriptionsScreen-BCxNFOZv.mjs.map} +1 -1
  47. package/dist/{SubscriptionsScreen-Cdf_XKwQ.cjs → SubscriptionsScreen-CYIUXxrJ.cjs} +1 -1
  48. package/dist/{SubscriptionsScreen-C_U6YU-s.cjs → SubscriptionsScreen-Dr0FmZZH.cjs} +2 -2
  49. package/dist/{SubscriptionsScreen-C_U6YU-s.cjs.map → SubscriptionsScreen-Dr0FmZZH.cjs.map} +1 -1
  50. package/dist/index.cjs +24 -24
  51. package/dist/index.mjs +24 -24
  52. package/dist/{portal_tenant-5kK658sL.cjs → portal_tenant-CvP7rhIy.cjs} +1 -33
  53. package/dist/{portal_tenant-5kK658sL.cjs.map → portal_tenant-CvP7rhIy.cjs.map} +1 -1
  54. package/dist/{portal_tenant-vEh8wfqU.mjs → portal_tenant-Vkge0BiD.mjs} +2 -22
  55. package/dist/{portal_tenant-vEh8wfqU.mjs.map → portal_tenant-Vkge0BiD.mjs.map} +1 -1
  56. package/dist/{portal_tenant_content-DZ8AqoU_.cjs → portal_tenant_content-Bq8PD-Sz.cjs} +1 -17
  57. package/dist/portal_tenant_content-Bq8PD-Sz.cjs.map +1 -0
  58. package/dist/{portal_tenant_content-5fNROcju.mjs → portal_tenant_content-C8DCQLR3.mjs} +2 -12
  59. package/dist/portal_tenant_content-C8DCQLR3.mjs.map +1 -0
  60. package/package.json +18 -18
  61. package/dist/FluidProvider-C6NlPdMA.mjs.map +0 -1
  62. package/dist/FluidProvider-MjOyxZEf.cjs.map +0 -1
  63. package/dist/portal_tenant_content-5fNROcju.mjs.map +0 -1
  64. package/dist/portal_tenant_content-DZ8AqoU_.cjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  require("./chunk-9hOWP6kD.cjs");
2
- require("./FluidProvider-MjOyxZEf.cjs");
2
+ require("./FluidProvider-CIuinUdw.cjs");
3
3
  require("./ScreenRenderer-8F7DT7CQ.cjs");
4
4
  require("./account-api-context-DZP9IiGg.cjs");
5
5
  require("./store-api-context-D1gZn22Z.cjs");
@@ -39,7 +39,7 @@ require("./SpacerWidget-BvdiobwO.cjs");
39
39
  require("./TableWidget-Czi5nVbO.cjs");
40
40
  require("./ToDoWidget-BRchHqmU.cjs");
41
41
  require("./VideoWidget-Crw3Xs_c.cjs");
42
- const require_MessagingScreen = require("./MessagingScreen-DRzVl0ux.cjs");
42
+ const require_MessagingScreen = require("./MessagingScreen-CwMR1WJG.cjs");
43
43
  require("./dist-BRT-FAUb.cjs");
44
44
  require("./es-Dr47illR.cjs");
45
45
  exports.MessagingScreen = require_MessagingScreen.MessagingScreen;
@@ -1,5 +1,5 @@
1
1
  import { r as __exportAll } from "./es-I9usCQT-.mjs";
2
- import { c as orders_show, s as orders_list } from "./portal_tenant-vEh8wfqU.mjs";
2
+ import { a as orders_list, o as orders_show } from "./portal_tenant-Vkge0BiD.mjs";
3
3
  import { n as usePortalTenantClient } from "./PortalTenantClientProvider-4ZmY6hac.mjs";
4
4
  import { Jt as BreadcrumbLink, Kt as Breadcrumb, Xt as BreadcrumbPage, Yt as BreadcrumbList, Zt as BreadcrumbSeparator, _ as fluidToast, b as Skeleton, qt as BreadcrumbItem } from "./src-BZbWkXOU.mjs";
5
5
  import { r as useScreenHeaderBreadcrumbs } from "./ScreenHeaderContext-FYyYk97y.mjs";
@@ -509,4 +509,4 @@ const ordersScreenPropertySchema = {
509
509
  //#endregion
510
510
  export { OrdersScreen_exports as n, ordersScreenPropertySchema as r, OrdersScreen as t };
511
511
 
512
- //# sourceMappingURL=OrdersScreen-Dz4XHnSA.mjs.map
512
+ //# sourceMappingURL=OrdersScreen-BYs3uo-1.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrdersScreen-Dz4XHnSA.mjs","names":["portalTenant.orders_show","portalTenant.orders_list","OrdersListScreen","OrdersListScreenContent","PortalOrderDetailScreenContent"],"sources":["../src/adapters/orders-api-adapter.ts","../src/orders/PortalOrdersApiProvider.tsx","../../../orders/ui/src/screens/OrdersListScreen.tsx","../src/screens/OrdersListScreen.tsx","../../../orders/ui/src/components/portal-order-detail.tsx","../../../orders/ui/src/screens/PortalOrderDetailScreen.tsx","../src/screens/OrderDetailScreen.tsx","../src/screens/OrdersScreen.tsx"],"sourcesContent":["import type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport type { OrdersApi } from \"@fluid-app/orders-core\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Creates an OrdersApi adapter backed by the portal-tenant BFF.\n *\n * Provides two methods:\n * - fetchOrderById -> PortalTenantOrderResponse (for PortalOrderDetail screen)\n * - fetchCustomerOrders -> CustomerOrdersResponse with ListOrder[] (for shared OrdersList)\n *\n * The BFF uses a single Order schema for both endpoints, but consumers need\n * different shapes: the detail screen works with PortalTenantOrder (matches the\n * BFF's limited data), while the list screen needs the canonical ListOrder so\n * the shared OrdersList component works unchanged.\n */\n\ntype RawOrder = NonNullable<\n Awaited<ReturnType<typeof portalTenant.orders_show>>[\"order\"]\n>;\n\nfunction mapToPortalTenantOrder(raw: RawOrder): orders.PortalTenantOrder {\n return {\n id: raw.id ?? 0,\n token: raw.token ?? \"\",\n status: (raw.status ?? \"pending\") as orders.PortalTenantOrderStatus,\n total: raw.total ?? \"0\",\n currency: raw.currency ?? \"\",\n line_items: (raw.line_items ?? []).map((li) => ({\n id: li.id ?? 0,\n product_id: li.product_id ?? 0,\n product_name: li.product_name ?? \"\",\n quantity: li.quantity ?? 0,\n price: li.price ?? \"0\",\n total: li.total ?? \"0\",\n })),\n customer_name: raw.customer_name ?? null,\n customer_email: raw.customer_email ?? null,\n subscription_order: raw.subscription_order ?? false,\n subscription_token: raw.subscription_token ?? null,\n // These fields are returned by the BFF but not yet in the OpenAPI spec.\n total_points_credited:\n typeof (raw as Record<string, unknown>).total_points_credited === \"number\"\n ? ((raw as Record<string, unknown>).total_points_credited as number)\n : undefined,\n customer_points_balance:\n typeof (raw as Record<string, unknown>).customer_points_balance ===\n \"number\"\n ? ((raw as Record<string, unknown>).customer_points_balance as number)\n : undefined,\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n } satisfies orders.PortalTenantOrder;\n}\n\nfunction mapToListOrder(raw: RawOrder): orders.ListOrder {\n const firstLineItem = raw.line_items?.[0];\n return {\n id: raw.id ?? 0,\n external_id: null,\n order_number: \"\",\n email: raw.customer_email ?? null,\n first_name: raw.customer_name?.split(\" \")[0] ?? null,\n last_name: raw.customer_name?.split(\" \").slice(1).join(\" \") || null,\n amount: raw.total ?? \"0\",\n status: raw.status ?? \"pending\",\n order_status: raw.status ?? \"pending\",\n fulfillment_status: \"unfulfilled\",\n financial_status: \"pending\",\n currency_code: raw.currency ?? \"\",\n note: null,\n token: raw.token ?? \"\",\n warehouse_id: null,\n source: \"web\",\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n total_display_amount: `${raw.currency ?? \"\"} ${raw.total ?? \"0\"}`,\n total_cv: 0,\n total_qv: 0,\n currency_symbol: raw.currency ?? \"\",\n items_count: raw.line_items?.length ?? 0,\n quantity_count:\n raw.line_items?.reduce((sum, li) => sum + (li.quantity ?? 0), 0) ?? 0,\n order_on_behalf_of: false,\n sale_date: null,\n customer: null,\n first_item: firstLineItem\n ? { title: firstLineItem.product_name ?? \"\", image_url: \"\" }\n : null,\n // The BFF indicates subscription_order but doesn't expose the\n // subscription's lifecycle status. We set \"active\" because the order's\n // existence implies the subscription was active at purchase time. The\n // real status is shown on the subscription detail screen.\n subscription:\n raw.subscription_order && raw.subscription_token\n ? { subscription_token: raw.subscription_token, status: \"active\" }\n : raw.subscription_order\n ? { subscription_token: \"\", status: \"active\" }\n : null,\n };\n}\n\nexport function createPortalOrdersAdapter(\n client: FetchClient,\n): Required<Pick<OrdersApi, \"fetchOrderById\" | \"fetchCustomerOrders\">> {\n return {\n fetchOrderById: async (id: string | number) => {\n const response = await portalTenant.orders_show(client, id);\n return {\n order: mapToPortalTenantOrder(response.order ?? {}),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies orders.PortalTenantOrderResponse;\n },\n\n fetchCustomerOrders: async (params: orders.FetchOrdersParams) => {\n const response = await portalTenant.orders_list(client, {\n \"page[cursor]\": params.cursor,\n \"page[limit]\": params.limit,\n status: params.status,\n q: params.search,\n });\n return {\n orders: (response.orders ?? []).map(mapToListOrder),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n pagination: {\n cursor: response.meta?.pagination?.cursor ?? null,\n limit: response.meta?.pagination?.limit ?? 25,\n next_cursor: response.meta?.pagination?.next_cursor ?? null,\n prev_cursor: response.meta?.pagination?.prev_cursor ?? null,\n total_count: response.meta?.pagination?.total_count ?? 0,\n },\n },\n } satisfies orders.CustomerOrdersResponse;\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { OrdersCoreProvider } from \"@fluid-app/orders-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalOrdersAdapter } from \"../adapters/orders-api-adapter\";\n\nexport function PortalOrdersApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalOrdersAdapter(client), [client]);\n\n return <OrdersCoreProvider api={api}>{children}</OrdersCoreProvider>;\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { OrdersList } from \"../components/orders-list\";\n\nexport interface OrdersListScreenProps {\n customerId: number | undefined;\n onOrderClick: (order: orders.ListOrder) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n t: (key: string) => string;\n isLoadingCustomer?: boolean;\n}\n\nexport function OrdersListScreen({\n customerId,\n onOrderClick,\n onSubscriptionClick,\n t,\n isLoadingCustomer,\n}: OrdersListScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Orders</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n if (isLoadingCustomer) {\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"space-y-3\">\n <div className=\"bg-muted h-10 animate-pulse rounded\" />\n <div className=\"bg-muted h-64 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <OrdersList\n customerId={customerId}\n onOrderClick={onOrderClick}\n onSubscriptionClick={onSubscriptionClick}\n t={t}\n />\n </div>\n );\n}\n","import type { orders } from \"@fluid-app/orders-core\";\nimport { OrdersListScreen as OrdersListScreenContent } from \"@fluid-app/orders-ui/screens/OrdersListScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\nconst translations: Record<string, string> = {\n search_orders: \"Search orders...\",\n order_number: \"Order #\",\n date: \"Date\",\n status: \"Status\",\n product: \"Product\",\n no_orders_found: \"No orders found\",\n no_matching_orders: \"No matching orders\",\n no_image_available: \"No image available\",\n this_product_no_longer_exists: \"This product no longer exists\",\n subscription: \"Subscription\",\n view_subscription: \"View Subscription\",\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n};\n\n// The portal-tenant BFF scopes orders to the logged-in user server-side,\n// so customerId is not used by the adapter. We pass a sentinel value to\n// satisfy the enabled guard in useCustomerOrders.\nconst BFF_SCOPED_CUSTOMER_ID = 1;\n\nexport function OrdersListScreen(): React.JSX.Element {\n const { navigate } = useAppNavigation();\n\n const handleOrderClick = (order: orders.ListOrder) => {\n navigate(`orders/${order.token}`);\n };\n\n const handleSubscriptionClick = (subscriptionToken: string) => {\n navigate(`subscriptions/${subscriptionToken}`);\n };\n\n return (\n <OrdersListScreenContent\n customerId={BFF_SCOPED_CUSTOMER_ID}\n onOrderClick={handleOrderClick}\n onSubscriptionClick={handleSubscriptionClick}\n t={(key) => translations[key] ?? key}\n />\n );\n}\n","import { useEffect } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { usePortalTenantOrder } from \"@fluid-app/orders-core\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { OrderStatusBadge } from \"./order-status-badge\";\n\nexport interface PortalOrderDetailProps {\n id: string | number;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nfunction DetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <div className=\"bg-muted flex flex-col items-center px-8 lg:col-span-4\">\n <div className=\"w-full max-w-lg py-6\">\n <Skeleton className=\"mb-4 h-6 w-48\" />\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-4\">\n <Skeleton className=\"h-24 w-24 rounded\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n <Skeleton className=\"mb-4 h-10 w-full rounded\" />\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ItemRow({ item }: { item: orders.PortalTenantOrderLineItem }) {\n return (\n <div className=\"flex items-center space-x-4 py-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted text-muted-foreground flex h-24 w-24 items-center justify-center overflow-hidden rounded\">\n No image\n </div>\n {item.quantity > 1 && (\n <span className=\"bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\">\n {item.quantity}\n </span>\n )}\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col space-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={item.product_name}\n >\n {item.product_name}\n </p>\n <p className=\"text-foreground text-sm font-medium\">{item.total}</p>\n {item.quantity > 1 && (\n <p className=\"text-muted-foreground text-xs\">\n {item.price} x {item.quantity}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nfunction ItemsSection({ order }: { order: orders.PortalTenantOrder }) {\n return (\n <section className=\"bg-muted flex w-full flex-col items-center px-8 lg:col-span-4\">\n <div className=\"flex w-full max-w-lg flex-col\">\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n Items ({order.line_items.length})\n </h2>\n <hr className=\"border-border\" />\n </div>\n\n <div className=\"divide-border divide-y\">\n {order.line_items.map((item) => (\n <ItemRow key={item.id} item={item} />\n ))}\n </div>\n\n <div className=\"border-border mb-4 border-t pt-4\">\n <div className=\"mt-4 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">Total</p>\n <p className=\"text-foreground text-base font-bold\">\n {order.currency} {order.total}\n </p>\n </div>\n </div>\n\n {/* TODO: i18n */}\n {/* TODO: gate on reward_points_enabled when available on PortalTenantOrder */}\n {order.total_points_credited != null &&\n order.total_points_credited > 0 && (\n <div className=\"border-border mb-4 border-t pt-4\">\n <div className=\"flex items-baseline justify-between\">\n <div>\n <p className=\"text-foreground text-sm font-semibold\">\n points earned on this order!\n </p>\n {order.customer_points_balance != null && (\n <p className=\"text-muted-foreground text-xs\">\n {order.customer_points_balance.toLocaleString()} points\n total\n </p>\n )}\n </div>\n <div className=\"text-right\">\n <p className=\"text-foreground text-sm font-semibold\">\n +{order.total_points_credited.toLocaleString()}\n </p>\n <p className=\"text-muted-foreground text-xs\">points</p>\n </div>\n </div>\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction DetailsSection({ order }: { order: orders.PortalTenantOrder }) {\n return (\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Order Status */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Status:</span>\n <OrderStatusBadge status={order.status} />\n </div>\n </div>\n </div>\n\n {/* Order Info */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order Info\n </h3>\n <div className=\"divide-border flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">Order</div>\n <div className=\"text-foreground font-medium\">#{order.id}</div>\n </div>\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">Date</div>\n <div className=\"text-foreground font-medium\">\n {new Date(order.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })}\n </div>\n </div>\n </div>\n {order.customer_email && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Email</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_email}\n </div>\n </div>\n )}\n {order.customer_name && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Customer</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_name}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport function PortalOrderDetail({\n id,\n onNotFound,\n onError,\n}: PortalOrderDetailProps) {\n const { data, isLoading, error } = usePortalTenantOrder(id);\n const order = data?.order;\n\n useEffect(() => {\n if (!isLoading && error) {\n onError?.(error as Error);\n }\n }, [isLoading, error, onError]);\n\n useEffect(() => {\n if (!isLoading && !error && !order) {\n onNotFound?.();\n }\n }, [isLoading, error, order, onNotFound]);\n\n if (isLoading) {\n return <DetailSkeleton />;\n }\n\n if (!order) {\n return null;\n }\n\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <ItemsSection order={order} />\n <DetailsSection order={order} />\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { PortalOrderDetail } from \"../components/portal-order-detail\";\n\nexport interface PortalOrderDetailScreenProps {\n id: string | number;\n onNavigateToList: () => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport function PortalOrderDetailScreen({\n id,\n onNavigateToList,\n onNotFound,\n onError,\n}: PortalOrderDetailScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n Orders\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n Order #{id}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [id, onNavigateToList],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <PortalOrderDetail id={id} onNotFound={onNotFound} onError={onError} />\n </div>\n );\n}\n","import { PortalOrderDetailScreen as PortalOrderDetailScreenContent } from \"@fluid-app/orders-ui/screens/PortalOrderDetailScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface OrderDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function OrderDetailScreen({\n token,\n onToast,\n}: OrderDetailScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n\n return (\n <PortalOrderDetailScreenContent\n id={token}\n onNavigateToList={() => navigate(\"orders\")}\n onNotFound={() => {\n onToast(\"Order not found\", \"warning\");\n navigate(\"orders\");\n }}\n onError={(err) => {\n const message =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`Failed to load order: ${message}`, \"error\");\n }}\n />\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalOrdersApiProvider } from \"../orders/PortalOrdersApiProvider\";\nimport { OrdersListScreen } from \"./OrdersListScreen\";\nimport { OrderDetailScreen } from \"./OrderDetailScreen\";\n\ntype OrdersScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function OrdersScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: OrdersScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const effectiveToast = onToast ?? defaultToast;\n\n // Parse slug: \"orders\" → list, \"orders/{token}\" → detail\n const detailToken = currentSlug.split(\"/\")[1];\n const isDetailView = detailToken !== undefined;\n\n if (isDetailView) {\n return (\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrderDetailScreen token={detailToken} onToast={effectiveToast} />\n </PortalOrdersApiProvider>\n </div>\n );\n }\n\n return (\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrdersListScreen />\n </PortalOrdersApiProvider>\n </div>\n );\n}\n\nexport const ordersScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"OrdersScreen\",\n displayName: \"Orders Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":";;;;;;;;;;AAsBA,SAAS,uBAAuB,KAAyC;AACvE,QAAO;EACL,IAAI,IAAI,MAAM;EACd,OAAO,IAAI,SAAS;EACpB,QAAS,IAAI,UAAU;EACvB,OAAO,IAAI,SAAS;EACpB,UAAU,IAAI,YAAY;EAC1B,aAAa,IAAI,cAAc,EAAE,EAAE,KAAK,QAAQ;GAC9C,IAAI,GAAG,MAAM;GACb,YAAY,GAAG,cAAc;GAC7B,cAAc,GAAG,gBAAgB;GACjC,UAAU,GAAG,YAAY;GACzB,OAAO,GAAG,SAAS;GACnB,OAAO,GAAG,SAAS;GACpB,EAAE;EACH,eAAe,IAAI,iBAAiB;EACpC,gBAAgB,IAAI,kBAAkB;EACtC,oBAAoB,IAAI,sBAAsB;EAC9C,oBAAoB,IAAI,sBAAsB;EAE9C,uBACE,OAAQ,IAAgC,0BAA0B,WAC5D,IAAgC,wBAClC,KAAA;EACN,yBACE,OAAQ,IAAgC,4BACxC,WACM,IAAgC,0BAClC,KAAA;EACN,YAAY,IAAI,cAAc;EAC9B,YAAY,IAAI,cAAc;EAC/B;;AAGH,SAAS,eAAe,KAAiC;CACvD,MAAM,gBAAgB,IAAI,aAAa;AACvC,QAAO;EACL,IAAI,IAAI,MAAM;EACd,aAAa;EACb,cAAc;EACd,OAAO,IAAI,kBAAkB;EAC7B,YAAY,IAAI,eAAe,MAAM,IAAI,CAAC,MAAM;EAChD,WAAW,IAAI,eAAe,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,IAAI;EAC/D,QAAQ,IAAI,SAAS;EACrB,QAAQ,IAAI,UAAU;EACtB,cAAc,IAAI,UAAU;EAC5B,oBAAoB;EACpB,kBAAkB;EAClB,eAAe,IAAI,YAAY;EAC/B,MAAM;EACN,OAAO,IAAI,SAAS;EACpB,cAAc;EACd,QAAQ;EACR,YAAY,IAAI,cAAc;EAC9B,YAAY,IAAI,cAAc;EAC9B,sBAAsB,GAAG,IAAI,YAAY,GAAG,GAAG,IAAI,SAAS;EAC5D,UAAU;EACV,UAAU;EACV,iBAAiB,IAAI,YAAY;EACjC,aAAa,IAAI,YAAY,UAAU;EACvC,gBACE,IAAI,YAAY,QAAQ,KAAK,OAAO,OAAO,GAAG,YAAY,IAAI,EAAE,IAAI;EACtE,oBAAoB;EACpB,WAAW;EACX,UAAU;EACV,YAAY,gBACR;GAAE,OAAO,cAAc,gBAAgB;GAAI,WAAW;GAAI,GAC1D;EAKJ,cACE,IAAI,sBAAsB,IAAI,qBAC1B;GAAE,oBAAoB,IAAI;GAAoB,QAAQ;GAAU,GAChE,IAAI,qBACF;GAAE,oBAAoB;GAAI,QAAQ;GAAU,GAC5C;EACT;;AAGH,SAAgB,0BACd,QACqE;AACrE,QAAO;EACL,gBAAgB,OAAO,OAAwB;GAC7C,MAAM,WAAW,MAAMA,YAAyB,QAAQ,GAAG;AAC3D,UAAO;IACL,OAAO,uBAAuB,SAAS,SAAS,EAAE,CAAC;IACnD,MAAM;KACJ,YAAY,SAAS,MAAM,cAAc;KACzC,WAAW,SAAS,MAAM,aAAa;KACxC;IACF;;EAGH,qBAAqB,OAAO,WAAqC;GAC/D,MAAM,WAAW,MAAMC,YAAyB,QAAQ;IACtD,gBAAgB,OAAO;IACvB,eAAe,OAAO;IACtB,QAAQ,OAAO;IACf,GAAG,OAAO;IACX,CAAC;AACF,UAAO;IACL,SAAS,SAAS,UAAU,EAAE,EAAE,IAAI,eAAe;IACnD,MAAM;KACJ,YAAY,SAAS,MAAM,cAAc;KACzC,WAAW,SAAS,MAAM,aAAa;KACvC,YAAY;MACV,QAAQ,SAAS,MAAM,YAAY,UAAU;MAC7C,OAAO,SAAS,MAAM,YAAY,SAAS;MAC3C,aAAa,SAAS,MAAM,YAAY,eAAe;MACvD,aAAa,SAAS,MAAM,YAAY,eAAe;MACvD,aAAa,SAAS,MAAM,YAAY,eAAe;MACxD;KACF;IACF;;EAEJ;;;;ACvIH,SAAgB,wBAAwB,EACtC,YAGe;CACf,MAAM,SAAS,uBAAuB;AAItC,QAAO,oBAAC,oBAAD;EAAoB,KAFf,cAAc,0BAA0B,OAAO,EAAE,CAAC,OAAO,CAAC;EAEhC;EAA8B,CAAA;;;;ACOtE,SAAgBC,mBAAiB,EAC/B,YACA,cACA,qBACA,GACA,qBACwB;AAaxB,4BAZ0B,cAEtB,oBAAC,YAAD,EAAA,UACE,oBAAC,gBAAD;EAAgB,WAAU;YACxB,oBAAC,gBAAD,EAAA,UACE,oBAAC,gBAAD;GAAgB,WAAU;aAAgB;GAAuB,CAAA,EAClD,CAAA;EACF,CAAA,EACN,CAAA,EAEf,EAAE,CACH,CAC4C;AAE7C,KAAI,kBACF,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,OAAD,EAAK,WAAU,uCAAwC,CAAA,EACvD,oBAAC,OAAD,EAAK,WAAU,uCAAwC,CAAA,CACnD;;EACF,CAAA;AAIV,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,YAAD;GACc;GACE;GACO;GAClB;GACH,CAAA;EACE,CAAA;;;;ACzDV,MAAM,eAAuC;CAC3C,eAAe;CACf,cAAc;CACd,MAAM;CACN,QAAQ;CACR,SAAS;CACT,iBAAiB;CACjB,oBAAoB;CACpB,oBAAoB;CACpB,+BAA+B;CAC/B,cAAc;CACd,mBAAmB;CACnB,OAAO;CACP,SAAS;CACT,UAAU;CACV,MAAM;CACN,YAAY;CACb;AAKD,MAAM,yBAAyB;AAE/B,SAAgB,mBAAsC;CACpD,MAAM,EAAE,aAAa,kBAAkB;CAEvC,MAAM,oBAAoB,UAA4B;AACpD,WAAS,UAAU,MAAM,QAAQ;;CAGnC,MAAM,2BAA2B,sBAA8B;AAC7D,WAAS,iBAAiB,oBAAoB;;AAGhD,QACE,oBAACC,oBAAD;EACE,YAAY;EACZ,cAAc;EACd,qBAAqB;EACrB,IAAI,QAAQ,aAAa,QAAQ;EACjC,CAAA;;;;ACjCN,SAAS,iBAAiB;AACxB,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,OAAD;GAAK,WAAU;aACb,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,oBAAC,UAAD,EAAU,WAAU,iBAAkB,CAAA;KACtC,oBAAC,OAAD;MAAK,WAAU;gBACb,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oBAAC,UAAD,EAAU,WAAU,qBAAsB,CAAA,EAC1C,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,oBAAC,UAAD,EAAU,WAAU,aAAc,CAAA,EAClC,oBAAC,UAAD,EAAU,WAAU,aAAc,CAAA,CAC9B;UACF;;MACF,CAAA;KACN,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,UAAD,EAAU,WAAU,cAAe,CAAA,EACnC,oBAAC,UAAD,EAAU,WAAU,cAAe,CAAA,CAC/B;;KACF;;GACF,CAAA,EACN,oBAAC,OAAD;GAAK,WAAU;aACb,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,UAAD,EAAU,WAAU,4BAA6B,CAAA,EACjD,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,UAAD,EAAU,WAAU,YAAa,CAAA,EACjC,oBAAC,UAAD,EAAU,WAAU,uBAAwB,CAAA,CACxC;OACF;;GACF,CAAA,CACF;;;AAIV,SAAS,QAAQ,EAAE,QAAoD;AACrE,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,oBAAC,OAAD;IAAK,WAAU;cAAoG;IAE7G,CAAA,EACL,KAAK,WAAW,KACf,oBAAC,QAAD;IAAM,WAAU;cACb,KAAK;IACD,CAAA,CAEL;MACN,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,oBAAC,KAAD;KACE,WAAU;KACV,OAAO,KAAK;eAEX,KAAK;KACJ,CAAA;IACJ,oBAAC,KAAD;KAAG,WAAU;eAAuC,KAAK;KAAU,CAAA;IAClE,KAAK,WAAW,KACf,qBAAC,KAAD;KAAG,WAAU;eAAb;MACG,KAAK;MAAM;MAAI,KAAK;MACnB;;IAEF;KACF;;;AAIV,SAAS,aAAa,EAAE,SAA8C;AACpE,QACE,oBAAC,WAAD;EAAS,WAAU;YACjB,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,MAAD;MAAI,WAAU;gBAAd;OAAyD;OAC/C,MAAM,WAAW;OAAO;OAC7B;SACL,oBAAC,MAAD,EAAI,WAAU,iBAAkB,CAAA,CAC5B;;IAEN,oBAAC,OAAD;KAAK,WAAU;eACZ,MAAM,WAAW,KAAK,SACrB,oBAAC,SAAD,EAA6B,MAAQ,EAAvB,KAAK,GAAkB,CACrC;KACE,CAAA;IAEN,oBAAC,OAAD;KAAK,WAAU;eACb,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,KAAD;OAAG,WAAU;iBAA4C;OAAS,CAAA,EAClE,qBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,MAAM;QAAS;QAAE,MAAM;QACtB;SACA;;KACF,CAAA;IAIL,MAAM,yBAAyB,QAC9B,MAAM,wBAAwB,KAC5B,oBAAC,OAAD;KAAK,WAAU;eACb,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,KAAD;OAAG,WAAU;iBAAwC;OAEjD,CAAA,EACH,MAAM,2BAA2B,QAChC,qBAAC,KAAD;OAAG,WAAU;iBAAb,CACG,MAAM,wBAAwB,gBAAgB,EAAC,gBAE9C;SAEF,EAAA,CAAA,EACN,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,qBAAC,KAAD;QAAG,WAAU;kBAAb,CAAqD,KACjD,MAAM,sBAAsB,gBAAgB,CAC5C;WACJ,oBAAC,KAAD;QAAG,WAAU;kBAAgC;QAAU,CAAA,CACnD;SACF;;KACF,CAAA;IAEN;;EACE,CAAA;;AAId,SAAS,eAAe,EAAE,SAA8C;AACtE,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,qBAAC,OAAD;GAAK,WAAU;aAAf,CAEE,oBAAC,OAAD;IAAK,WAAU;cACb,oBAAC,OAAD;KAAK,WAAU;eACb,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,QAAD;OAAM,WAAU;iBAAgC;OAAc,CAAA,EAC9D,oBAAC,kBAAD,EAAkB,QAAQ,MAAM,QAAU,CAAA,CACtC;;KACF,CAAA;IACF,CAAA,EAGN,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,oBAAC,MAAD;MAAI,WAAU;gBAA+C;MAExD,CAAA;KACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oBAAC,OAAD;QAAK,WAAU;kBAAgC;QAAW,CAAA,EAC1D,qBAAC,OAAD;QAAK,WAAU;kBAAf,CAA6C,KAAE,MAAM,GAAS;UAC1D;UACN,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,oBAAC,OAAD;QAAK,WAAU;kBAAgC;QAAU,CAAA,EACzD,oBAAC,OAAD;QAAK,WAAU;kBACZ,IAAI,KAAK,MAAM,WAAW,CAAC,mBAAmB,SAAS;SACtD,MAAM;SACN,OAAO;SACP,KAAK;SACN,CAAC;QACE,CAAA,CACF;SACF;;KACL,MAAM,kBACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,OAAD;OAAK,WAAU;iBAAgC;OAAW,CAAA,EAC1D,oBAAC,OAAD;OAAK,WAAU;iBACZ,MAAM;OACH,CAAA,CACF;;KAEP,MAAM,iBACL,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,OAAD;OAAK,WAAU;iBAAgC;OAAc,CAAA,EAC7D,oBAAC,OAAD;OAAK,WAAU;iBACZ,MAAM;OACH,CAAA,CACF;;KAEJ;MACF;;EACF,CAAA;;AAIV,SAAgB,kBAAkB,EAChC,IACA,YACA,WACyB;CACzB,MAAM,EAAE,MAAM,WAAW,UAAU,qBAAqB,GAAG;CAC3D,MAAM,QAAQ,MAAM;AAEpB,iBAAgB;AACd,MAAI,CAAC,aAAa,MAChB,WAAU,MAAe;IAE1B;EAAC;EAAW;EAAO;EAAQ,CAAC;AAE/B,iBAAgB;AACd,MAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAC3B,eAAc;IAEf;EAAC;EAAW;EAAO;EAAO;EAAW,CAAC;AAEzC,KAAI,UACF,QAAO,oBAAC,gBAAD,EAAkB,CAAA;AAG3B,KAAI,CAAC,MACH,QAAO;AAGT,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,cAAD,EAAqB,OAAS,CAAA,EAC9B,oBAAC,gBAAD,EAAuB,OAAS,CAAA,CAC5B;;;;;AC1MV,SAAgB,wBAAwB,EACtC,IACA,kBACA,YACA,WAC+B;AA2B/B,4BA1B0B,cAEtB,oBAAC,YAAD,EAAA,UACE,qBAAC,gBAAD;EAAgB,WAAU;YAA1B;GACE,oBAAC,gBAAD,EAAA,UACE,oBAAC,gBAAD;IACE,MAAK;IACL,UAAU,MAAM;AACd,OAAE,gBAAgB;AAClB,uBAAkB;;cAErB;IAEgB,CAAA,EACF,CAAA;GACjB,oBAAC,qBAAD,EAAuB,CAAA;GACvB,oBAAC,gBAAD,EAAA,UACE,qBAAC,gBAAD;IAAgB,WAAU;cAA1B,CAA0C,WAChC,GACO;OACF,CAAA;GACF;KACN,CAAA,EAEf,CAAC,IAAI,iBAAiB,CACvB,CAC4C;AAE7C,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,mBAAD;GAAuB;GAAgB;GAAqB;GAAW,CAAA;EACnE,CAAA;;;;AClDV,SAAgB,kBAAkB,EAChC,OACA,WAC4C;CAC5C,MAAM,EAAE,aAAa,kBAAkB;AAEvC,QACE,oBAACC,yBAAD;EACE,IAAI;EACJ,wBAAwB,SAAS,SAAS;EAC1C,kBAAkB;AAChB,WAAQ,mBAAmB,UAAU;AACrC,YAAS,SAAS;;EAEpB,UAAU,QAAQ;AAGhB,WAAQ,yBADN,eAAe,QAAQ,IAAI,UAAU,uBACK,QAAQ;;EAEtD,CAAA;;;;;;;;ACJN,SAAS,aAAa,SAAiB,MAAuC;AAC5E,YAAW;EAAE,OAAO;EAAS;EAAM,CAAC;;AAGtC,SAAgB,aAAa,EAC3B,SAEA,YACA,WACA,aACA,SACA,cAEA,GAAG,YACoC;CACvC,MAAM,EAAE,gBAAgB,kBAAkB;CAC1C,MAAM,iBAAiB,WAAW;CAGlC,MAAM,cAAc,YAAY,MAAM,IAAI,CAAC;AAG3C,KAFqB,gBAAgB,KAAA,EAGnC,QACE,oBAAC,OAAD;EAAK,GAAI;YACP,oBAAC,yBAAD,EAAA,UACE,oBAAC,mBAAD;GAAmB,OAAO;GAAa,SAAS;GAAkB,CAAA,EAC1C,CAAA;EACtB,CAAA;AAIV,QACE,oBAAC,OAAD;EAAK,GAAI;YACP,oBAAC,yBAAD,EAAA,UACE,oBAAC,kBAAD,EAAoB,CAAA,EACI,CAAA;EACtB,CAAA;;AAIV,MAAa,6BAAmD;CAC9D,YAAY;CACZ,aAAa;CACb,YAAY,CAAC;EAAE,IAAI;EAAW,OAAO;EAAW,CAAC;CACjD,QAAQ,EAAE;CACX"}
1
+ {"version":3,"file":"OrdersScreen-BYs3uo-1.mjs","names":["portalTenant.orders_show","portalTenant.orders_list","OrdersListScreen","OrdersListScreenContent","PortalOrderDetailScreenContent"],"sources":["../src/adapters/orders-api-adapter.ts","../src/orders/PortalOrdersApiProvider.tsx","../../../orders/ui/src/screens/OrdersListScreen.tsx","../src/screens/OrdersListScreen.tsx","../../../orders/ui/src/components/portal-order-detail.tsx","../../../orders/ui/src/screens/PortalOrderDetailScreen.tsx","../src/screens/OrderDetailScreen.tsx","../src/screens/OrdersScreen.tsx"],"sourcesContent":["import type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport type { OrdersApi } from \"@fluid-app/orders-core\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Creates an OrdersApi adapter backed by the portal-tenant BFF.\n *\n * Provides two methods:\n * - fetchOrderById -> PortalTenantOrderResponse (for PortalOrderDetail screen)\n * - fetchCustomerOrders -> CustomerOrdersResponse with ListOrder[] (for shared OrdersList)\n *\n * The BFF uses a single Order schema for both endpoints, but consumers need\n * different shapes: the detail screen works with PortalTenantOrder (matches the\n * BFF's limited data), while the list screen needs the canonical ListOrder so\n * the shared OrdersList component works unchanged.\n */\n\ntype RawOrder = NonNullable<\n Awaited<ReturnType<typeof portalTenant.orders_show>>[\"order\"]\n>;\n\nfunction mapToPortalTenantOrder(raw: RawOrder): orders.PortalTenantOrder {\n return {\n id: raw.id ?? 0,\n token: raw.token ?? \"\",\n status: (raw.status ?? \"pending\") as orders.PortalTenantOrderStatus,\n total: raw.total ?? \"0\",\n currency: raw.currency ?? \"\",\n line_items: (raw.line_items ?? []).map((li) => ({\n id: li.id ?? 0,\n product_id: li.product_id ?? 0,\n product_name: li.product_name ?? \"\",\n quantity: li.quantity ?? 0,\n price: li.price ?? \"0\",\n total: li.total ?? \"0\",\n })),\n customer_name: raw.customer_name ?? null,\n customer_email: raw.customer_email ?? null,\n subscription_order: raw.subscription_order ?? false,\n subscription_token: raw.subscription_token ?? null,\n // These fields are returned by the BFF but not yet in the OpenAPI spec.\n total_points_credited:\n typeof (raw as Record<string, unknown>).total_points_credited === \"number\"\n ? ((raw as Record<string, unknown>).total_points_credited as number)\n : undefined,\n customer_points_balance:\n typeof (raw as Record<string, unknown>).customer_points_balance ===\n \"number\"\n ? ((raw as Record<string, unknown>).customer_points_balance as number)\n : undefined,\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n } satisfies orders.PortalTenantOrder;\n}\n\nfunction mapToListOrder(raw: RawOrder): orders.ListOrder {\n const firstLineItem = raw.line_items?.[0];\n return {\n id: raw.id ?? 0,\n external_id: null,\n order_number: \"\",\n email: raw.customer_email ?? null,\n first_name: raw.customer_name?.split(\" \")[0] ?? null,\n last_name: raw.customer_name?.split(\" \").slice(1).join(\" \") || null,\n amount: raw.total ?? \"0\",\n status: raw.status ?? \"pending\",\n order_status: raw.status ?? \"pending\",\n fulfillment_status: \"unfulfilled\",\n financial_status: \"pending\",\n currency_code: raw.currency ?? \"\",\n note: null,\n token: raw.token ?? \"\",\n warehouse_id: null,\n source: \"web\",\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n total_display_amount: `${raw.currency ?? \"\"} ${raw.total ?? \"0\"}`,\n total_cv: 0,\n total_qv: 0,\n currency_symbol: raw.currency ?? \"\",\n items_count: raw.line_items?.length ?? 0,\n quantity_count:\n raw.line_items?.reduce((sum, li) => sum + (li.quantity ?? 0), 0) ?? 0,\n order_on_behalf_of: false,\n sale_date: null,\n customer: null,\n first_item: firstLineItem\n ? { title: firstLineItem.product_name ?? \"\", image_url: \"\" }\n : null,\n // The BFF indicates subscription_order but doesn't expose the\n // subscription's lifecycle status. We set \"active\" because the order's\n // existence implies the subscription was active at purchase time. The\n // real status is shown on the subscription detail screen.\n subscription:\n raw.subscription_order && raw.subscription_token\n ? { subscription_token: raw.subscription_token, status: \"active\" }\n : raw.subscription_order\n ? { subscription_token: \"\", status: \"active\" }\n : null,\n };\n}\n\nexport function createPortalOrdersAdapter(\n client: FetchClient,\n): Required<Pick<OrdersApi, \"fetchOrderById\" | \"fetchCustomerOrders\">> {\n return {\n fetchOrderById: async (id: string | number) => {\n const response = await portalTenant.orders_show(client, id);\n return {\n order: mapToPortalTenantOrder(response.order ?? {}),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies orders.PortalTenantOrderResponse;\n },\n\n fetchCustomerOrders: async (params: orders.FetchOrdersParams) => {\n const response = await portalTenant.orders_list(client, {\n \"page[cursor]\": params.cursor,\n \"page[limit]\": params.limit,\n status: params.status,\n q: params.search,\n });\n return {\n orders: (response.orders ?? []).map(mapToListOrder),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n pagination: {\n cursor: response.meta?.pagination?.cursor ?? null,\n limit: response.meta?.pagination?.limit ?? 25,\n next_cursor: response.meta?.pagination?.next_cursor ?? null,\n prev_cursor: response.meta?.pagination?.prev_cursor ?? null,\n total_count: response.meta?.pagination?.total_count ?? 0,\n },\n },\n } satisfies orders.CustomerOrdersResponse;\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { OrdersCoreProvider } from \"@fluid-app/orders-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalOrdersAdapter } from \"../adapters/orders-api-adapter\";\n\nexport function PortalOrdersApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalOrdersAdapter(client), [client]);\n\n return <OrdersCoreProvider api={api}>{children}</OrdersCoreProvider>;\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { OrdersList } from \"../components/orders-list\";\n\nexport interface OrdersListScreenProps {\n customerId: number | undefined;\n onOrderClick: (order: orders.ListOrder) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n t: (key: string) => string;\n isLoadingCustomer?: boolean;\n}\n\nexport function OrdersListScreen({\n customerId,\n onOrderClick,\n onSubscriptionClick,\n t,\n isLoadingCustomer,\n}: OrdersListScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Orders</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n if (isLoadingCustomer) {\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"space-y-3\">\n <div className=\"bg-muted h-10 animate-pulse rounded\" />\n <div className=\"bg-muted h-64 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <OrdersList\n customerId={customerId}\n onOrderClick={onOrderClick}\n onSubscriptionClick={onSubscriptionClick}\n t={t}\n />\n </div>\n );\n}\n","import type { orders } from \"@fluid-app/orders-core\";\nimport { OrdersListScreen as OrdersListScreenContent } from \"@fluid-app/orders-ui/screens/OrdersListScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\nconst translations: Record<string, string> = {\n search_orders: \"Search orders...\",\n order_number: \"Order #\",\n date: \"Date\",\n status: \"Status\",\n product: \"Product\",\n no_orders_found: \"No orders found\",\n no_matching_orders: \"No matching orders\",\n no_image_available: \"No image available\",\n this_product_no_longer_exists: \"This product no longer exists\",\n subscription: \"Subscription\",\n view_subscription: \"View Subscription\",\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n};\n\n// The portal-tenant BFF scopes orders to the logged-in user server-side,\n// so customerId is not used by the adapter. We pass a sentinel value to\n// satisfy the enabled guard in useCustomerOrders.\nconst BFF_SCOPED_CUSTOMER_ID = 1;\n\nexport function OrdersListScreen(): React.JSX.Element {\n const { navigate } = useAppNavigation();\n\n const handleOrderClick = (order: orders.ListOrder) => {\n navigate(`orders/${order.token}`);\n };\n\n const handleSubscriptionClick = (subscriptionToken: string) => {\n navigate(`subscriptions/${subscriptionToken}`);\n };\n\n return (\n <OrdersListScreenContent\n customerId={BFF_SCOPED_CUSTOMER_ID}\n onOrderClick={handleOrderClick}\n onSubscriptionClick={handleSubscriptionClick}\n t={(key) => translations[key] ?? key}\n />\n );\n}\n","import { useEffect } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { usePortalTenantOrder } from \"@fluid-app/orders-core\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { OrderStatusBadge } from \"./order-status-badge\";\n\nexport interface PortalOrderDetailProps {\n id: string | number;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nfunction DetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <div className=\"bg-muted flex flex-col items-center px-8 lg:col-span-4\">\n <div className=\"w-full max-w-lg py-6\">\n <Skeleton className=\"mb-4 h-6 w-48\" />\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-4\">\n <Skeleton className=\"h-24 w-24 rounded\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n <Skeleton className=\"mb-4 h-10 w-full rounded\" />\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ItemRow({ item }: { item: orders.PortalTenantOrderLineItem }) {\n return (\n <div className=\"flex items-center space-x-4 py-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted text-muted-foreground flex h-24 w-24 items-center justify-center overflow-hidden rounded\">\n No image\n </div>\n {item.quantity > 1 && (\n <span className=\"bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\">\n {item.quantity}\n </span>\n )}\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col space-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={item.product_name}\n >\n {item.product_name}\n </p>\n <p className=\"text-foreground text-sm font-medium\">{item.total}</p>\n {item.quantity > 1 && (\n <p className=\"text-muted-foreground text-xs\">\n {item.price} x {item.quantity}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nfunction ItemsSection({ order }: { order: orders.PortalTenantOrder }) {\n return (\n <section className=\"bg-muted flex w-full flex-col items-center px-8 lg:col-span-4\">\n <div className=\"flex w-full max-w-lg flex-col\">\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n Items ({order.line_items.length})\n </h2>\n <hr className=\"border-border\" />\n </div>\n\n <div className=\"divide-border divide-y\">\n {order.line_items.map((item) => (\n <ItemRow key={item.id} item={item} />\n ))}\n </div>\n\n <div className=\"border-border mb-4 border-t pt-4\">\n <div className=\"mt-4 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">Total</p>\n <p className=\"text-foreground text-base font-bold\">\n {order.currency} {order.total}\n </p>\n </div>\n </div>\n\n {/* TODO: i18n */}\n {/* TODO: gate on reward_points_enabled when available on PortalTenantOrder */}\n {order.total_points_credited != null &&\n order.total_points_credited > 0 && (\n <div className=\"border-border mb-4 border-t pt-4\">\n <div className=\"flex items-baseline justify-between\">\n <div>\n <p className=\"text-foreground text-sm font-semibold\">\n points earned on this order!\n </p>\n {order.customer_points_balance != null && (\n <p className=\"text-muted-foreground text-xs\">\n {order.customer_points_balance.toLocaleString()} points\n total\n </p>\n )}\n </div>\n <div className=\"text-right\">\n <p className=\"text-foreground text-sm font-semibold\">\n +{order.total_points_credited.toLocaleString()}\n </p>\n <p className=\"text-muted-foreground text-xs\">points</p>\n </div>\n </div>\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction DetailsSection({ order }: { order: orders.PortalTenantOrder }) {\n return (\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Order Status */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Status:</span>\n <OrderStatusBadge status={order.status} />\n </div>\n </div>\n </div>\n\n {/* Order Info */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order Info\n </h3>\n <div className=\"divide-border flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">Order</div>\n <div className=\"text-foreground font-medium\">#{order.id}</div>\n </div>\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">Date</div>\n <div className=\"text-foreground font-medium\">\n {new Date(order.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })}\n </div>\n </div>\n </div>\n {order.customer_email && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Email</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_email}\n </div>\n </div>\n )}\n {order.customer_name && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Customer</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_name}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport function PortalOrderDetail({\n id,\n onNotFound,\n onError,\n}: PortalOrderDetailProps) {\n const { data, isLoading, error } = usePortalTenantOrder(id);\n const order = data?.order;\n\n useEffect(() => {\n if (!isLoading && error) {\n onError?.(error as Error);\n }\n }, [isLoading, error, onError]);\n\n useEffect(() => {\n if (!isLoading && !error && !order) {\n onNotFound?.();\n }\n }, [isLoading, error, order, onNotFound]);\n\n if (isLoading) {\n return <DetailSkeleton />;\n }\n\n if (!order) {\n return null;\n }\n\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <ItemsSection order={order} />\n <DetailsSection order={order} />\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { PortalOrderDetail } from \"../components/portal-order-detail\";\n\nexport interface PortalOrderDetailScreenProps {\n id: string | number;\n onNavigateToList: () => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport function PortalOrderDetailScreen({\n id,\n onNavigateToList,\n onNotFound,\n onError,\n}: PortalOrderDetailScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n Orders\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n Order #{id}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [id, onNavigateToList],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <PortalOrderDetail id={id} onNotFound={onNotFound} onError={onError} />\n </div>\n );\n}\n","import { PortalOrderDetailScreen as PortalOrderDetailScreenContent } from \"@fluid-app/orders-ui/screens/PortalOrderDetailScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface OrderDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function OrderDetailScreen({\n token,\n onToast,\n}: OrderDetailScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n\n return (\n <PortalOrderDetailScreenContent\n id={token}\n onNavigateToList={() => navigate(\"orders\")}\n onNotFound={() => {\n onToast(\"Order not found\", \"warning\");\n navigate(\"orders\");\n }}\n onError={(err) => {\n const message =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`Failed to load order: ${message}`, \"error\");\n }}\n />\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalOrdersApiProvider } from \"../orders/PortalOrdersApiProvider\";\nimport { OrdersListScreen } from \"./OrdersListScreen\";\nimport { OrderDetailScreen } from \"./OrderDetailScreen\";\n\ntype OrdersScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function OrdersScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: OrdersScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const effectiveToast = onToast ?? defaultToast;\n\n // Parse slug: \"orders\" → list, \"orders/{token}\" → detail\n const detailToken = currentSlug.split(\"/\")[1];\n const isDetailView = detailToken !== undefined;\n\n if (isDetailView) {\n return (\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrderDetailScreen token={detailToken} onToast={effectiveToast} />\n </PortalOrdersApiProvider>\n </div>\n );\n }\n\n return (\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrdersListScreen />\n </PortalOrdersApiProvider>\n </div>\n );\n}\n\nexport const ordersScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"OrdersScreen\",\n displayName: \"Orders Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
@@ -3,6 +3,6 @@ require("./src-CvtwdzKm.cjs");
3
3
  require("./ScreenHeaderContext-B06T9svT.cjs");
4
4
  require("./SearchSort-BgHSdG1l.cjs");
5
5
  require("./order-status-badge-DfsLUj9h.cjs");
6
- const require_OrdersScreen = require("./OrdersScreen-DBaIwXoT.cjs");
6
+ const require_OrdersScreen = require("./OrdersScreen-tEz4rZn_.cjs");
7
7
  exports.OrdersScreen = require_OrdersScreen.OrdersScreen;
8
8
  exports.ordersScreenPropertySchema = require_OrdersScreen.ordersScreenPropertySchema;
@@ -1,5 +1,5 @@
1
1
  require("./chunk-9hOWP6kD.cjs");
2
- const require_portal_tenant = require("./portal_tenant-5kK658sL.cjs");
2
+ const require_portal_tenant = require("./portal_tenant-CvP7rhIy.cjs");
3
3
  const require_PortalTenantClientProvider = require("./PortalTenantClientProvider-CVv-4rQ9.cjs");
4
4
  const require_src = require("./src-CvtwdzKm.cjs");
5
5
  const require_ScreenHeaderContext = require("./ScreenHeaderContext-B06T9svT.cjs");
@@ -516,4 +516,4 @@ Object.defineProperty(exports, "ordersScreenPropertySchema", {
516
516
  }
517
517
  });
518
518
 
519
- //# sourceMappingURL=OrdersScreen-DBaIwXoT.cjs.map
519
+ //# sourceMappingURL=OrdersScreen-tEz4rZn_.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"OrdersScreen-DBaIwXoT.cjs","names":["usePortalTenantClient","OrdersCoreProvider","OrdersListScreen","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage","OrdersList","useAppNavigation","OrdersListScreenContent","Skeleton","OrderStatusBadge","usePortalTenantOrder","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","useAppNavigation","PortalOrderDetailScreenContent","useAppNavigation"],"sources":["../src/adapters/orders-api-adapter.ts","../src/orders/PortalOrdersApiProvider.tsx","../../../orders/ui/src/screens/OrdersListScreen.tsx","../src/screens/OrdersListScreen.tsx","../../../orders/ui/src/components/portal-order-detail.tsx","../../../orders/ui/src/screens/PortalOrderDetailScreen.tsx","../src/screens/OrderDetailScreen.tsx","../src/screens/OrdersScreen.tsx"],"sourcesContent":["import type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport type { OrdersApi } from \"@fluid-app/orders-core\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Creates an OrdersApi adapter backed by the portal-tenant BFF.\n *\n * Provides two methods:\n * - fetchOrderById -> PortalTenantOrderResponse (for PortalOrderDetail screen)\n * - fetchCustomerOrders -> CustomerOrdersResponse with ListOrder[] (for shared OrdersList)\n *\n * The BFF uses a single Order schema for both endpoints, but consumers need\n * different shapes: the detail screen works with PortalTenantOrder (matches the\n * BFF's limited data), while the list screen needs the canonical ListOrder so\n * the shared OrdersList component works unchanged.\n */\n\ntype RawOrder = NonNullable<\n Awaited<ReturnType<typeof portalTenant.orders_show>>[\"order\"]\n>;\n\nfunction mapToPortalTenantOrder(raw: RawOrder): orders.PortalTenantOrder {\n return {\n id: raw.id ?? 0,\n token: raw.token ?? \"\",\n status: (raw.status ?? \"pending\") as orders.PortalTenantOrderStatus,\n total: raw.total ?? \"0\",\n currency: raw.currency ?? \"\",\n line_items: (raw.line_items ?? []).map((li) => ({\n id: li.id ?? 0,\n product_id: li.product_id ?? 0,\n product_name: li.product_name ?? \"\",\n quantity: li.quantity ?? 0,\n price: li.price ?? \"0\",\n total: li.total ?? \"0\",\n })),\n customer_name: raw.customer_name ?? null,\n customer_email: raw.customer_email ?? null,\n subscription_order: raw.subscription_order ?? false,\n subscription_token: raw.subscription_token ?? null,\n // These fields are returned by the BFF but not yet in the OpenAPI spec.\n total_points_credited:\n typeof (raw as Record<string, unknown>).total_points_credited === \"number\"\n ? ((raw as Record<string, unknown>).total_points_credited as number)\n : undefined,\n customer_points_balance:\n typeof (raw as Record<string, unknown>).customer_points_balance ===\n \"number\"\n ? ((raw as Record<string, unknown>).customer_points_balance as number)\n : undefined,\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n } satisfies orders.PortalTenantOrder;\n}\n\nfunction mapToListOrder(raw: RawOrder): orders.ListOrder {\n const firstLineItem = raw.line_items?.[0];\n return {\n id: raw.id ?? 0,\n external_id: null,\n order_number: \"\",\n email: raw.customer_email ?? null,\n first_name: raw.customer_name?.split(\" \")[0] ?? null,\n last_name: raw.customer_name?.split(\" \").slice(1).join(\" \") || null,\n amount: raw.total ?? \"0\",\n status: raw.status ?? \"pending\",\n order_status: raw.status ?? \"pending\",\n fulfillment_status: \"unfulfilled\",\n financial_status: \"pending\",\n currency_code: raw.currency ?? \"\",\n note: null,\n token: raw.token ?? \"\",\n warehouse_id: null,\n source: \"web\",\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n total_display_amount: `${raw.currency ?? \"\"} ${raw.total ?? \"0\"}`,\n total_cv: 0,\n total_qv: 0,\n currency_symbol: raw.currency ?? \"\",\n items_count: raw.line_items?.length ?? 0,\n quantity_count:\n raw.line_items?.reduce((sum, li) => sum + (li.quantity ?? 0), 0) ?? 0,\n order_on_behalf_of: false,\n sale_date: null,\n customer: null,\n first_item: firstLineItem\n ? { title: firstLineItem.product_name ?? \"\", image_url: \"\" }\n : null,\n // The BFF indicates subscription_order but doesn't expose the\n // subscription's lifecycle status. We set \"active\" because the order's\n // existence implies the subscription was active at purchase time. The\n // real status is shown on the subscription detail screen.\n subscription:\n raw.subscription_order && raw.subscription_token\n ? { subscription_token: raw.subscription_token, status: \"active\" }\n : raw.subscription_order\n ? { subscription_token: \"\", status: \"active\" }\n : null,\n };\n}\n\nexport function createPortalOrdersAdapter(\n client: FetchClient,\n): Required<Pick<OrdersApi, \"fetchOrderById\" | \"fetchCustomerOrders\">> {\n return {\n fetchOrderById: async (id: string | number) => {\n const response = await portalTenant.orders_show(client, id);\n return {\n order: mapToPortalTenantOrder(response.order ?? {}),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies orders.PortalTenantOrderResponse;\n },\n\n fetchCustomerOrders: async (params: orders.FetchOrdersParams) => {\n const response = await portalTenant.orders_list(client, {\n \"page[cursor]\": params.cursor,\n \"page[limit]\": params.limit,\n status: params.status,\n q: params.search,\n });\n return {\n orders: (response.orders ?? []).map(mapToListOrder),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n pagination: {\n cursor: response.meta?.pagination?.cursor ?? null,\n limit: response.meta?.pagination?.limit ?? 25,\n next_cursor: response.meta?.pagination?.next_cursor ?? null,\n prev_cursor: response.meta?.pagination?.prev_cursor ?? null,\n total_count: response.meta?.pagination?.total_count ?? 0,\n },\n },\n } satisfies orders.CustomerOrdersResponse;\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { OrdersCoreProvider } from \"@fluid-app/orders-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalOrdersAdapter } from \"../adapters/orders-api-adapter\";\n\nexport function PortalOrdersApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalOrdersAdapter(client), [client]);\n\n return <OrdersCoreProvider api={api}>{children}</OrdersCoreProvider>;\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { OrdersList } from \"../components/orders-list\";\n\nexport interface OrdersListScreenProps {\n customerId: number | undefined;\n onOrderClick: (order: orders.ListOrder) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n t: (key: string) => string;\n isLoadingCustomer?: boolean;\n}\n\nexport function OrdersListScreen({\n customerId,\n onOrderClick,\n onSubscriptionClick,\n t,\n isLoadingCustomer,\n}: OrdersListScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Orders</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n if (isLoadingCustomer) {\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"space-y-3\">\n <div className=\"bg-muted h-10 animate-pulse rounded\" />\n <div className=\"bg-muted h-64 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <OrdersList\n customerId={customerId}\n onOrderClick={onOrderClick}\n onSubscriptionClick={onSubscriptionClick}\n t={t}\n />\n </div>\n );\n}\n","import type { orders } from \"@fluid-app/orders-core\";\nimport { OrdersListScreen as OrdersListScreenContent } from \"@fluid-app/orders-ui/screens/OrdersListScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\nconst translations: Record<string, string> = {\n search_orders: \"Search orders...\",\n order_number: \"Order #\",\n date: \"Date\",\n status: \"Status\",\n product: \"Product\",\n no_orders_found: \"No orders found\",\n no_matching_orders: \"No matching orders\",\n no_image_available: \"No image available\",\n this_product_no_longer_exists: \"This product no longer exists\",\n subscription: \"Subscription\",\n view_subscription: \"View Subscription\",\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n};\n\n// The portal-tenant BFF scopes orders to the logged-in user server-side,\n// so customerId is not used by the adapter. We pass a sentinel value to\n// satisfy the enabled guard in useCustomerOrders.\nconst BFF_SCOPED_CUSTOMER_ID = 1;\n\nexport function OrdersListScreen(): React.JSX.Element {\n const { navigate } = useAppNavigation();\n\n const handleOrderClick = (order: orders.ListOrder) => {\n navigate(`orders/${order.token}`);\n };\n\n const handleSubscriptionClick = (subscriptionToken: string) => {\n navigate(`subscriptions/${subscriptionToken}`);\n };\n\n return (\n <OrdersListScreenContent\n customerId={BFF_SCOPED_CUSTOMER_ID}\n onOrderClick={handleOrderClick}\n onSubscriptionClick={handleSubscriptionClick}\n t={(key) => translations[key] ?? key}\n />\n );\n}\n","import { useEffect } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { usePortalTenantOrder } from \"@fluid-app/orders-core\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { OrderStatusBadge } from \"./order-status-badge\";\n\nexport interface PortalOrderDetailProps {\n id: string | number;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nfunction DetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <div className=\"bg-muted flex flex-col items-center px-8 lg:col-span-4\">\n <div className=\"w-full max-w-lg py-6\">\n <Skeleton className=\"mb-4 h-6 w-48\" />\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-4\">\n <Skeleton className=\"h-24 w-24 rounded\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n <Skeleton className=\"mb-4 h-10 w-full rounded\" />\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ItemRow({ item }: { item: orders.PortalTenantOrderLineItem }) {\n return (\n <div className=\"flex items-center space-x-4 py-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted text-muted-foreground flex h-24 w-24 items-center justify-center overflow-hidden rounded\">\n No image\n </div>\n {item.quantity > 1 && (\n <span className=\"bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\">\n {item.quantity}\n </span>\n )}\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col space-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={item.product_name}\n >\n {item.product_name}\n </p>\n <p className=\"text-foreground text-sm font-medium\">{item.total}</p>\n {item.quantity > 1 && (\n <p className=\"text-muted-foreground text-xs\">\n {item.price} x {item.quantity}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nfunction ItemsSection({ order }: { order: orders.PortalTenantOrder }) {\n return (\n <section className=\"bg-muted flex w-full flex-col items-center px-8 lg:col-span-4\">\n <div className=\"flex w-full max-w-lg flex-col\">\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n Items ({order.line_items.length})\n </h2>\n <hr className=\"border-border\" />\n </div>\n\n <div className=\"divide-border divide-y\">\n {order.line_items.map((item) => (\n <ItemRow key={item.id} item={item} />\n ))}\n </div>\n\n <div className=\"border-border mb-4 border-t pt-4\">\n <div className=\"mt-4 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">Total</p>\n <p className=\"text-foreground text-base font-bold\">\n {order.currency} {order.total}\n </p>\n </div>\n </div>\n\n {/* TODO: i18n */}\n {/* TODO: gate on reward_points_enabled when available on PortalTenantOrder */}\n {order.total_points_credited != null &&\n order.total_points_credited > 0 && (\n <div className=\"border-border mb-4 border-t pt-4\">\n <div className=\"flex items-baseline justify-between\">\n <div>\n <p className=\"text-foreground text-sm font-semibold\">\n points earned on this order!\n </p>\n {order.customer_points_balance != null && (\n <p className=\"text-muted-foreground text-xs\">\n {order.customer_points_balance.toLocaleString()} points\n total\n </p>\n )}\n </div>\n <div className=\"text-right\">\n <p className=\"text-foreground text-sm font-semibold\">\n +{order.total_points_credited.toLocaleString()}\n </p>\n <p className=\"text-muted-foreground text-xs\">points</p>\n </div>\n </div>\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction DetailsSection({ order }: { order: orders.PortalTenantOrder }) {\n return (\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Order Status */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Status:</span>\n <OrderStatusBadge status={order.status} />\n </div>\n </div>\n </div>\n\n {/* Order Info */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order Info\n </h3>\n <div className=\"divide-border flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">Order</div>\n <div className=\"text-foreground font-medium\">#{order.id}</div>\n </div>\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">Date</div>\n <div className=\"text-foreground font-medium\">\n {new Date(order.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })}\n </div>\n </div>\n </div>\n {order.customer_email && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Email</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_email}\n </div>\n </div>\n )}\n {order.customer_name && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Customer</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_name}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport function PortalOrderDetail({\n id,\n onNotFound,\n onError,\n}: PortalOrderDetailProps) {\n const { data, isLoading, error } = usePortalTenantOrder(id);\n const order = data?.order;\n\n useEffect(() => {\n if (!isLoading && error) {\n onError?.(error as Error);\n }\n }, [isLoading, error, onError]);\n\n useEffect(() => {\n if (!isLoading && !error && !order) {\n onNotFound?.();\n }\n }, [isLoading, error, order, onNotFound]);\n\n if (isLoading) {\n return <DetailSkeleton />;\n }\n\n if (!order) {\n return null;\n }\n\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <ItemsSection order={order} />\n <DetailsSection order={order} />\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { PortalOrderDetail } from \"../components/portal-order-detail\";\n\nexport interface PortalOrderDetailScreenProps {\n id: string | number;\n onNavigateToList: () => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport function PortalOrderDetailScreen({\n id,\n onNavigateToList,\n onNotFound,\n onError,\n}: PortalOrderDetailScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n Orders\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n Order #{id}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [id, onNavigateToList],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <PortalOrderDetail id={id} onNotFound={onNotFound} onError={onError} />\n </div>\n );\n}\n","import { PortalOrderDetailScreen as PortalOrderDetailScreenContent } from \"@fluid-app/orders-ui/screens/PortalOrderDetailScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface OrderDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function OrderDetailScreen({\n token,\n onToast,\n}: OrderDetailScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n\n return (\n <PortalOrderDetailScreenContent\n id={token}\n onNavigateToList={() => navigate(\"orders\")}\n onNotFound={() => {\n onToast(\"Order not found\", \"warning\");\n navigate(\"orders\");\n }}\n onError={(err) => {\n const message =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`Failed to load order: ${message}`, \"error\");\n }}\n />\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalOrdersApiProvider } from \"../orders/PortalOrdersApiProvider\";\nimport { OrdersListScreen } from \"./OrdersListScreen\";\nimport { OrderDetailScreen } from \"./OrderDetailScreen\";\n\ntype OrdersScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function OrdersScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: OrdersScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const effectiveToast = onToast ?? defaultToast;\n\n // Parse slug: \"orders\" → list, \"orders/{token}\" → detail\n const detailToken = currentSlug.split(\"/\")[1];\n const isDetailView = detailToken !== undefined;\n\n if (isDetailView) {\n return (\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrderDetailScreen token={detailToken} onToast={effectiveToast} />\n </PortalOrdersApiProvider>\n </div>\n );\n }\n\n return (\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrdersListScreen />\n </PortalOrdersApiProvider>\n </div>\n );\n}\n\nexport const ordersScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"OrdersScreen\",\n displayName: \"Orders Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
1
+ {"version":3,"file":"OrdersScreen-tEz4rZn_.cjs","names":["usePortalTenantClient","OrdersCoreProvider","OrdersListScreen","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage","OrdersList","useAppNavigation","OrdersListScreenContent","Skeleton","OrderStatusBadge","usePortalTenantOrder","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","useAppNavigation","PortalOrderDetailScreenContent","useAppNavigation"],"sources":["../src/adapters/orders-api-adapter.ts","../src/orders/PortalOrdersApiProvider.tsx","../../../orders/ui/src/screens/OrdersListScreen.tsx","../src/screens/OrdersListScreen.tsx","../../../orders/ui/src/components/portal-order-detail.tsx","../../../orders/ui/src/screens/PortalOrderDetailScreen.tsx","../src/screens/OrderDetailScreen.tsx","../src/screens/OrdersScreen.tsx"],"sourcesContent":["import type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport type { OrdersApi } from \"@fluid-app/orders-core\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Creates an OrdersApi adapter backed by the portal-tenant BFF.\n *\n * Provides two methods:\n * - fetchOrderById -> PortalTenantOrderResponse (for PortalOrderDetail screen)\n * - fetchCustomerOrders -> CustomerOrdersResponse with ListOrder[] (for shared OrdersList)\n *\n * The BFF uses a single Order schema for both endpoints, but consumers need\n * different shapes: the detail screen works with PortalTenantOrder (matches the\n * BFF's limited data), while the list screen needs the canonical ListOrder so\n * the shared OrdersList component works unchanged.\n */\n\ntype RawOrder = NonNullable<\n Awaited<ReturnType<typeof portalTenant.orders_show>>[\"order\"]\n>;\n\nfunction mapToPortalTenantOrder(raw: RawOrder): orders.PortalTenantOrder {\n return {\n id: raw.id ?? 0,\n token: raw.token ?? \"\",\n status: (raw.status ?? \"pending\") as orders.PortalTenantOrderStatus,\n total: raw.total ?? \"0\",\n currency: raw.currency ?? \"\",\n line_items: (raw.line_items ?? []).map((li) => ({\n id: li.id ?? 0,\n product_id: li.product_id ?? 0,\n product_name: li.product_name ?? \"\",\n quantity: li.quantity ?? 0,\n price: li.price ?? \"0\",\n total: li.total ?? \"0\",\n })),\n customer_name: raw.customer_name ?? null,\n customer_email: raw.customer_email ?? null,\n subscription_order: raw.subscription_order ?? false,\n subscription_token: raw.subscription_token ?? null,\n // These fields are returned by the BFF but not yet in the OpenAPI spec.\n total_points_credited:\n typeof (raw as Record<string, unknown>).total_points_credited === \"number\"\n ? ((raw as Record<string, unknown>).total_points_credited as number)\n : undefined,\n customer_points_balance:\n typeof (raw as Record<string, unknown>).customer_points_balance ===\n \"number\"\n ? ((raw as Record<string, unknown>).customer_points_balance as number)\n : undefined,\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n } satisfies orders.PortalTenantOrder;\n}\n\nfunction mapToListOrder(raw: RawOrder): orders.ListOrder {\n const firstLineItem = raw.line_items?.[0];\n return {\n id: raw.id ?? 0,\n external_id: null,\n order_number: \"\",\n email: raw.customer_email ?? null,\n first_name: raw.customer_name?.split(\" \")[0] ?? null,\n last_name: raw.customer_name?.split(\" \").slice(1).join(\" \") || null,\n amount: raw.total ?? \"0\",\n status: raw.status ?? \"pending\",\n order_status: raw.status ?? \"pending\",\n fulfillment_status: \"unfulfilled\",\n financial_status: \"pending\",\n currency_code: raw.currency ?? \"\",\n note: null,\n token: raw.token ?? \"\",\n warehouse_id: null,\n source: \"web\",\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n total_display_amount: `${raw.currency ?? \"\"} ${raw.total ?? \"0\"}`,\n total_cv: 0,\n total_qv: 0,\n currency_symbol: raw.currency ?? \"\",\n items_count: raw.line_items?.length ?? 0,\n quantity_count:\n raw.line_items?.reduce((sum, li) => sum + (li.quantity ?? 0), 0) ?? 0,\n order_on_behalf_of: false,\n sale_date: null,\n customer: null,\n first_item: firstLineItem\n ? { title: firstLineItem.product_name ?? \"\", image_url: \"\" }\n : null,\n // The BFF indicates subscription_order but doesn't expose the\n // subscription's lifecycle status. We set \"active\" because the order's\n // existence implies the subscription was active at purchase time. The\n // real status is shown on the subscription detail screen.\n subscription:\n raw.subscription_order && raw.subscription_token\n ? { subscription_token: raw.subscription_token, status: \"active\" }\n : raw.subscription_order\n ? { subscription_token: \"\", status: \"active\" }\n : null,\n };\n}\n\nexport function createPortalOrdersAdapter(\n client: FetchClient,\n): Required<Pick<OrdersApi, \"fetchOrderById\" | \"fetchCustomerOrders\">> {\n return {\n fetchOrderById: async (id: string | number) => {\n const response = await portalTenant.orders_show(client, id);\n return {\n order: mapToPortalTenantOrder(response.order ?? {}),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies orders.PortalTenantOrderResponse;\n },\n\n fetchCustomerOrders: async (params: orders.FetchOrdersParams) => {\n const response = await portalTenant.orders_list(client, {\n \"page[cursor]\": params.cursor,\n \"page[limit]\": params.limit,\n status: params.status,\n q: params.search,\n });\n return {\n orders: (response.orders ?? []).map(mapToListOrder),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n pagination: {\n cursor: response.meta?.pagination?.cursor ?? null,\n limit: response.meta?.pagination?.limit ?? 25,\n next_cursor: response.meta?.pagination?.next_cursor ?? null,\n prev_cursor: response.meta?.pagination?.prev_cursor ?? null,\n total_count: response.meta?.pagination?.total_count ?? 0,\n },\n },\n } satisfies orders.CustomerOrdersResponse;\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { OrdersCoreProvider } from \"@fluid-app/orders-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalOrdersAdapter } from \"../adapters/orders-api-adapter\";\n\nexport function PortalOrdersApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalOrdersAdapter(client), [client]);\n\n return <OrdersCoreProvider api={api}>{children}</OrdersCoreProvider>;\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { OrdersList } from \"../components/orders-list\";\n\nexport interface OrdersListScreenProps {\n customerId: number | undefined;\n onOrderClick: (order: orders.ListOrder) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n t: (key: string) => string;\n isLoadingCustomer?: boolean;\n}\n\nexport function OrdersListScreen({\n customerId,\n onOrderClick,\n onSubscriptionClick,\n t,\n isLoadingCustomer,\n}: OrdersListScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Orders</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n if (isLoadingCustomer) {\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"space-y-3\">\n <div className=\"bg-muted h-10 animate-pulse rounded\" />\n <div className=\"bg-muted h-64 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <OrdersList\n customerId={customerId}\n onOrderClick={onOrderClick}\n onSubscriptionClick={onSubscriptionClick}\n t={t}\n />\n </div>\n );\n}\n","import type { orders } from \"@fluid-app/orders-core\";\nimport { OrdersListScreen as OrdersListScreenContent } from \"@fluid-app/orders-ui/screens/OrdersListScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\nconst translations: Record<string, string> = {\n search_orders: \"Search orders...\",\n order_number: \"Order #\",\n date: \"Date\",\n status: \"Status\",\n product: \"Product\",\n no_orders_found: \"No orders found\",\n no_matching_orders: \"No matching orders\",\n no_image_available: \"No image available\",\n this_product_no_longer_exists: \"This product no longer exists\",\n subscription: \"Subscription\",\n view_subscription: \"View Subscription\",\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n};\n\n// The portal-tenant BFF scopes orders to the logged-in user server-side,\n// so customerId is not used by the adapter. We pass a sentinel value to\n// satisfy the enabled guard in useCustomerOrders.\nconst BFF_SCOPED_CUSTOMER_ID = 1;\n\nexport function OrdersListScreen(): React.JSX.Element {\n const { navigate } = useAppNavigation();\n\n const handleOrderClick = (order: orders.ListOrder) => {\n navigate(`orders/${order.token}`);\n };\n\n const handleSubscriptionClick = (subscriptionToken: string) => {\n navigate(`subscriptions/${subscriptionToken}`);\n };\n\n return (\n <OrdersListScreenContent\n customerId={BFF_SCOPED_CUSTOMER_ID}\n onOrderClick={handleOrderClick}\n onSubscriptionClick={handleSubscriptionClick}\n t={(key) => translations[key] ?? key}\n />\n );\n}\n","import { useEffect } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { usePortalTenantOrder } from \"@fluid-app/orders-core\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { OrderStatusBadge } from \"./order-status-badge\";\n\nexport interface PortalOrderDetailProps {\n id: string | number;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nfunction DetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <div className=\"bg-muted flex flex-col items-center px-8 lg:col-span-4\">\n <div className=\"w-full max-w-lg py-6\">\n <Skeleton className=\"mb-4 h-6 w-48\" />\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-4\">\n <Skeleton className=\"h-24 w-24 rounded\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n <Skeleton className=\"mb-4 h-10 w-full rounded\" />\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ItemRow({ item }: { item: orders.PortalTenantOrderLineItem }) {\n return (\n <div className=\"flex items-center space-x-4 py-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted text-muted-foreground flex h-24 w-24 items-center justify-center overflow-hidden rounded\">\n No image\n </div>\n {item.quantity > 1 && (\n <span className=\"bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\">\n {item.quantity}\n </span>\n )}\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col space-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={item.product_name}\n >\n {item.product_name}\n </p>\n <p className=\"text-foreground text-sm font-medium\">{item.total}</p>\n {item.quantity > 1 && (\n <p className=\"text-muted-foreground text-xs\">\n {item.price} x {item.quantity}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nfunction ItemsSection({ order }: { order: orders.PortalTenantOrder }) {\n return (\n <section className=\"bg-muted flex w-full flex-col items-center px-8 lg:col-span-4\">\n <div className=\"flex w-full max-w-lg flex-col\">\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n Items ({order.line_items.length})\n </h2>\n <hr className=\"border-border\" />\n </div>\n\n <div className=\"divide-border divide-y\">\n {order.line_items.map((item) => (\n <ItemRow key={item.id} item={item} />\n ))}\n </div>\n\n <div className=\"border-border mb-4 border-t pt-4\">\n <div className=\"mt-4 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">Total</p>\n <p className=\"text-foreground text-base font-bold\">\n {order.currency} {order.total}\n </p>\n </div>\n </div>\n\n {/* TODO: i18n */}\n {/* TODO: gate on reward_points_enabled when available on PortalTenantOrder */}\n {order.total_points_credited != null &&\n order.total_points_credited > 0 && (\n <div className=\"border-border mb-4 border-t pt-4\">\n <div className=\"flex items-baseline justify-between\">\n <div>\n <p className=\"text-foreground text-sm font-semibold\">\n points earned on this order!\n </p>\n {order.customer_points_balance != null && (\n <p className=\"text-muted-foreground text-xs\">\n {order.customer_points_balance.toLocaleString()} points\n total\n </p>\n )}\n </div>\n <div className=\"text-right\">\n <p className=\"text-foreground text-sm font-semibold\">\n +{order.total_points_credited.toLocaleString()}\n </p>\n <p className=\"text-muted-foreground text-xs\">points</p>\n </div>\n </div>\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction DetailsSection({ order }: { order: orders.PortalTenantOrder }) {\n return (\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Order Status */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Status:</span>\n <OrderStatusBadge status={order.status} />\n </div>\n </div>\n </div>\n\n {/* Order Info */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order Info\n </h3>\n <div className=\"divide-border flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">Order</div>\n <div className=\"text-foreground font-medium\">#{order.id}</div>\n </div>\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">Date</div>\n <div className=\"text-foreground font-medium\">\n {new Date(order.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })}\n </div>\n </div>\n </div>\n {order.customer_email && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Email</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_email}\n </div>\n </div>\n )}\n {order.customer_name && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Customer</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_name}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nexport function PortalOrderDetail({\n id,\n onNotFound,\n onError,\n}: PortalOrderDetailProps) {\n const { data, isLoading, error } = usePortalTenantOrder(id);\n const order = data?.order;\n\n useEffect(() => {\n if (!isLoading && error) {\n onError?.(error as Error);\n }\n }, [isLoading, error, onError]);\n\n useEffect(() => {\n if (!isLoading && !error && !order) {\n onNotFound?.();\n }\n }, [isLoading, error, order, onNotFound]);\n\n if (isLoading) {\n return <DetailSkeleton />;\n }\n\n if (!order) {\n return null;\n }\n\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <ItemsSection order={order} />\n <DetailsSection order={order} />\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { PortalOrderDetail } from \"../components/portal-order-detail\";\n\nexport interface PortalOrderDetailScreenProps {\n id: string | number;\n onNavigateToList: () => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport function PortalOrderDetailScreen({\n id,\n onNavigateToList,\n onNotFound,\n onError,\n}: PortalOrderDetailScreenProps) {\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n Orders\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n Order #{id}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [id, onNavigateToList],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <PortalOrderDetail id={id} onNotFound={onNotFound} onError={onError} />\n </div>\n );\n}\n","import { PortalOrderDetailScreen as PortalOrderDetailScreenContent } from \"@fluid-app/orders-ui/screens/PortalOrderDetailScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface OrderDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function OrderDetailScreen({\n token,\n onToast,\n}: OrderDetailScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n\n return (\n <PortalOrderDetailScreenContent\n id={token}\n onNavigateToList={() => navigate(\"orders\")}\n onNotFound={() => {\n onToast(\"Order not found\", \"warning\");\n navigate(\"orders\");\n }}\n onError={(err) => {\n const message =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`Failed to load order: ${message}`, \"error\");\n }}\n />\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalOrdersApiProvider } from \"../orders/PortalOrdersApiProvider\";\nimport { OrdersListScreen } from \"./OrdersListScreen\";\nimport { OrderDetailScreen } from \"./OrderDetailScreen\";\n\ntype OrdersScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function OrdersScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: OrdersScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const effectiveToast = onToast ?? defaultToast;\n\n // Parse slug: \"orders\" → list, \"orders/{token}\" → detail\n const detailToken = currentSlug.split(\"/\")[1];\n const isDetailView = detailToken !== undefined;\n\n if (isDetailView) {\n return (\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrderDetailScreen token={detailToken} onToast={effectiveToast} />\n </PortalOrdersApiProvider>\n </div>\n );\n }\n\n return (\n <div {...divProps}>\n <PortalOrdersApiProvider>\n <OrdersListScreen />\n </PortalOrdersApiProvider>\n </div>\n );\n}\n\nexport const ordersScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"OrdersScreen\",\n displayName: \"Orders Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require("./chunk-9hOWP6kD.cjs");
2
- const require_portal_tenant_content = require("./portal_tenant_content-DZ8AqoU_.cjs");
2
+ const require_portal_tenant_content = require("./portal_tenant_content-Bq8PD-Sz.cjs");
3
3
  const require_PortalTenantClientProvider = require("./PortalTenantClientProvider-CVv-4rQ9.cjs");
4
4
  const require_src = require("./src-CvtwdzKm.cjs");
5
5
  const require_ScreenHeaderContext = require("./ScreenHeaderContext-B06T9svT.cjs");
@@ -8,7 +8,7 @@ const require_es = require("./es-Dr47illR.cjs");
8
8
  const require_SearchSort = require("./SearchSort-BgHSdG1l.cjs");
9
9
  const require_dist$4 = require("./dist-DbiSKQz4.cjs");
10
10
  const require_dist$5 = require("./dist-DWs3-WOI.cjs");
11
- const require_PortalProductsApiProvider = require("./PortalProductsApiProvider-jbh8K-Yu.cjs");
11
+ const require_PortalProductsApiProvider = require("./PortalProductsApiProvider-Duj-EjQj.cjs");
12
12
  let react = require("react");
13
13
  react = require_chunk.__toESM(react);
14
14
  let _tanstack_react_query = require("@tanstack/react-query");
@@ -9282,17 +9282,16 @@ function mapPlaylist(raw) {
9282
9282
  };
9283
9283
  }
9284
9284
  function mapPlaylistItem(raw) {
9285
- const relateable = raw.relateable ?? {};
9286
9285
  return {
9287
9286
  id: raw.id ?? 0,
9288
- media_id: relateable.id ?? 0,
9289
- position: raw.order ?? null,
9290
- title: relateable.title,
9291
- image_url: relateable.image_url ?? null,
9292
- media_type: raw.relateable_type ?? void 0,
9293
- video_url: relateable.video_url ?? null,
9294
- duration: relateable.duration ?? null,
9295
- created_at: relateable.created_at ?? ""
9287
+ media_id: raw.media_id ?? 0,
9288
+ position: raw.position ?? null,
9289
+ title: raw.title,
9290
+ image_url: raw.image_url ?? null,
9291
+ media_type: raw.media_type,
9292
+ video_url: raw.video_url ?? null,
9293
+ duration: raw.duration ?? null,
9294
+ created_at: raw.created_at ?? ""
9296
9295
  };
9297
9296
  }
9298
9297
  function mapPlaylistsMeta(raw) {
@@ -9813,4 +9812,4 @@ Object.defineProperty(exports, "usePortalContentContext", {
9813
9812
  }
9814
9813
  });
9815
9814
 
9816
- //# sourceMappingURL=PortalContentApiProvider-BvreyuHL.cjs.map
9815
+ //# sourceMappingURL=PortalContentApiProvider-BBGpjTFn.cjs.map