@fluid-app/portal-sdk 0.1.280 → 0.1.281

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 (72) hide show
  1. package/dist/{ContactsScreen-D42uVkfI.mjs → ContactsScreen-CMETL0o1.mjs} +33 -36
  2. package/dist/ContactsScreen-CMETL0o1.mjs.map +1 -0
  3. package/dist/{ContactsScreen-CVUFwHD0.cjs → ContactsScreen-CNM9nqb1.cjs} +33 -36
  4. package/dist/ContactsScreen-CNM9nqb1.cjs.map +1 -0
  5. package/dist/{ContactsScreen-BWgTp9z6.cjs → ContactsScreen-CZLLBgUB.cjs} +2 -2
  6. package/dist/{MessagingScreen-ihaUzGp0.mjs → MessagingScreen-BvVhwvm8.mjs} +2 -2
  7. package/dist/{MessagingScreen-CE8MTQxn.cjs → MessagingScreen-C3yCIWo4.cjs} +41 -62
  8. package/dist/MessagingScreen-C3yCIWo4.cjs.map +1 -0
  9. package/dist/{MessagingScreen-r73abdKa.mjs → MessagingScreen-C7W5-K1N.mjs} +41 -62
  10. package/dist/{MessagingScreen-r73abdKa.mjs.map → MessagingScreen-C7W5-K1N.mjs.map} +1 -1
  11. package/dist/{MessagingScreen-DIbrm4HW.cjs → MessagingScreen-sc1u2IwX.cjs} +2 -2
  12. package/dist/{MySiteScreen-B1_Xx5-L.cjs → MySiteScreen-BiRsdk3F.cjs} +5 -10
  13. package/dist/MySiteScreen-BiRsdk3F.cjs.map +1 -0
  14. package/dist/{MySiteScreen-Dx8wYdv3.mjs → MySiteScreen-CfCr1_w0.mjs} +5 -10
  15. package/dist/{MySiteScreen-Dx8wYdv3.mjs.map → MySiteScreen-CfCr1_w0.mjs.map} +1 -1
  16. package/dist/{MySiteScreen-CFyr06DP.cjs → MySiteScreen-D2ivRa2e.cjs} +2 -2
  17. package/dist/{OrdersScreen-RNTW7SCI.mjs → OrdersScreen-BCFfxurP.mjs} +2 -2
  18. package/dist/{OrdersScreen-BQKy-1vC.cjs → OrdersScreen-CSkiK7j8.cjs} +13 -15
  19. package/dist/OrdersScreen-CSkiK7j8.cjs.map +1 -0
  20. package/dist/{OrdersScreen-C-32UkcG.cjs → OrdersScreen-DOCdTWOx.cjs} +2 -2
  21. package/dist/{OrdersScreen-9wp4AWDC.mjs → OrdersScreen-NzGaufXO.mjs} +13 -15
  22. package/dist/OrdersScreen-NzGaufXO.mjs.map +1 -0
  23. package/dist/{ProfileScreen-OZZ9Zcab.mjs → ProfileScreen-CkRFE_jb.mjs} +5 -6
  24. package/dist/{ProfileScreen-OZZ9Zcab.mjs.map → ProfileScreen-CkRFE_jb.mjs.map} +1 -1
  25. package/dist/{ProfileScreen-BdMZsorI.mjs → ProfileScreen-Cm4WZ54w.mjs} +2 -2
  26. package/dist/{ProfileScreen-BvIfbjnw.cjs → ProfileScreen-Dacb369p.cjs} +5 -6
  27. package/dist/ProfileScreen-Dacb369p.cjs.map +1 -0
  28. package/dist/{ProfileScreen-BrdjkmQd.cjs → ProfileScreen-zzk5SGP5.cjs} +2 -2
  29. package/dist/ScreenHeaderContext-CsfhnuJk.cjs +86 -0
  30. package/dist/ScreenHeaderContext-CsfhnuJk.cjs.map +1 -0
  31. package/dist/ScreenHeaderContext-Dn12BZyj.mjs +62 -0
  32. package/dist/ScreenHeaderContext-Dn12BZyj.mjs.map +1 -0
  33. package/dist/{ShareablesScreen-BP1Ed_Sv.cjs → ShareablesScreen-BwFmwYNG.cjs} +2 -2
  34. package/dist/{ShareablesScreen-DwxcReCu.cjs → ShareablesScreen-C6pCPvmx.cjs} +1101 -1144
  35. package/dist/ShareablesScreen-C6pCPvmx.cjs.map +1 -0
  36. package/dist/{ShareablesScreen-tq0taJJe.mjs → ShareablesScreen-kr2RL4FN.mjs} +2 -2
  37. package/dist/{ShareablesScreen-C5ZRdX-y.mjs → ShareablesScreen-uMQYLpTv.mjs} +1101 -1144
  38. package/dist/ShareablesScreen-uMQYLpTv.mjs.map +1 -0
  39. package/dist/{ShopScreen-B-OBQ2S7.mjs → ShopScreen-BqDNPM7i.mjs} +36 -47
  40. package/dist/{ShopScreen-B-OBQ2S7.mjs.map → ShopScreen-BqDNPM7i.mjs.map} +1 -1
  41. package/dist/{ShopScreen-Cn94XVxx.mjs → ShopScreen-CpCBdW0Z.mjs} +2 -2
  42. package/dist/{ShopScreen-zdvCwxBT.cjs → ShopScreen-DRnPRtV7.cjs} +36 -47
  43. package/dist/ShopScreen-DRnPRtV7.cjs.map +1 -0
  44. package/dist/{ShopScreen-CQDkeQrR.cjs → ShopScreen-SN91S9Ao.cjs} +2 -2
  45. package/dist/{SubscriptionsScreen-CRHHXzrB.cjs → SubscriptionsScreen-D4C8a7-e.cjs} +13 -15
  46. package/dist/SubscriptionsScreen-D4C8a7-e.cjs.map +1 -0
  47. package/dist/{SubscriptionsScreen-Dx7Evic_.mjs → SubscriptionsScreen-DCeby11T.mjs} +13 -15
  48. package/dist/SubscriptionsScreen-DCeby11T.mjs.map +1 -0
  49. package/dist/{SubscriptionsScreen-DH10SUZK.cjs → SubscriptionsScreen-DzwK-Sck.cjs} +2 -2
  50. package/dist/index.cjs +35 -34
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.d.cts.map +1 -1
  53. package/dist/index.d.mts.map +1 -1
  54. package/dist/index.mjs +35 -34
  55. package/dist/index.mjs.map +1 -1
  56. package/package.json +18 -18
  57. package/dist/ContactsScreen-CVUFwHD0.cjs.map +0 -1
  58. package/dist/ContactsScreen-D42uVkfI.mjs.map +0 -1
  59. package/dist/MessagingScreen-CE8MTQxn.cjs.map +0 -1
  60. package/dist/MySiteScreen-B1_Xx5-L.cjs.map +0 -1
  61. package/dist/OrdersScreen-9wp4AWDC.mjs.map +0 -1
  62. package/dist/OrdersScreen-BQKy-1vC.cjs.map +0 -1
  63. package/dist/ProfileScreen-BvIfbjnw.cjs.map +0 -1
  64. package/dist/ScreenHeaderContext-BDjNSUfr.mjs +0 -85
  65. package/dist/ScreenHeaderContext-BDjNSUfr.mjs.map +0 -1
  66. package/dist/ScreenHeaderContext-PbjwAMeB.cjs +0 -109
  67. package/dist/ScreenHeaderContext-PbjwAMeB.cjs.map +0 -1
  68. package/dist/ShareablesScreen-C5ZRdX-y.mjs.map +0 -1
  69. package/dist/ShareablesScreen-DwxcReCu.cjs.map +0 -1
  70. package/dist/ShopScreen-zdvCwxBT.cjs.map +0 -1
  71. package/dist/SubscriptionsScreen-CRHHXzrB.cjs.map +0 -1
  72. package/dist/SubscriptionsScreen-Dx7Evic_.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"OrdersScreen-BQKy-1vC.cjs","names":["usePortalTenantClient","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage","Search","Input","ImageOff","Repeat","AlertCircle","useAppNavigation","cn","Skeleton","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","useAppNavigation","useFluidContext","PortalOrderDetailScreenContent","useAppNavigation"],"sources":["../../../orders/core/src/orders-api-context.ts","../../../orders/core/src/provider.tsx","../../../orders/core/src/query-keys.ts","../../../orders/core/src/hooks/use-infinite-customer-orders.ts","../../../orders/core/src/hooks/use-portal-tenant-order.ts","../../../orders/core/src/utils/format-order-total.ts","../../../orders/core/src/utils/build-static-map-url.ts","../src/adapters/orders-api-adapter.ts","../src/orders/PortalOrdersApiProvider.tsx","../src/screens/orders/portal-orders-list-helpers.ts","../src/screens/orders/PortalOrdersList.tsx","../src/screens/OrdersListScreen.tsx","../../../orders/ui/src/components/status-badge.tsx","../../../orders/ui/src/lib/format.ts","../../../orders/ui/src/components/order-status-badge.tsx","../../../orders/ui/src/components/static-map.tsx","../../../orders/ui/src/components/portal-order-detail.tsx","../../../orders/ui/src/screens/PortalOrderDetailScreen.tsx","../src/screens/OrderDetailScreen.tsx","../src/screens/OrdersScreen.tsx"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { OrdersApi } from \"./orders-api\";\n\nconst OrdersApiContext = createContext<OrdersApi | null>(null);\n\nexport const OrdersApiProvider = OrdersApiContext.Provider;\n\nexport function useOrdersApi(): OrdersApi {\n const api = useContext(OrdersApiContext);\n if (!api) {\n throw new Error(\"useOrdersApi must be used within an OrdersCoreProvider\");\n }\n return api;\n}\n","import type { JSX, ReactNode } from \"react\";\nimport type { OrdersApi } from \"./orders-api\";\nimport { OrdersApiProvider } from \"./orders-api-context\";\n\nexport interface OrdersCoreProviderProps {\n api: OrdersApi;\n children: ReactNode;\n}\n\nexport function OrdersCoreProvider({\n api,\n children,\n}: OrdersCoreProviderProps): JSX.Element {\n return <OrdersApiProvider value={api}>{children}</OrdersApiProvider>;\n}\n","import type { orders } from \"./types\";\n\nexport const ordersKeys = {\n all: [\"orders\"] as const,\n list: (params?: orders.FetchOrdersParams) =>\n [...ordersKeys.all, \"list\", params] as const,\n detail: (orderToken: string) =>\n [...ordersKeys.all, \"detail\", orderToken] as const,\n} as const;\n\nexport const portalTenantOrdersKeys = {\n all: [\"portalTenantOrders\"] as const,\n list: (params?: orders.PortalTenantFetchOrdersParams) =>\n [...portalTenantOrdersKeys.all, \"list\", params] as const,\n detail: (id: string | number) =>\n [...portalTenantOrdersKeys.all, \"detail\", id] as const,\n} as const;\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { orders } from \"../types\";\nimport { ordersKeys } from \"../query-keys\";\nimport { useOrdersApi } from \"../orders-api-context\";\n\nexport function useInfiniteCustomerOrders(\n params: Omit<orders.FetchOrdersParams, \"cursor\">,\n options?: { enabled?: boolean },\n) {\n const api = useOrdersApi();\n return useInfiniteQuery({\n queryKey: [...ordersKeys.all, \"infinite-list\", params],\n queryFn: ({ pageParam }) => {\n if (!api.fetchCustomerOrders) {\n throw new Error(\n \"fetchCustomerOrders not implemented on this OrdersApi\",\n );\n }\n return api.fetchCustomerOrders({ ...params, cursor: pageParam });\n },\n getNextPageParam: (lastPage) =>\n lastPage.meta?.pagination?.next_cursor ?? undefined,\n initialPageParam: undefined as string | undefined,\n enabled: options?.enabled ?? true,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { portalTenantOrdersKeys } from \"../query-keys\";\nimport { useOrdersApi } from \"../orders-api-context\";\n\nexport function usePortalTenantOrder(\n id: string | number,\n options?: { enabled?: boolean },\n) {\n const api = useOrdersApi();\n return useQuery({\n queryKey: portalTenantOrdersKeys.detail(id),\n queryFn: () => {\n if (!api.fetchOrderById) {\n throw new Error(\"fetchOrderById not implemented on this OrdersApi\");\n }\n return api.fetchOrderById(id);\n },\n enabled: (options?.enabled ?? true) && !!id,\n });\n}\n","import type { orders } from \"../types\";\n\nexport function formatOrderTotal(order: orders.ListOrder): string {\n if (order.order_total_after_points_redemption != null) {\n return `${order.currency_symbol || \"$\"}${Number(\n order.order_total_after_points_redemption,\n ).toFixed(2)}`;\n }\n return (\n order.total_display_amount ||\n `${order.currency_symbol || \"$\"}${Number(order.amount).toFixed(2)}`\n );\n}\n","export interface StaticMapAddress {\n address1: string | null;\n city: string | null;\n state: string | null;\n postal_code: string | null;\n}\n\nexport interface StaticMapOptions {\n width?: number;\n height?: number;\n zoom?: number;\n markerColor?: string;\n}\n\nexport function buildStaticMapUrl(\n apiKey: string,\n address: StaticMapAddress,\n options?: StaticMapOptions,\n): string | null {\n if (\n !address.address1 ||\n !address.city ||\n !address.state ||\n !address.postal_code\n ) {\n return null;\n }\n\n const formatted = `${address.address1}, ${address.city}, ${address.state} ${address.postal_code.slice(0, 5)}`;\n const encoded = encodeURIComponent(formatted);\n const width = options?.width ?? 600;\n const height = options?.height ?? 300;\n const zoom = options?.zoom ?? 15;\n const markerColor = encodeURIComponent(options?.markerColor ?? \"red\");\n\n return `https://maps.googleapis.com/maps/api/staticmap?center=${encoded}&zoom=${zoom}&size=${width}x${height}&maptype=roadmap&markers=color:${markerColor}%7C${encoded}&key=${apiKey}`;\n}\n","import type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport type { OrdersApi } from \"@fluid-app/orders-core\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Creates an OrdersApi adapter backed by the portal-tenant BFF.\n *\n * Provides two methods:\n * - fetchOrderById -> PortalTenantOrderResponse (for PortalOrderDetail screen)\n * - fetchCustomerOrders -> CustomerOrdersResponse with ListOrder[] (for shared OrdersList)\n *\n * The BFF uses a single Order schema for both endpoints, but consumers need\n * different shapes: the detail screen works with PortalTenantOrder (matches the\n * BFF's limited data), while the list screen needs the canonical ListOrder so\n * the shared OrdersList component works unchanged.\n */\n\ntype RawOrder = NonNullable<\n Awaited<ReturnType<typeof portalTenant.orders_show>>[\"order\"]\n>;\n\ntype RawAddress = RawOrder[\"address\"];\ntype RawPaymentMethod = RawOrder[\"payment_method\"];\n\n/**\n * Requires a BFF money field to be present. The BFF contract guarantees\n * subtotal/discount/shipping/tax on every Order, so a missing value signals\n * a broken contract. Mirrors the fail-loud pattern in subscriptions-api-adapter\n * (see the `BFF returned a successful response but subscription data was\n * missing` throw) and avoids silently rendering $0.00 in the UI, which a\n * customer cannot distinguish from a legitimately free line.\n */\nfunction requireMoneyField(\n value: string | null | undefined,\n field: string,\n): string {\n if (value == null) {\n throw new Error(\n `BFF returned an order without required money field \"${field}\"`,\n );\n }\n return value;\n}\n\nfunction mapAddress(raw: RawAddress): orders.PortalTenantAddress | null {\n if (!raw) return null;\n return {\n id: raw.id ?? 0,\n name: raw.name ?? null,\n address1: raw.address1 ?? null,\n address2: raw.address2 ?? null,\n city: raw.city ?? null,\n state: raw.state ?? null,\n postal_code: raw.postal_code ?? null,\n country_code: raw.country_code ?? null,\n } satisfies orders.PortalTenantAddress;\n}\n\nfunction mapPaymentMethod(\n raw: RawPaymentMethod,\n): orders.PortalTenantPaymentMethod | null {\n if (!raw) return null;\n return {\n id: raw.id ?? 0,\n source: raw.source ?? \"\",\n payment_type: raw.payment_type ?? \"\",\n card_type: raw.card_type ?? null,\n last4: raw.last4 ?? null,\n } satisfies orders.PortalTenantPaymentMethod;\n}\n\nfunction mapToPortalTenantOrder(raw: RawOrder): orders.PortalTenantOrder {\n const subtotal = requireMoneyField(raw.subtotal, \"subtotal\");\n const discount = requireMoneyField(raw.discount, \"discount\");\n const shipping = requireMoneyField(raw.shipping, \"shipping\");\n const tax = requireMoneyField(raw.tax, \"tax\");\n const total = requireMoneyField(raw.total, \"total\");\n return {\n id: raw.id ?? 0,\n token: raw.token ?? \"\",\n status: (raw.status ?? \"pending\") as orders.PortalTenantOrderStatus,\n subtotal,\n subtotal_in_currency: raw.subtotal_in_currency ?? subtotal,\n discount,\n discount_in_currency: raw.discount_in_currency ?? discount,\n shipping,\n shipping_in_currency: raw.shipping_in_currency ?? shipping,\n tax,\n tax_in_currency: raw.tax_in_currency ?? tax,\n total,\n total_in_currency: raw.total_in_currency ?? total,\n currency: raw.currency ?? \"\",\n line_items: (raw.line_items ?? []).map((li) => {\n const liPrice = li.price ?? \"0\";\n const liTotal = li.total ?? \"0\";\n return {\n id: li.id ?? 0,\n product_id: li.product_id ?? 0,\n product_name: li.product_name ?? \"\",\n variant_id: li.variant_id ?? null,\n variant_name: li.variant_name ?? null,\n sku: li.sku ?? null,\n image_url: li.image_url ?? null,\n quantity: li.quantity ?? 0,\n price: liPrice,\n price_in_currency: li.price_in_currency ?? liPrice,\n total: liTotal,\n total_in_currency: li.total_in_currency ?? liTotal,\n source_subscription: li.source_subscription?.subscription_token\n ? { subscription_token: li.source_subscription.subscription_token }\n : null,\n };\n }),\n customer_name: raw.customer_name ?? null,\n customer_email: raw.customer_email ?? null,\n address: mapAddress(raw.address),\n payment_method: mapPaymentMethod(raw.payment_method),\n subscription_order: raw.subscription_order ?? false,\n subscription_token: raw.subscription_token ?? null,\n // These fields are returned by the BFF but not yet in the OpenAPI spec.\n total_points_credited:\n typeof (raw as Record<string, unknown>).total_points_credited === \"number\"\n ? ((raw as Record<string, unknown>).total_points_credited as number)\n : undefined,\n customer_points_balance:\n typeof (raw as Record<string, unknown>).customer_points_balance ===\n \"number\"\n ? ((raw as Record<string, unknown>).customer_points_balance as number)\n : undefined,\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n } satisfies orders.PortalTenantOrder;\n}\n\nfunction mapToListOrder(raw: RawOrder): orders.ListOrder {\n const firstLineItem = raw.line_items?.[0];\n return {\n id: raw.id ?? 0,\n external_id: null,\n order_number: \"\",\n email: raw.customer_email ?? null,\n first_name: raw.customer_name?.split(\" \")[0] ?? null,\n last_name: raw.customer_name?.split(\" \").slice(1).join(\" \") || null,\n amount: raw.total ?? \"0\",\n status: raw.status ?? \"pending\",\n order_status: raw.status ?? \"pending\",\n fulfillment_status: \"unfulfilled\",\n financial_status: \"pending\",\n currency_code: raw.currency ?? \"\",\n note: null,\n token: raw.token ?? \"\",\n warehouse_id: null,\n source: \"web\",\n created_at: raw.created_at ?? \"\",\n updated_at: raw.updated_at ?? \"\",\n total_display_amount: raw.total_in_currency ?? raw.total ?? \"0\",\n total_cv: 0,\n total_qv: 0,\n // BFF doesn't expose a currency symbol; leave empty so `formatOrderTotal`\n // falls back to \"$\" rather than rendering the ISO code (e.g. \"USD50.00\").\n currency_symbol: \"\",\n items_count: raw.line_items?.length ?? 0,\n quantity_count:\n raw.line_items?.reduce((sum, li) => sum + (li.quantity ?? 0), 0) ?? 0,\n order_on_behalf_of: false,\n sale_date: null,\n customer: null,\n first_item: firstLineItem\n ? {\n title: firstLineItem.product_name ?? \"\",\n image_url: firstLineItem.image_url ?? \"\",\n }\n : null,\n // Up to 3 product image URLs from the order's line items, in line-item\n // order, used for list-row photo stacks. Skips items without an image.\n thumbnail_image_urls:\n raw.line_items\n ?.map((li) => li.image_url)\n .filter((u): u is string => typeof u === \"string\" && u.length > 0)\n .slice(0, 3) ?? [],\n // The BFF indicates subscription_order but doesn't expose the\n // subscription's lifecycle status. We set \"active\" because the order's\n // existence implies the subscription was active at purchase time. The\n // real status is shown on the subscription detail screen.\n subscription:\n raw.subscription_order && raw.subscription_token\n ? { subscription_token: raw.subscription_token, status: \"active\" }\n : raw.subscription_order\n ? { subscription_token: \"\", status: \"active\" }\n : null,\n };\n}\n\nexport function createPortalOrdersAdapter(\n client: FetchClient,\n): Required<Pick<OrdersApi, \"fetchOrderById\" | \"fetchCustomerOrders\">> {\n return {\n fetchOrderById: async (id: string | number) => {\n const response = await portalTenant.orders_show(client, id);\n return {\n order: mapToPortalTenantOrder(response.order ?? {}),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies orders.PortalTenantOrderResponse;\n },\n\n fetchCustomerOrders: async (params: orders.FetchOrdersParams) => {\n const response = await portalTenant.orders_list(client, {\n \"page[cursor]\": params.cursor,\n \"page[limit]\": params.limit,\n status: params.status,\n q: params.search,\n });\n return {\n orders: (response.orders ?? []).map(mapToListOrder),\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n pagination: {\n cursor: response.meta?.pagination?.cursor ?? null,\n limit: response.meta?.pagination?.limit ?? 25,\n next_cursor: response.meta?.pagination?.next_cursor ?? null,\n prev_cursor: response.meta?.pagination?.prev_cursor ?? null,\n },\n },\n } satisfies orders.CustomerOrdersResponse;\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { OrdersCoreProvider } from \"@fluid-app/orders-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalOrdersAdapter } from \"../adapters/orders-api-adapter\";\n\nexport function PortalOrdersApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalOrdersAdapter(client), [client]);\n\n return <OrdersCoreProvider api={api}>{children}</OrdersCoreProvider>;\n}\n","import type { orders } from \"@fluid-app/orders-core\";\n\nexport type T = (key: string) => string;\n\nexport type FilterKey = \"all\" | \"delivered\" | \"preparing\" | \"subscription\";\n\nexport type StatusKind =\n | \"delivered\"\n | \"preparing\"\n | \"shipped\"\n | \"cancelled\"\n | \"pending\";\n\nexport interface MappedStatus {\n kind: StatusKind;\n label: string;\n}\n\nconst replaceN = (s: string, n: number) => s.replace(\"{n}\", String(n));\n\n// Aliases fold to the same `kind` (e.g. completed/fulfilled → delivered).\n// `labelKey` is omitted for cancelled-family statuses so the raw user-input\n// status (Cancelled / Returned / Refunded) is preserved as the label —\n// these aren't part of the translation dictionary.\nconst STATUS_LOOKUP: Record<string, { kind: StatusKind; labelKey?: string }> = {\n delivered: { kind: \"delivered\", labelKey: \"orders_status_delivered\" },\n completed: { kind: \"delivered\", labelKey: \"orders_status_delivered\" },\n fulfilled: { kind: \"delivered\", labelKey: \"orders_status_delivered\" },\n shipped: { kind: \"shipped\", labelKey: \"orders_status_shipped\" },\n cancelled: { kind: \"cancelled\" },\n returned: { kind: \"cancelled\" },\n refunded: { kind: \"cancelled\" },\n preparing: { kind: \"preparing\", labelKey: \"orders_status_preparing\" },\n pending: { kind: \"pending\", labelKey: \"orders_status_processing\" },\n unfulfilled: { kind: \"pending\", labelKey: \"orders_status_processing\" },\n processing: { kind: \"pending\", labelKey: \"orders_status_processing\" },\n};\n\n/**\n * Map a raw `order_status` string from the BFF onto our internal status\n * vocabulary (`StatusKind`). Aliases are folded together (`completed` →\n * `delivered`, `unfulfilled` → `pending`, etc.). Unknown statuses pass\n * through with `kind: \"pending\"` and the raw label capitalized — never\n * synthesize a colored pill that pretends to be real status data.\n */\nexport function mapStatus(orderStatus: string, t: T): MappedStatus {\n const entry = STATUS_LOOKUP[(orderStatus || \"\").toLowerCase()];\n const rawLabel = orderStatus\n ? orderStatus.charAt(0).toUpperCase() + orderStatus.slice(1)\n : \"—\";\n if (!entry) return { kind: \"pending\", label: rawLabel };\n return {\n kind: entry.kind,\n label: entry.labelKey ? t(entry.labelKey) : rawLabel,\n };\n}\n\nexport const STATUS_STYLES: Record<\n StatusKind,\n { bg: string; text: string; dot: string }\n> = {\n delivered: {\n bg: \"bg-emerald-50 dark:bg-emerald-950/40\",\n text: \"text-emerald-700 dark:text-emerald-400\",\n dot: \"bg-emerald-500\",\n },\n shipped: {\n bg: \"bg-sky-50 dark:bg-sky-950/40\",\n text: \"text-sky-700 dark:text-sky-400\",\n dot: \"bg-sky-500\",\n },\n preparing: {\n bg: \"bg-amber-50 dark:bg-amber-950/40\",\n text: \"text-amber-700 dark:text-amber-400\",\n dot: \"bg-amber-500\",\n },\n pending: {\n bg: \"bg-profile-icon-bg\",\n text: \"text-profile-text-muted\",\n dot: \"bg-profile-text-muted\",\n },\n cancelled: {\n bg: \"bg-profile-danger-bg\",\n text: \"text-profile-danger-icon\",\n dot: \"bg-profile-danger-icon\",\n },\n};\n\nexport function filterPredicate(\n filter: FilterKey,\n order: orders.ListOrder,\n): boolean {\n if (filter === \"all\") return true;\n if (filter === \"subscription\") return order.subscription != null;\n // Use a no-op `t` here — we only need the kind for filter classification.\n const status = mapStatus(order.order_status, identity).kind;\n if (filter === \"delivered\")\n return status === \"delivered\" || status === \"shipped\";\n if (filter === \"preparing\")\n return status === \"preparing\" || status === \"pending\";\n return true;\n}\n\nconst identity: T = (k) => k;\n\nexport function countByFilter(\n list: orders.ListOrder[],\n): Record<FilterKey, number> {\n return {\n all: list.length,\n delivered: list.filter((o) => filterPredicate(\"delivered\", o)).length,\n preparing: list.filter((o) => filterPredicate(\"preparing\", o)).length,\n subscription: list.filter((o) => filterPredicate(\"subscription\", o)).length,\n };\n}\n\nexport interface OrderGroup {\n label: string;\n orders: orders.ListOrder[];\n}\n\n/**\n * Group orders into date buckets (\"This week\", \"This month\", month name, or\n * \"{Month} {year}\" for anything older than the current year). Insertion\n * order is preserved within and between buckets so newest-first ordering\n * from the BFF carries through.\n *\n * `t` resolves the structural bucket labels (\"This week\" / \"This month\").\n * Older buckets use `toLocaleDateString` which is locale-aware on its own.\n * `now` is injectable for tests; defaults to the current wall-clock time.\n */\nexport function groupOrdersByDate(\n list: orders.ListOrder[],\n t: T,\n now: Date = new Date(),\n): OrderGroup[] {\n if (list.length === 0) return [];\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const sevenDaysAgo = new Date(startOfToday);\n sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);\n const startOfMonth = new Date(now.getFullYear(), now.getMonth(), 1);\n const startOfYear = new Date(now.getFullYear(), 0, 1);\n\n const buckets = new Map<string, orders.ListOrder[]>();\n const order: string[] = [];\n\n for (const o of list) {\n const created = new Date(o.created_at);\n let label: string;\n if (created >= sevenDaysAgo) {\n label = t(\"orders_group_this_week\");\n } else if (created >= startOfMonth) {\n label = t(\"orders_group_this_month\");\n } else if (created >= startOfYear) {\n label = created.toLocaleDateString(undefined, {\n month: \"long\",\n });\n } else {\n label = created.toLocaleDateString(undefined, {\n month: \"long\",\n year: \"numeric\",\n });\n }\n let bucket = buckets.get(label);\n if (!bucket) {\n bucket = [];\n buckets.set(label, bucket);\n order.push(label);\n }\n bucket.push(o);\n }\n\n return order.map((label) => ({\n label,\n orders: buckets.get(label) ?? [],\n }));\n}\n\n/**\n * Render a friendly relative-time label for an order's created_at.\n * `t` resolves the relative-time templates; `{n}` placeholders are\n * substituted with the day/week count. Absolute dates use\n * `toLocaleDateString` which is locale-aware on its own.\n * `now` is injectable for tests.\n */\nexport function formatFriendlyDate(\n iso: string,\n t: T,\n now: Date = new Date(),\n): string {\n try {\n const d = new Date(iso);\n const startOfToday = new Date(\n now.getFullYear(),\n now.getMonth(),\n now.getDate(),\n );\n const startOfDate = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n const diffDays = Math.round(\n (startOfToday.getTime() - startOfDate.getTime()) / (1000 * 60 * 60 * 24),\n );\n\n if (diffDays === 0) return t(\"orders_today\");\n if (diffDays === 1) return t(\"orders_yesterday\");\n if (diffDays < 7) return replaceN(t(\"orders_n_days_ago\"), diffDays);\n if (diffDays < 14) return t(\"orders_last_week\");\n if (diffDays < 30)\n return replaceN(t(\"orders_n_weeks_ago\"), Math.round(diffDays / 7));\n if (d.getFullYear() === now.getFullYear()) {\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n });\n }\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return \"\";\n }\n}\n\n/**\n * Compute the per-image transform for the photo-stack fan in `OrderRow`.\n * Index 0 is the front (centered, no rotation); index 1 peeks right;\n * index 2 peeks left.\n */\nexport function fanStyle(\n i: number,\n count: number,\n): { left: string; transform: string; zIndex: number } {\n if (i === 0) {\n return {\n left: \"50%\",\n transform: \"translateX(-50%)\",\n zIndex: 30,\n };\n }\n if (i === 1) {\n return {\n left: \"50%\",\n transform:\n count === 2\n ? \"translateX(-25%) rotate(7deg)\"\n : \"translateX(-20%) rotate(7deg)\",\n zIndex: 20,\n };\n }\n return {\n left: \"50%\",\n transform: \"translateX(-80%) rotate(-7deg)\",\n zIndex: 10,\n };\n}\n","import { type JSX, useMemo, useState } from \"react\";\nimport {\n type orders,\n useInfiniteCustomerOrders,\n formatOrderTotal,\n} from \"@fluid-app/orders-core\";\nimport { Search, ImageOff, Repeat, AlertCircle } from \"lucide-react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n Input,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport {\n type FilterKey,\n type MappedStatus,\n type T,\n STATUS_STYLES,\n countByFilter,\n fanStyle,\n filterPredicate,\n formatFriendlyDate,\n groupOrdersByDate,\n mapStatus,\n} from \"./portal-orders-list-helpers\";\n\nexport type { FilterKey } from \"./portal-orders-list-helpers\";\n\nconst identityT: T = (key) => key;\n\ninterface PortalOrdersListProps {\n customerId: number | undefined;\n onOrderClick: (order: orders.ListOrder) => void;\n /**\n * Translation function. Falls back to returning the key verbatim when\n * absent so the component renders something usable in storybook /\n * tenant-less contexts; production callers should always supply `t`.\n */\n t?: T;\n}\n\nexport function PortalOrdersList({\n customerId,\n onOrderClick,\n t = identityT,\n}: PortalOrdersListProps): JSX.Element {\n useScreenHeaderBreadcrumbs(\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"orders_title\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>,\n );\n\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [filter, setFilter] = useState<FilterKey>(\"all\");\n const {\n data,\n isLoading,\n isError,\n refetch,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n } = useInfiniteCustomerOrders(\n {\n customerId,\n limit: 10,\n search: searchTerm || undefined,\n sort: \"-created_at\",\n },\n { enabled: !!customerId },\n );\n\n const list = useMemo(\n () => data?.pages.flatMap((p) => p.orders) ?? [],\n [data],\n );\n const counts = useMemo(() => countByFilter(list), [list]);\n const filteredList = useMemo(\n () => list.filter((o) => filterPredicate(filter, o)),\n [list, filter],\n );\n const groups = useMemo(\n () => groupOrdersByDate(filteredList, t),\n [filteredList, t],\n );\n\n return (\n <div className=\"relative\">\n <div className=\"max-w-profile-container relative mx-auto px-5 pt-8 pb-20 md:px-8\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-profile-hero tracking-profile-hero text-profile-text md:text-profile-hero-lg flex-1 truncate font-bold\">\n {t(\"orders_title\")}\n </h1>\n <div className=\"relative hidden sm:block\">\n <Search\n className=\"text-profile-text-muted pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2\"\n strokeWidth={2}\n />\n <Input\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder={t(\"orders_search_placeholder\")}\n className=\"ring-profile-border bg-profile-card text-profile-sm h-9 w-64 rounded-md pl-9\"\n />\n </div>\n </div>\n\n {list.length > 0 && (\n <FilterPills\n active={filter}\n counts={counts}\n onChange={setFilter}\n t={t}\n />\n )}\n\n {isLoading ? (\n <div className=\"ring-profile-border bg-profile-card mt-4 overflow-hidden rounded-2xl ring-1\">\n <OrdersListSkeleton />\n </div>\n ) : isError ? (\n <div className=\"ring-profile-border bg-profile-card mt-4 overflow-hidden rounded-2xl ring-1\">\n <ErrorState onRetry={() => refetch()} t={t} />\n </div>\n ) : filteredList.length === 0 ? (\n <div className=\"ring-profile-border bg-profile-card mt-4 overflow-hidden rounded-2xl ring-1\">\n <EmptyState searching={!!searchTerm || filter !== \"all\"} t={t} />\n </div>\n ) : (\n <div className=\"mt-4 space-y-6\">\n {groups.map((group) => (\n <div key={group.label}>\n <div className=\"text-profile-xs text-profile-text-muted mb-2 px-1 font-semibold\">\n {group.label}\n </div>\n <div className=\"space-y-3\">\n {group.orders.map((order) => (\n <OrderRow\n key={order.id}\n order={order}\n onClick={() => onOrderClick(order)}\n t={t}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {hasNextPage && (\n <div className=\"mt-3 flex justify-center\">\n <button\n type=\"button\"\n onClick={() => fetchNextPage()}\n disabled={isFetchingNextPage}\n className=\"ring-profile-border bg-profile-card text-profile-text hover:bg-profile-pill-hover text-profile-xs inline-flex items-center gap-1 rounded-md px-3 py-1.5 font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {isFetchingNextPage ? t(\"orders_loading\") : t(\"orders_load_more\")}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ─── Filter pills ─────────────────────────────────────────────────────────\n\nconst FILTER_KEYS: ReadonlyArray<{ key: FilterKey; labelKey: string }> = [\n { key: \"all\", labelKey: \"orders_filter_all\" },\n { key: \"delivered\", labelKey: \"orders_filter_delivered\" },\n { key: \"preparing\", labelKey: \"orders_filter_preparing\" },\n { key: \"subscription\", labelKey: \"orders_filter_subscription\" },\n];\n\nfunction FilterPills({\n active,\n counts,\n onChange,\n t,\n}: {\n active: FilterKey;\n counts: Record<FilterKey, number>;\n onChange: (k: FilterKey) => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"-mx-1 mt-5 flex flex-wrap gap-1.5 px-1\">\n {FILTER_KEYS.map((f) => {\n const isActive = f.key === active;\n const count = counts[f.key];\n return (\n <button\n key={f.key}\n type=\"button\"\n onClick={() => onChange(f.key)}\n className={`text-profile-xs inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 font-bold transition-all ${\n isActive\n ? \"bg-profile-dark text-profile-dark-foreground\"\n : \"ring-profile-border bg-profile-card text-profile-text hover:bg-profile-pill-hover ring-1\"\n }`}\n >\n {t(f.labelKey)}\n <span\n className={`text-profile-micro tabular-nums ${\n isActive\n ? \"text-profile-dark-foreground/70\"\n : \"text-profile-text-muted\"\n }`}\n >\n {count}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\n// ─── Order row ────────────────────────────────────────────────────────────\n\nfunction OrderRow({\n order,\n onClick,\n t,\n}: {\n order: orders.ListOrder;\n onClick: () => void;\n t: T;\n}): JSX.Element {\n const status = mapStatus(order.order_status, t);\n const dateLabel = formatFriendlyDate(order.created_at, t);\n const total = formatOrderTotal(order);\n const titleText =\n order.first_item?.title ||\n `${t(\"orders_order_number_prefix\")}${order.order_number}`;\n const titleSuffix =\n order.items_count > 1\n ? t(\"orders_more_items\").replace(\"{n}\", String(order.items_count - 1))\n : \"\";\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group bg-profile-card ring-profile-card-edge shadow-profile-card hover:ring-profile-text/10 hover:shadow-profile-card-hover focus-visible:ring-profile-text/30 relative flex w-full cursor-pointer items-center gap-4 rounded-2xl px-4 py-4 text-left ring-1 transition-all duration-300 hover:-translate-y-0.5 focus-visible:ring-2 focus-visible:outline-none\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <div className=\"text-profile-md text-profile-text truncate font-bold\">\n {titleText}\n {titleSuffix && (\n <span className=\"text-profile-text-muted font-medium\">\n {titleSuffix}\n </span>\n )}\n </div>\n <StatusPill status={status} />\n </div>\n <div className=\"text-profile-xs text-profile-text-muted mt-1 truncate\">\n {dateLabel} · {total}\n </div>\n </div>\n <ThumbnailStack\n fallback={order.first_item}\n urls={order.thumbnail_image_urls}\n isSubscription={order.subscription != null}\n t={t}\n />\n </button>\n );\n}\n\nfunction ThumbnailStack({\n urls,\n fallback,\n isSubscription,\n t,\n}: {\n urls: string[] | undefined;\n fallback: orders.FirstItem | null;\n isSubscription?: boolean;\n t: T;\n}): JSX.Element {\n // Prefer the explicit thumbnail array; fall back to first_item.image_url\n // for older API responses or when only one image exists.\n const effective = (\n urls && urls.length > 0\n ? urls\n : fallback?.image_url\n ? [fallback.image_url]\n : []\n ).slice(0, 3);\n\n if (effective.length === 0) {\n return (\n <div className=\"ring-profile-border bg-profile-icon-bg text-profile-text-muted relative flex size-12 shrink-0 items-center justify-center rounded-xl ring-1\">\n <ImageOff className=\"size-5\" strokeWidth={1.75} />\n {isSubscription && <SubscriptionBadge t={t} />}\n </div>\n );\n }\n\n if (effective.length === 1) {\n return (\n <div className=\"relative size-12 shrink-0\">\n <img\n src={effective[0]}\n alt=\"\"\n className=\"bg-profile-card ring-profile-canvas size-12 rounded-xl object-cover ring-[3px]\"\n />\n {isSubscription && <SubscriptionBadge t={t} />}\n </div>\n );\n }\n\n // Symmetric fan: front image centered, with up to 2 back images peeking\n // out behind on the left and right with a slight outward rotation. The\n // container is wider than a single thumb so back images can peek.\n const stackWidth = effective.length === 3 ? \"w-[80px]\" : \"w-[60px]\";\n return (\n <div className={`relative h-12 ${stackWidth} shrink-0`}>\n {effective.map((url, i) => (\n <img\n key={`${url}-${i}`}\n src={url}\n alt=\"\"\n className=\"bg-profile-card ring-profile-canvas absolute top-0 size-12 rounded-xl object-cover ring-[3px]\"\n style={fanStyle(i, effective.length)}\n />\n ))}\n {isSubscription && <SubscriptionBadge t={t} />}\n </div>\n );\n}\n\nfunction SubscriptionBadge({ t }: { t: T }): JSX.Element {\n return (\n <div\n className=\"bg-profile-dark text-profile-dark-foreground ring-profile-canvas absolute -top-1 -right-1 z-40 flex size-5 items-center justify-center rounded-full ring-2\"\n title={t(\"orders_subscription_badge\")}\n >\n <Repeat className=\"size-2.5\" strokeWidth={2.75} />\n </div>\n );\n}\n\nfunction StatusPill({ status }: { status: MappedStatus }): JSX.Element {\n const styles = STATUS_STYLES[status.kind];\n return (\n <span\n className={`text-profile-2xs inline-flex shrink-0 items-center gap-1 rounded-md px-2 py-0.5 font-semibold ${styles.bg} ${styles.text}`}\n >\n <span className={`size-1.5 rounded-full ${styles.dot}`} />\n {status.label}\n </span>\n );\n}\n\nfunction OrdersListSkeleton(): JSX.Element {\n return (\n <>\n {Array(4)\n .fill(0)\n .map((_, i) => (\n <div\n key={i}\n className={`flex items-center gap-3 px-4 py-3.5 ${i < 3 ? \"border-profile-divider border-b\" : \"\"}`}\n >\n <div className=\"bg-profile-icon-bg size-12 shrink-0 animate-pulse rounded-xl\" />\n <div className=\"flex-1 space-y-2\">\n <div className=\"bg-profile-icon-bg h-4 w-1/3 animate-pulse rounded\" />\n <div className=\"bg-profile-icon-bg h-3 w-1/2 animate-pulse rounded\" />\n </div>\n </div>\n ))}\n </>\n );\n}\n\nfunction EmptyState({\n searching,\n t,\n}: {\n searching: boolean;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"flex flex-col items-center gap-2 px-4 py-12 text-center\">\n <div className=\"bg-profile-icon-bg flex size-12 items-center justify-center rounded-full\">\n <Search className=\"text-profile-text-muted size-5\" strokeWidth={2} />\n </div>\n <div className=\"text-profile-base text-profile-text font-bold\">\n {searching ? t(\"orders_no_matching\") : t(\"orders_none_yet\")}\n </div>\n <div className=\"text-profile-xs text-profile-text-muted max-w-sm\">\n {searching ? t(\"orders_searching_hint\") : t(\"orders_empty_hint\")}\n </div>\n </div>\n );\n}\n\nfunction ErrorState({\n onRetry,\n t,\n}: {\n onRetry: () => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"flex flex-col items-center gap-2 px-4 py-12 text-center\">\n <div className=\"bg-profile-icon-bg flex size-12 items-center justify-center rounded-full\">\n <AlertCircle\n className=\"text-profile-text-muted size-5\"\n strokeWidth={2}\n />\n </div>\n <div className=\"text-profile-base text-profile-text font-bold\">\n {t(\"orders_load_failed_title\")}\n </div>\n <div className=\"text-profile-xs text-profile-text-muted max-w-sm\">\n {t(\"orders_load_failed_hint\")}\n </div>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"bg-profile-dark text-profile-dark-foreground hover:bg-profile-dark-hover text-profile-xs mt-2 inline-flex items-center gap-1 rounded-md px-3 py-1.5 font-bold transition-all\"\n >\n {t(\"orders_try_again\")}\n </button>\n </div>\n );\n}\n","import type { orders } from \"@fluid-app/orders-core\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalOrdersList } from \"./orders/PortalOrdersList\";\n\n// The portal-tenant BFF scopes orders to the logged-in user server-side,\n// so customerId is not used by the adapter. We pass a sentinel value to\n// satisfy the enabled guard in useCustomerOrders.\nconst BFF_SCOPED_CUSTOMER_ID = 1;\n\nconst translations: Record<string, string> = {\n // Page chrome\n orders_title: \"Order history\",\n orders_search_placeholder: \"Search orders...\",\n orders_loading: \"Loading...\",\n orders_load_more: \"Load more\",\n\n // Filter pills\n orders_filter_all: \"All\",\n orders_filter_delivered: \"Delivered\",\n orders_filter_preparing: \"Preparing\",\n orders_filter_subscription: \"Subscription\",\n\n // Status pill labels\n orders_status_delivered: \"Delivered\",\n orders_status_shipped: \"Shipped\",\n orders_status_preparing: \"Preparing\",\n orders_status_processing: \"Processing\",\n\n // Date groupings\n orders_group_this_week: \"This week\",\n orders_group_this_month: \"This month\",\n\n // Friendly relative dates ({n} interpolated by helper)\n orders_today: \"Today\",\n orders_yesterday: \"Yesterday\",\n orders_n_days_ago: \"{n} days ago\",\n orders_last_week: \"Last week\",\n orders_n_weeks_ago: \"{n} weeks ago\",\n\n // Row composition\n orders_order_number_prefix: \"Order #\",\n orders_more_items: \" + {n} more\",\n orders_subscription_badge: \"From subscription\",\n\n // Empty / error / retry copy\n orders_no_matching: \"No matching orders\",\n orders_none_yet: \"No orders yet\",\n orders_searching_hint: \"Try a different search term.\",\n orders_empty_hint: \"Your orders will show up here after you place one.\",\n orders_load_failed_title: \"Couldn't load your orders\",\n orders_load_failed_hint: \"Something went wrong on our end. Please try again.\",\n orders_try_again: \"Try again\",\n};\n\n// Module-level so the reference is stable across renders. Inline arrows would\n// recreate the function each render and bust every `useMemo([..., t])` in\n// `PortalOrdersList` (groups, filtered list, status mapping).\nconst t = (key: string) => translations[key] ?? key;\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 return (\n <PortalOrdersList\n customerId={BFF_SCOPED_CUSTOMER_ID}\n onOrderClick={handleOrderClick}\n t={t}\n />\n );\n}\n","import { cn } from \"@fluid-app/ui-primitives\";\n\nexport type BadgeColor = \"green\" | \"yellow\" | \"red\" | \"blue\" | \"gray\";\n\ntype BadgeSize = \"xs\" | \"sm\" | \"md\";\n\ninterface StatusBadgeProps {\n color: BadgeColor;\n dot?: boolean;\n size?: BadgeSize;\n className?: string;\n children: React.ReactNode;\n}\n\nconst colorStyles: Record<BadgeColor, string> = {\n green: \"bg-green-500/15 text-foreground\",\n yellow: \"bg-yellow-500/15 text-foreground\",\n red: \"bg-red-500/15 text-foreground\",\n blue: \"bg-blue-500/15 text-foreground\",\n gray: \"bg-foreground/10 text-foreground\",\n};\n\nconst dotColorStyles: Record<BadgeColor, string> = {\n green: \"bg-green-500\",\n yellow: \"bg-yellow-500\",\n red: \"bg-red-500\",\n blue: \"bg-blue-500\",\n gray: \"bg-gray-500\",\n};\n\nconst sizeStyles: Record<BadgeSize, string> = {\n xs: \"px-1.5 py-0.5 text-[10px]\",\n sm: \"px-2 py-0.5 text-xs\",\n md: \"px-2.5 py-1 text-sm\",\n};\n\nexport function StatusBadge({\n color,\n dot,\n size = \"md\",\n className,\n children,\n}: StatusBadgeProps) {\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1 rounded-full font-medium whitespace-nowrap capitalize\",\n colorStyles[color],\n sizeStyles[size],\n className,\n )}\n >\n {dot && (\n <span\n className={cn(\"h-1.5 w-1.5 rounded-full\", dotColorStyles[color])}\n />\n )}\n {children}\n </span>\n );\n}\n","export function startCase(str: string | undefined | null): string {\n if (!str) return \"\";\n return str.replace(/_/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport function formatCurrency(symbol: string, value: string | number): string {\n return `${symbol}${Number(value).toFixed(2)}`;\n}\n","import { StatusBadge, type BadgeColor } from \"./status-badge\";\nimport { startCase } from \"../lib/format\";\n\nconst statusColorMap: Record<string, BadgeColor> = {\n paid: \"green\",\n fulfilled: \"green\",\n delivered: \"green\",\n complete: \"green\",\n pending: \"yellow\",\n unfulfilled: \"yellow\",\n partially_fulfilled: \"yellow\",\n processing: \"yellow\",\n refunded: \"red\",\n cancelled: \"red\",\n failed: \"red\",\n voided: \"red\",\n};\n\nexport interface OrderStatusBadgeProps {\n status: string;\n className?: string;\n}\n\nexport function OrderStatusBadge({ status, className }: OrderStatusBadgeProps) {\n const color = statusColorMap[status] ?? \"gray\";\n return (\n <StatusBadge color={color} dot size=\"sm\" className={className}>\n {startCase(status)}\n </StatusBadge>\n );\n}\n","import { useState } from \"react\";\nimport type {\n StaticMapAddress,\n StaticMapOptions,\n} from \"@fluid-app/orders-core\";\nimport { buildStaticMapUrl } from \"@fluid-app/orders-core\";\n\nexport interface StaticMapProps {\n apiKey: string;\n address: StaticMapAddress;\n options?: StaticMapOptions;\n alt?: string;\n className?: string;\n}\n\nexport function StaticMap({\n apiKey,\n address,\n options,\n alt = \"Shipping address map\",\n className,\n}: StaticMapProps) {\n const [errored, setErrored] = useState(false);\n const url = buildStaticMapUrl(apiKey, address, options);\n\n if (!url || errored) return null;\n\n return (\n <img\n src={url}\n alt={alt}\n width={options?.width ?? 600}\n height={options?.height ?? 300}\n className={\n className ??\n \"border-border w-full rounded border object-cover shadow-xs\"\n }\n onError={() => setErrored(true)}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\nimport type { orders } from \"@fluid-app/orders-core\";\nimport { usePortalTenantOrder } from \"@fluid-app/orders-core\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { OrderStatusBadge } from \"./order-status-badge\";\nimport { StaticMap } from \"./static-map\";\n\n// Human-readable labels for the non-card entries of PaymentMethod.payment_type.\n// Card payments render via card_type (uppercased) and bypass this map entirely.\nconst PAYMENT_TYPE_LABELS: Record<string, string> = {\n apple_pay: \"Apple Pay\",\n google_pay: \"Google Pay\",\n paypal: \"PayPal\",\n braintree_paypal: \"PayPal\",\n affirm: \"Affirm\",\n klarna: \"Klarna\",\n bread: \"Bread\",\n iap: \"In-App Purchase\",\n citcon: \"Citcon\",\n ppro: \"PPRO\",\n dlocal: \"dLocal\",\n droplet: \"Droplet\",\n};\n\nexport interface PortalOrderDetailProps {\n id: string | number;\n googleMapsApiKey?: string;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n}\n\nfunction DetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <div className=\"bg-muted flex flex-col items-center px-8 lg:col-span-4\">\n <div className=\"w-full max-w-lg py-6\">\n <Skeleton className=\"mb-4 h-6 w-48\" />\n <div className=\"space-y-4\">\n <div className=\"flex items-center space-x-4\">\n <Skeleton className=\"h-24 w-24 rounded\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n <div className=\"bg-background px-8 pt-4 lg:col-span-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n <Skeleton className=\"mb-4 h-10 w-full rounded\" />\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction SummaryRow({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"flex items-center justify-between text-sm\">\n <p className=\"text-muted-foreground\">{label}</p>\n <p className=\"text-foreground\">{value}</p>\n </div>\n );\n}\n\n/**\n * Display a positive money string as a deduction (prefixed with \"-\").\n * Idempotent: if the value already starts with \"-\" we leave it alone, so\n * a future BFF that returns signed discounts can't produce \"--$10.00\".\n */\nfunction asNegative(value: string): string {\n return value.startsWith(\"-\") ? value : `-${value}`;\n}\n\n/**\n * Pick the formatted currency string when present, falling back to the raw\n * decimal so the row still renders something for orders where the BFF left\n * the field nil (e.g. a checkout where shipping was never set).\n */\nfunction moneyDisplay(formatted: string | null, fallback: string): string {\n return formatted ?? fallback;\n}\n\nfunction formatAddressLines(address: orders.PortalTenantAddress): string[] {\n const lines: string[] = [];\n if (address.name) lines.push(address.name);\n if (address.address1) lines.push(address.address1);\n if (address.address2) lines.push(address.address2);\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n if (cityLine) lines.push(cityLine);\n if (address.country_code) lines.push(address.country_code);\n return lines;\n}\n\nfunction AddressSection({ address }: { address: orders.PortalTenantAddress }) {\n const lines = formatAddressLines(address);\n if (lines.length === 0) return null;\n return (\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Shipping Address\n </h3>\n <div className=\"text-foreground space-y-0.5 text-sm\">\n {lines.map((line, index) => (\n <p key={index}>{line}</p>\n ))}\n </div>\n </div>\n );\n}\n\nfunction PaymentMethodSection({\n paymentMethod,\n}: {\n paymentMethod: orders.PortalTenantPaymentMethod;\n}) {\n const { card_type, last4 } = paymentMethod;\n const brand = card_type\n ? card_type.toUpperCase()\n : (PAYMENT_TYPE_LABELS[paymentMethod.payment_type] ??\n paymentMethod.payment_type);\n const label = last4 ? `${brand} ending in ${last4}` : brand;\n if (!label) return null;\n return (\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Payment Method\n </h3>\n <p className=\"text-foreground text-sm\">{label}</p>\n </div>\n );\n}\n\nfunction LineItemImage({ src, alt }: { src: string; alt: string }) {\n const [errored, setErrored] = useState(false);\n if (errored) return <span className=\"text-xs\">No image</span>;\n return (\n <img\n src={src}\n alt={alt}\n className=\"h-full w-full object-cover\"\n onError={() => setErrored(true)}\n />\n );\n}\n\nfunction ItemRow({\n item,\n onSubscriptionClick,\n}: {\n item: orders.PortalTenantOrderLineItem;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n}) {\n const subscriptionToken = item.source_subscription?.subscription_token;\n return (\n <div className=\"flex items-center space-x-4 py-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted text-muted-foreground flex h-24 w-24 items-center justify-center overflow-hidden rounded\">\n {item.image_url ? (\n <LineItemImage src={item.image_url} alt={item.product_name} />\n ) : (\n <span className=\"text-xs\">No image</span>\n )}\n </div>\n {item.quantity > 1 && (\n <span className=\"bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\">\n {item.quantity}\n </span>\n )}\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col space-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={item.product_name}\n >\n {item.product_name}\n </p>\n {item.variant_name && (\n <p\n className=\"text-muted-foreground truncate text-xs\"\n title={item.variant_name}\n >\n {item.variant_name}\n </p>\n )}\n <p className=\"text-foreground text-sm font-medium\">\n {moneyDisplay(item.total_in_currency, item.total)}\n </p>\n {item.quantity > 1 && (\n <p className=\"text-muted-foreground text-xs\">\n {moneyDisplay(item.price_in_currency, item.price)} x {item.quantity}\n </p>\n )}\n {subscriptionToken && onSubscriptionClick && (\n <button\n type=\"button\"\n title={subscriptionToken}\n className=\"mt-1 max-w-full cursor-pointer truncate text-left text-xs text-blue-600 transition-colors duration-200 hover:text-blue-700 hover:underline\"\n onClick={() => onSubscriptionClick(subscriptionToken)}\n >\n Subscription #{subscriptionToken}\n </button>\n )}\n </div>\n </div>\n );\n}\n\nfunction ItemsSection({\n order,\n onSubscriptionClick,\n}: {\n order: orders.PortalTenantOrder;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n}) {\n 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\n key={item.id}\n item={item}\n onSubscriptionClick={onSubscriptionClick}\n />\n ))}\n </div>\n\n <div className=\"border-border mb-4 space-y-1 border-t pt-4\">\n <SummaryRow\n label=\"Subtotal\"\n value={moneyDisplay(order.subtotal_in_currency, order.subtotal)}\n />\n {parseFloat(order.discount) > 0 && (\n <SummaryRow\n label=\"Discount\"\n value={asNegative(\n moneyDisplay(order.discount_in_currency, order.discount),\n )}\n />\n )}\n <SummaryRow\n label=\"Shipping\"\n value={moneyDisplay(order.shipping_in_currency, order.shipping)}\n />\n <SummaryRow\n label=\"Tax\"\n value={moneyDisplay(order.tax_in_currency, order.tax)}\n />\n <div className=\"mt-2 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">Total</p>\n <p className=\"text-foreground text-base font-bold\">\n {moneyDisplay(order.total_in_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({\n order,\n googleMapsApiKey,\n}: {\n order: orders.PortalTenantOrder;\n googleMapsApiKey?: string;\n}) {\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 {googleMapsApiKey && order.address && (\n <div className=\"mb-6\">\n <StaticMap apiKey={googleMapsApiKey} address={order.address} />\n </div>\n )}\n\n {/* Order Info */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order Info\n </h3>\n <div className=\"divide-border flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">Order</div>\n <div className=\"text-foreground font-medium\">#{order.id}</div>\n </div>\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">Date</div>\n <div className=\"text-foreground font-medium\">\n {new Date(order.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })}\n </div>\n </div>\n </div>\n {order.customer_email && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Email</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_email}\n </div>\n </div>\n )}\n {order.customer_name && (\n <div className=\"mt-3\">\n <div className=\"text-muted-foreground text-sm\">Customer</div>\n <div className=\"text-foreground text-sm font-medium\">\n {order.customer_name}\n </div>\n </div>\n )}\n </div>\n\n {order.address && <AddressSection address={order.address} />}\n {order.payment_method && (\n <PaymentMethodSection paymentMethod={order.payment_method} />\n )}\n </div>\n </div>\n );\n}\n\nexport function PortalOrderDetail({\n id,\n googleMapsApiKey,\n onNotFound,\n onError,\n onSubscriptionClick,\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} onSubscriptionClick={onSubscriptionClick} />\n <DetailsSection order={order} googleMapsApiKey={googleMapsApiKey} />\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 googleMapsApiKey?: string;\n onNavigateToList: () => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n}\n\nexport function PortalOrderDetailScreen({\n id,\n googleMapsApiKey,\n onNavigateToList,\n onNotFound,\n onError,\n onSubscriptionClick,\n}: PortalOrderDetailScreenProps) {\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\n id={id}\n googleMapsApiKey={googleMapsApiKey}\n onNotFound={onNotFound}\n onError={onError}\n onSubscriptionClick={onSubscriptionClick}\n />\n </div>\n );\n}\n","import { PortalOrderDetailScreen as PortalOrderDetailScreenContent } from \"@fluid-app/orders-ui/screens/PortalOrderDetailScreen\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\n\ninterface OrderDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function OrderDetailScreen({\n token,\n onToast,\n}: OrderDetailScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n const { config } = useFluidContext();\n\n return (\n <PortalOrderDetailScreenContent\n id={token}\n googleMapsApiKey={config.googleMapsApiKey}\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 onSubscriptionClick={(subscriptionToken) =>\n navigate(`subscriptions/${subscriptionToken}`)\n }\n />\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalOrdersApiProvider } from \"../orders/PortalOrdersApiProvider\";\nimport { 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 +0,0 @@
1
- {"version":3,"file":"ProfileScreen-BvIfbjnw.cjs","names":["Sparkles","Pencil","User","Mail","Phone","Quote","Link2","Copy","Dialog","DialogContent","DialogHeader","DialogTitle","LogOut","Plus","MapPin","EllipsesDropdown","Linkedin","Facebook","Twitter","Instagram","Youtube","Globe","useProfileTranslation","usePayApi","useAccountApi","createFluidPayApiAdapter","usePortalMySiteProfile","useAccount","payKeys","mapToFluidPayPaymentMethod","useCountriesApi","useLanguagesApi","storeKeys","accountKeys","useZodForm","z","FluidPayCoreProvider","UserInfoDialog","AddressFormDialog","AddressAutocompleteInput","ConfirmActionDialog","CreditCardFormDialog","EditPaymentMethodDialog","Dialog","DialogContent","DialogHeader","DialogTitle","Label","Input","DialogFooter","Button","useFluidContext","ProfileTranslationBridge","useProfileTranslation","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage"],"sources":["../src/screens/profile/derive-last-name.ts","../src/screens/profile/ProfileLayout.tsx","../src/screens/ProfileContentScreen.tsx","../src/screens/ProfileScreen.tsx"],"sourcesContent":["export function deriveLastName(firstName: string, fullName: string): string {\n if (!firstName) return \"\";\n const prefix = `${firstName} `;\n return fullName.startsWith(prefix) ? fullName.slice(prefix.length) : \"\";\n}\n","import { type JSX, type ReactNode, useState, type ComponentType } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@fluid-app/ui-primitives\";\nimport {\n Sparkles,\n Pencil,\n Plus,\n Copy,\n Link2,\n MapPin,\n User,\n Mail,\n Phone,\n Quote,\n Linkedin,\n Facebook,\n Twitter,\n Instagram,\n Youtube,\n Globe,\n LogOut,\n} from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { PointsLedger } from \"@fluid-app/profile-core\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\n\ninterface ProfileLayoutProps {\n account: AccountRep;\n pointsBalance: number | undefined;\n pointsLedger?: PointsLedger[];\n rewardsEnabled?: boolean;\n addresses: fluidPay.CustomerAddress[];\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n mySiteDisplayUrl: string;\n socialLinks: Partial<Record<SocialKey, string>>;\n onEditPersonalInfo: () => void;\n onAddAddress: () => void;\n onEditAddress: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress: (address: fluidPay.CustomerAddress) => void;\n onAddPaymentMethod: () => void;\n onEditPaymentMethod: (method: fluidPay.CustomerPaymentMethod) => void;\n onCopyMySiteLink: () => void;\n onEditMySiteLink?: () => void;\n onConnectSocial: (key: SocialKey) => void;\n onSignOut?: () => void;\n}\n\nexport function ProfileLayout(props: ProfileLayoutProps): JSX.Element {\n const {\n account,\n pointsBalance,\n pointsLedger,\n rewardsEnabled,\n addresses,\n paymentMethods,\n mySiteDisplayUrl,\n socialLinks,\n onEditPersonalInfo,\n onAddAddress,\n onEditAddress,\n onDeleteAddress,\n onAddPaymentMethod,\n onEditPaymentMethod,\n onCopyMySiteLink,\n onEditMySiteLink,\n onConnectSocial,\n onSignOut,\n } = props;\n\n const fullName =\n `${account.first_name ?? \"\"} ${account.last_name ?? \"\"}`.trim();\n const heroFirstName = (account.first_name || \"\").trim().split(\" \")[0] || \"\";\n const heroDisplay =\n heroFirstName || account.email?.split(\"@\")[0] || \"Account\";\n const connectedSocialCount = Object.values(socialLinks).filter(\n (v) => typeof v === \"string\" && v.length > 0,\n ).length;\n const [isPointsHistoryOpen, setIsPointsHistoryOpen] = useState(false);\n const POINTS_PREVIEW_COUNT = 4;\n const ledger = pointsLedger ?? [];\n const ledgerPreview = ledger.slice(0, POINTS_PREVIEW_COUNT);\n const hasMoreLedger = ledger.length > POINTS_PREVIEW_COUNT;\n\n return (\n <div className=\"relative\">\n <div className=\"max-w-profile-container relative mx-auto px-5 pt-8 pb-20 md:px-8\">\n {/* Hero */}\n <section className=\"flex items-center gap-3.5\">\n <div className=\"size-profile-avatar-sm md:size-profile-avatar relative shrink-0 overflow-hidden rounded-full ring-1 ring-black/5\">\n {account.avatar_url ? (\n <img\n src={account.avatar_url}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"bg-profile-dark text-profile-dark-foreground flex h-full w-full items-center justify-center text-lg font-semibold\">\n {heroDisplay.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-profile-hero tracking-profile-hero text-profile-text md:text-profile-hero-lg truncate font-bold\">\n {heroDisplay}\n </h1>\n <p className=\"text-profile-sm-plus text-profile-text-muted mt-0.5 truncate\">\n {account.email}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {rewardsEnabled && (\n <div className=\"ring-profile-border bg-profile-card text-profile-xs-plus text-profile-text inline-flex items-center gap-1.5 rounded-md px-2.5 py-1 font-semibold ring-1\">\n <Sparkles\n className=\"text-profile-accent size-3\"\n strokeWidth={2.25}\n />\n {(pointsBalance ?? 0).toLocaleString()} pts\n </div>\n )}\n </div>\n </section>\n\n {/* Personal information */}\n <SectionHeader\n title=\"Personal information\"\n action={\n <PillButton\n onClick={onEditPersonalInfo}\n icon={Pencil}\n label=\"Edit\"\n />\n }\n />\n <div className=\"ring-profile-border bg-profile-card mt-2.5 overflow-hidden rounded-2xl ring-1\">\n <FieldRow\n icon={User}\n label=\"Name\"\n value={fullName || account.first_name || \"\"}\n />\n <FieldRow icon={Mail} label=\"Email\" value={account.email ?? \"\"} />\n <FieldRow\n icon={Phone}\n label=\"Phone\"\n value={account.phone ?? \"\"}\n placeholder=\"Add phone number\"\n />\n <FieldRow\n icon={Quote}\n label=\"Bio\"\n value={account.bio ?? \"\"}\n placeholder=\"Add a short bio\"\n multiline\n isLast\n />\n </div>\n\n {/* Payment methods */}\n <SectionHeader title=\"Payment methods\" />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-3\">\n {paymentMethods.map((method) => (\n <PaymentCardVisual\n key={method.id}\n method={method}\n onClick={() => onEditPaymentMethod(method)}\n />\n ))}\n <AddPaymentTile onClick={onAddPaymentMethod} />\n </div>\n\n {/* Points history */}\n {rewardsEnabled && (\n <>\n <SectionHeader\n title=\"Points history\"\n action={\n <span className=\"text-profile-xs text-profile-text-faint\">\n {(pointsBalance ?? 0).toLocaleString()} pts available\n </span>\n }\n />\n {ledger.length > 0 ? (\n <div className=\"ring-profile-border bg-profile-card mt-2.5 overflow-hidden rounded-2xl ring-1\">\n {ledgerPreview.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={!hasMoreLedger && i === ledgerPreview.length - 1}\n />\n ))}\n {hasMoreLedger && (\n <button\n type=\"button\"\n onClick={() => setIsPointsHistoryOpen(true)}\n className=\"text-profile-xs text-profile-text hover:bg-profile-pill-hover flex w-full items-center justify-center gap-1 px-4 py-3 font-bold transition-colors\"\n >\n See all {ledger.length} transactions\n </button>\n )}\n </div>\n ) : (\n <div className=\"ring-dashed ring-profile-dashed-border bg-profile-card mt-2.5 flex flex-col items-center justify-center gap-1 rounded-2xl px-4 py-8 text-center ring-1\">\n <Sparkles\n className=\"text-profile-text-faint size-5\"\n strokeWidth={1.75}\n />\n <div className=\"text-profile-base text-profile-text font-bold\">\n No points yet\n </div>\n <div className=\"text-profile-xs text-profile-text-muted\">\n Earn points on every order to unlock rewards.\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Your MySite link */}\n <SectionHeader\n title=\"Your MySite link\"\n action={\n onEditMySiteLink ? (\n <PillButton\n onClick={onEditMySiteLink}\n icon={Pencil}\n label=\"Edit link\"\n />\n ) : undefined\n }\n />\n <div className=\"ring-profile-border bg-profile-card mt-2.5 flex items-center gap-3 rounded-2xl p-3.5 ring-1\">\n <div className=\"size-profile-mysite-icon bg-profile-icon-bg text-profile-text flex shrink-0 items-center justify-center rounded-full\">\n <Link2 className=\"size-[18px]\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-profile-2xs tracking-profile-uppercase-1 text-profile-text-faint font-bold uppercase\">\n Public link\n </div>\n <div className=\"text-profile-base text-profile-text mt-0.5 truncate font-mono font-semibold\">\n {mySiteDisplayUrl || \"Set your MySite link\"}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onCopyMySiteLink}\n disabled={!mySiteDisplayUrl}\n className=\"ring-profile-border bg-profile-card text-profile-xs text-profile-text hover:bg-profile-pill-hover inline-flex items-center gap-1 rounded-md px-3 py-1.5 font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Copy className=\"size-3\" strokeWidth={2.25} />\n Copy\n </button>\n </div>\n\n {/* Shipping addresses */}\n <SectionHeader title=\"Shipping addresses\" />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n {addresses.map((address) => (\n <AddressCard\n key={address.id}\n address={address}\n onEdit={() => onEditAddress(address)}\n onDelete={\n address.default ? undefined : () => onDeleteAddress(address)\n }\n />\n ))}\n <AddAddressTile onClick={onAddAddress} />\n </div>\n\n {/* Social media */}\n <SectionHeader\n title=\"Social media\"\n action={\n <span className=\"text-profile-xs text-profile-text-faint\">\n {connectedSocialCount} connected\n </span>\n }\n />\n <div className=\"ring-profile-border bg-profile-card mt-2.5 overflow-hidden rounded-2xl ring-1\">\n {SOCIAL_ENTRIES.map((entry, i) => (\n <SocialRow\n key={entry.key}\n entry={entry}\n handle={socialLinks[entry.key] ?? \"\"}\n isLast={i === SOCIAL_ENTRIES.length - 1}\n onConnect={() => onConnectSocial(entry.key)}\n />\n ))}\n </div>\n\n <Dialog\n open={isPointsHistoryOpen}\n onOpenChange={setIsPointsHistoryOpen}\n >\n <DialogContent className=\"max-w-md md:max-w-lg\">\n <DialogHeader>\n <DialogTitle>Points history</DialogTitle>\n </DialogHeader>\n <div className=\"ring-profile-border bg-profile-card max-h-[60vh] overflow-y-auto rounded-2xl ring-1\">\n {ledger.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={i === ledger.length - 1}\n />\n ))}\n </div>\n </DialogContent>\n </Dialog>\n\n {onSignOut && (\n <div className=\"ring-profile-border bg-profile-card mt-8 flex flex-wrap items-center justify-between gap-3 rounded-2xl p-3.5 ring-1\">\n <div className=\"flex items-center gap-3\">\n <div className=\"bg-profile-danger-bg flex size-9 items-center justify-center rounded-md\">\n <LogOut\n className=\"text-profile-danger-icon size-4\"\n strokeWidth={2.25}\n />\n </div>\n <div>\n <div className=\"text-profile-base text-profile-text font-bold\">\n Sign out\n </div>\n <div className=\"text-profile-xs-plus text-profile-text-muted\">\n You can sign back in any time\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"bg-profile-danger-button-bg text-profile-sm text-profile-danger-button-text hover:bg-profile-danger-button-hover rounded-md px-4 py-2 font-bold transition-colors\"\n >\n Sign out\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction SectionHeader({\n title,\n action,\n}: {\n title: string;\n action?: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"mt-8 flex items-end justify-between\">\n <h2 className=\"text-profile-lg tracking-profile-heading text-profile-text font-bold\">\n {title}\n </h2>\n {action ?? null}\n </div>\n );\n}\n\nfunction PillButton({\n onClick,\n icon: Icon,\n label,\n disabled,\n}: {\n onClick: () => void;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n disabled?: boolean;\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className=\"ring-profile-border bg-profile-card text-profile-xs text-profile-text hover:bg-profile-pill-hover inline-flex items-center gap-1 rounded-md px-3 py-1.5 font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Icon className=\"size-3\" strokeWidth={2.25} />\n {label}\n </button>\n );\n}\n\nfunction PointsLedgerRow({\n entry,\n isLast,\n}: {\n entry: PointsLedger;\n isLast: boolean;\n}): JSX.Element {\n const isCredit = entry.amount >= 0;\n const sign = isCredit ? \"+\" : \"−\";\n const magnitude = Math.abs(entry.amount).toLocaleString();\n const amountColor = isCredit\n ? \"text-emerald-600\"\n : \"text-profile-danger-icon\";\n const sourceName = entry.metadata?.source?.name?.trim();\n const transactionType = entry.metadata?.transaction_type;\n const label =\n sourceName ||\n (transactionType\n ? transactionType.charAt(0).toUpperCase() + transactionType.slice(1)\n : isCredit\n ? \"Points earned\"\n : \"Points redeemed\");\n const dateLabel = formatLedgerDate(entry.created_at);\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-profile-divider border-b\"}`}\n >\n <div className=\"bg-profile-icon-bg flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Sparkles\n className={`size-4 ${isCredit ? \"text-profile-accent\" : \"text-profile-text-muted\"}`}\n strokeWidth={2}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-profile-md text-profile-text truncate font-medium\">\n {label}\n </div>\n <div className=\"text-profile-xs text-profile-text-muted\">\n {dateLabel}\n </div>\n </div>\n <div\n className={`text-profile-md shrink-0 font-mono font-bold tabular-nums ${amountColor}`}\n >\n {sign}\n {magnitude}\n </div>\n </div>\n );\n}\n\nfunction formatLedgerDate(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nfunction FieldRow({\n icon: Icon,\n label,\n value,\n placeholder,\n isLast,\n multiline,\n}: {\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n value: string;\n placeholder?: string;\n isLast?: boolean;\n multiline?: boolean;\n}): JSX.Element {\n const display = value || placeholder || \"\";\n const isPlaceholder = !value && Boolean(placeholder);\n const valueClasses = multiline ? \"whitespace-pre-line\" : \"truncate\";\n return (\n <div\n className={`flex gap-3 px-4 py-3.5 ${multiline ? \"items-start\" : \"items-center\"} ${isLast ? \"\" : \"border-profile-divider border-b\"}`}\n >\n <div className=\"bg-profile-icon-bg text-profile-text-muted flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-profile-2xs tracking-profile-uppercase-1 text-profile-text-faint font-bold uppercase\">\n {label}\n </div>\n <div\n className={`mt-0.5 ${valueClasses} text-profile-md font-medium ${isPlaceholder ? \"text-profile-text-placeholder\" : \"text-profile-text\"}`}\n >\n {display}\n </div>\n </div>\n </div>\n );\n}\n\nconst CARD_BRAND_LABEL: Record<string, string> = {\n amex: \"AMERICAN EXPRESS\",\n visa: \"VISA\",\n mastercard: \"MASTERCARD\",\n discover: \"DISCOVER\",\n diners: \"DINERS CLUB\",\n jcb: \"JCB\",\n unionpay: \"UNIONPAY\",\n};\n\nconst CARD_BRAND_BADGE: Record<string, string> = {\n amex: \"AMEX\",\n visa: \"VISA\",\n mastercard: \"MC\",\n discover: \"DISC\",\n diners: \"DC\",\n jcb: \"JCB\",\n unionpay: \"UPI\",\n};\n\nfunction PaymentCardVisual({\n method,\n onClick,\n}: {\n method: fluidPay.CustomerPaymentMethod;\n onClick: () => void;\n}): JSX.Element {\n const brand = (method.details.card_brand || \"\").toLowerCase();\n const brandLabel =\n CARD_BRAND_LABEL[brand] || (brand ? brand.toUpperCase() : \"CARD\");\n const badge = CARD_BRAND_BADGE[brand] || \"CARD\";\n const last4 = method.details.last_four ?? \"••••\";\n const expMonth = String(method.details.exp_month ?? \"\").padStart(2, \"0\");\n const expYear = String(method.details.exp_year ?? \"\").slice(-2);\n const exp = expMonth && expYear ? `${expMonth}/${expYear}` : \"\";\n const holder = method.billing_address?.name ?? \"\";\n const badgeBg =\n brand === \"visa\"\n ? \"bg-[#1A1F71]\"\n : brand === \"mastercard\"\n ? \"bg-[#EB001B]\"\n : \"bg-[#0064D2]\";\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group bg-foreground text-background ring-foreground/10 relative flex aspect-[1.586/1] flex-col justify-between overflow-hidden rounded-xl p-4 text-left shadow-sm ring-1 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg\"\n >\n <div\n aria-hidden\n className=\"absolute inset-0 bg-[repeating-linear-gradient(135deg,transparent_0px,transparent_22px,currentColor_22px,currentColor_24px)] opacity-[0.04]\"\n />\n <div className=\"relative flex items-start justify-between\">\n <div>\n <div className=\"text-profile-micro tracking-profile-uppercase-2 text-background/50 font-semibold uppercase\">\n {brandLabel}\n </div>\n <div className=\"text-profile-hero tracking-profile-mono text-background mt-1 font-mono font-bold\">\n {last4}\n </div>\n </div>\n {method.default && (\n <span className=\"text-profile-micro bg-background/10 text-background/80 rounded-md px-2 py-0.5 font-bold tracking-wider uppercase\">\n Default\n </span>\n )}\n </div>\n <div className=\"relative flex items-end justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-profile-nano tracking-profile-uppercase-2 text-background/40 font-semibold uppercase\">\n Cardholder\n </div>\n <div className=\"text-profile-xs-plus text-background truncate font-semibold\">\n {holder || \" \"}\n </div>\n </div>\n <div>\n <div className=\"text-profile-nano tracking-profile-uppercase-2 text-background/40 font-semibold uppercase\">\n Expires\n </div>\n <div className=\"text-profile-xs-plus text-background font-mono font-semibold\">\n {exp}\n </div>\n </div>\n <div\n className={`text-profile-micro shrink-0 rounded px-1.5 py-0.5 font-bold tracking-wider text-white ${badgeBg}`}\n >\n {badge}\n </div>\n </div>\n </button>\n );\n}\n\nfunction AddPaymentTile({ onClick }: { onClick: () => void }): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-profile-dashed-border bg-profile-card text-profile-text-muted hover:bg-profile-canvas hover:text-profile-text flex aspect-[1.586/1] flex-col items-center justify-center gap-1.5 rounded-xl ring-1 transition-colors\"\n >\n <div className=\"ring-profile-border bg-profile-card flex size-9 items-center justify-center rounded-full ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-profile-sm text-profile-text font-bold\">\n Add payment method\n </div>\n <div className=\"text-profile-2xs-plus text-profile-text-faint\">\n Visa, Mastercard, Amex\n </div>\n </button>\n );\n}\n\nfunction AddressCard({\n address,\n onEdit,\n onDelete,\n}: {\n address: fluidPay.CustomerAddress;\n onEdit: () => void;\n onDelete?: () => void;\n}): JSX.Element {\n const label = address.name?.trim() || \"Address\";\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n return (\n <div className=\"ring-profile-border bg-profile-card hover:bg-profile-pill-hover focus-within:ring-profile-text/40 relative flex flex-col rounded-2xl ring-1 transition-all duration-200 focus-within:ring-2 hover:ring-2\">\n <button\n type=\"button\"\n onClick={onEdit}\n className=\"flex w-full flex-col rounded-2xl p-4 pr-12 text-left focus-visible:outline-none\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-profile-icon-bg flex size-8 items-center justify-center rounded-full\">\n <MapPin\n className=\"text-profile-text-muted size-4\"\n strokeWidth={2}\n />\n </div>\n <div className=\"text-profile-md text-profile-text font-bold\">\n {label}\n </div>\n </div>\n {address.default && (\n <span className=\"bg-profile-dark text-profile-micro text-profile-dark-foreground rounded-md px-2 py-0.5 font-bold tracking-wider uppercase\">\n Default\n </span>\n )}\n </div>\n <div className=\"text-profile-sm-plus text-profile-text mt-3 space-y-0.5 leading-snug\">\n {address.address1 && <div>{address.address1}</div>}\n {address.address2 && <div>{address.address2}</div>}\n {cityLine && <div>{cityLine}</div>}\n {address.country_code && (\n <div className=\"text-profile-text-muted\">\n {address.country_code}\n </div>\n )}\n </div>\n </button>\n {onDelete && (\n <div className=\"absolute top-2 right-2 z-10\">\n <EllipsesDropdown\n onEdit={onEdit}\n onDelete={onDelete}\n editLabel=\"Edit\"\n deleteLabel=\"Delete\"\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction AddAddressTile({ onClick }: { onClick: () => void }): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-profile-dashed-border min-h-profile-tile-min-h bg-profile-card text-profile-text-muted hover:bg-profile-canvas hover:text-profile-text flex flex-col items-center justify-center gap-1.5 rounded-2xl ring-1 transition-colors\"\n >\n <div className=\"ring-profile-border bg-profile-card flex size-9 items-center justify-center rounded-full ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-profile-base text-profile-text font-bold\">\n Add an address\n </div>\n </button>\n );\n}\n\ntype SocialKey =\n | \"linkedin\"\n | \"facebook\"\n | \"x\"\n | \"instagram\"\n | \"youtube\"\n | \"pinterest\"\n | \"tiktok\";\n\ninterface SocialEntry {\n key: SocialKey;\n label: string;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n placeholder: string;\n}\n\nconst SOCIAL_ENTRIES: readonly SocialEntry[] = [\n {\n key: \"linkedin\",\n label: \"LinkedIn\",\n icon: Linkedin,\n placeholder: \"linkedin.com/in/username\",\n },\n {\n key: \"facebook\",\n label: \"Facebook\",\n icon: Facebook,\n placeholder: \"facebook.com/username\",\n },\n { key: \"x\", label: \"X\", icon: Twitter, placeholder: \"x.com/username\" },\n {\n key: \"instagram\",\n label: \"Instagram\",\n icon: Instagram,\n placeholder: \"instagram.com/username\",\n },\n {\n key: \"youtube\",\n label: \"YouTube\",\n icon: Youtube,\n placeholder: \"youtube.com/@channel\",\n },\n {\n key: \"pinterest\",\n label: \"Pinterest\",\n icon: Globe,\n placeholder: \"pinterest.com/username\",\n },\n {\n key: \"tiktok\",\n label: \"TikTok\",\n icon: Globe,\n placeholder: \"tiktok.com/@username\",\n },\n] as const;\n\nfunction SocialRow({\n entry,\n handle,\n isLast,\n onConnect,\n}: {\n entry: SocialEntry;\n handle: string;\n isLast: boolean;\n onConnect: () => void;\n}): JSX.Element {\n const Icon = entry.icon;\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-profile-divider border-b\"}`}\n >\n <div className=\"bg-profile-icon-bg text-profile-text flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-profile-base text-profile-text font-bold\">\n {entry.label}\n </div>\n <div\n className={`text-profile-sm truncate ${handle ? \"text-profile-text-muted\" : \"text-profile-text-placeholder\"}`}\n >\n {handle || entry.placeholder}\n </div>\n </div>\n <PillButton\n onClick={onConnect}\n icon={handle ? Pencil : Plus}\n label={handle ? \"Edit\" : \"Connect\"}\n />\n </div>\n );\n}\n\nexport type { SocialKey };\n","import { useCallback, useMemo, useState } from \"react\";\nimport { z } from \"zod\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n AddressFormDialog,\n ConfirmActionDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n UserInfoDialog,\n socialFields,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n} from \"@fluid-app/profile-ui\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { useAccountApi } from \"@fluid-app/portal-core/account-api-context\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { usePortalMySiteProfile } from \"@fluid-app/mysite-ui/portal/hooks/use-mysite-portal\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { useLanguagesApi } from \"@fluid-app/store-core/languages-api-context\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { accountKeys, payKeys, storeKeys } from \"../account/query-keys\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { deriveLastName } from \"./profile/derive-last-name\";\nimport { ProfileLayout, type SocialKey } from \"./profile/ProfileLayout\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nfunction mapAccountToCustomerAccount(\n raw: AccountRep,\n): fluidPay.CustomerAccount {\n return {\n fluid_pay_account: {\n id: raw.id,\n email: raw.email,\n address_count: 0,\n payment_methods_count: 0,\n language_iso: null,\n },\n customer: {\n id: raw.id,\n active: true,\n active_subscriptions_count: 0,\n display_total_spent: \"0\",\n email: raw.email,\n first_name: raw.first_name,\n full_name: `${raw.first_name} ${raw.last_name}`.trim(),\n inactive_subscriptions_count: 0,\n is_rep: raw.member_type === \"rep\",\n phone: raw.phone,\n orders_count: 0,\n },\n };\n}\n\nfunction composeAddressName(\n firstName: string,\n lastName: string,\n): string | null {\n const combined = `${firstName} ${lastName}`.trim();\n return combined.length > 0 ? combined : null;\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\ntype SocialFieldKey = (typeof socialFields)[number][\"name\"];\n\nconst SOCIAL_KEY_TO_FIELD: Record<SocialKey, SocialFieldKey | null> = {\n linkedin: \"linkedin\" as SocialFieldKey,\n facebook: \"facebook\" as SocialFieldKey,\n x: \"twitter\" as SocialFieldKey,\n instagram: \"instagram\" as SocialFieldKey,\n youtube: \"youtube\" as SocialFieldKey,\n pinterest: null,\n tiktok: \"tiktok\" as SocialFieldKey,\n};\n\nconst SOCIAL_LABELS: Record<SocialKey, string> = {\n linkedin: \"LinkedIn\",\n facebook: \"Facebook\",\n x: \"X\",\n instagram: \"Instagram\",\n youtube: \"YouTube\",\n pinterest: \"Pinterest\",\n tiktok: \"TikTok\",\n};\n\nconst SOCIAL_PLACEHOLDERS: Record<SocialKey, string> = {\n linkedin: \"linkedin.com/in/username\",\n facebook: \"facebook.com/username\",\n x: \"x.com/username\",\n instagram: \"instagram.com/username\",\n youtube: \"youtube.com/@channel\",\n pinterest: \"pinterest.com/username\",\n tiktok: \"tiktok.com/@username\",\n};\n\nexport function ProfileContentScreen({\n onToast,\n}: ProfileContentScreenProps): React.JSX.Element {\n const { t } = useProfileTranslation();\n const payApi = usePayApi();\n const accountApi = useAccountApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const { data: mySiteProfile } = usePortalMySiteProfile();\n\n const mySiteUrl = mySiteProfile?.mysite_url ?? \"\";\n const mySiteDisplayUrl = mySiteUrl\n ? mySiteUrl.replace(/^https?:\\/\\//, \"\")\n : \"\";\n\n // Reuse the app-wide useAccount() cache entry shared with AppShell/PageRouter.\n const {\n data: accountRep,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useAccount();\n\n const accountData = useMemo(\n () => (accountRep ? mapAccountToCustomerAccount(accountRep) : undefined),\n [accountRep],\n );\n\n const { data: addressesData } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: true,\n });\n\n const { data: paymentMethodsData } = useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n enabled: true,\n });\n\n const countriesAdapter = useCountriesApi();\n const languagesAdapter = useLanguagesApi();\n\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(),\n queryFn: () => countriesAdapter.listCountries(),\n enabled: true,\n });\n\n const { data: languagesData } = useQuery({\n queryKey: storeKeys.languages(),\n queryFn: () => languagesAdapter.listLanguages(),\n enabled: true,\n });\n\n const { data: pointsLedgerData, isError: isPointsLedgerError } = useQuery({\n queryKey: payKeys.pointsLedgers.list(),\n queryFn: () => payApi.fetchPointsLedgers(),\n enabled: true,\n retry: (failureCount, error) => {\n if (\n error instanceof Error &&\n \"status\" in error &&\n (error as { status: number }).status === 403\n ) {\n return false;\n }\n return failureCount < 1;\n },\n });\n\n const rewardPointsEnabled = !isPointsLedgerError && pointsLedgerData != null;\n\n const adaptedPointsLedger: PointsLedger[] = useMemo(() => {\n return (pointsLedgerData?.points_ledgers ?? []).map((entry) => {\n const meta = entry.metadata as {\n transaction_type?: string | null;\n source?: {\n name: string;\n email?: string;\n reason?: string;\n user_id?: number;\n } | null;\n } | null;\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: 0,\n metadata: {\n transaction_type: meta?.transaction_type ?? undefined,\n source: meta?.source ?? undefined,\n },\n total_balance: entry.total_balance,\n updated_at: entry.created_at,\n };\n });\n }, [pointsLedgerData]);\n\n const updateCustomerMutation = useMutation({\n mutationFn: async (data: UserFormData) => {\n await accountApi.updateAccount({\n account: {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n bio: data.bio,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(\"Profile updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update profile\", \"error\");\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(\"Failed to delete payment method\", \"error\");\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(\"Failed to update payment method\", \"error\");\n },\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) =>\n payApi.createAddress({\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Address created\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to create address\", \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Address updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update address\", \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Address deleted\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to delete address\", \"error\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: fluidPay.AddCreditCardData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n default: data.default_payment_method,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onToast(\"Payment method added\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to add payment method\", \"error\");\n },\n });\n\n const addresses = addressesData ?? [];\n const paymentMethods = paymentMethodsData ?? [];\n\n const adaptedLanguages: Language[] = (languagesData?.languages ?? []).map(\n (l, i) => ({ id: i, name: l.name, iso: l.code }),\n );\n\n const countries = countriesData?.countries;\n\n const countryOptions = useMemo(\n () =>\n [...(countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countries]);\n\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n // Dialog open state\n const [isInfoDialogOpen, setIsInfoDialogOpen] = useState(false);\n const [addressDialog, setAddressDialog] = useState<{\n open: boolean;\n selected: fluidPay.CustomerAddress | null;\n }>({ open: false, selected: null });\n const [deletingAddress, setDeletingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [isAddCardOpen, setIsAddCardOpen] = useState(false);\n const [editPaymentMethod, setEditPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n\n // User-info form (for the existing dialog)\n const userInfoLanguage = useMemo(() => {\n return (\n adaptedLanguages.find(\n (l) => l.iso === accountData?.fluid_pay_account.language_iso,\n )?.name ?? \"English\"\n );\n }, [adaptedLanguages, accountData]);\n\n const derivedLastName = useMemo(() => {\n if (!accountData) return \"\";\n const { first_name, full_name } = accountData.customer;\n return deriveLastName(first_name, full_name);\n }, [accountData]);\n\n const userInfoSchema = useMemo(\n () =>\n z.object({\n first_name: z.string().min(1, \"First name is required\"),\n last_name: z.string().min(1, \"Last name is required\"),\n phone_number: z.string().optional(),\n language: z.string().min(1, \"Language is required\"),\n bio: z.string().optional(),\n }),\n [],\n );\n\n const userInfoForm = useZodForm<UserFormData>(userInfoSchema, {\n defaultValues: {\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n },\n });\n\n const handleOpenInfoDialog = useCallback(() => {\n userInfoForm.reset({\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n });\n setIsInfoDialogOpen(true);\n }, [\n accountData,\n accountRep,\n derivedLastName,\n userInfoLanguage,\n userInfoForm,\n ]);\n\n const onSubmitUserInfo = userInfoForm.handleSubmit(async (data) => {\n try {\n await updateCustomerMutation.mutateAsync(data);\n setIsInfoDialogOpen(false);\n } catch {\n // toast surfaced via onError\n }\n });\n\n const socialLinks = useMemo<Partial<Record<SocialKey, string>>>(() => {\n const src: Partial<Record<SocialFieldKey, string>> =\n accountRep?.social_links ?? {};\n const result: Partial<Record<SocialKey, string>> = {};\n for (const [key, field] of Object.entries(SOCIAL_KEY_TO_FIELD) as [\n SocialKey,\n SocialFieldKey | null,\n ][]) {\n if (!field) continue;\n const v = src[field];\n if (typeof v === \"string\" && v.length > 0) {\n result[key] = v;\n }\n }\n return result;\n }, [accountRep]);\n\n const handleCopyMySiteLink = useCallback(async () => {\n if (!mySiteUrl) return;\n try {\n await navigator.clipboard.writeText(mySiteUrl);\n onToast(\"MySite link copied\", \"success\");\n } catch {\n onToast(\"Failed to copy link\", \"error\");\n }\n }, [mySiteUrl, onToast]);\n\n const [editingSocial, setEditingSocial] = useState<SocialKey | null>(null);\n const [socialDraft, setSocialDraft] = useState(\"\");\n\n const handleConnectSocial = useCallback(\n (key: SocialKey) => {\n const field = SOCIAL_KEY_TO_FIELD[key];\n if (!field) {\n onToast(\"This platform isn't editable yet\", \"warning\");\n return;\n }\n const current = accountRep?.social_links?.[field] ?? \"\";\n setSocialDraft(current);\n setEditingSocial(key);\n },\n [accountRep, onToast],\n );\n\n const updateSocialMutation = useMutation({\n mutationFn: async ({\n field,\n value,\n }: {\n field: SocialFieldKey;\n value: string;\n }) => {\n const current = accountRep?.social_links ?? {};\n await accountApi.updateAccount({\n account: {\n social_links: { ...current, [field]: value },\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(\"Social link updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update social link\", \"error\");\n },\n });\n\n const handleSubmitSocial = useCallback(async () => {\n if (!editingSocial) return;\n const field = SOCIAL_KEY_TO_FIELD[editingSocial];\n if (!field) return;\n await updateSocialMutation.mutateAsync({\n field,\n value: socialDraft.trim(),\n });\n setEditingSocial(null);\n }, [editingSocial, socialDraft, updateSocialMutation]);\n\n if (isAccountError && !isLoadingAccount) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"text-muted-foreground text-center text-sm\">\n Unable to load account data. Please try again later.\n </div>\n </div>\n );\n }\n\n if (isLoadingAccount || !accountData || !accountRep) {\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-16 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n const pointsBalance = rewardPointsEnabled\n ? (pointsLedgerData?.points_ledgers?.[0]?.total_balance ?? 0)\n : undefined;\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileLayout\n account={accountRep}\n pointsBalance={pointsBalance}\n pointsLedger={adaptedPointsLedger}\n rewardsEnabled={rewardPointsEnabled}\n addresses={addresses}\n paymentMethods={paymentMethods}\n mySiteDisplayUrl={mySiteDisplayUrl}\n socialLinks={socialLinks}\n onEditPersonalInfo={handleOpenInfoDialog}\n onAddAddress={() => setAddressDialog({ open: true, selected: null })}\n onEditAddress={(address) =>\n setAddressDialog({ open: true, selected: address })\n }\n onDeleteAddress={(address) => setDeletingAddress(address)}\n onAddPaymentMethod={() => setIsAddCardOpen(true)}\n onEditPaymentMethod={(pm) => setEditPaymentMethod(pm)}\n onCopyMySiteLink={handleCopyMySiteLink}\n onConnectSocial={handleConnectSocial}\n />\n\n <UserInfoDialog\n control={userInfoForm.control}\n isOpen={isInfoDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={() => setIsInfoDialogOpen(false)}\n languageOptions={adaptedLanguages.map((l) => ({\n name: l.name,\n value: l.name,\n }))}\n errorMsg={undefined}\n isSubmitting={updateCustomerMutation.isPending}\n email={accountRep.email ?? \"\"}\n />\n\n <AddressFormDialog\n isOpen={addressDialog.open}\n onClose={() => setAddressDialog({ open: false, selected: null })}\n selectedAddress={addressDialog.selected}\n t={(key: string) => t(key as never)}\n onSubmit={async (formData) => {\n if (addressDialog.selected) {\n await updateAddressMutation.mutateAsync({\n addressId: addressDialog.selected.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n setAddressDialog({ open: false, selected: null });\n }}\n isSubmitting={\n createAddressMutation.isPending || updateAddressMutation.isPending\n }\n onDelete={\n addressDialog.selected && !addressDialog.selected.default\n ? async () => {\n if (!addressDialog.selected) return;\n try {\n await deleteAddressMutation.mutateAsync(\n addressDialog.selected.id,\n );\n setAddressDialog({ open: false, selected: null });\n } catch {\n // toast surfaced via onError\n }\n }\n : undefined\n }\n isDeleting={deleteAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n renderAddressAutocomplete={({ control, setValue, countryCode }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"postal_code\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n openDialog={deletingAddress !== null}\n setOpenDialog={(open) => {\n if (!open) setDeletingAddress(null);\n }}\n onAction={async () => {\n if (!deletingAddress) return;\n try {\n await deleteAddressMutation.mutateAsync(deletingAddress.id);\n setDeletingAddress(null);\n } catch {\n // toast surfaced via onError\n }\n }}\n isLoading={deleteAddressMutation.isPending}\n actionText={t(\"delete\")}\n />\n\n <CreditCardFormDialog\n isOpen={isAddCardOpen}\n onClose={() => setIsAddCardOpen(false)}\n t={(key: string) => t(key as never)}\n onSubmit={async (data) => {\n try {\n await addCreditCardMutation.mutateAsync(data);\n setIsAddCardOpen(false);\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={addCreditCardMutation.isPending}\n countries={countryOptions}\n jwt=\"\"\n renderAddressAutocomplete={({ control, setValue, countryCode }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"zip\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n\n {editPaymentMethod && (\n <EditPaymentMethodDialog\n isOpen\n onClose={() => setEditPaymentMethod(null)}\n paymentMethod={editPaymentMethod}\n countries={countryOptions}\n onSubmit={(data) => {\n updatePaymentMethodMutation.mutate(\n { paymentMethodId: editPaymentMethod.id, data },\n { onSuccess: () => setEditPaymentMethod(null) },\n );\n }}\n isSubmitting={updatePaymentMethodMutation.isPending}\n onDelete={() => {\n deletePaymentMethodMutation.mutate(editPaymentMethod.id, {\n onSuccess: () => setEditPaymentMethod(null),\n });\n }}\n isDeleting={deletePaymentMethodMutation.isPending}\n />\n )}\n\n <Dialog\n open={editingSocial !== null}\n onOpenChange={(open) => !open && setEditingSocial(null)}\n >\n <DialogContent className=\"max-w-sm md:max-w-md\">\n <DialogHeader>\n <DialogTitle>\n {editingSocial\n ? `Edit ${SOCIAL_LABELS[editingSocial]} link`\n : \"Edit social link\"}\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"social-handle\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n URL\n </Label>\n <Input\n id=\"social-handle\"\n value={socialDraft}\n onChange={(e) => setSocialDraft(e.target.value)}\n placeholder={\n editingSocial ? SOCIAL_PLACEHOLDERS[editingSocial] : \"\"\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void handleSubmitSocial();\n }\n }}\n autoFocus\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setEditingSocial(null)}\n disabled={updateSocialMutation.isPending}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitSocial();\n }}\n disabled={updateSocialMutation.isPending}\n >\n {updateSocialMutation.isPending ? \"Saving...\" : \"Save\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </FluidPayCoreProvider>\n );\n}\n","import { type ComponentProps, useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n return (\n <ProfileTranslationBridge>\n <ProfileScreenContent\n onToast={effectiveToast}\n countryIso={countryIso}\n divProps={divProps}\n />\n </ProfileTranslationBridge>\n );\n}\n\nfunction ProfileScreenContent({\n onToast,\n countryIso,\n divProps,\n}: {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n divProps: ComponentProps<\"div\">;\n}): React.JSX.Element {\n const { t } = useProfileTranslation();\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [t],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div {...divProps}>\n <ProfileContentScreen onToast={onToast} countryIso={countryIso} />\n </div>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
@@ -1,85 +0,0 @@
1
- import { createContext, useContext, useEffect, useRef, useState } from "react";
2
- import { jsx } from "react/jsx-runtime";
3
- //#region ../react/src/shell/ScreenHeaderContext.tsx
4
- /**
5
- * Split into separate read/write contexts so that components calling
6
- * useScreenHeaderActions (writers) don't re-render when the actions
7
- * state changes — only the ScreenHeader (reader) re-renders.
8
- */
9
- const ScreenHeaderWriteContext = createContext(null);
10
- const ScreenHeaderReadContext = createContext(null);
11
- const ScreenHeaderBreadcrumbsWriteContext = createContext(null);
12
- const ScreenHeaderBreadcrumbsReadContext = createContext(null);
13
- function ScreenHeaderProvider({ children }) {
14
- const [actions, setActions] = useState(null);
15
- const [breadcrumbs, setBreadcrumbs] = useState(null);
16
- return /* @__PURE__ */ jsx(ScreenHeaderWriteContext.Provider, {
17
- value: setActions,
18
- children: /* @__PURE__ */ jsx(ScreenHeaderReadContext.Provider, {
19
- value: actions,
20
- children: /* @__PURE__ */ jsx(ScreenHeaderBreadcrumbsWriteContext.Provider, {
21
- value: setBreadcrumbs,
22
- children: /* @__PURE__ */ jsx(ScreenHeaderBreadcrumbsReadContext.Provider, {
23
- value: breadcrumbs,
24
- children
25
- })
26
- })
27
- })
28
- });
29
- }
30
- /**
31
- * Sets actions to display in the ScreenHeader.
32
- * Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),
33
- * `false` otherwise. Pages can use this boolean to conditionally skip
34
- * rendering their own PageHeader.
35
- *
36
- * Cleans up actions on unmount so navigating away doesn't leave stale actions.
37
- */
38
- function useScreenHeaderActions(actions) {
39
- const setActions = useContext(ScreenHeaderWriteContext);
40
- const setActionsRef = useRef(setActions);
41
- setActionsRef.current = setActions;
42
- useEffect(() => {
43
- if (!setActions) return;
44
- setActions(actions);
45
- }, [actions, setActions]);
46
- useEffect(() => {
47
- return () => setActionsRef.current?.(null);
48
- }, []);
49
- return setActions !== null;
50
- }
51
- /**
52
- * Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).
53
- * Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),
54
- * `false` otherwise.
55
- *
56
- * Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.
57
- */
58
- function useScreenHeaderBreadcrumbs(breadcrumbs) {
59
- const setBreadcrumbs = useContext(ScreenHeaderBreadcrumbsWriteContext);
60
- const setBreadcrumbsRef = useRef(setBreadcrumbs);
61
- setBreadcrumbsRef.current = setBreadcrumbs;
62
- useEffect(() => {
63
- if (!setBreadcrumbs) return;
64
- setBreadcrumbs(breadcrumbs);
65
- }, [breadcrumbs, setBreadcrumbs]);
66
- useEffect(() => {
67
- return () => setBreadcrumbsRef.current?.(null);
68
- }, []);
69
- return setBreadcrumbs !== null;
70
- }
71
- /**
72
- * Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.
73
- */
74
- function useScreenHeaderContext() {
75
- const actions = useContext(ScreenHeaderReadContext);
76
- const breadcrumbs = useContext(ScreenHeaderBreadcrumbsReadContext);
77
- return {
78
- actions: actions ?? null,
79
- breadcrumbs: breadcrumbs ?? null
80
- };
81
- }
82
- //#endregion
83
- export { useScreenHeaderContext as i, useScreenHeaderActions as n, useScreenHeaderBreadcrumbs as r, ScreenHeaderProvider as t };
84
-
85
- //# sourceMappingURL=ScreenHeaderContext-BDjNSUfr.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ScreenHeaderContext-BDjNSUfr.mjs","names":[],"sources":["../../react/src/shell/ScreenHeaderContext.tsx"],"sourcesContent":["\"use client\";\n\nimport type React from \"react\";\nimport {\n createContext,\n useContext,\n useState,\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\n\ntype SetActions = (actions: ReactNode) => void;\ntype SetBreadcrumbs = (breadcrumbs: ReactNode) => void;\n\n/**\n * Split into separate read/write contexts so that components calling\n * useScreenHeaderActions (writers) don't re-render when the actions\n * state changes — only the ScreenHeader (reader) re-renders.\n */\nconst ScreenHeaderWriteContext = createContext<SetActions | null>(null);\nconst ScreenHeaderReadContext = createContext<ReactNode>(null);\n\nconst ScreenHeaderBreadcrumbsWriteContext =\n createContext<SetBreadcrumbs | null>(null);\nconst ScreenHeaderBreadcrumbsReadContext = createContext<ReactNode>(null);\n\nexport function ScreenHeaderProvider({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const [actions, setActions] = useState<ReactNode>(null);\n const [breadcrumbs, setBreadcrumbs] = useState<ReactNode>(null);\n\n return (\n <ScreenHeaderWriteContext.Provider value={setActions}>\n <ScreenHeaderReadContext.Provider value={actions}>\n <ScreenHeaderBreadcrumbsWriteContext.Provider value={setBreadcrumbs}>\n <ScreenHeaderBreadcrumbsReadContext.Provider value={breadcrumbs}>\n {children}\n </ScreenHeaderBreadcrumbsReadContext.Provider>\n </ScreenHeaderBreadcrumbsWriteContext.Provider>\n </ScreenHeaderReadContext.Provider>\n </ScreenHeaderWriteContext.Provider>\n );\n}\n\n/**\n * Sets actions to display in the ScreenHeader.\n * Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),\n * `false` otherwise. Pages can use this boolean to conditionally skip\n * rendering their own PageHeader.\n *\n * Cleans up actions on unmount so navigating away doesn't leave stale actions.\n */\nexport function useScreenHeaderActions(actions: ReactNode): boolean {\n const setActions = useContext(ScreenHeaderWriteContext);\n const setActionsRef = useRef(setActions);\n setActionsRef.current = setActions;\n\n // Update actions when the value changes\n useEffect(() => {\n if (!setActions) return;\n setActions(actions);\n }, [actions, setActions]);\n\n // Clear actions only on unmount\n useEffect(() => {\n return () => setActionsRef.current?.(null);\n }, []);\n\n return setActions !== null;\n}\n\n/**\n * Sets breadcrumbs to display in the ScreenHeader (in place of the plain title).\n * Returns `true` if inside a ScreenHeaderProvider (i.e., in the portal shell),\n * `false` otherwise.\n *\n * Cleans up breadcrumbs on unmount so navigating away doesn't leave stale breadcrumbs.\n */\nexport function useScreenHeaderBreadcrumbs(breadcrumbs: ReactNode): boolean {\n const setBreadcrumbs = useContext(ScreenHeaderBreadcrumbsWriteContext);\n const setBreadcrumbsRef = useRef(setBreadcrumbs);\n setBreadcrumbsRef.current = setBreadcrumbs;\n\n // Update breadcrumbs when the value changes\n useEffect(() => {\n if (!setBreadcrumbs) return;\n setBreadcrumbs(breadcrumbs);\n }, [breadcrumbs, setBreadcrumbs]);\n\n // Clear breadcrumbs only on unmount\n useEffect(() => {\n return () => setBreadcrumbsRef.current?.(null);\n }, []);\n\n return setBreadcrumbs !== null;\n}\n\n/**\n * Reads the current screen header actions and breadcrumbs. Used internally by ScreenHeader.\n */\nexport function useScreenHeaderContext(): {\n actions: ReactNode;\n breadcrumbs: ReactNode;\n} {\n const actions = useContext(ScreenHeaderReadContext);\n const breadcrumbs = useContext(ScreenHeaderBreadcrumbsReadContext);\n return { actions: actions ?? null, breadcrumbs: breadcrumbs ?? null };\n}\n"],"mappings":";;;;;;;;AAoBA,MAAM,2BAA2B,cAAiC,KAAK;AACvE,MAAM,0BAA0B,cAAyB,KAAK;AAE9D,MAAM,sCACJ,cAAqC,KAAK;AAC5C,MAAM,qCAAqC,cAAyB,KAAK;AAEzE,SAAgB,qBAAqB,EACnC,YAGoB;CACpB,MAAM,CAAC,SAAS,cAAc,SAAoB,KAAK;CACvD,MAAM,CAAC,aAAa,kBAAkB,SAAoB,KAAK;AAE/D,QACE,oBAAC,yBAAyB,UAA1B;EAAmC,OAAO;YACxC,oBAAC,wBAAwB,UAAzB;GAAkC,OAAO;aACvC,oBAAC,oCAAoC,UAArC;IAA8C,OAAO;cACnD,oBAAC,mCAAmC,UAApC;KAA6C,OAAO;KACjD;KAC2C,CAAA;IACD,CAAA;GACd,CAAA;EACD,CAAA;;;;;;;;;;AAYxC,SAAgB,uBAAuB,SAA6B;CAClE,MAAM,aAAa,WAAW,yBAAyB;CACvD,MAAM,gBAAgB,OAAO,WAAW;AACxC,eAAc,UAAU;AAGxB,iBAAgB;AACd,MAAI,CAAC,WAAY;AACjB,aAAW,QAAQ;IAClB,CAAC,SAAS,WAAW,CAAC;AAGzB,iBAAgB;AACd,eAAa,cAAc,UAAU,KAAK;IACzC,EAAE,CAAC;AAEN,QAAO,eAAe;;;;;;;;;AAUxB,SAAgB,2BAA2B,aAAiC;CAC1E,MAAM,iBAAiB,WAAW,oCAAoC;CACtE,MAAM,oBAAoB,OAAO,eAAe;AAChD,mBAAkB,UAAU;AAG5B,iBAAgB;AACd,MAAI,CAAC,eAAgB;AACrB,iBAAe,YAAY;IAC1B,CAAC,aAAa,eAAe,CAAC;AAGjC,iBAAgB;AACd,eAAa,kBAAkB,UAAU,KAAK;IAC7C,EAAE,CAAC;AAEN,QAAO,mBAAmB;;;;;AAM5B,SAAgB,yBAGd;CACA,MAAM,UAAU,WAAW,wBAAwB;CACnD,MAAM,cAAc,WAAW,mCAAmC;AAClE,QAAO;EAAE,SAAS,WAAW;EAAM,aAAa,eAAe;EAAM"}