@fluid-app/portal-sdk 0.1.26 → 0.1.28
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.
- package/dist/{AccountScreen-DTv1-206.cjs → AccountScreen-Dp6QFyEr.cjs} +2 -2
- package/dist/{AccountScreen-DTv1-206.cjs.map → AccountScreen-Dp6QFyEr.cjs.map} +1 -1
- package/dist/{AccountScreen-BigIbqV5.mjs → AccountScreen-E4ZBgOUS.mjs} +2 -2
- package/dist/{AccountScreen-BigIbqV5.mjs.map → AccountScreen-E4ZBgOUS.mjs.map} +1 -1
- package/dist/{AccountScreen-B0p9WJoI.cjs → AccountScreen-Vzz8W4Iq.cjs} +3 -3
- package/dist/{FluidProvider-PqLUzyvQ.cjs → FluidProvider-BmkSwcgV.cjs} +3 -3
- package/dist/{FluidProvider-PqLUzyvQ.cjs.map → FluidProvider-BmkSwcgV.cjs.map} +1 -1
- package/dist/{FluidProvider-Bp1sNJnr.mjs → FluidProvider-x96kqsgN.mjs} +3 -3
- package/dist/{FluidProvider-Bp1sNJnr.mjs.map → FluidProvider-x96kqsgN.mjs.map} +1 -1
- package/dist/LayoutWidget-Dc_wvaLg.mjs.map +1 -1
- package/dist/LayoutWidget-fOBC-EML.cjs.map +1 -1
- package/dist/{MessagingScreen-CcxyIep3.cjs → MessagingScreen-C33eDdna.cjs} +3 -3
- package/dist/{MessagingScreen-D7xu52lk.mjs → MessagingScreen-DVU3c8fX.mjs} +3 -4
- package/dist/{MessagingScreen-7pC6SdRs.mjs → MessagingScreen-II_iNqLk.mjs} +3 -3
- package/dist/{MessagingScreen-7pC6SdRs.mjs.map → MessagingScreen-II_iNqLk.mjs.map} +1 -1
- package/dist/{MessagingScreen-C-kF4Z5h.cjs → MessagingScreen-sAWF7pjl.cjs} +3 -3
- package/dist/{MessagingScreen-C-kF4Z5h.cjs.map → MessagingScreen-sAWF7pjl.cjs.map} +1 -1
- package/dist/{ProductsScreen-DwcIB1Tp.mjs → ProductsScreen-BOngRxSO.mjs} +4 -4
- package/dist/{ProductsScreen-DwcIB1Tp.mjs.map → ProductsScreen-BOngRxSO.mjs.map} +1 -1
- package/dist/{ProductsScreen-7t1oNY_N.cjs → ProductsScreen-CdP_m_Ok.cjs} +4 -4
- package/dist/{ProductsScreen-FZS6vPqz.mjs → ProductsScreen-DrrBYFl0.mjs} +4 -6
- package/dist/{ProductsScreen-DeXWGZXc.cjs → ProductsScreen-DzD-TPh5.cjs} +4 -4
- package/dist/{ProductsScreen-DeXWGZXc.cjs.map → ProductsScreen-DzD-TPh5.cjs.map} +1 -1
- package/dist/{ShareablesScreen-D2iE3ytr.mjs → ShareablesScreen-BsqZvRSK.mjs} +4 -6
- package/dist/{ShareablesScreen-8gKrJQn3.mjs → ShareablesScreen-CQy39TAK.mjs} +4 -4
- package/dist/{ShareablesScreen-8gKrJQn3.mjs.map → ShareablesScreen-CQy39TAK.mjs.map} +1 -1
- package/dist/{ShareablesScreen-B-kEPPCb.cjs → ShareablesScreen-DYPJgZ3z.cjs} +4 -4
- package/dist/{ShareablesScreen-B-kEPPCb.cjs.map → ShareablesScreen-DYPJgZ3z.cjs.map} +1 -1
- package/dist/{ShareablesScreen-Cx87emjz.cjs → ShareablesScreen-jHqLmOC6.cjs} +4 -4
- package/dist/{ShopScreen-Ds4MVzZT.cjs → ShopScreen--pUsiUNt.cjs} +3 -3
- package/dist/{ShopScreen-BMCb4k-O.mjs → ShopScreen-BKBzgkr7.mjs} +3 -3
- package/dist/{ShopScreen-BMCb4k-O.mjs.map → ShopScreen-BKBzgkr7.mjs.map} +1 -1
- package/dist/{ShopScreen-BstU0BQe.cjs → ShopScreen-BPCwix1m.cjs} +3 -3
- package/dist/{ShopScreen-BstU0BQe.cjs.map → ShopScreen-BPCwix1m.cjs.map} +1 -1
- package/dist/{TableWidget-D-r0EQ_2.cjs → TableWidget-2ttj9H5g.cjs} +10 -7
- package/dist/TableWidget-2ttj9H5g.cjs.map +1 -0
- package/dist/{TableWidget-D_6Qi3m8.mjs → TableWidget-BbjQhI2A.mjs} +10 -7
- package/dist/TableWidget-BbjQhI2A.mjs.map +1 -0
- package/dist/{TableWidget-1Bp4ZHK8.cjs → TableWidget-eVjxq7Lv.cjs} +1 -1
- package/dist/index.cjs +28 -21
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -0
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +28 -21
- package/dist/index.mjs.map +1 -1
- package/dist/{products-Bu0IiW0A.mjs → products-BAFSvGSa.mjs} +2 -2
- package/dist/{products-Bu0IiW0A.mjs.map → products-BAFSvGSa.mjs.map} +1 -1
- package/dist/{products-CzuNSVSG.cjs → products-CH5kIItT.cjs} +2 -2
- package/dist/{products-CzuNSVSG.cjs.map → products-CH5kIItT.cjs.map} +1 -1
- package/dist/registries-4OQmN6DO.cjs.map +1 -1
- package/dist/registries-Qk8P123O.mjs.map +1 -1
- package/dist/{src-BFKgg3tf.mjs → src-9pW9wS5O.mjs} +2 -2
- package/dist/{src-BFKgg3tf.mjs.map → src-9pW9wS5O.mjs.map} +1 -1
- package/dist/{src-MZ0kePDW.cjs → src-DMjlIMO9.cjs} +2 -2
- package/dist/{src-MZ0kePDW.cjs.map → src-DMjlIMO9.cjs.map} +1 -1
- package/dist/{use-fluid-api-CTRIRz1H.cjs → use-fluid-api-DvJuEWRf.cjs} +2 -2
- package/dist/{use-fluid-api-CTRIRz1H.cjs.map → use-fluid-api-DvJuEWRf.cjs.map} +1 -1
- package/dist/{use-fluid-api-dCyPDaGZ.mjs → use-fluid-api-Zq9sZ5vk.mjs} +2 -2
- package/dist/{use-fluid-api-dCyPDaGZ.mjs.map → use-fluid-api-Zq9sZ5vk.mjs.map} +1 -1
- package/package.json +11 -11
- package/dist/TableWidget-D-r0EQ_2.cjs.map +0 -1
- package/dist/TableWidget-D_6Qi3m8.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountScreen-DTv1-206.cjs","names":["useFluidAuthContext","useOrdersClient","useFluidContext","createOrdersFetchClient","useSubscriptionsClient","createSubscriptionsFetchClient","createFluidPayFetchClient","createCoreFetchClient","User","PackageOpen","Repeat","useAppNavigation","Button","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","DialogClose","Button","Accordion","AccordionItem","AccordionTrigger","Skeleton","AccordionContent","cn","FormTextField","cn","Label","Input","FormSelectField","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Dialog","DialogContent","DialogHeader","DialogTitle","FormTextField","FormSelectField","DialogFooter","DialogClose","Button","z","Avatar","AvatarFallback","Pencil","Accordion","AccordionItem","AccordionTrigger","Skeleton","AccordionContent","cn","Accordion","AccordionItem","AccordionTrigger","Skeleton","AccordionContent","cn","Dialog","DialogContent","DialogHeader","DialogTitle","Button","DialogFooter","DialogClose","z","Dialog","DialogContent","DialogHeader","DialogTitle","FormSelectField","FormTextField","DialogFooter","Button","cn","Input","cn","Controller","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","z","Dialog","DialogContent","DialogHeader","DialogTitle","Button","z","cn","vaultApi.fetchVaultCredentialsForPaymentAccount","Dialog","DialogContent","DialogHeader","DialogTitle","Button","translations","customersApi.fetchCustomerAccount","addressesApi.fetchCustomerAddresses","paymentMethodsApi.fetchCustomerPaymentMethods","customersApi.updateCustomer","addressesApi.deleteCustomerAddress","paymentMethodsApi.deleteCustomerPaymentMethod","paymentMethodsApi.updatePaymentMethod","addressesApi.createCustomerAddress","addressesApi.updateCustomerAddress","paymentMethodsApi.addCreditCardToCustomer","ordersApi.fetchOrder","ordersApi.fetchCustomerOrders","Search","Input","cn","ChevronLeft","ChevronRight","cn","cn","Skeleton","Card","CardHeader","CardTitle","CardContent","Card","CardHeader","CardTitle","CardContent","Truck","startCase","formatCurrency","startCase","Card","CardHeader","CardTitle","CardContent","startCase","Skeleton","formatCurrency","startCase","translations","useOrdersClient","useAppNavigation","useOrdersClient","useAppNavigation","subscriptionsApi.fetchCustomerSubscriptions","subscriptionsApi.fetchSubscription","subscriptionsApi.pauseSubscription","subscriptionsApi.resumeSubscription","subscriptionsApi.skipSubscription","subscriptionsApi.cancelSubscription","subscriptionsApi.reactivateSubscription","Button","Search","Input","Skeleton","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","Skeleton","Button","SkipForward","Pause","Play","XCircle","RotateCcw","useSubscriptionsClient","useAppNavigation","useSubscriptionsClient","useAppNavigation","useAppNavigation","useFluidContext","customersApi.fetchCustomerAccount"],"sources":["../../../platform/api-client-core/src/parse-api-errors.ts","../src/hooks/use-fluid-auth.ts","../../../fluid-pay/api-client/src/namespaces/customers.ts","../../../fluid-pay/api-client/src/namespaces/addresses.ts","../../../fluid-pay/api-client/src/namespaces/payment-methods.ts","../../../fluid-pay/api-client/src/namespaces/vault.ts","../../../orders/api-client/src/namespaces/orders.ts","../../../subscriptions/api-client/src/namespaces/subscriptions.ts","../src/account/use-account-clients.ts","../src/account/AccountManageLayout.tsx","../../../profile/core/src/context.ts","../../../profile/core/src/provider.tsx","../../../fluid-pay/core/src/utils/country-config.ts","../../../fluid-pay/core/src/hooks/use-country-states.ts","../../../profile/ui/src/components/ellipses-dropdown.tsx","../../../profile/ui/src/components/confirm-action-dialog.tsx","../../../profile/ui/src/components/customer-points-ledger.tsx","../../../profile/ui/src/components/form-fields.tsx","../../../profile/ui/src/components/user-info-dialog.tsx","../../../profile/ui/src/components/customer-info.tsx","../../../profile/ui/src/components/address-dropdown.tsx","../../../profile/ui/src/components/addresses.tsx","../../../profile/ui/src/components/payment-method-dropdown.tsx","../../../profile/ui/src/components/view-payment-method-dialog.tsx","../../../profile/ui/src/components/edit-payment-method-dialog.tsx","../../../profile/ui/src/components/payment-methods.tsx","../../../profile/ui/src/components/profile.tsx","../../../fluid-pay/ui/src/components/form-fields/FormTextField.tsx","../../../fluid-pay/ui/src/components/form-fields/FormSelectField.tsx","../../../fluid-pay/ui/src/components/AddressFormDialog.tsx","../../../fluid-pay/ui/src/hooks/use-vgs-collect.ts","../../../fluid-pay/ui/src/components/CreditCardFormDialog.tsx","../src/screens/AccountProfileScreen.tsx","../../../orders/core/src/context.ts","../../../orders/core/src/provider.tsx","../../../orders/core/src/query-keys.ts","../../../orders/core/src/hooks/use-order.ts","../../../orders/core/src/hooks/use-customer-orders.ts","../../../orders/core/src/utils/format-order-total.ts","../../../orders/ui/src/components/search-input.tsx","../../../orders/ui/src/components/pagination-footer.tsx","../../../orders/ui/src/components/status-badge.tsx","../../../orders/ui/src/components/table-column.tsx","../../../orders/ui/src/components/orders-list.tsx","../../../orders/ui/src/components/section.tsx","../../../orders/ui/src/components/shipping-address-card.tsx","../../../orders/ui/src/lib/format.ts","../../../orders/ui/src/components/payment-method-card.tsx","../../../orders/ui/src/components/order-status-badge.tsx","../../../orders/ui/src/components/order-detail.tsx","../src/screens/AccountOrdersScreen.tsx","../src/screens/AccountOrderDetailScreen.tsx","../../../subscriptions/core/src/context.ts","../../../subscriptions/core/src/provider.tsx","../../../subscriptions/core/src/query-keys.ts","../../../subscriptions/core/src/hooks/use-subscriptions.ts","../../../subscriptions/core/src/hooks/use-subscription.ts","../../../subscriptions/core/src/hooks/use-pause-subscription.ts","../../../subscriptions/core/src/hooks/use-resume-subscription.ts","../../../subscriptions/core/src/hooks/use-skip-subscription.ts","../../../subscriptions/core/src/hooks/use-cancel-subscription.ts","../../../subscriptions/core/src/hooks/use-reactivate-subscription.ts","../../../subscriptions/core/src/utils/subscription-helpers.ts","../../../subscriptions/ui/src/lib/cn.ts","../../../subscriptions/ui/src/lib/format.ts","../../../subscriptions/ui/src/components/status-pill.tsx","../../../subscriptions/ui/src/components/subscriptions-list.tsx","../../../subscriptions/ui/src/components/confirm-dialog.tsx","../../../subscriptions/ui/src/components/subscription-detail.tsx","../src/screens/AccountSubscriptionsScreen.tsx","../src/screens/AccountSubscriptionDetailScreen.tsx","../src/screens/AccountScreen.tsx"],"sourcesContent":["/**\n * Framework-agnostic API error parsing utilities.\n *\n * Extracts structured field-level errors from API responses and formats\n * them into human-readable messages. Works with ApiError from this package\n * as well as any error object that has `status`, `data`, and optional `message`.\n */\n\n/**\n * Converts snake_case or camelCase field names to Title Case\n */\nexport function formatFieldName(field: string): string {\n return field\n .replace(/_/g, \" \")\n .replace(/([A-Z])/g, \" $1\")\n .split(\" \")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \")\n .trim();\n}\n\nexport interface ParsedFieldError {\n field: string;\n messages: string[];\n}\n\n/**\n * Type guard to check if an error looks like an API error\n */\nexport function isApiLikeError(\n error: unknown,\n): error is { message: string | undefined; status: number; data: unknown } {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n\n const err = error as Record<string, unknown>;\n return (\n typeof err.status === \"number\" &&\n \"data\" in err &&\n (typeof err.message === \"string\" || err.message === undefined)\n );\n}\n\n/**\n * Extracts field-level errors from API error data\n */\nexport function extractFieldErrors(data: unknown): ParsedFieldError[] {\n const errors: ParsedFieldError[] = [];\n\n if (!data || typeof data !== \"object\") {\n return errors;\n }\n\n const errorObj = data as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(errorObj)) {\n if (Array.isArray(value) && value.length > 0) {\n errors.push({\n field: formatFieldName(key),\n messages: value.map((item) =>\n typeof item === \"string\" ? item : JSON.stringify(item),\n ),\n });\n } else if (typeof value === \"string\" && value.length > 0) {\n errors.push({\n field: formatFieldName(key),\n messages: [value],\n });\n } else if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const nestedErrors = extractFieldErrors(value);\n nestedErrors.forEach((nestedError) => {\n errors.push({\n field: `${formatFieldName(key)} → ${nestedError.field}`,\n messages: nestedError.messages,\n });\n });\n }\n }\n\n return errors;\n}\n\n/**\n * Formats field errors into a readable description string\n */\nexport function formatErrorDescription(errors: ParsedFieldError[]): string {\n if (errors.length === 0) {\n return \"\";\n }\n\n if (errors.length === 1) {\n const err = errors[0];\n if (!err) return \"\";\n const message = err.messages[0] || \"is invalid\";\n return `${err.field} ${message}`;\n }\n\n if (errors.length <= 3) {\n return errors\n .map((e) => `${e.field} ${e.messages[0] || \"is invalid\"}`)\n .join(\"\\n\");\n }\n\n const shown = errors\n .slice(0, 3)\n .map((e) => `${e.field} ${e.messages[0] || \"is invalid\"}`)\n .join(\"\\n\");\n const remaining = errors.length - 3;\n return `${shown}\\n...and ${remaining} more ${remaining === 1 ? \"error\" : \"errors\"}`;\n}\n\n/**\n * Parses an error and returns a human-readable description string.\n *\n * Handles:\n * - API-like errors with structured field-level data\n * - API-like errors with a top-level message\n * - Standard Error instances\n * - Falls back to the provided fallback string\n *\n * @param error - The error to parse (ApiError, Error, or unknown)\n * @param fallback - Optional fallback description if error cannot be parsed\n * @returns A human-readable error description, or undefined if nothing could be extracted\n */\nexport function parseApiErrors(\n error: unknown,\n fallback?: string,\n): string | undefined {\n if (isApiLikeError(error)) {\n if (error.data) {\n const fieldErrors = extractFieldErrors(error.data);\n if (fieldErrors.length > 0) {\n return formatErrorDescription(fieldErrors);\n }\n }\n\n if (error.message) {\n return error.message;\n }\n } else if (error instanceof Error) {\n return error.message;\n }\n\n return fallback;\n}\n","/**\n * useFluidAuth Hook\n *\n * Provides access to authentication state and utilities.\n * This is the primary hook for interacting with auth in components.\n */\n\nimport { useFluidAuthContext } from \"../providers/FluidAuthProvider\";\nimport type { FluidAuthContextValue } from \"../auth/types\";\n\n/**\n * Hook to access authentication state and utilities.\n *\n * Must be used within a `FluidAuthProvider`.\n *\n * @returns Authentication context with user info, loading state, and utilities\n * @throws Error if used outside FluidAuthProvider\n *\n * @example\n * ```tsx\n * function UserProfile() {\n * const { isAuthenticated, isLoading, user, clearAuth } = useFluidAuth();\n *\n * if (isLoading) {\n * return <Spinner />;\n * }\n *\n * if (!isAuthenticated) {\n * return <p>Please log in</p>;\n * }\n *\n * return (\n * <div>\n * <p>Welcome, {user.full_name}!</p>\n * <button onClick={clearAuth}>Log out</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useFluidAuth(): FluidAuthContextValue {\n return useFluidAuthContext();\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch the current customer's account info.\n * Endpoint: GET /fluid_pay/me?jwt={jwt}\n */\nexport async function fetchCustomerAccount(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.CustomerAccount> {\n return client.get(`/fluid_pay/me`, { jwt });\n}\n\n/**\n * Update customer profile (name, phone, language).\n * Endpoint: PATCH /fluid_pay/update_me?jwt={jwt}\n */\nexport async function updateCustomer(\n client: FetchClient,\n jwt: string,\n body: fluidPay.UpdateCustomerBody,\n): Promise<fluidPay.FluidPayAccountResponse> {\n return client.patch(`/fluid_pay/update_me?jwt=${jwt}`, {\n fluid_pay_account: body,\n });\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch all customer addresses.\n * Endpoint: GET /fluid_pay/addresses?jwt={jwt}\n */\nexport async function fetchCustomerAddresses(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.CustomerAddressResponse> {\n return client.get(\"/fluid_pay/addresses\", {\n jwt,\n page: \"1\",\n per_page: \"100\",\n });\n}\n\n/**\n * Create a new customer address.\n * Endpoint: POST /fluid_pay/create_address?jwt={jwt}\n */\nexport async function createCustomerAddress(\n client: FetchClient,\n jwt: string,\n body: fluidPay.CreateAddressBody,\n): Promise<fluidPay.CreateCustomerAddressResponse> {\n return client.post(`/fluid_pay/create_address?jwt=${jwt}`, body);\n}\n\n/**\n * Update an existing customer address.\n * Endpoint: PATCH /fluid_pay/update_address/{addressId}?jwt={jwt}\n */\nexport async function updateCustomerAddress(\n client: FetchClient,\n jwt: string,\n addressId: number,\n body: fluidPay.CreateAddressBody,\n): Promise<fluidPay.CreateCustomerAddressResponse> {\n return client.patch(\n `/fluid_pay/update_address/${addressId}?jwt=${jwt}`,\n body,\n );\n}\n\n/**\n * Delete a customer address.\n * Endpoint: DELETE /fluid_pay/delete_address/{addressId}?jwt={jwt}\n */\nexport async function deleteCustomerAddress(\n client: FetchClient,\n jwt: string,\n addressId: number,\n): Promise<Record<string, never>> {\n return client.delete(`/fluid_pay/delete_address/${addressId}?jwt=${jwt}`);\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch all customer payment methods.\n * Endpoint: GET /fluid_pay/payment_methods?jwt={jwt}\n */\nexport async function fetchCustomerPaymentMethods(\n client: FetchClient,\n jwt: string,\n countryCode?: string,\n): Promise<fluidPay.CustomerPaymentMethodsResponse> {\n const params: Record<string, string> = {\n jwt,\n page: \"1\",\n per_page: \"100\",\n };\n if (countryCode) params.country_code = countryCode;\n\n return client.get(\"/fluid_pay/payment_methods\", params);\n}\n\n/**\n * Add a credit card to the customer's account.\n * Endpoint: POST /fluid_pay/create_payment_method?jwt={jwt}\n */\nexport async function addCreditCardToCustomer(\n client: FetchClient,\n jwt: string,\n data: fluidPay.AddCreditCardData,\n): Promise<fluidPay.CreateCustomerPaymentMethodResponse> {\n return client.post(`/fluid_pay/create_payment_method?jwt=${jwt}`, data);\n}\n\n/**\n * Delete a customer payment method.\n * Endpoint: DELETE /fluid_pay/delete_payment_method/{id}?jwt={jwt}\n */\nexport async function deleteCustomerPaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n): Promise<unknown> {\n return client.delete(\n `/fluid_pay/delete_payment_method/${paymentMethodId}?jwt=${jwt}`,\n );\n}\n\n/**\n * Set a payment method as default.\n * Endpoint: PATCH /fluid_pay/update_payment_method/{id}?jwt={jwt}\n */\nexport async function updateDefaultPaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n): Promise<fluidPay.UpdateDefaultPaymentMethodResponse> {\n return client.patch(\n `/fluid_pay/update_payment_method/${paymentMethodId}?jwt=${jwt}`,\n );\n}\n\n/**\n * Update a payment method (default status, billing address).\n * Endpoint: PATCH /fluid_pay/update_payment_method/{id}?jwt={jwt}\n */\nexport async function updatePaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n body?: fluidPay.UpdatePaymentMethodInput,\n): Promise<fluidPay.UpdatePaymentMethodResponse> {\n return client.patch(\n `/fluid_pay/update_payment_method/${paymentMethodId}?jwt=${jwt}`,\n body,\n );\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch VGS vault credentials for the customer's payment account.\n * Endpoint: GET /fluid_pay/vault?jwt={jwt}\n */\nexport async function fetchVaultCredentialsForPaymentAccount(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.VaultResponse> {\n return client.get(\"/fluid_pay/vault\", { jwt });\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { orders } from \"../custom/orders\";\n\n/**\n * Fetch a single order by token.\n * Endpoint: GET /public/v2025-06/orders/{orderToken}\n */\nexport async function fetchOrder(\n client: FetchClient,\n orderToken: string,\n): Promise<orders.OrderResponse> {\n return client.get(`/public/v2025-06/orders/${orderToken}`);\n}\n\n/**\n * Fetch a paginated list of customer orders.\n * Endpoint: GET /v202506/orders\n */\nexport async function fetchCustomerOrders(\n client: FetchClient,\n params: orders.FetchOrdersParams,\n): Promise<orders.CustomerOrdersResponse> {\n const input: Record<string, string> = {};\n\n if (params.cursor) input[\"page[cursor]\"] = params.cursor;\n if (params.limit != null) input[\"page[limit]\"] = params.limit.toString();\n if (params.search) input.search = params.search;\n if (params.sort) input.sort = params.sort;\n if (params.status) input.status = params.status;\n if (params.type) input.type = params.type;\n if (params.customerId != null)\n input.customer_id = params.customerId.toString();\n if (params.userCompanyId != null)\n input.user_company_id = params.userCompanyId.toString();\n if (params.subscriptionId != null)\n input.subscription_id = params.subscriptionId.toString();\n if (params.startDate) input.start_date = params.startDate;\n if (params.endDate) input.end_date = params.endDate;\n if (params.withinDays != null)\n input.within_days = params.withinDays.toString();\n if (params.cartSource) input.cart_source = params.cartSource;\n if (params.countryIsos) input.country_isos = params.countryIsos;\n if (params.forceStats != null)\n input.force_stats = params.forceStats.toString();\n\n return client.get(\"/v202506/orders\", input);\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { subscriptions } from \"../custom/subscriptions\";\n\n/**\n * Fetch a paginated list of customer subscriptions.\n * Endpoint: GET /subscriptions\n */\nexport async function fetchCustomerSubscriptions(\n client: FetchClient,\n params: subscriptions.FetchSubscriptionsParams,\n): Promise<subscriptions.SubscriptionsResponse> {\n const input: Record<string, string> = {\n customer_id: params.customerId.toString(),\n page: (params.page ?? 1).toString(),\n per_page: (params.perPage ?? 10).toString(),\n };\n\n if (params.status != null) input.status = params.status;\n if (params.search != null) input.search = params.search;\n if (params.sortBy != null) input.sort_by = params.sortBy;\n if (params.sortDirection != null) input.sort_direction = params.sortDirection;\n\n return client.get(\"/subscriptions\", input);\n}\n\n/**\n * Fetch a single subscription by token.\n * Endpoint: GET /subscriptions/{token}\n */\nexport async function fetchSubscription(\n client: FetchClient,\n subscriptionToken: string,\n): Promise<subscriptions.SubscriptionDetail> {\n return client.get(`/subscriptions/${subscriptionToken}`);\n}\n\n/**\n * Pause a subscription.\n * Endpoint: POST /subscriptions/{token}/pause\n */\nexport async function pauseSubscription(\n client: FetchClient,\n subscriptionToken: string,\n params: subscriptions.PauseSubscriptionParams,\n): Promise<subscriptions.SubscriptionDetail> {\n const queryParams: Record<string, string> = {\n customer_id: params.customerId.toString(),\n };\n\n if (params.nextBillDate != null) {\n queryParams.next_bill_date = params.nextBillDate;\n }\n if (params.numberOfOrders != null) {\n queryParams.number_of_orders = params.numberOfOrders.toString();\n }\n\n const query = new URLSearchParams(queryParams).toString();\n return client.post(`/subscriptions/${subscriptionToken}/pause?${query}`);\n}\n\n/**\n * Resume a paused subscription.\n * Endpoint: POST /subscriptions/{token}/resume\n */\nexport async function resumeSubscription(\n client: FetchClient,\n subscriptionToken: string,\n params: subscriptions.ResumeSubscriptionParams,\n): Promise<subscriptions.SubscriptionDetail> {\n const query = new URLSearchParams({\n customer_id: params.customerId.toString(),\n next_bill_date: params.nextBillDate,\n }).toString();\n\n return client.post(`/subscriptions/${subscriptionToken}/resume?${query}`);\n}\n\n/**\n * Skip the next billing cycle.\n * Endpoint: POST /subscriptions/{token}/skip_next_billing\n */\nexport async function skipSubscription(\n client: FetchClient,\n subscriptionToken: string,\n params: subscriptions.SkipSubscriptionParams,\n): Promise<subscriptions.SubscriptionDetail> {\n const query = new URLSearchParams({\n customer_id: params.customerId.toString(),\n next_bill_date: params.nextBillDate,\n }).toString();\n\n return client.post(\n `/subscriptions/${subscriptionToken}/skip_next_billing?${query}`,\n );\n}\n\n/**\n * Cancel a subscription.\n * Endpoint: POST /subscriptions/{token}/cancel\n */\nexport async function cancelSubscription(\n client: FetchClient,\n subscriptionToken: string,\n customerId: number,\n): Promise<subscriptions.SubscriptionDetail> {\n const query = new URLSearchParams({\n customer_id: customerId.toString(),\n }).toString();\n\n return client.post(`/subscriptions/${subscriptionToken}/cancel?${query}`);\n}\n\n/**\n * Reactivate a cancelled subscription.\n * Endpoint: POST /subscriptions/{token}/reactivate\n */\nexport async function reactivateSubscription(\n client: FetchClient,\n subscriptionToken: string,\n params: subscriptions.ReactivateSubscriptionParams,\n): Promise<subscriptions.SubscriptionDetail> {\n const body =\n params.process_immediately === true\n ? { process_immediately: true }\n : params.next_bill_date\n ? { next_bill_date: params.next_bill_date }\n : {};\n\n return client.post(\n `/subscriptions/${subscriptionToken}/reactivate`,\n Object.keys(body).length > 0 ? body : undefined,\n );\n}\n\n/**\n * Update subscription info (plan, variant, address, payment method, quantity).\n * Endpoint: PUT /subscriptions/{token}\n */\nexport async function updateSubscriptionInfo(\n client: FetchClient,\n subscriptionToken: string,\n body: subscriptions.UpdateSubscriptionInfoBody,\n): Promise<subscriptions.SubscriptionDetail> {\n return client.put(`/subscriptions/${subscriptionToken}`, {\n subscription: body,\n });\n}\n\n/**\n * Create a new subscription. Two-step process: creates a cart first, then the subscription.\n * Endpoint: POST /carts + POST /subscriptions\n */\nexport async function createSubscription(\n client: FetchClient,\n data: subscriptions.CreateSubscriptionData,\n): Promise<subscriptions.SubscriptionCreateResponse> {\n // Step 1: Create a cart with the subscription item\n const cartResponse = await client.post<subscriptions.CartCreateResponse>(\n \"/carts\",\n {\n country_code: \"US\",\n items: [\n {\n variant_id: data.variant_id,\n quantity: data.quantity ?? 1,\n subscription: true,\n subscription_plan_id: data.subscription_plan_id,\n },\n ],\n },\n );\n\n // Step 2: Create the subscription using the cart token\n return client.post(\"/subscriptions\", {\n subscription: {\n ...data,\n cart_token: cartResponse.cart.cart_token,\n },\n });\n}\n","import { useMemo } from \"react\";\nimport {\n createFetchClient as createOrdersFetchClient,\n type FetchClient as OrdersFetchClient,\n} from \"@fluid-app/orders-api-client\";\nimport {\n createFetchClient as createSubscriptionsFetchClient,\n type FetchClient as SubscriptionsFetchClient,\n} from \"@fluid-app/subscriptions-api-client\";\nimport {\n createFetchClient as createFluidPayFetchClient,\n type FetchClient as FluidPayFetchClient,\n} from \"@fluid-app/fluid-pay-api-client\";\nimport {\n createFetchClient as createCoreFetchClient,\n type FetchClient as CoreFetchClient,\n} from \"@fluid-app/api-client-core\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { useFluidAuth } from \"../hooks/use-fluid-auth\";\n\n/** API version prefix for versioned endpoints (e.g. points ledger) */\nexport const API_VERSION = \"/v202506\";\n\n/**\n * Ensures baseUrl ends with /api.\n * Domain-specific API clients (orders, subscriptions, fluid-pay) use endpoint\n * paths without /api (e.g. /fluid_pay/me, /subscriptions), matching fluid-admin's\n * NEXT_PUBLIC_API_URL convention. The portal SDK's config.baseUrl is the domain\n * root (e.g. https://api.fluid.app), so we append /api here.\n */\nfunction withApiPrefix(baseUrl: string): string {\n const base = baseUrl.replace(/\\/+$/, \"\");\n return base.endsWith(\"/api\") ? base : `${base}/api`;\n}\n\nexport function useOrdersClient(): OrdersFetchClient {\n const { config } = useFluidContext();\n const { token } = useFluidAuth();\n\n return useMemo(\n () =>\n createOrdersFetchClient({\n baseUrl: withApiPrefix(config.baseUrl),\n getAuthToken: () => token,\n onAuthError: config.onAuthError,\n }),\n [config.baseUrl, config.onAuthError, token],\n );\n}\n\nexport function useSubscriptionsClient(): SubscriptionsFetchClient {\n const { config } = useFluidContext();\n const { token } = useFluidAuth();\n\n return useMemo(\n () =>\n createSubscriptionsFetchClient({\n baseUrl: withApiPrefix(config.baseUrl),\n getAuthToken: () => token,\n onAuthError: config.onAuthError,\n }),\n [config.baseUrl, config.onAuthError, token],\n );\n}\n\nexport function useFluidPayClient(): FluidPayFetchClient {\n const { config } = useFluidContext();\n const { token } = useFluidAuth();\n\n return useMemo(\n () =>\n createFluidPayFetchClient({\n baseUrl: withApiPrefix(config.baseUrl),\n getAuthToken: () => token,\n onAuthError: config.onAuthError,\n }),\n [config.baseUrl, config.onAuthError, token],\n );\n}\n\n/**\n * Generic SDK fetch client for endpoints not covered by domain-specific clients\n * (e.g. /countries, /v202506/customers/:id/points_ledgers).\n * Uses the same auth/baseUrl/error handling as the domain clients.\n */\nexport function useSdkClient(): CoreFetchClient {\n const { config } = useFluidContext();\n const { token } = useFluidAuth();\n\n return useMemo(\n () =>\n createCoreFetchClient({\n baseUrl: withApiPrefix(config.baseUrl),\n getAuthToken: () => token,\n onAuthError: config.onAuthError,\n }),\n [config.baseUrl, config.onAuthError, token],\n );\n}\n","import { PackageOpen, Repeat, User, type LucideIcon } from \"lucide-react\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ntype ManageTab = \"profile\" | \"orders\" | \"subscriptions\";\n\nconst NAV_ITEMS: {\n key: ManageTab;\n label: string;\n slug: string;\n icon: LucideIcon;\n}[] = [\n { key: \"profile\", label: \"Profile\", slug: \"account/profile\", icon: User },\n {\n key: \"orders\",\n label: \"Orders\",\n slug: \"account/orders\",\n icon: PackageOpen,\n },\n {\n key: \"subscriptions\",\n label: \"Subscriptions\",\n slug: \"account/subscriptions\",\n icon: Repeat,\n },\n];\n\nfunction getActiveTab(slug: string): ManageTab {\n const parts = slug.split(\"/\");\n const sub = parts[1];\n if (sub === \"orders\") return \"orders\";\n if (sub === \"subscriptions\") return \"subscriptions\";\n return \"profile\";\n}\n\nexport function AccountManageLayout({\n children,\n}: {\n children: React.ReactNode;\n}): React.JSX.Element {\n const { currentSlug, navigate } = useAppNavigation();\n const activeTab = getActiveTab(currentSlug);\n\n return (\n <div className=\"flex flex-col md:flex-row\">\n {/* Mobile: horizontal tab bar */}\n <nav className=\"flex gap-1 overflow-x-auto border-b px-4 py-2 md:hidden\">\n {NAV_ITEMS.map(({ key, slug, label, icon: Icon }) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => navigate(slug)}\n className={`flex items-center gap-2 rounded-md px-3 py-2 text-sm font-medium whitespace-nowrap ${\n activeTab === key\n ? \"bg-sidebar-primary text-sidebar-primary-foreground\"\n : \"hover:bg-sidebar-primary hover:text-sidebar-primary-foreground\"\n }`}\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </button>\n ))}\n </nav>\n\n {/* Desktop: vertical sidebar */}\n <nav className=\"hidden w-48 shrink-0 flex-col gap-1 p-4 md:flex\">\n {NAV_ITEMS.map(({ key, slug, label, icon: Icon }) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => navigate(slug)}\n className={`flex items-center gap-2 rounded-md px-3 py-2 text-left text-sm font-medium ${\n activeTab === key\n ? \"bg-sidebar-primary text-sidebar-primary-foreground\"\n : \"hover:bg-sidebar-primary hover:text-sidebar-primary-foreground\"\n }`}\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </button>\n ))}\n </nav>\n\n {/* Content */}\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n );\n}\n","import { createContext, useContext } from \"react\";\n\nexport type TranslationFn = (key: string) => string;\n\nexport interface ProfileUIContextValue {\n t: TranslationFn;\n}\n\nexport const ProfileUIContext = createContext<ProfileUIContextValue | null>(\n null,\n);\n\nexport function useProfileUI(): ProfileUIContextValue {\n const context = useContext(ProfileUIContext);\n if (!context) {\n throw new Error(\"useProfileUI must be used within a ProfileUIProvider\");\n }\n return context;\n}\n","import type { JSX, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { ProfileUIContext, type TranslationFn } from \"./context\";\n\nexport interface ProfileUIProviderProps {\n t: TranslationFn;\n children: ReactNode;\n}\n\nexport function ProfileUIProvider({\n t,\n children,\n}: ProfileUIProviderProps): JSX.Element {\n const value = useMemo(() => ({ t }), [t]);\n return (\n <ProfileUIContext.Provider value={value}>\n {children}\n </ProfileUIContext.Provider>\n );\n}\n","export interface State {\n name: string;\n isoCode: string;\n}\n\nexport interface RegionConfig {\n regionLabel: string;\n postalLabel: string;\n}\n\nexport const US_STATES: State[] = [\n { name: \"Alabama\", isoCode: \"AL\" },\n { name: \"Alaska\", isoCode: \"AK\" },\n { name: \"Arizona\", isoCode: \"AZ\" },\n { name: \"Arkansas\", isoCode: \"AR\" },\n { name: \"California\", isoCode: \"CA\" },\n { name: \"Colorado\", isoCode: \"CO\" },\n { name: \"Connecticut\", isoCode: \"CT\" },\n { name: \"Delaware\", isoCode: \"DE\" },\n { name: \"Florida\", isoCode: \"FL\" },\n { name: \"Georgia\", isoCode: \"GA\" },\n { name: \"Hawaii\", isoCode: \"HI\" },\n { name: \"Idaho\", isoCode: \"ID\" },\n { name: \"Illinois\", isoCode: \"IL\" },\n { name: \"Indiana\", isoCode: \"IN\" },\n { name: \"Iowa\", isoCode: \"IA\" },\n { name: \"Kansas\", isoCode: \"KS\" },\n { name: \"Kentucky\", isoCode: \"KY\" },\n { name: \"Louisiana\", isoCode: \"LA\" },\n { name: \"Maine\", isoCode: \"ME\" },\n { name: \"Maryland\", isoCode: \"MD\" },\n { name: \"Massachusetts\", isoCode: \"MA\" },\n { name: \"Michigan\", isoCode: \"MI\" },\n { name: \"Minnesota\", isoCode: \"MN\" },\n { name: \"Mississippi\", isoCode: \"MS\" },\n { name: \"Missouri\", isoCode: \"MO\" },\n { name: \"Montana\", isoCode: \"MT\" },\n { name: \"Nebraska\", isoCode: \"NE\" },\n { name: \"Nevada\", isoCode: \"NV\" },\n { name: \"New Hampshire\", isoCode: \"NH\" },\n { name: \"New Jersey\", isoCode: \"NJ\" },\n { name: \"New Mexico\", isoCode: \"NM\" },\n { name: \"New York\", isoCode: \"NY\" },\n { name: \"North Carolina\", isoCode: \"NC\" },\n { name: \"North Dakota\", isoCode: \"ND\" },\n { name: \"Ohio\", isoCode: \"OH\" },\n { name: \"Oklahoma\", isoCode: \"OK\" },\n { name: \"Oregon\", isoCode: \"OR\" },\n { name: \"Pennsylvania\", isoCode: \"PA\" },\n { name: \"Rhode Island\", isoCode: \"RI\" },\n { name: \"South Carolina\", isoCode: \"SC\" },\n { name: \"South Dakota\", isoCode: \"SD\" },\n { name: \"Tennessee\", isoCode: \"TN\" },\n { name: \"Texas\", isoCode: \"TX\" },\n { name: \"Utah\", isoCode: \"UT\" },\n { name: \"Vermont\", isoCode: \"VT\" },\n { name: \"Virginia\", isoCode: \"VA\" },\n { name: \"Washington\", isoCode: \"WA\" },\n { name: \"West Virginia\", isoCode: \"WV\" },\n { name: \"Wisconsin\", isoCode: \"WI\" },\n { name: \"Wyoming\", isoCode: \"WY\" },\n { name: \"District of Columbia\", isoCode: \"DC\" },\n];\n\nexport const COUNTRY_CONFIGS: Record<string, RegionConfig> = {\n US: { regionLabel: \"State\", postalLabel: \"ZIP Code\" },\n JP: { regionLabel: \"Prefecture\", postalLabel: \"Postal Code\" },\n};\n\nconst DEFAULT_REGION_CONFIG: RegionConfig = {\n regionLabel: \"Province\",\n postalLabel: \"Postal Code\",\n};\n\nexport function getRegionConfig(countryCode: string): RegionConfig {\n return COUNTRY_CONFIGS[countryCode] ?? DEFAULT_REGION_CONFIG;\n}\n\nexport const DEFAULT_ADDRESS_FIELDS = [\n { field: \"first_name\", label: \"First Name\", required: true },\n { field: \"last_name\", label: \"Last Name\", required: true },\n { field: \"address1\", label: \"Address\", required: true },\n { field: \"address2\", label: \"Apartment, suite, etc.\", required: false },\n { field: \"city\", label: \"City\", required: true },\n { field: \"state\", label: \"State\", required: true },\n { field: \"postal_code\", label: \"Postal Code\", required: true },\n { field: \"country_code\", label: \"Country\", required: true },\n];\n","import { useCallback, useState } from \"react\";\nimport {\n US_STATES,\n getRegionConfig,\n type State,\n} from \"../utils/country-config\";\n\nexport default function useCountryStates() {\n const [selectedCountry, setSelectedCountry] = useState<string>(\"US\");\n const [stateOptions, setStateOptions] = useState<State[]>(US_STATES);\n\n const handleCountryChange = useCallback(\n (\n selectedCountryCode: string,\n fetchStates?: (countryCode: string) => Promise<State[]>,\n ) => {\n setSelectedCountry(selectedCountryCode);\n if (selectedCountryCode === \"US\") {\n setStateOptions(US_STATES);\n } else if (fetchStates) {\n fetchStates(selectedCountryCode)\n .then((states) => setStateOptions(states))\n .catch((error) => {\n console.error(\"Failed to fetch states:\", error);\n setStateOptions([]);\n });\n } else {\n setStateOptions([]);\n }\n },\n [],\n );\n\n const config = getRegionConfig(selectedCountry);\n\n return { handleCountryChange, stateOptions, config, selectedCountry };\n}\n","import type { JSX } from \"react\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Button,\n} from \"@fluid-app/ui-primitives\";\n\nexport default function EllipsesDropdown({\n onDelete,\n onEdit,\n editLabel = \"Edit\",\n deleteLabel = \"Delete\",\n disabled = false,\n}: {\n onDelete?: () => void;\n onEdit?: () => void;\n editLabel?: string;\n deleteLabel?: string;\n disabled?: boolean;\n}): JSX.Element {\n if (disabled) {\n return (\n <Button\n variant=\"ghost\"\n disabled\n className=\"cursor-not-allowed opacity-50\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 128 512\"\n className=\"h-4 w-1 fill-gray-400\"\n >\n <path d=\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\" />\n </svg>\n </Button>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 128 512\"\n className=\"h-4 w-1 fill-gray-400\"\n >\n <path d=\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\" />\n </svg>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"min-w-20 space-y-1 text-sm text-gray-900\">\n {onEdit && (\n <>\n <DropdownMenuItem\n className=\"flex cursor-pointer flex-row items-center justify-between space-x-2 rounded px-2 hover:bg-gray-50\"\n onClick={(e) => {\n e.stopPropagation();\n onEdit();\n }}\n >\n <span>{editLabel}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n className=\"h-2.5 w-2.5 fill-current\"\n >\n <path d=\"M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z\" />\n </svg>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n className=\"flex cursor-pointer flex-row items-center justify-between space-x-2 rounded px-2 text-red-500 hover:bg-red-50\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete?.();\n }}\n >\n <span>{deleteLabel}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 448 512\"\n className=\"h-2.5 w-2.5 fill-red-500\"\n >\n <path d=\"M135.2 17.7C140.6 6.8 151.7 0 163.8 0L284.2 0c12.1 0 23.2 6.8 28.6 17.7L320 32l80 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L48 96C30.3 96 16 81.7 16 64S30.3 32 48 32l80 0 7.2-14.3zM32 128l384 0 0 320c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-320z\" />\n </svg>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import type { JSX } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\ntype ConfirmActionDialogProps = {\n title: string;\n description: string;\n onAction: () => void;\n openDialog: boolean;\n setOpenDialog: (open: boolean) => void;\n errorMsg?: string;\n isLoading?: boolean;\n actionText?: string;\n};\n\nexport default function ConfirmActionDialog({\n title,\n description,\n onAction,\n openDialog,\n setOpenDialog,\n errorMsg,\n isLoading,\n actionText = \"Delete\",\n}: ConfirmActionDialogProps): JSX.Element {\n const { t } = useProfileUI();\n\n return (\n <Dialog open={openDialog} onOpenChange={setOpenDialog}>\n <DialogContent className=\"max-w-sm rounded md:w-90\">\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {title}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p className=\"text-left text-sm text-gray-500\">{description}</p>\n </div>\n\n {errorMsg && <p className=\"text-sm text-red-500\">{errorMsg}</p>}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between space-x-2\">\n <DialogClose asChild>\n <Button\n className=\"min-w-[70px] rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={() => setOpenDialog(false)}\n >\n {t(\"cancel\")}\n </Button>\n </DialogClose>\n <Button\n type=\"button\"\n className=\"min-w-[70px] rounded bg-red-600 p-3 text-white hover:bg-red-700\"\n onClick={onAction}\n disabled={isLoading}\n >\n {isLoading ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n actionText\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport {\n useProfileUI,\n type TranslationFn,\n type PointsLedger,\n} from \"@fluid-app/profile-core\";\n\nfunction formatTransactionType(ledger: PointsLedger, t: TranslationFn): string {\n const transactionType = ledger.metadata.transaction_type;\n\n if (!transactionType) {\n if (ledger.metadata.source) {\n return ledger.amount > 0 ? t(\"points_awarded\") : t(\"points_redeemed\");\n }\n return t(\"transaction\");\n }\n\n const translationKey = transactionType.toLowerCase().replace(/ /g, \"_\");\n const translated = t(translationKey);\n\n if (translated !== translationKey) {\n return translated;\n }\n\n return transactionType\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction formatPoints(amount: number): string {\n const prefix = amount >= 0 ? \"+\" : \"\";\n return `${prefix}${amount}`;\n}\n\nfunction formatDateTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nexport interface CustomerPointsLedgerProps {\n pointsLedger: PointsLedger[];\n isLoading?: boolean;\n}\n\nexport default function CustomerPointsLedger({\n pointsLedger,\n isLoading = false,\n}: CustomerPointsLedgerProps): JSX.Element {\n const [accordionValue, setAccordionValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n const availablePoints = pointsLedger[0]?.total_balance ?? 0;\n\n return (\n <div className=\"mb-6 border-b border-gray-300 pb-4\">\n <Accordion\n type=\"single\"\n collapsible\n value={accordionValue}\n onValueChange={setAccordionValue}\n className=\"w-full\"\n >\n <AccordionItem value=\"points-history\" className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">\n {t(\"points_history\")}\n </div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {isLoading && <Skeleton className=\"h-6 w-full\" />}\n\n {!isLoading && !accordionValue && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setAccordionValue(\"points-history\")}\n >\n <div className=\"text-sm font-semibold text-gray-900\">\n {availablePoints.toLocaleString()}{\" \"}\n <span className=\"font-normal text-gray-500\">\n {t(\"points_available\").toLowerCase()}\n </span>\n </div>\n </div>\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mb-3 flex w-full flex-col\">\n <div className=\"text-sm font-semibold text-gray-900\">\n {availablePoints.toLocaleString()}{\" \"}\n <span className=\"font-normal text-gray-500\">\n {t(\"points_available\").toLowerCase()}\n </span>\n </div>\n </div>\n\n <div className=\"flex flex-col space-y-0\">\n {pointsLedger.length > 0 ? (\n pointsLedger.map((ledger) => (\n <div\n key={ledger.id}\n className=\"relative flex flex-row items-start justify-between py-3\"\n >\n <div className=\"absolute top-3 left-0\">\n <div className=\"mt-1.5 h-2 w-2 flex-shrink-0 rounded-full border border-gray-300\" />\n <div className=\"mr-1 h-10 border-r border-gray-200\" />\n </div>\n <div className=\"ml-6 flex flex-row items-start space-x-3\">\n <div className=\"flex flex-col\">\n <div className=\"text-sm font-medium text-gray-900\">\n {formatTransactionType(ledger, t)}\n </div>\n <div className=\"text-sm text-gray-500\">\n {formatDateTime(ledger.created_at)}\n </div>\n </div>\n </div>\n <div\n className={cn(\n \"text-sm font-medium\",\n ledger.amount >= 0 ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {formatPoints(ledger.amount)}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-sm text-gray-500\">\n {t(\"no_points_history_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n </div>\n );\n}\n","import {\n useController,\n type Control,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\";\nimport {\n Input,\n Label,\n Select,\n SelectTrigger,\n SelectContent,\n SelectItem,\n SelectValue,\n cn,\n} from \"@fluid-app/ui-primitives\";\n\nexport type NameValue = { name: string; value: string | number };\n\nexport function FormTextField<T extends FieldValues>({\n control,\n name,\n label,\n containerClassName,\n ...props\n}: {\n control: Control<T>;\n name: FieldPath<T>;\n label?: string;\n containerClassName?: string;\n} & Omit<React.ComponentProps<\"input\">, \"name\">) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n {label && (\n <Label\n htmlFor={name}\n className=\"mb-1.5 block text-sm font-medium text-gray-700\"\n >\n {label}\n </Label>\n )}\n <Input\n {...field}\n {...props}\n id={name}\n value={field.value ?? \"\"}\n className={cn(error && \"ring-1 ring-red-500\", props.className)}\n />\n {error && <p className=\"text-sm text-red-500\">{error.message}</p>}\n </div>\n );\n}\n\nexport function FormSelectField<T extends FieldValues>({\n control,\n name,\n label,\n options,\n placeholder,\n containerClassName,\n onChange,\n}: {\n control: Control<T>;\n name: FieldPath<T>;\n label?: string;\n options?: NameValue[];\n placeholder?: string;\n containerClassName?: string;\n onChange?: (value: string) => void;\n}) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n {label && (\n <Label\n htmlFor={name}\n className=\"block text-sm font-medium text-gray-700\"\n >\n {label}\n </Label>\n )}\n <Select\n value={field.value?.toString() ?? \"\"}\n onValueChange={(val) => {\n field.onChange(val);\n onChange?.(val);\n }}\n >\n <SelectTrigger className={cn(error && \"ring-1 ring-red-500\")}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options?.map((opt) => (\n <SelectItem\n key={`${opt.name}-${opt.value}`}\n value={opt.value.toString()}\n >\n {opt.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {error && <p className=\"text-sm text-red-500\">{error.message}</p>}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport type { Control } from \"react-hook-form\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField, FormSelectField, type NameValue } from \"./form-fields\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\nexport type UserFormData = {\n first_name: string;\n last_name: string;\n phone_number?: string;\n language: string;\n};\n\nexport default function UserInfoDialog({\n control,\n isOpen,\n onSubmit,\n handleClose,\n languageOptions,\n errorMsg,\n isSubmitting,\n}: {\n control: Control<UserFormData>;\n isOpen: boolean;\n onSubmit: () => void;\n handleClose: () => void;\n languageOptions?: NameValue[];\n errorMsg: string | undefined;\n isSubmitting: boolean;\n}): JSX.Element {\n const { t } = useProfileUI();\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"max-w-sm rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium text-gray-900\">\n {t(\"edit_profile\")}\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-0\">\n <FormTextField\n control={control}\n name=\"first_name\"\n label={t(\"first_name\")}\n />\n <FormTextField\n control={control}\n name=\"last_name\"\n label={t(\"last_name\")}\n />\n <FormTextField\n control={control}\n name=\"phone_number\"\n label={t(\"phone_number\")}\n type=\"tel\"\n />\n <FormSelectField\n control={control}\n name=\"language\"\n label={t(\"language\")}\n options={languageOptions}\n placeholder={t(\"select_an_option\")}\n />\n </div>\n {errorMsg && <p className=\"text-sm text-red-500\">{errorMsg}</p>}\n <DialogFooter className=\"flex flex-row items-center justify-end\">\n <div className=\"flex-1 text-right\">\n <DialogClose asChild>\n <Button type=\"button\" onClick={onSubmit}>\n {isSubmitting && (\n <div className=\"mr-3 h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n )}\n {isSubmitting ? t(\"saving\") : t(\"save_changes\")}\n </Button>\n </DialogClose>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z } from \"zod\";\nimport { Avatar, AvatarFallback } from \"@fluid-app/ui-primitives\";\nimport { Pencil } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport type { NameValue } from \"./form-fields\";\nimport { useProfileUI, type Language } from \"@fluid-app/profile-core\";\nimport UserInfoDialog, { type UserFormData } from \"./user-info-dialog\";\n\nfunction createUserInfoSchema(messages: {\n firstNameRequired: string;\n lastNameRequired: string;\n languageRequired: string;\n}) {\n return z.object({\n first_name: z.string().min(1, { message: messages.firstNameRequired }),\n last_name: z.string().min(1, { message: messages.lastNameRequired }),\n phone_number: z.string().optional(),\n language: z.string().min(1, { message: messages.languageRequired }),\n });\n}\n\nexport interface CustomerInfoProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: (data: UserFormData) => Promise<void> | void;\n isUpdating?: boolean;\n}\n\nexport default function CustomerInfo({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdating = false,\n}: CustomerInfoProps): JSX.Element {\n const [isEditDialogOpen, setIsEditDialogOpen] = useState(false);\n const [updateError, setUpdateError] = useState<string | undefined>(undefined);\n\n const { t } = useProfileUI();\n\n const { first_name, full_name } = customerAccount.customer;\n const derivedLastName = full_name.startsWith(first_name)\n ? full_name.slice(first_name.length).trim()\n : \"\";\n const userInitial = first_name ? first_name.charAt(0).toUpperCase() : \"\";\n const customerLanguage = languages?.find(\n (language) =>\n language.iso === customerAccount.fluid_pay_account.language_iso,\n )?.name;\n\n const languageOptions: NameValue[] | undefined = languages?.map(\n (language) => ({\n name: language.name,\n value: language.name,\n }),\n );\n\n const schema = useMemo(\n () =>\n createUserInfoSchema({\n firstNameRequired: t(\"first_name_is_required\"),\n lastNameRequired: t(\"last_name_is_required\"),\n languageRequired: t(\"language_is_required\"),\n }),\n [t],\n );\n\n const { control, handleSubmit, reset } = useForm<UserFormData>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolver: zodResolver(schema as any),\n defaultValues: {\n first_name: customerAccount.customer.first_name || \"\",\n last_name: derivedLastName,\n phone_number: customerAccount.customer.phone || \"\",\n language: customerLanguage || \"English\",\n },\n });\n\n const handleOpenEditDialog = () => {\n reset({\n first_name: customerAccount.customer.first_name || \"\",\n last_name: derivedLastName,\n phone_number: customerAccount.customer.phone || \"\",\n language: customerLanguage || \"English\",\n });\n setIsEditDialogOpen(true);\n };\n\n const handleCloseEditDialog = () => {\n setIsEditDialogOpen(false);\n setUpdateError(undefined);\n };\n\n const onSubmitUserInfo = handleSubmit(async (data: UserFormData) => {\n try {\n await onUpdateCustomer(data);\n setIsEditDialogOpen(false);\n } catch (error) {\n console.error(\"Error updating profile:\", error);\n setUpdateError(\n \"Error updating profile. Please verify your information and try again.\",\n );\n }\n });\n\n return (\n <>\n <div className=\"mb-6 flex flex-row items-center justify-between space-x-2 border-b border-gray-300 pb-4\">\n <div className=\"flex flex-row items-center space-x-2\">\n <Avatar>\n <AvatarFallback>{userInitial}</AvatarFallback>\n </Avatar>\n <div className=\"flex flex-col\">\n <p className=\"text-sm font-medium\">\n {customerAccount.customer.full_name}\n </p>\n <p className=\"text-sm text-gray-500\">\n {customerAccount.customer.email}\n </p>\n </div>\n </div>\n <button\n className=\"cursor-pointer rounded-md border border-gray-300 p-1 hover:bg-gray-50 disabled:opacity-50\"\n onClick={handleOpenEditDialog}\n >\n <Pencil className=\"h-2.5 w-2.5 text-gray-400\" />\n </button>\n </div>\n\n <UserInfoDialog\n control={control}\n isOpen={isEditDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={handleCloseEditDialog}\n languageOptions={languageOptions}\n errorMsg={updateError}\n isSubmitting={isUpdating}\n />\n </>\n );\n}\n","import { useState } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\n\nfunction formatAddressName(address: fluidPay.CustomerAddress): string {\n return address.name ?? \"\";\n}\n\ninterface AddressDropdownProps {\n title: string;\n displayAddress: fluidPay.CustomerAddress | null;\n addressList: fluidPay.CustomerAddress[];\n onAddAddressClick: () => void;\n onEditAddress?: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress?: (address: fluidPay.CustomerAddress) => void;\n accordionItemValue: string;\n addAddressLabel: string;\n showAddButton?: boolean;\n borderStyle?: string;\n className?: string;\n showActions?: boolean;\n isLoading?: boolean;\n}\n\nexport default function AddressDropdown({\n title,\n displayAddress,\n addressList,\n onAddAddressClick,\n onEditAddress,\n onDeleteAddress,\n accordionItemValue,\n addAddressLabel,\n showAddButton = true,\n borderStyle = \"border-b border-gray-300 pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: AddressDropdownProps) {\n const [addressesValue, setAddressesValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n return (\n <div className={`${borderStyle} ${className}`}>\n <Accordion\n type=\"single\"\n collapsible\n value={addressesValue}\n onValueChange={setAddressesValue}\n className=\"w-full\"\n >\n <AccordionItem value={accordionItemValue} className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">{title}</div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {isLoading && (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n )}\n\n {!isLoading && !addressesValue && displayAddress && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setAddressesValue(accordionItemValue)}\n >\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {formatAddressName(displayAddress)}, {displayAddress.address1}\n </div>\n <div className=\"text-sm text-gray-500\">\n {displayAddress.city}, {displayAddress.state}{\" \"}\n {displayAddress.postal_code}\n </div>\n </div>\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mt-2 flex flex-col justify-between space-y-4 px-0.5\">\n {addressList.length > 0 ? (\n addressList.map((address, index) => (\n <div\n key={address.id}\n className={cn(\n \"flex min-h-[48px] w-full flex-row items-center justify-between space-x-2 px-2\",\n {\n \"items-center border-b border-gray-300 p-3\":\n addressList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-col\">\n <div className=\"text-sm text-gray-900\">\n {formatAddressName(address)} <br />\n {address.address1} <br />\n {address.city}, {address.state} {address.postal_code}\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {address.default && (\n <p className=\"mt-1 w-fit rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() => onDeleteAddress?.(address)}\n onEdit={() => onEditAddress?.(address)}\n editLabel={t(\"edit\")}\n deleteLabel={t(\"delete\")}\n />\n )}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-sm text-gray-500\">\n {t(\"no_saved_addresses_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"mt-3 text-left text-sm text-gray-900\"\n onClick={onAddAddressClick}\n >\n {addAddressLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useState, type JSX, type ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport ConfirmActionDialog from \"./confirm-action-dialog\";\nimport AddressDropdown from \"./address-dropdown\";\n\nexport interface AddressDialogRenderProps {\n isOpen: boolean;\n onClose: () => void;\n selectedAddress: fluidPay.CustomerAddress | null;\n}\n\nexport interface AddressesProps {\n addresses: fluidPay.CustomerAddress[];\n isLoading?: boolean;\n onCreateAddress?: () => void;\n onDeleteAddress: (addressId: number) => Promise<void> | void;\n isDeletingAddress?: boolean;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n}\n\nexport default function Addresses({\n addresses,\n isLoading = false,\n onCreateAddress,\n onDeleteAddress,\n isDeletingAddress = false,\n renderAddressDialog,\n}: AddressesProps): JSX.Element {\n const [openAddressDialog, setOpenAddressDialog] = useState(false);\n const [openDeleteDialog, setOpenDeleteDialog] = useState(false);\n const [selectedAddress, setSelectedAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [deleteAddressError, setDeleteAddressError] = useState<\n string | undefined\n >(undefined);\n\n const { t } = useProfileUI();\n\n const defaultAddress = addresses.find((addr) => addr.default) ?? null;\n\n const handleDeleteClick = (address: fluidPay.CustomerAddress) => {\n setSelectedAddress(address);\n setDeleteAddressError(undefined);\n requestAnimationFrame(() => {\n setOpenDeleteDialog(true);\n });\n };\n\n const handleEditClick = (address: fluidPay.CustomerAddress) => {\n setSelectedAddress(address);\n requestAnimationFrame(() => {\n setOpenAddressDialog(true);\n });\n };\n\n const handleDeleteAddress = async () => {\n if (!selectedAddress) return;\n try {\n await onDeleteAddress(selectedAddress.id);\n setDeleteAddressError(undefined);\n setOpenDeleteDialog(false);\n setSelectedAddress(null);\n } catch {\n setDeleteAddressError(\n \"We were unable to delete this address. Please try again.\",\n );\n }\n };\n\n const handleAddClick = () => {\n setSelectedAddress(null);\n if (onCreateAddress) {\n onCreateAddress();\n }\n setOpenAddressDialog(true);\n };\n\n const handleCloseAddressDialog = () => {\n setOpenAddressDialog(false);\n setSelectedAddress(null);\n };\n\n return (\n <>\n <AddressDropdown\n title={t(\"shipping_addresses\")}\n displayAddress={defaultAddress}\n addressList={addresses}\n onAddAddressClick={handleAddClick}\n onEditAddress={handleEditClick}\n onDeleteAddress={handleDeleteClick}\n accordionItemValue=\"addresses\"\n addAddressLabel={`+ ${t(\"add_an_address\")}`}\n showAddButton={true}\n borderStyle=\"border-b border-gray-300 pb-4 mb-6\"\n showActions={true}\n isLoading={isLoading}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n onAction={handleDeleteAddress}\n actionText={t(\"delete\")}\n openDialog={openDeleteDialog}\n setOpenDialog={setOpenDeleteDialog}\n errorMsg={deleteAddressError}\n isLoading={isDeletingAddress}\n />\n\n {renderAddressDialog?.({\n isOpen: openAddressDialog,\n onClose: handleCloseAddressDialog,\n selectedAddress,\n })}\n </>\n );\n}\n","import { useState } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\n\ninterface PaymentMethodDropdownProps {\n title: string;\n displayPaymentMethod: fluidPay.CustomerPaymentMethod | null;\n paymentMethodList: fluidPay.CustomerPaymentMethod[];\n onAddPaymentMethodClick: () => void;\n onEditPaymentMethod?: (paymentMethod: fluidPay.CustomerPaymentMethod) => void;\n onDeletePaymentMethod?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n accordionItemValue?: string;\n addPaymentMethodLabel?: string;\n showAddButton?: boolean;\n borderStyle?: string;\n className?: string;\n showActions?: boolean;\n isLoading?: boolean;\n}\n\nfunction getCardDisplayName(\n paymentMethod: fluidPay.CustomerPaymentMethod,\n): string {\n if (paymentMethod.payment_type === \"Credit Card\") {\n const brand = paymentMethod.details.card_type;\n const lastFour = paymentMethod.details.last_four;\n return `${brand ?? \"Card\"} •••• ${lastFour ?? \"****\"}`;\n }\n return paymentMethod.payment_type;\n}\n\nfunction getCardExpiry(paymentMethod: fluidPay.CustomerPaymentMethod): string {\n const { exp_month, exp_year } = paymentMethod.details;\n if (exp_month != null && exp_year != null) {\n return `Expires ${exp_month}/${exp_year}`;\n }\n return \"\";\n}\n\nexport default function PaymentMethodDropdown({\n title,\n displayPaymentMethod,\n paymentMethodList,\n onAddPaymentMethodClick,\n onEditPaymentMethod,\n onDeletePaymentMethod,\n accordionItemValue = \"paymentMethods\",\n addPaymentMethodLabel = \"+ Add a payment method\",\n showAddButton = true,\n borderStyle = \"border-b border-gray-300 pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: PaymentMethodDropdownProps) {\n const [paymentsValue, setPaymentsValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n const renderPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => (\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={paymentMethod.details.logo_url}\n alt={paymentMethod.details.card_type ?? t(\"payment_method\")}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {getCardDisplayName(paymentMethod)}\n </div>\n {getCardExpiry(paymentMethod) && (\n <div className=\"text-sm text-gray-500\">\n {getCardExpiry(paymentMethod)}\n </div>\n )}\n </div>\n </div>\n );\n\n return (\n <div className={`${borderStyle} ${className}`}>\n <Accordion\n type=\"single\"\n collapsible\n value={paymentsValue}\n onValueChange={setPaymentsValue}\n className=\"w-full\"\n >\n <AccordionItem value={accordionItemValue} className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">{title}</div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {!paymentsValue && isLoading ? (\n <div className=\"mb-2 flex w-full flex-row items-center space-x-2\">\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col space-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n ) : (\n !paymentsValue &&\n displayPaymentMethod && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setPaymentsValue(accordionItemValue)}\n >\n {renderPaymentMethod(displayPaymentMethod)}\n </div>\n )\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mt-2 flex flex-col justify-between space-y-4 px-0.5\">\n {isLoading ? (\n <>\n {[1, 2].map((i) => (\n <div\n key={`skeleton-${i}`}\n className=\"items-center rounded bg-gray-100 p-3\"\n >\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"flex flex-row items-center space-x-2\">\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col space-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n <Skeleton className=\"h-6 w-6\" />\n </div>\n </div>\n ))}\n </>\n ) : (\n paymentMethodList.map((paymentMethod, index) => (\n <div\n key={paymentMethod.id}\n className={cn(\n \"flex min-h-[48px] w-full flex-row items-center justify-between space-x-2 px-2\",\n {\n \"items-center border-b border-gray-300 p-3\":\n paymentMethodList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={paymentMethod.details.logo_url}\n alt={\n paymentMethod.details.card_type ??\n t(\"payment_method\")\n }\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {`${paymentMethod.details.card_type ?? \"Card\"} •••• ${paymentMethod.details.last_four ?? \"****\"}`}\n </div>\n <div className=\"text-sm text-gray-500\">\n {`${t(\"card_expires\")} ${paymentMethod.details.exp_month}/${paymentMethod.details.exp_year}`}\n </div>\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.default && (\n <p className=\"mt-1 w-fit rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() =>\n onDeletePaymentMethod?.(paymentMethod)\n }\n deleteLabel={t(\"delete\")}\n onEdit={() => onEditPaymentMethod?.(paymentMethod)}\n editLabel={t(\"edit\")}\n />\n )}\n </div>\n </div>\n ))\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"mt-3 text-left text-sm text-gray-900\"\n onClick={onAddPaymentMethodClick}\n >\n {addPaymentMethodLabel}\n </button>\n )}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\nexport interface BillingAddress {\n name?: string | null;\n address1?: string | null;\n address2?: string | null;\n city?: string | null;\n state?: string | null;\n zip?: string | null;\n country_code?: string | null;\n}\n\ninterface ViewPaymentMethodDialogProps {\n isOpen: boolean;\n paymentMethod: fluidPay.CustomerPaymentMethod | null;\n billingAddress?: BillingAddress | null;\n onClose: () => void;\n onEdit?: () => void;\n}\n\nexport default function ViewPaymentMethodDialog({\n isOpen,\n paymentMethod,\n billingAddress,\n onClose,\n onEdit,\n}: ViewPaymentMethodDialogProps): JSX.Element | null {\n const { t } = useProfileUI();\n\n if (!paymentMethod) return null;\n\n const { details } = paymentMethod;\n const cardBrand = details.card_type ?? \"Card\";\n const lastFour = details.last_four ?? \"****\";\n const expMonth = details.exp_month;\n const expYear = details.exp_year;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-w-sm rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium\">\n {t(\"edit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div>\n <div className=\"rounded-lg bg-gray-50 p-4\">\n <div className=\"flex items-center space-x-3\">\n {details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={details.logo_url}\n alt={cardBrand}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-gray-900\">\n {cardBrand} •••• {lastFour}\n </span>\n {expMonth != null && expYear != null && (\n <span className=\"text-sm text-gray-500\">\n {t(\"card_expires\")} {expMonth}/{expYear}\n </span>\n )}\n </div>\n </div>\n {paymentMethod.default && (\n <span className=\"mt-2 inline-block rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </span>\n )}\n </div>\n </div>\n\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-gray-900\">\n {t(\"billing_address\")}\n </h3>\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto p-0 text-sm text-gray-600 underline hover:bg-transparent\"\n onClick={onEdit}\n >\n {t(\"edit\")}\n </Button>\n )}\n </div>\n <div className=\"rounded-lg bg-gray-50 p-4\">\n {billingAddress ? (\n <div className=\"space-y-1 text-sm text-gray-900\">\n {billingAddress.name && <p>{billingAddress.name}</p>}\n <p>{billingAddress.address1}</p>\n {billingAddress.address2 && <p>{billingAddress.address2}</p>}\n <p>\n {billingAddress.city}, {billingAddress.state}{\" \"}\n {billingAddress.zip}\n </p>\n <p>{billingAddress.country_code}</p>\n </div>\n ) : (\n <p className=\"text-sm text-gray-500 italic\">\n {t(\"no_billing_address\")}\n </p>\n )}\n </div>\n </div>\n </div>\n\n <DialogFooter>\n <DialogClose asChild>\n <Button\n className=\"rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={onClose}\n >\n {t(\"close\")}\n </Button>\n </DialogClose>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, type JSX } from \"react\";\nimport { useForm, useWatch } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField, FormSelectField } from \"./form-fields\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI, useCountryStates } from \"@fluid-app/profile-core\";\nimport type { BillingAddress } from \"./view-payment-method-dialog\";\n\nconst editPaymentMethodFormSchema = z.object({\n billing_address: z.object({\n name: z.string().min(1, \"Name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n zip: z.string().min(1, \"Zip code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n }),\n set_as_default: z.boolean(),\n});\n\nexport type EditPaymentMethodFormData = z.infer<\n typeof editPaymentMethodFormSchema\n>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\ninterface EditPaymentMethodDialogProps {\n isOpen: boolean;\n paymentMethod: fluidPay.CustomerPaymentMethod | null;\n billingAddress?: BillingAddress | null;\n onClose: () => void;\n onSubmit: (data: EditPaymentMethodFormData) => void;\n isSubmitting: boolean;\n error?: string;\n countries?: CountryOption[];\n}\n\nexport default function EditPaymentMethodDialog({\n isOpen,\n paymentMethod,\n billingAddress,\n onClose,\n onSubmit,\n isSubmitting,\n error,\n countries = [],\n}: EditPaymentMethodDialogProps): JSX.Element | null {\n const { t } = useProfileUI();\n\n const { control, handleSubmit, reset, setValue } =\n useForm<EditPaymentMethodFormData>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolver: zodResolver(editPaymentMethodFormSchema as any),\n defaultValues: {\n billing_address: {\n name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n zip: \"\",\n country_code: \"US\",\n },\n set_as_default: false,\n },\n });\n\n const billingCountry = useWatch({\n control,\n name: \"billing_address.country_code\",\n });\n const setAsDefault = useWatch({ control, name: \"set_as_default\" });\n\n const { stateOptions, config, handleCountryChange } = useCountryStates();\n\n const countryOptions = [...countries]\n .map((country) => ({\n name: country.name,\n value: country.iso,\n }))\n .sort((a, b) => {\n if (a.value === billingCountry) return -1;\n if (b.value === billingCountry) return 1;\n return a.name.localeCompare(b.name);\n });\n\n const stateSelectOptions = stateOptions.map((state) => ({\n name: state.name,\n value: state.isoCode,\n }));\n\n useEffect(() => {\n if (paymentMethod && isOpen) {\n reset({\n billing_address: {\n name: billingAddress?.name ?? \"\",\n address1: billingAddress?.address1 ?? \"\",\n address2: billingAddress?.address2 ?? \"\",\n city: billingAddress?.city ?? \"\",\n state: billingAddress?.state ?? \"\",\n zip: billingAddress?.zip ?? \"\",\n country_code: billingAddress?.country_code ?? \"US\",\n },\n set_as_default: paymentMethod.default,\n });\n }\n }, [paymentMethod, billingAddress, isOpen, reset]);\n\n const handleCountrySelect = (countryCode: string) => {\n handleCountryChange(countryCode);\n setValue(\"billing_address.country_code\", countryCode, {\n shouldValidate: true,\n });\n };\n\n const handleFormSubmit = handleSubmit((data) => {\n onSubmit(data);\n });\n\n if (!paymentMethod) return null;\n\n const { details } = paymentMethod;\n const cardBrand = details.card_type ?? \"Card\";\n const lastFour = details.last_four ?? \"****\";\n const expMonth = details.exp_month;\n const expYear = details.exp_year;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-sm overflow-y-auto rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium\">\n {t(\"edit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div className=\"rounded-lg bg-gray-50 p-4\">\n <div className=\"flex items-center space-x-3\">\n {details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={details.logo_url}\n alt={cardBrand}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-gray-900\">\n {cardBrand} •••• {lastFour}\n </span>\n {expMonth != null && expYear != null && (\n <span className=\"text-sm text-gray-500\">\n {t(\"card_expires\")} {expMonth}/{expYear}\n </span>\n )}\n </div>\n </div>\n </div>\n\n <div>\n <h3 className=\"mb-1 text-sm font-medium text-gray-900\">\n {t(\"billing_address\")}\n </h3>\n <div className=\"space-y-0\">\n <FormSelectField\n control={control}\n name=\"billing_address.country_code\"\n label={t(\"country\")}\n options={countryOptions}\n placeholder={t(\"select_an_option\")}\n onChange={(val) => {\n handleCountrySelect(val);\n }}\n />\n <FormTextField\n control={control}\n name=\"billing_address.name\"\n label={t(\"name\")}\n />\n <FormTextField\n control={control}\n name=\"billing_address.address1\"\n label={t(\"address_line_1\")}\n />\n <FormTextField\n control={control}\n name=\"billing_address.address2\"\n label={t(\"address_line_2\")}\n />\n <div className=\"sm:flex sm:gap-2\">\n <FormTextField\n control={control}\n name=\"billing_address.city\"\n label={t(\"city\")}\n containerClassName=\"flex-1\"\n />\n <FormSelectField\n control={control}\n name=\"billing_address.state\"\n label={\n config?.regionLabel ? t(config.regionLabel) : t(\"state\")\n }\n options={stateSelectOptions}\n placeholder={t(\"select_state\")}\n containerClassName=\"flex-1\"\n />\n <FormTextField\n control={control}\n name=\"billing_address.zip\"\n label={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"mt-2 flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default\"\n checked={setAsDefault}\n onChange={() => setValue(\"set_as_default\", !setAsDefault)}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default\" className=\"text-sm\">\n {t(\"set_as_default_payment_method\")}\n </label>\n </div>\n\n {error && <div className=\"text-sm text-red-500\">{error}</div>}\n\n <DialogFooter className=\"flex flex-row items-center justify-between\">\n <div className=\"flex-2\">\n <Button\n type=\"button\"\n className=\"rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={onClose}\n disabled={isSubmitting}\n >\n {t(\"cancel\")}\n </Button>\n </div>\n <div className=\"flex-1 text-right\">\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isSubmitting}\n className=\"rounded bg-gray-900 p-3 text-white hover:bg-gray-800\"\n >\n {isSubmitting ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, type JSX, type ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport ConfirmActionDialog from \"./confirm-action-dialog\";\nimport PaymentMethodDropdown from \"./payment-method-dropdown\";\nimport ViewPaymentMethodDialog, {\n type BillingAddress,\n} from \"./view-payment-method-dialog\";\nimport EditPaymentMethodDialog, {\n type EditPaymentMethodFormData,\n} from \"./edit-payment-method-dialog\";\n\nexport interface CreditCardDialogRenderProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface PaymentMethodsProps {\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n isLoading?: boolean;\n onDeletePaymentMethod: (paymentMethodId: number) => Promise<void> | void;\n isDeletingPaymentMethod?: boolean;\n onUpdatePaymentMethod: (\n paymentMethodId: number,\n data: EditPaymentMethodFormData,\n ) => Promise<void> | void;\n isUpdatingPaymentMethod?: boolean;\n getBillingAddress?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => BillingAddress | null | undefined;\n countries?: CountryOption[];\n renderCreditCardDialog?: (props: CreditCardDialogRenderProps) => ReactNode;\n}\n\nexport default function PaymentMethods({\n paymentMethods,\n isLoading = false,\n onDeletePaymentMethod,\n isDeletingPaymentMethod = false,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod = false,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n}: PaymentMethodsProps): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const [openDeleteDialog, setOpenDeleteDialog] = useState(false);\n const [deleteCardError, setDeleteCardError] = useState<string | undefined>(\n undefined,\n );\n const [selectedCreditCard, setSelectedCreditCard] = useState<\n fluidPay.CustomerPaymentMethod | undefined\n >(undefined);\n const [isViewOpen, setIsViewOpen] = useState(false);\n const [isEditOpen, setIsEditOpen] = useState(false);\n const [selectedPaymentMethod, setSelectedPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n const [editError, setEditError] = useState<string | undefined>(undefined);\n\n const { t } = useProfileUI();\n\n const defaultPaymentMethod =\n paymentMethods.find((method) => method.default) ?? null;\n\n const handleDeleteCard = async (cardId: number | null) => {\n if (!cardId) return;\n try {\n await onDeletePaymentMethod(cardId);\n setSelectedCreditCard(undefined);\n setDeleteCardError(undefined);\n setOpenDeleteDialog(false);\n } catch {\n setDeleteCardError(\"Unable to delete payment method. Please try again.\");\n }\n };\n\n const handleDeletePaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => {\n setSelectedCreditCard(paymentMethod);\n requestAnimationFrame(() => {\n setOpenDeleteDialog(true);\n });\n };\n\n const handleViewPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => {\n setSelectedPaymentMethod(paymentMethod);\n requestAnimationFrame(() => {\n setIsViewOpen(true);\n });\n };\n\n const handleCloseViewDialog = () => {\n setIsViewOpen(false);\n setSelectedPaymentMethod(null);\n };\n\n const handleOpenEditFromView = () => {\n setIsViewOpen(false);\n setEditError(undefined);\n requestAnimationFrame(() => {\n setIsEditOpen(true);\n });\n };\n\n const handleCloseEditDialog = () => {\n setIsEditOpen(false);\n setSelectedPaymentMethod(null);\n setEditError(undefined);\n };\n\n const handleEditSubmit = async (data: EditPaymentMethodFormData) => {\n if (!selectedPaymentMethod) return;\n try {\n await onUpdatePaymentMethod(selectedPaymentMethod.id, data);\n handleCloseEditDialog();\n fluidToast({\n title: t(\"default_payment_method_updated\"),\n type: \"success\",\n });\n } catch (error) {\n console.error(\"Error updating payment method:\", error);\n fluidToast({\n title: t(\"failed_to_set_default_payment_method\"),\n type: \"error\",\n description: parseApiErrors(error),\n });\n if (error instanceof Error) {\n setEditError(error.message);\n } else {\n setEditError(\"An unexpected error occurred. Please try again.\");\n }\n }\n };\n\n const handleOpenDialog = () => {\n setIsOpen(true);\n };\n\n const handleCloseDialog = () => {\n setIsOpen(false);\n };\n\n const selectedBillingAddress = selectedPaymentMethod\n ? (getBillingAddress?.(selectedPaymentMethod) ?? null)\n : null;\n\n return (\n <>\n <PaymentMethodDropdown\n title={t(\"payment_methods\")}\n displayPaymentMethod={defaultPaymentMethod}\n paymentMethodList={paymentMethods}\n onAddPaymentMethodClick={handleOpenDialog}\n onEditPaymentMethod={handleViewPaymentMethod}\n onDeletePaymentMethod={handleDeletePaymentMethod}\n addPaymentMethodLabel={`+ ${t(\"add_payment_method\")}`}\n isLoading={isLoading}\n />\n\n {renderCreditCardDialog?.({\n isOpen,\n onClose: handleCloseDialog,\n })}\n\n <ConfirmActionDialog\n title={t(\"delete_credit_card\")}\n description={t(\"delete_credit_card_message\")}\n actionText={t(\"delete\")}\n onAction={() => handleDeleteCard(selectedCreditCard?.id ?? null)}\n openDialog={openDeleteDialog}\n setOpenDialog={setOpenDeleteDialog}\n errorMsg={deleteCardError}\n isLoading={isDeletingPaymentMethod}\n />\n\n <ViewPaymentMethodDialog\n isOpen={isViewOpen}\n paymentMethod={selectedPaymentMethod}\n billingAddress={selectedBillingAddress}\n onClose={handleCloseViewDialog}\n onEdit={handleOpenEditFromView}\n />\n\n <EditPaymentMethodDialog\n isOpen={isEditOpen}\n paymentMethod={selectedPaymentMethod}\n billingAddress={selectedBillingAddress}\n onClose={handleCloseEditDialog}\n onSubmit={handleEditSubmit}\n isSubmitting={isUpdatingPaymentMethod}\n error={editError}\n countries={countries}\n />\n </>\n );\n}\n","import type { JSX, ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport CustomerInfo, { type CustomerInfoProps } from \"./customer-info\";\nimport CustomerPointsLedger from \"./customer-points-ledger\";\nimport Addresses, { type AddressDialogRenderProps } from \"./addresses\";\nimport PaymentMethods, {\n type CreditCardDialogRenderProps,\n} from \"./payment-methods\";\nimport type { EditPaymentMethodFormData } from \"./edit-payment-method-dialog\";\nimport type { BillingAddress } from \"./view-payment-method-dialog\";\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface ProfileProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: CustomerInfoProps[\"onUpdateCustomer\"];\n isUpdatingCustomer?: boolean;\n\n rewardsPointsEnabled?: boolean;\n pointsLedger?: PointsLedger[];\n isLoadingPointsLedger?: boolean;\n\n addresses: fluidPay.CustomerAddress[];\n isLoadingAddresses?: boolean;\n onDeleteAddress: (addressId: number) => Promise<void> | void;\n isDeletingAddress?: boolean;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n isLoadingPaymentMethods?: boolean;\n onDeletePaymentMethod: (paymentMethodId: number) => Promise<void> | void;\n isDeletingPaymentMethod?: boolean;\n onUpdatePaymentMethod: (\n paymentMethodId: number,\n data: EditPaymentMethodFormData,\n ) => Promise<void> | void;\n isUpdatingPaymentMethod?: boolean;\n getBillingAddress?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => BillingAddress | null | undefined;\n countries?: CountryOption[];\n renderCreditCardDialog?: (props: CreditCardDialogRenderProps) => ReactNode;\n}\n\nexport default function Profile({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdatingCustomer,\n rewardsPointsEnabled = false,\n pointsLedger,\n isLoadingPointsLedger,\n addresses,\n isLoadingAddresses,\n onDeleteAddress,\n isDeletingAddress,\n renderAddressDialog,\n paymentMethods,\n isLoadingPaymentMethods,\n onDeletePaymentMethod,\n isDeletingPaymentMethod,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n}: ProfileProps): JSX.Element {\n return (\n <>\n <CustomerInfo\n customerAccount={customerAccount}\n languages={languages}\n onUpdateCustomer={onUpdateCustomer}\n isUpdating={isUpdatingCustomer}\n />\n {rewardsPointsEnabled && (\n <CustomerPointsLedger\n pointsLedger={pointsLedger ?? []}\n isLoading={isLoadingPointsLedger}\n />\n )}\n <Addresses\n addresses={addresses}\n isLoading={isLoadingAddresses}\n onDeleteAddress={onDeleteAddress}\n isDeletingAddress={isDeletingAddress}\n renderAddressDialog={renderAddressDialog}\n />\n <PaymentMethods\n paymentMethods={paymentMethods}\n isLoading={isLoadingPaymentMethods}\n onDeletePaymentMethod={onDeletePaymentMethod}\n isDeletingPaymentMethod={isDeletingPaymentMethod}\n onUpdatePaymentMethod={onUpdatePaymentMethod}\n isUpdatingPaymentMethod={isUpdatingPaymentMethod}\n getBillingAddress={getBillingAddress}\n countries={countries}\n renderCreditCardDialog={renderCreditCardDialog}\n />\n </>\n );\n}\n","\"use client\";\n\nimport type { Control, FieldPath, FieldValues } from \"react-hook-form\";\nimport { useController } from \"react-hook-form\";\nimport { Input, cn } from \"@fluid-app/ui-primitives\";\n\ninterface FormTextFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n control: Control<TFieldValues>;\n name: TName;\n placeholder?: string;\n containerClassName?: string;\n type?: React.HTMLInputTypeAttribute;\n disabled?: boolean;\n inputMode?: React.HTMLAttributes<HTMLInputElement>[\"inputMode\"];\n}\n\nexport function FormTextField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n placeholder,\n containerClassName,\n type,\n disabled,\n inputMode,\n}: FormTextFieldProps<TFieldValues, TName>) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n <Input\n {...field}\n value={field.value ?? \"\"}\n id={name}\n type={type}\n disabled={disabled}\n inputMode={inputMode}\n placeholder={placeholder}\n aria-invalid={!!error}\n />\n {error?.message && (\n <p className=\"text-sm text-red-500\">{error.message}</p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { Control, FieldPath, FieldValues } from \"react-hook-form\";\nimport { Controller } from \"react-hook-form\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n} from \"@fluid-app/ui-primitives\";\n\ntype NameValue = { name: string; value: string | number };\n\ninterface FormSelectFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n control: Control<TFieldValues>;\n name: TName;\n placeholder?: string;\n options?: NameValue[];\n containerClassName?: string;\n disabled?: boolean;\n}\n\nexport function FormSelectField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n placeholder = \"Select\",\n options,\n containerClassName,\n disabled,\n}: FormSelectFieldProps<TFieldValues, TName>) {\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n <Controller\n control={control}\n name={name}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <Select\n value={value?.toString() ?? \"\"}\n onValueChange={onChange}\n disabled={disabled}\n >\n <SelectTrigger\n aria-invalid={!!error}\n className={cn(\n \"w-full\",\n error && \"border-red-500 ring-1 ring-red-500\",\n )}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options && options.length > 0 ? (\n options.map((opt) => (\n <SelectItem\n key={opt.value.toString()}\n value={opt.value.toString()}\n >\n {opt.name}\n </SelectItem>\n ))\n ) : (\n <SelectItem value=\"__empty\" disabled>\n No available options\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n {error?.message && (\n <p className=\"text-sm text-red-500\">{error.message}</p>\n )}\n </>\n )}\n />\n </div>\n );\n}\n","import { type JSX, type ReactNode, useEffect } from \"react\";\nimport {\n useForm,\n useWatch,\n type Control,\n type UseFormSetValue,\n} from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField } from \"./form-fields/FormTextField\";\nimport { FormSelectField } from \"./form-fields/FormSelectField\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useCountryStates } from \"@fluid-app/fluid-pay-core\";\n\nconst addressFormSchema = 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 address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n postal_code: z.string().min(1, \"Postal code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n default: z.boolean(),\n});\n\nexport type AddressFormData = z.infer<typeof addressFormSchema>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface AddressAutocompleteRenderProps {\n control: Control<AddressFormData>;\n setValue: UseFormSetValue<AddressFormData>;\n countryCode: string;\n}\n\ninterface AddressFormDialogProps {\n isOpen: boolean;\n onClose: () => void;\n selectedAddress: fluidPay.CustomerAddress | null;\n onSubmit: (data: fluidPay.CreateAddressBody) => void;\n isSubmitting: boolean;\n countries?: CountryOption[];\n error?: string;\n renderAddressAutocomplete?: (\n props: AddressAutocompleteRenderProps,\n ) => ReactNode;\n t: (key: string) => string;\n}\n\nexport default function AddressFormDialog({\n isOpen,\n onClose,\n selectedAddress,\n onSubmit,\n isSubmitting,\n countries = [],\n error,\n renderAddressAutocomplete,\n t,\n}: AddressFormDialogProps): JSX.Element {\n const { control, handleSubmit, reset, setValue } = useForm<AddressFormData>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolver: zodResolver(addressFormSchema as any),\n defaultValues: {\n first_name: \"\",\n last_name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country_code: \"US\",\n default: false,\n },\n });\n\n const selectedCountryCode = useWatch({ control, name: \"country_code\" });\n const isDefault = useWatch({ control, name: \"default\" });\n\n const { stateOptions, config, handleCountryChange } = useCountryStates();\n\n const countrySelectOptions = [...countries]\n .map((country) => ({\n name: country.name,\n value: country.iso,\n }))\n .sort((a, b) => {\n if (a.value === selectedCountryCode) return -1;\n if (b.value === selectedCountryCode) return 1;\n return a.name.localeCompare(b.name);\n });\n\n const stateSelectOptions = stateOptions.map((state) => ({\n name: state.name,\n value: state.isoCode,\n }));\n\n useEffect(() => {\n if (isOpen) {\n if (selectedAddress) {\n const nameParts = (selectedAddress.name ?? \"\").split(\" \");\n const firstName = nameParts[0] ?? \"\";\n const lastName = nameParts.slice(1).join(\" \");\n reset({\n first_name: firstName,\n last_name: lastName,\n address1: selectedAddress.address1,\n address2: selectedAddress.address2 ?? \"\",\n city: selectedAddress.city,\n state: selectedAddress.state,\n postal_code: selectedAddress.postal_code,\n country_code: selectedAddress.country_code ?? \"US\",\n default: selectedAddress.default,\n });\n handleCountryChange(selectedAddress.country_code ?? \"US\");\n } else {\n reset({\n first_name: \"\",\n last_name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country_code: \"US\",\n default: false,\n });\n handleCountryChange(\"US\");\n }\n }\n }, [selectedAddress, isOpen, reset, handleCountryChange]);\n\n useEffect(() => {\n handleCountryChange(selectedCountryCode);\n }, [selectedCountryCode, handleCountryChange]);\n\n const handleFormSubmit = handleSubmit((data) => {\n onSubmit({\n address: {\n first_name: data.first_name,\n last_name: data.last_name,\n address1: data.address1,\n address2: data.address2 ?? null,\n city: data.city,\n state: data.state,\n postal_code: data.postal_code,\n country_code: data.country_code,\n default: data.default,\n },\n });\n });\n\n const isEditMode = selectedAddress !== null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-md overflow-y-auto rounded md:max-w-xl\">\n <DialogHeader>\n <DialogTitle className=\"text-lg font-medium\">\n {isEditMode ? t(\"edit_address\") : t(\"add_an_address\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-3 pt-2\">\n <FormSelectField\n control={control}\n name=\"country_code\"\n placeholder={t(\"country\")}\n options={countrySelectOptions}\n disabled={isSubmitting}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"first_name\"\n placeholder={t(\"first_name\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormTextField\n control={control}\n name=\"last_name\"\n placeholder={t(\"last_name\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n </div>\n {renderAddressAutocomplete ? (\n renderAddressAutocomplete({\n control,\n setValue,\n countryCode: selectedCountryCode,\n })\n ) : (\n <FormTextField\n control={control}\n name=\"address1\"\n placeholder={t(\"address_line_1\")}\n disabled={isSubmitting}\n />\n )}\n <FormTextField\n control={control}\n name=\"address2\"\n placeholder={t(\"address_line_2\")}\n disabled={isSubmitting}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"city\"\n placeholder={t(\"city\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormSelectField\n control={control}\n name=\"state\"\n placeholder={\n config?.regionLabel ? t(config.regionLabel) : t(\"select_state\")\n }\n options={stateSelectOptions}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormTextField\n control={control}\n name=\"postal_code\"\n placeholder={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default_address\"\n checked={isDefault}\n onChange={() => setValue(\"default\", !isDefault)}\n disabled={isSubmitting}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default_address\" className=\"text-sm\">\n {t(\"set_as_default_address\")}\n </label>\n </div>\n\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isSubmitting}\n className=\"rounded bg-gray-900 px-5 py-2.5 text-white hover:bg-gray-800\"\n >\n {isSubmitting ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save_address\")\n )}\n </Button>\n </div>\n\n {error && <div className=\"mt-2 text-sm text-red-500\">{error}</div>}\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, useRef, useState, useCallback } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\n\nexport type VgsFieldState = {\n isFocused: boolean;\n isValid: boolean;\n isEmpty: boolean;\n};\n\nexport type VgsFormState = {\n [key: string]: VgsFieldState;\n};\n\ninterface VGSCollectForm {\n setRouteId: (routeId: string) => void;\n field: (selector: string, config: Record<string, unknown>) => void;\n submit: (\n path: string,\n options: { headers?: Record<string, string> },\n successCallback: (\n status: number,\n response: fluidPay.VgsCollectSubmitResponse,\n ) => void,\n errorCallback: (errors: Record<string, string[]>) => void,\n ) => void;\n unmount: () => void;\n}\n\ninterface VGSCollectLibrary {\n create: (\n vaultId: string,\n environment: string,\n stateCallback: (state: Record<string, Partial<VgsFieldState>>) => void,\n ) => VGSCollectForm;\n}\n\nconst getVGSCollect = (): VGSCollectLibrary | null => {\n if (typeof window !== \"undefined\") {\n return (\n (window as unknown as { VGSCollect?: VGSCollectLibrary }).VGSCollect ||\n null\n );\n }\n return null;\n};\n\nconst DEFAULT_FIELD_STATE: VgsFormState = {\n card_number: { isFocused: false, isValid: false, isEmpty: true },\n card_exp: { isFocused: false, isValid: false, isEmpty: true },\n card_cvc: { isFocused: false, isValid: false, isEmpty: true },\n card_holder: { isFocused: false, isValid: false, isEmpty: true },\n};\n\nexport function useVgsCollect() {\n const [isFormReady, setIsFormReady] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isScriptLoaded, setIsScriptLoaded] = useState(false);\n\n const [vgsFieldState, setVgsFieldState] =\n useState<VgsFormState>(DEFAULT_FIELD_STATE);\n\n const formRef = useRef<VGSCollectForm | null>(null);\n const onSuccessRef = useRef<\n ((response: fluidPay.VgsCollectSubmitResponse) => void) | null\n >(null);\n const onErrorRef = useRef<((error: string) => void) | null>(null);\n\n // Load VGS Collect script\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const vgsCollect = getVGSCollect();\n if (vgsCollect) {\n const timeoutId = window.setTimeout(() => {\n setIsScriptLoaded(true);\n }, 0);\n return () => window.clearTimeout(timeoutId);\n }\n\n if (isScriptLoaded) return;\n\n const script = document.createElement(\"script\");\n script.src =\n \"https://js.verygoodvault.com/vgs-collect/3.3.0/vgs-collect.js\";\n script.async = true;\n script.onload = () => setIsScriptLoaded(true);\n script.onerror = () => onErrorRef.current?.(\"Failed to load payment form\");\n document.head.appendChild(script);\n }, [isScriptLoaded]);\n\n const updateFieldState = useCallback(\n (state: Record<string, Partial<VgsFieldState>>) => {\n if (!state) return;\n\n setVgsFieldState((prev) => {\n const newState: VgsFormState = { ...prev };\n let hasChanges = false;\n\n Object.keys(state).forEach((key) => {\n const field = state[key];\n if (!field) return;\n\n const next: VgsFieldState = {\n isFocused: !!field.isFocused,\n isValid: !!field.isValid,\n isEmpty: !!field.isEmpty,\n };\n\n if (\n !newState[key] ||\n JSON.stringify(newState[key]) !== JSON.stringify(next)\n ) {\n newState[key] = next;\n hasChanges = true;\n }\n });\n\n return hasChanges ? newState : prev;\n });\n },\n [],\n );\n\n const resetVgs = useCallback(() => {\n if (formRef.current) {\n try {\n formRef.current.unmount();\n } catch (e) {\n console.warn(\"VGS unmount error\", e);\n }\n formRef.current = null;\n }\n\n setIsFormReady(false);\n setVgsFieldState({ ...DEFAULT_FIELD_STATE });\n }, []);\n\n const initializeForm = useCallback(\n async (credentials: fluidPay.VaultResponse) => {\n if (!isScriptLoaded) return;\n\n const VGSCollect = getVGSCollect();\n if (!VGSCollect) {\n onErrorRef.current?.(\"Payment script not loaded\");\n return;\n }\n\n try {\n setIsLoading(true);\n\n const vgsEnvironment =\n credentials.vault.environment === \"sandbox\" ? \"sandbox\" : \"live-eu-1\";\n\n const form = VGSCollect.create(\n credentials.vault.vault_id,\n vgsEnvironment,\n (state) => updateFieldState(state),\n );\n\n if (credentials.vault.route_id) {\n form.setRouteId(credentials.vault.route_id);\n }\n\n formRef.current = form;\n\n // Wait for DOM elements\n let retries = 0;\n const maxRetries = 20;\n const retryDelay = 200;\n\n const waitForDom = async (): Promise<boolean> => {\n const allExist = [\n \"vgs-card-number\",\n \"vgs-expiration-date\",\n \"vgs-cvc\",\n \"vgs-card-holder\",\n ].every((id) => {\n const el = document.getElementById(id);\n return el && el.isConnected;\n });\n\n if (allExist) return true;\n if (retries >= maxRetries) return false;\n\n retries++;\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n return waitForDom();\n };\n\n const domReady = await waitForDom();\n if (!domReady) {\n throw new Error(\"Payment form elements not ready\");\n }\n\n const css = {\n fontSize: \"14px\",\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n color: \"#1f2937\",\n paddingTop: \"0px\",\n paddingBottom: \"0px\",\n paddingLeft: \"0px\",\n paddingRight: \"0px\",\n boxSizing: \"border-box\",\n lineHeight: \"38px\",\n height: \"100%\",\n width: \"100%\",\n \"&::placeholder\": { color: \"#9ca3af\", opacity: 1 },\n \"&:focus\": { outline: \"none\" },\n };\n\n form.field(\"#vgs-card-number\", {\n type: \"card-number\",\n name: \"card_number\",\n placeholder: \"0000 0000 0000 0000\",\n showCardIcon: true,\n css: { ...css, paddingRight: \"40px\" },\n autoComplete: \"cc-number\",\n validations: [\"required\", \"validCardNumber\"],\n });\n\n form.field(\"#vgs-expiration-date\", {\n type: \"card-expiration-date\",\n name: \"card_exp\",\n yearLength: 2,\n placeholder: \"MM / YY\",\n css,\n autoComplete: \"cc-exp\",\n validations: [\"required\", \"validCardExpirationDate\"],\n });\n\n form.field(\"#vgs-cvc\", {\n type: \"card-security-code\",\n name: \"card_cvc\",\n placeholder: \"123\",\n css,\n autoComplete: \"cc-csc\",\n validations: [\"required\", \"validCardSecurityCode\"],\n });\n\n form.field(\"#vgs-card-holder\", {\n type: \"text\",\n name: \"card_holder\",\n placeholder: \"Full Name\",\n css,\n autoComplete: \"cc-name\",\n validations: [\"required\"],\n });\n\n setIsFormReady(true);\n } catch (error) {\n console.error(\"Failed to initialize VGS:\", error);\n onErrorRef.current?.(\"Failed to initialize payment form\");\n } finally {\n setIsLoading(false);\n }\n },\n [isScriptLoaded, updateFieldState],\n );\n\n const submitCard = useCallback(() => {\n if (!formRef.current) {\n onErrorRef.current?.(\"Form not initialized\");\n return;\n }\n\n formRef.current.submit(\n `/post`,\n {},\n (status: number, response: fluidPay.VgsCollectSubmitResponse) => {\n if (status >= 200 && status < 400) {\n onSuccessRef.current?.(response);\n } else {\n onErrorRef.current?.(\"Payment failed\");\n }\n },\n (errors: Record<string, string[]>) => {\n const allErrors = Object.values(errors)\n .flat()\n .filter(\n (msg) =>\n typeof msg === \"string\" &&\n msg.trim().length > 0 &&\n msg !== \"Required\",\n );\n\n const uniqueErrors = Array.from(new Set(allErrors));\n\n let errorMsg = \"Please verify your payment details.\";\n if (uniqueErrors.length > 0) {\n errorMsg = uniqueErrors.join(\", \");\n } else {\n const rawErrors = Object.values(errors).flat();\n if (rawErrors.length > 0) {\n errorMsg = \"Please fill in all required fields.\";\n }\n }\n\n onErrorRef.current?.(errorMsg);\n },\n );\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (formRef.current) {\n try {\n formRef.current.unmount();\n } catch (e) {\n console.warn(\"VGS unmount error\", e);\n }\n formRef.current = null;\n }\n };\n }, []);\n\n return {\n isFormReady,\n isLoading,\n isScriptLoaded,\n initializeForm,\n submitCard,\n vgsFieldState,\n resetVgs,\n onSuccessRef,\n onErrorRef,\n };\n}\n","import {\n type JSX,\n type ReactNode,\n useEffect,\n useState,\n useCallback,\n} from \"react\";\nimport {\n useForm,\n useWatch,\n type Control,\n type UseFormSetValue,\n} from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n cn,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField } from \"./form-fields/FormTextField\";\nimport { FormSelectField } from \"./form-fields/FormSelectField\";\nimport type { fluidPay, FetchClient } from \"@fluid-app/fluid-pay-api-client\";\nimport { vaultApi } from \"@fluid-app/fluid-pay-api-client\";\nimport { useCountryStates } from \"@fluid-app/fluid-pay-core\";\nimport {\n useVgsCollect,\n type VgsFieldState,\n type VgsFormState,\n} from \"../hooks/use-vgs-collect\";\n\nconst billingAddressSchema = z.object({\n name: z.string().min(1, \"Name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n zip: z.string().min(1, \"Zip code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n set_as_default: z.boolean(),\n});\n\ntype BillingAddressFormData = z.infer<typeof billingAddressSchema>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface BillingAddressAutocompleteRenderProps {\n control: Control<BillingAddressFormData>;\n setValue: UseFormSetValue<BillingAddressFormData>;\n countryCode: string;\n}\n\ninterface CreditCardFormDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (data: fluidPay.AddCreditCardData) => void;\n isSubmitting: boolean;\n countries?: CountryOption[];\n error?: string;\n jwt: string;\n client: FetchClient;\n renderAddressAutocomplete?: (\n props: BillingAddressAutocompleteRenderProps,\n ) => ReactNode;\n t: (key: string) => string;\n}\n\nfunction VgsInputWrapper({\n id,\n fieldState,\n className,\n}: {\n id: string;\n fieldState?: VgsFieldState;\n className?: string;\n}) {\n const isInvalid =\n fieldState?.isValid === false &&\n !fieldState?.isFocused &&\n !fieldState?.isEmpty;\n\n const isFocused = fieldState?.isFocused;\n\n return (\n <div className=\"w-full\">\n <div\n id={id}\n className={cn(\n \"relative flex h-10 w-full items-center rounded-md border border-gray-300 bg-white px-3 shadow-sm transition-all duration-200 ease-in-out\",\n \"[&_iframe]:block! [&_iframe]:h-full! [&_iframe]:w-full!\",\n isFocused && \"border-blue-600 ring-1 ring-blue-600\",\n isInvalid && \"border-red-500 ring-1 ring-red-500\",\n className,\n )}\n />\n </div>\n );\n}\n\nfunction VgsCardForm({\n isLoading,\n isFormReady,\n vgsFieldState,\n networkError,\n t,\n}: {\n isLoading: boolean;\n isFormReady: boolean;\n vgsFieldState: VgsFormState;\n networkError?: string;\n t: (key: string) => string;\n}) {\n const showSpinner = isLoading || !isFormReady;\n\n return (\n <div className=\"space-y-4\" aria-label=\"Credit card form\">\n <VgsInputWrapper\n id=\"vgs-card-number\"\n fieldState={vgsFieldState[\"card_number\"]}\n />\n\n <div className=\"flex gap-3\">\n <div className=\"flex-1\">\n <VgsInputWrapper\n id=\"vgs-expiration-date\"\n fieldState={vgsFieldState[\"card_exp\"]}\n />\n </div>\n <div className=\"flex-1\">\n <VgsInputWrapper\n id=\"vgs-cvc\"\n fieldState={vgsFieldState[\"card_cvc\"]}\n />\n </div>\n </div>\n\n <VgsInputWrapper\n id=\"vgs-card-holder\"\n fieldState={vgsFieldState[\"card_holder\"]}\n />\n\n {networkError && networkError.trim().length > 0 && (\n <div className=\"rounded-md bg-red-50 p-3 text-sm text-red-600\">\n {networkError}\n </div>\n )}\n </div>\n );\n}\n\nexport default function CreditCardFormDialog({\n isOpen,\n onClose,\n onSubmit,\n isSubmitting,\n countries = [],\n error,\n jwt,\n client,\n renderAddressAutocomplete,\n t,\n}: CreditCardFormDialogProps): JSX.Element {\n const [cardError, setCardError] = useState<string | undefined>(undefined);\n const [isVgsSubmitting, setIsVgsSubmitting] = useState(false);\n\n const {\n isFormReady,\n isLoading: isVgsLoading,\n isScriptLoaded,\n initializeForm,\n submitCard,\n vgsFieldState,\n resetVgs,\n onSuccessRef,\n onErrorRef,\n } = useVgsCollect();\n\n const { control, handleSubmit, reset, setValue } =\n useForm<BillingAddressFormData>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolver: zodResolver(billingAddressSchema as any),\n defaultValues: {\n name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n zip: \"\",\n country_code: \"US\",\n set_as_default: false,\n },\n });\n\n const billingCountry = useWatch({ control, name: \"country_code\" });\n const setAsDefault = useWatch({ control, name: \"set_as_default\" });\n\n const { stateOptions, config, handleCountryChange } = useCountryStates();\n\n const countrySelectOptions = [...countries]\n .map((country) => ({\n name: country.name,\n value: country.iso,\n }))\n .sort((a, b) => {\n if (a.value === billingCountry) return -1;\n if (b.value === billingCountry) return 1;\n return a.name.localeCompare(b.name);\n });\n\n const stateSelectOptions = stateOptions.map((state) => ({\n name: state.name,\n value: state.isoCode,\n }));\n\n useEffect(() => {\n handleCountryChange(billingCountry);\n }, [billingCountry, handleCountryChange]);\n\n // Initialize VGS when dialog opens\n useEffect(() => {\n if (!isOpen || !isScriptLoaded || !jwt) return;\n\n let cancelled = false;\n\n const init = async () => {\n try {\n const credentials =\n await vaultApi.fetchVaultCredentialsForPaymentAccount(client, jwt);\n if (!cancelled) {\n await initializeForm(credentials);\n }\n } catch (err) {\n console.error(\"Failed to fetch vault credentials:\", err);\n if (!cancelled) {\n setCardError(\"Failed to initialize payment form\");\n }\n }\n };\n\n init();\n\n return () => {\n cancelled = true;\n };\n }, [isOpen, isScriptLoaded, jwt, client, initializeForm]);\n\n // Wire up VGS callbacks\n const handleVgsSuccess = useCallback(\n (response: fluidPay.VgsCollectSubmitResponse) => {\n const expValue = response?.card_exp;\n if (!expValue) {\n setCardError(\"Missing expiration date from payment form\");\n setIsVgsSubmitting(false);\n return;\n }\n\n const cleanExp = expValue.replace(/\\s+/g, \"\");\n const [expMonth, expYearShort] = cleanExp.split(\"/\");\n\n if (!expMonth || !expYearShort) {\n setCardError(\"Invalid expiration date format\");\n setIsVgsSubmitting(false);\n return;\n }\n\n const expYear =\n expYearShort.length === 2 ? `20${expYearShort}` : expYearShort;\n\n const cardholderName = response?.card_holder?.trim();\n if (!cardholderName) {\n setCardError(\"Cardholder name is required\");\n setIsVgsSubmitting(false);\n return;\n }\n\n // Read the current form values synchronously via handleSubmit\n handleSubmit((formData) => {\n const creditCardData: fluidPay.AddCreditCardData = {\n type: \"credit_card\",\n country_code: formData.country_code,\n default_payment_method: formData.set_as_default,\n payment_method: {\n token: response.card_number,\n cvv_token: response.card_cvc,\n exp_month: expMonth,\n exp_year: expYear,\n card_holder: cardholderName,\n billing_zip: formData.zip,\n },\n billing_address: {\n name: formData.name,\n address1: formData.address1,\n address2: formData.address2 ?? undefined,\n city: formData.city,\n state: formData.state,\n zip: formData.zip,\n country_code: formData.country_code,\n },\n };\n\n onSubmit(creditCardData);\n setIsVgsSubmitting(false);\n })();\n },\n [handleSubmit, onSubmit],\n );\n\n const handleVgsError = useCallback((err: string) => {\n setCardError(err);\n setIsVgsSubmitting(false);\n }, []);\n\n useEffect(() => {\n onSuccessRef.current = handleVgsSuccess;\n onErrorRef.current = handleVgsError;\n }, [handleVgsSuccess, handleVgsError, onSuccessRef, onErrorRef]);\n\n const handleClose = () => {\n resetVgs();\n reset();\n setCardError(undefined);\n setIsVgsSubmitting(false);\n onClose();\n };\n\n const handleFormSubmit = handleSubmit(() => {\n setIsVgsSubmitting(true);\n setCardError(undefined);\n submitCard();\n });\n\n const isBusy = isSubmitting || isVgsSubmitting;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-md overflow-y-auto rounded p-0 md:max-w-xl\">\n <div className=\"relative p-6\">\n {(isVgsLoading || !isFormReady) && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center rounded bg-white/80 backdrop-blur-[1px]\">\n <div className=\"flex items-center justify-center\">\n <div className=\"mr-3 h-5 w-5 animate-spin rounded-full border-2 border-t-2 border-blue-600 border-t-transparent\" />\n <p className=\"text-sm font-medium text-gray-600\">\n {t(\"securing\")}\n </p>\n </div>\n </div>\n )}\n <DialogHeader>\n <DialogTitle className=\"text-lg font-medium\">\n {t(\"add_credit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4 pt-6\">\n <VgsCardForm\n isLoading={isVgsLoading}\n isFormReady={isFormReady}\n vgsFieldState={vgsFieldState}\n networkError={cardError ?? error}\n t={t}\n />\n\n <div className=\"space-y-3 pt-2\">\n <h3 className=\"text-sm font-medium text-gray-500\">\n {t(\"billing_address\")}\n </h3>\n <FormSelectField\n control={control}\n name=\"country_code\"\n placeholder={t(\"country\")}\n options={countrySelectOptions}\n disabled={isBusy}\n />\n <FormTextField\n control={control}\n name=\"name\"\n placeholder={t(\"name\")}\n disabled={isBusy}\n />\n {renderAddressAutocomplete ? (\n renderAddressAutocomplete({\n control,\n setValue,\n countryCode: billingCountry,\n })\n ) : (\n <FormTextField\n control={control}\n name=\"address1\"\n placeholder={t(\"address_line_1\")}\n disabled={isBusy}\n />\n )}\n <FormTextField\n control={control}\n name=\"address2\"\n placeholder={t(\"address_line_2\")}\n disabled={isBusy}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"city\"\n placeholder={t(\"city\")}\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n <FormSelectField\n control={control}\n name=\"state\"\n placeholder={\n config?.regionLabel\n ? t(config.regionLabel)\n : t(\"select_state\")\n }\n options={stateSelectOptions}\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n <FormTextField\n control={control}\n name=\"zip\"\n placeholder={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n </div>\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default_cc\"\n checked={setAsDefault}\n onChange={() => setValue(\"set_as_default\", !setAsDefault)}\n disabled={isBusy}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default_cc\" className=\"text-sm\">\n {t(\"set_as_default_payment_method\")}\n </label>\n </div>\n\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isBusy}\n className=\"rounded bg-gray-900 px-5 py-2.5 text-white hover:bg-gray-800\"\n >\n {isBusy ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save_card\")\n )}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo } from \"react\";\nimport { useController } from \"react-hook-form\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { ProfileUIProvider } from \"@fluid-app/profile-core\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n Profile,\n AddressFormDialog,\n CreditCardFormDialog,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n BillingAddressAutocompleteRenderProps,\n} from \"@fluid-app/profile-ui\";\nimport {\n customersApi,\n addressesApi,\n paymentMethodsApi,\n} from \"@fluid-app/fluid-pay-api-client\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useFluidAuth } from \"../hooks/use-fluid-auth\";\nimport {\n useFluidPayClient,\n useSdkClient,\n API_VERSION,\n} from \"../account/use-account-clients\";\n\ninterface AccountProfileScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nconst translations: Record<string, string> = {\n edit_profile: \"Edit Profile\",\n first_name: \"First Name\",\n last_name: \"Last Name\",\n phone_number: \"Phone Number\",\n language: \"Language\",\n first_name_is_required: \"First name is required\",\n last_name_is_required: \"Last name is required\",\n language_is_required: \"Language is required\",\n saving: \"Saving...\",\n save_changes: \"Save Changes\",\n select_an_option: \"Select an option\",\n points_history: \"Points History\",\n points_available: \"Points Available\",\n points_awarded: \"Points Awarded\",\n points_redeemed: \"Points Redeemed\",\n transaction: \"Transaction\",\n no_points_history_found: \"No points history found\",\n shipping_addresses: \"Shipping Addresses\",\n add_an_address: \"Add an Address\",\n delete_address: \"Delete Address\",\n delete_address_message:\n \"Are you sure you want to delete this address? This action cannot be undone.\",\n delete: \"Delete\",\n add_address: \"Add Address\",\n edit_address: \"Edit Address\",\n set_as_default_address: \"Set as default address\",\n save_address: \"Save Address\",\n card_number: \"Card Number\",\n expiration_date: \"Expiration (MM / YY)\",\n cvc: \"CVC\",\n cardholder_name: \"Cardholder Name\",\n add_credit_card: \"Add Credit Card\",\n save_card: \"Save Card\",\n securing: \"Loading secure form...\",\n payment_methods: \"Payment Methods\",\n add_payment_method: \"Add Payment Method\",\n delete_credit_card: \"Delete Credit Card\",\n delete_credit_card_message:\n \"Are you sure you want to delete this payment method? This action cannot be undone.\",\n edit_card: \"Card Details\",\n billing_address: \"Billing Address\",\n country: \"Country\",\n name: \"Name\",\n address_line_1: \"Address Line 1\",\n address_line_2: \"Address Line 2\",\n city: \"City\",\n state: \"State\",\n province: \"Province\",\n zip_code: \"Zip Code\",\n postal_code: \"Postal Code\",\n select_state: \"Select state\",\n set_as_default_payment_method: \"Set as default payment method\",\n cancel: \"Cancel\",\n save: \"Save\",\n close: \"Close\",\n edit: \"Edit\",\n default: \"Default\",\n card_expires: \"Expires\",\n no_billing_address: \"No billing address on file\",\n default_payment_method_updated: \"Payment method updated\",\n failed_to_set_default_payment_method: \"Failed to update payment method\",\n};\n\nfunction t(key: string): string {\n if (translations[key]) return translations[key];\n return key\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\ninterface RawPointsLedgerEntry {\n id: number;\n amount: number;\n customer_id: number;\n created_at: string;\n metadata?: {\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 total_balance?: number;\n}\n\nfunction adaptPointsLedger(entry: RawPointsLedgerEntry): PointsLedger {\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: entry.customer_id,\n metadata: {\n transaction_type: entry.metadata?.transaction_type ?? undefined,\n source: entry.metadata?.source ?? undefined,\n },\n total_balance: entry.total_balance ?? 0,\n updated_at: entry.created_at,\n };\n}\n\nexport function AccountProfileScreen({\n onToast,\n countryIso,\n}: AccountProfileScreenProps): React.JSX.Element {\n const { token, user } = useFluidAuth();\n const client = useFluidPayClient();\n const sdkClient = useSdkClient();\n const queryClient = useQueryClient();\n const jwt = token ?? \"\";\n const userId = user?.id;\n\n // -- Data fetching --\n\n const {\n data: accountData,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useQuery({\n queryKey: [\"fluidPayAccount\", userId],\n queryFn: () => customersApi.fetchCustomerAccount(client, jwt),\n enabled: !!jwt,\n });\n\n const { data: addressesData, isLoading: isLoadingAddresses } = useQuery({\n queryKey: [\"fluidPayAddresses\", userId],\n queryFn: () => addressesApi.fetchCustomerAddresses(client, jwt),\n enabled: !!jwt,\n });\n\n const { data: paymentMethodsData, isLoading: isLoadingPaymentMethods } =\n useQuery({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n queryFn: () =>\n paymentMethodsApi.fetchCustomerPaymentMethods(client, jwt, countryIso),\n enabled: !!jwt,\n });\n\n const { data: countriesData } = useQuery({\n queryKey: [\"sdk-countries\"],\n queryFn: () =>\n sdkClient.get<Array<{ iso: string; name: string }>>(\"/countries\"),\n initialData: [],\n });\n\n const customerId = accountData?.customer?.id;\n\n const { data: pointsLedgerData, isLoading: isLoadingPointsLedger } = useQuery(\n {\n queryKey: [\"customer-points-ledger\", customerId],\n queryFn: () =>\n sdkClient.get<{ points_ledgers: RawPointsLedgerEntry[] }>(\n `${API_VERSION}/customers/${customerId}/points_ledgers`,\n ),\n enabled: !!customerId,\n },\n );\n\n // -- Mutations --\n\n const updateCustomerMutation = useMutation({\n mutationFn: (data: UserFormData) => {\n const languageIso =\n adaptedLanguages?.find((l) => l.name === data.language)?.iso ?? \"en\";\n return customersApi.updateCustomer(client, jwt, {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n language_iso: languageIso,\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAccount\", userId],\n });\n onToast(\"Profile updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update profile\", \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) =>\n addressesApi.deleteCustomerAddress(client, jwt, addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n paymentMethodsApi.deleteCustomerPaymentMethod(\n client,\n jwt,\n paymentMethodId,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n paymentMethodsApi.updatePaymentMethod(client, jwt, paymentMethodId, {\n set_as_default: data.set_as_default,\n billing_address: data.billing_address,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n },\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) =>\n addressesApi.createCustomerAddress(client, jwt, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\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 }) => addressesApi.updateCustomerAddress(client, jwt, addressId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\n onToast(\"Address updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update address\", \"error\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: fluidPay.AddCreditCardData) =>\n paymentMethodsApi.addCreditCardToCustomer(client, jwt, data),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n onToast(\"Payment method added\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to add payment method\", \"error\");\n },\n });\n\n // -- Derived data --\n\n const addresses = addressesData?.addresses ?? [];\n const paymentMethods = paymentMethodsData?.payment_methods ?? [];\n\n const adaptedPointsLedger: PointsLedger[] =\n pointsLedgerData?.points_ledgers?.map(adaptPointsLedger) ?? [];\n\n // MVP: Only English is supported. When the API exposes a languages endpoint, fetch dynamically.\n const adaptedLanguages: Language[] = [{ id: 0, name: \"English\", iso: \"en\" }];\n\n const countryOptions = useMemo(\n () =>\n [...countriesData]\n .map((c) => ({ iso: c.iso, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n\n // -- Loading state --\n\n if (!token) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"rounded-lg border p-4 text-center\">Login Required</div>\n </div>\n );\n }\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) {\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 return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <ProfileUIProvider t={t}>\n <Profile\n customerAccount={accountData}\n languages={adaptedLanguages}\n onUpdateCustomer={async (data) => {\n await updateCustomerMutation.mutateAsync(data);\n }}\n isUpdatingCustomer={updateCustomerMutation.isPending}\n // MVP: matches admin behavior; a merchant-level flag would be better\n rewardsPointsEnabled={adaptedPointsLedger.length > 0}\n pointsLedger={adaptedPointsLedger}\n isLoadingPointsLedger={isLoadingPointsLedger}\n addresses={addresses}\n isLoadingAddresses={isLoadingAddresses}\n onDeleteAddress={async (addressId) => {\n await deleteAddressMutation.mutateAsync(addressId);\n }}\n isDeletingAddress={deleteAddressMutation.isPending}\n paymentMethods={paymentMethods}\n isLoadingPaymentMethods={isLoadingPaymentMethods}\n onDeletePaymentMethod={async (paymentMethodId) => {\n await deletePaymentMethodMutation.mutateAsync(paymentMethodId);\n }}\n isDeletingPaymentMethod={deletePaymentMethodMutation.isPending}\n onUpdatePaymentMethod={async (paymentMethodId, data) => {\n await updatePaymentMethodMutation.mutateAsync({\n paymentMethodId,\n data,\n });\n }}\n isUpdatingPaymentMethod={updatePaymentMethodMutation.isPending}\n getBillingAddress={(pm) => pm.billing_address ?? null}\n countries={countryOptions}\n renderAddressDialog={({ isOpen, onClose, selectedAddress }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={selectedAddress}\n t={t}\n onSubmit={async (formData) => {\n if (selectedAddress) {\n await updateAddressMutation.mutateAsync({\n addressId: selectedAddress.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n onClose();\n }}\n isSubmitting={\n createAddressMutation.isPending ||\n updateAddressMutation.isPending\n }\n countries={countryOptions}\n renderAddressAutocomplete={({\n control,\n setValue: _setValue,\n }: {\n control: Parameters<\n NonNullable<\n Parameters<\n typeof AddressFormDialog\n >[0][\"renderAddressAutocomplete\"]\n >\n >[0][\"control\"];\n setValue: Parameters<\n NonNullable<\n Parameters<\n typeof AddressFormDialog\n >[0][\"renderAddressAutocomplete\"]\n >\n >[0][\"setValue\"];\n }) => <PlainAddressInput control={control} name=\"address1\" />}\n />\n )}\n renderCreditCardDialog={({ isOpen, onClose }) => (\n <CreditCardFormDialog\n isOpen={isOpen}\n onClose={onClose}\n t={t}\n onSubmit={async (data) => {\n await addCreditCardMutation.mutateAsync(data);\n onClose();\n }}\n isSubmitting={addCreditCardMutation.isPending}\n countries={countryOptions}\n jwt={jwt}\n client={client}\n renderAddressAutocomplete={({\n control,\n setValue: _setValue,\n }: BillingAddressAutocompleteRenderProps) => (\n <PlainAddressInput control={control} name=\"address1\" />\n )}\n />\n )}\n />\n </ProfileUIProvider>\n </div>\n );\n}\n\n/**\n * Plain text input fallback for address autocomplete.\n * The SDK doesn't have Google Places integration.\n */\nfunction PlainAddressInput({\n control,\n name,\n}: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n control: any;\n name: string;\n}): React.JSX.Element {\n const { field } = useController({ control, name: name as string });\n return (\n <input\n type=\"text\"\n value={(field.value as string) ?? \"\"}\n placeholder=\"Address Line 1\"\n className=\"border-input bg-background ring-offset-background placeholder:text-muted-foreground focus-visible:ring-ring flex h-10 w-full rounded-md border px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\"\n onChange={field.onChange}\n />\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\n\nconst OrdersClientContext = createContext<FetchClient | null>(null);\n\nexport const OrdersClientProvider = OrdersClientContext.Provider;\n\nexport function useOrdersClient(): FetchClient {\n const client = useContext(OrdersClientContext);\n if (!client) {\n throw new Error(\n \"useOrdersClient must be used within an OrdersCoreProvider\",\n );\n }\n return client;\n}\n","import type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { JSX, ReactNode } from \"react\";\nimport { OrdersClientProvider } from \"./context\";\n\nexport interface OrdersCoreProviderProps {\n client: FetchClient;\n children: ReactNode;\n}\n\nexport function OrdersCoreProvider({\n client,\n children,\n}: OrdersCoreProviderProps): JSX.Element {\n return <OrdersClientProvider value={client}>{children}</OrdersClientProvider>;\n}\n","import type { orders } from \"@fluid-app/orders-api-client\";\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","import { useQuery } from \"@tanstack/react-query\";\nimport { ordersApi } from \"@fluid-app/orders-api-client\";\nimport { ordersKeys } from \"../query-keys\";\nimport { useOrdersClient } from \"../context\";\n\nexport function useOrder(orderToken: string, options?: { enabled?: boolean }) {\n const client = useOrdersClient();\n return useQuery({\n queryKey: ordersKeys.detail(orderToken),\n queryFn: () => ordersApi.fetchOrder(client, orderToken),\n enabled: (options?.enabled ?? true) && !!orderToken,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { orders } from \"@fluid-app/orders-api-client\";\nimport { ordersApi } from \"@fluid-app/orders-api-client\";\nimport { ordersKeys } from \"../query-keys\";\nimport { useOrdersClient } from \"../context\";\n\nexport function useCustomerOrders(\n params: orders.FetchOrdersParams,\n options?: { enabled?: boolean },\n) {\n const client = useOrdersClient();\n return useQuery({\n queryKey: ordersKeys.list(params),\n queryFn: () => ordersApi.fetchCustomerOrders(client, params),\n enabled: options?.enabled ?? true,\n });\n}\n","import type { orders } from \"@fluid-app/orders-api-client\";\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","import { Input } from \"@fluid-app/ui-primitives\";\nimport { Search } from \"lucide-react\";\n\ninterface SearchInputProps {\n searchTerm: string;\n onSearchChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function SearchInput({\n searchTerm,\n onSearchChange,\n placeholder,\n}: SearchInputProps) {\n return (\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2\" />\n <Input\n value={searchTerm}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={placeholder}\n className=\"pl-9\"\n />\n </div>\n );\n}\n","import { cn } from \"@fluid-app/ui-primitives\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nexport interface PaginationFooterProps {\n currentPage: number;\n totalPages: number;\n pageSize: number;\n totalItems: number;\n /** @deprecated No longer used. Kept for backward compatibility with subscriptions-ui. */\n maxVisiblePages?: number;\n onPageChange?: (page: number) => void;\n cursorPaginationMode?: boolean;\n hasNextPage?: boolean;\n hasPrevPage?: boolean;\n onCursorNext?: () => void;\n onCursorPrev?: () => void;\n /** @deprecated Use lucide icons directly. Kept for backward compatibility with subscriptions-ui. */\n chevronLeftIcon?: string;\n /** @deprecated Use lucide icons directly. Kept for backward compatibility with subscriptions-ui. */\n chevronRightIcon?: string;\n /** @deprecated Pagination labels are now hardcoded in English. Kept for backward compatibility. */\n t?: (key: string) => string;\n}\n\nexport function PaginationFooter({\n currentPage,\n totalPages,\n pageSize,\n totalItems,\n onPageChange,\n cursorPaginationMode,\n hasNextPage,\n hasPrevPage,\n onCursorNext,\n onCursorPrev,\n}: PaginationFooterProps) {\n const isCursor = !!cursorPaginationMode;\n\n const isPrevDisabled = isCursor ? !hasPrevPage : currentPage === 1;\n const isNextDisabled = isCursor\n ? !hasNextPage\n : totalPages === 0 || currentPage === totalPages;\n\n const handlePrevClick = () => {\n if (isCursor) {\n onCursorPrev?.();\n } else {\n onPageChange?.(currentPage - 1);\n }\n };\n\n const handleNextClick = () => {\n if (isCursor) {\n onCursorNext?.();\n } else {\n onPageChange?.(currentPage + 1);\n }\n };\n\n const displayText = (() => {\n if (isCursor) {\n return (\n <>\n Total <span className=\"font-medium\">{totalItems}</span> results\n </>\n );\n }\n const start = totalItems === 0 ? 0 : (currentPage - 1) * pageSize + 1;\n const end = Math.min(currentPage * pageSize, totalItems);\n return (\n <>\n Showing <span className=\"font-medium\">{start}</span> to{\" \"}\n <span className=\"font-medium\">{end}</span> of{\" \"}\n <span className=\"font-medium\">{totalItems}</span> results\n </>\n );\n })();\n\n const buttonBase =\n \"relative inline-flex items-center px-3 py-2 text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50\";\n\n return (\n <div className=\"border-border flex items-center justify-between border-t px-4 py-3 sm:px-6\">\n {/* Mobile prev/next */}\n <div className=\"flex flex-1 justify-between sm:hidden\">\n <button\n type=\"button\"\n onClick={handlePrevClick}\n disabled={isPrevDisabled}\n className={cn(\n buttonBase,\n \"border-border bg-background text-foreground hover:bg-accent rounded-md border\",\n )}\n >\n Previous\n </button>\n <button\n type=\"button\"\n onClick={handleNextClick}\n disabled={isNextDisabled}\n className={cn(\n buttonBase,\n \"border-border bg-background text-foreground hover:bg-accent ml-3 rounded-md border\",\n )}\n >\n Next\n </button>\n </div>\n\n {/* Desktop */}\n <div className=\"hidden sm:flex sm:flex-1 sm:items-center sm:justify-between\">\n <p className=\"text-muted-foreground text-xs\">{displayText}</p>\n <nav\n aria-label=\"Pagination\"\n className=\"isolate inline-flex -space-x-px rounded-md shadow-sm\"\n >\n <button\n type=\"button\"\n onClick={handlePrevClick}\n disabled={isPrevDisabled}\n className={cn(\n buttonBase,\n \"border-border text-muted-foreground hover:bg-accent rounded-l-md border\",\n )}\n >\n <span className=\"sr-only\">Previous</span>\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n {!isCursor && (\n <span className=\"border-border bg-background text-foreground relative inline-flex items-center border px-4 py-2 text-sm font-medium\">\n {currentPage} / {totalPages}\n </span>\n )}\n <button\n type=\"button\"\n onClick={handleNextClick}\n disabled={isNextDisabled}\n className={cn(\n buttonBase,\n \"border-border text-muted-foreground hover:bg-accent rounded-r-md border\",\n )}\n >\n <span className=\"sr-only\">Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </nav>\n </div>\n </div>\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-100 text-green-800 dark:bg-green-900/30 dark:text-green-400\",\n yellow:\n \"bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400\",\n red: \"bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400\",\n blue: \"bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400\",\n gray: \"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300\",\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\",\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","import { cn } from \"@fluid-app/ui-primitives\";\n\ninterface TableColumnProps {\n label: string;\n sortable?: boolean;\n className?: string;\n onSortClick?: (sortBy: string) => void;\n sortBy?: string;\n sortData?: {\n column: string;\n direction: \"asc\" | \"desc\";\n };\n chevronUpIcon?: string;\n chevronDownIcon?: string;\n}\n\nexport function TableColumn({\n label,\n sortable = true,\n className,\n onSortClick,\n sortBy,\n sortData,\n chevronUpIcon,\n chevronDownIcon,\n}: TableColumnProps) {\n const hideUpIcon =\n sortData?.column !== sortBy ||\n (sortData?.column === sortBy && sortData?.direction === \"asc\");\n\n const hideDownIcon =\n sortData?.column !== sortBy ||\n (sortData?.column === sortBy && sortData?.direction === \"desc\");\n\n return (\n <th\n className={cn(\n \"group cursor-pointer px-3 py-2 text-left text-xs font-medium text-gray-500 transition-colors duration-200\",\n \"hover:text-blue-600\",\n className,\n )}\n onClick={() => sortable && onSortClick?.(sortBy ?? \"\")}\n >\n <div className=\"relative flex items-center\">\n {label}\n {sortable && chevronUpIcon && chevronDownIcon && (\n <button\n className={`ml-2 inline-flex flex-col items-center justify-center group-hover:opacity-100 ${\n sortData?.column === sortBy ? \"opacity-100\" : \"opacity-0\"\n } transition-opacity duration-200`}\n >\n <div className=\"flex flex-col\">\n <img\n src={chevronUpIcon}\n alt=\"\"\n width={12}\n height={12}\n className={cn(\n \"h-2.5 w-2.5 text-gray-400 transition-colors duration-200 group-hover:text-blue-600\",\n hideUpIcon && \"opacity-0\",\n sortData?.column !== sortBy && \"group-hover:opacity-100\",\n )}\n />\n <img\n src={chevronDownIcon}\n alt=\"\"\n width={12}\n height={12}\n className={cn(\n \"h-2.5 w-2.5 text-gray-400 transition-colors duration-200 group-hover:text-blue-600\",\n hideDownIcon && \"opacity-0\",\n sortData?.column !== sortBy && \"group-hover:opacity-100\",\n )}\n />\n </div>\n </button>\n )}\n </div>\n </th>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport type { orders } from \"@fluid-app/orders-api-client\";\nimport { useCustomerOrders, formatOrderTotal } from \"@fluid-app/orders-core\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { SearchInput } from \"./search-input\";\nimport { PaginationFooter } from \"./pagination-footer\";\nimport { StatusBadge } from \"./status-badge\";\nimport { TableColumn } from \"./table-column\";\n\nexport interface OrdersListProps {\n customerId: number | undefined;\n onOrderClick: (order: orders.ListOrder) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n t: (key: string) => string;\n pageSize?: number;\n}\n\nexport function OrdersList({\n customerId,\n onOrderClick,\n onSubscriptionClick,\n t,\n pageSize = 10,\n}: OrdersListProps) {\n const [cursor, setCursor] = useState<string | null>(null);\n const [searchTerm, setSearchTerm] = useState(\"\");\n\n const params: orders.FetchOrdersParams = {\n customerId,\n limit: pageSize,\n search: searchTerm || undefined,\n cursor: cursor || undefined,\n sort: \"-created_at\",\n };\n\n const { data, isLoading } = useCustomerOrders(params, {\n enabled: !!customerId,\n });\n\n const handleSearchChange = useCallback((term: string) => {\n setSearchTerm(term);\n setCursor(null);\n }, []);\n\n const handleNextPage = useCallback(() => {\n const nextCursor = data?.meta?.pagination?.next_cursor;\n if (nextCursor) {\n setCursor(nextCursor);\n }\n }, [data?.meta?.pagination?.next_cursor]);\n\n const handlePrevPage = useCallback(() => {\n const prevCursor = data?.meta?.pagination?.prev_cursor;\n if (prevCursor) {\n setCursor(prevCursor);\n } else {\n setCursor(null);\n }\n }, [data?.meta?.pagination?.prev_cursor]);\n\n const ordersList = data?.orders || [];\n const pagination = data?.meta?.pagination;\n const totalItems = pagination?.total_count ?? ordersList.length;\n const totalPages = pagination?.total_pages ?? 1;\n const currentPage = pagination?.current_page ?? 1;\n const hasNextPage = !!pagination?.next_cursor;\n const hasPrevPage = !!pagination?.prev_cursor;\n\n return (\n <div className=\"border-border overflow-hidden rounded-lg border shadow-sm\">\n <div className=\"p-3 text-left\">\n <div className=\"w-full md:mr-auto md:w-1/2 lg:w-1/3\">\n <SearchInput\n searchTerm={searchTerm}\n onSearchChange={handleSearchChange}\n placeholder={t(\"search_orders\")}\n />\n </div>\n </div>\n\n {/* mobile view */}\n <div className=\"block md:hidden\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, index) => (\n <div\n key={`skeleton-${index}`}\n className=\"border-border border-b p-4\"\n >\n <div className=\"flex space-x-3\">\n <Skeleton className=\"h-12 w-12 rounded-md\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n </div>\n </div>\n ))\n ) : ordersList.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-8 text-center text-sm\">\n {searchTerm ? t(\"no_matching_orders\") : t(\"no_orders_found\")}\n </div>\n ) : (\n ordersList.map((order) => (\n <div\n key={order.id}\n className=\"border-border hover:bg-accent cursor-pointer border-b p-4 transition-colors duration-200 ease-in-out last:border-b-0\"\n onClick={() => onOrderClick(order)}\n >\n <div className=\"flex items-start space-x-3\">\n {order.first_item?.image_url ? (\n <img\n src={order.first_item.image_url}\n alt={t(\"no_image_available\")}\n width={48}\n height={48}\n className=\"h-12 w-12 flex-shrink-0 rounded-md object-cover\"\n />\n ) : (\n <div className=\"bg-border h-12 w-12 flex-shrink-0 rounded-md\" />\n )}\n <div className=\"w-0 min-w-0 flex-1\">\n {order.first_item?.title ? (\n <p className=\"text-foreground truncate text-sm font-medium\">\n {order.first_item.title}\n </p>\n ) : (\n <div className=\"bg-muted rounded-lg p-2\">\n <div className=\"text-muted-foreground text-xs\">\n {t(\"this_product_no_longer_exists\")}\n </div>\n </div>\n )}\n {order.subscription && (\n <StatusBadge color=\"blue\" size=\"xs\" className=\"mt-1\">\n {t(\"subscription\")}\n </StatusBadge>\n )}\n {order.subscription && onSubscriptionClick && (\n <button\n type=\"button\"\n className=\"text-foreground hover:text-foreground/80 mt-1 inline-block text-xs transition-colors duration-200 hover:underline\"\n onClick={(e) => {\n e.stopPropagation();\n onSubscriptionClick(\n order.subscription!.subscription_token,\n );\n }}\n >\n {t(\"view_subscription\")}\n </button>\n )}\n <div className=\"mt-2 grid grid-cols-2 gap-x-4 gap-y-1 text-sm\">\n <div>\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"date\")}\n </span>\n <span className=\"text-muted-foreground\">\n {new Date(order.created_at).toLocaleDateString()}\n </span>\n </div>\n <div>\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"total\")}\n </span>\n <span className=\"text-foreground font-medium\">\n {formatOrderTotal(order)}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n\n {/* desktop view */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"min-w-full table-fixed\">\n <colgroup>\n <col className=\"w-2/5 min-w-[240px]\" />\n <col className=\"w-1/3 min-w-[100px]\" />\n <col className=\"w-[26.67%] min-w-[100px]\" />\n </colgroup>\n <thead className=\"bg-muted\">\n <tr className=\"h-10\">\n <TableColumn label={t(\"product\")} sortable={false} />\n <TableColumn label={t(\"date\")} sortable={false} />\n <TableColumn label={t(\"total\")} sortable={false} />\n </tr>\n </thead>\n <tbody className=\"divide-border bg-background divide-y\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, index) => (\n <tr key={`skeleton-${index}`}>\n <td className=\"px-3 py-4\">\n <div className=\"flex items-center space-x-2\">\n <Skeleton className=\"h-9 w-9 rounded-md\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-24\" />\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-24\" />\n </td>\n </tr>\n ))\n ) : ordersList.length === 0 ? (\n <tr>\n <td\n colSpan={3}\n className=\"text-muted-foreground px-3 py-8 text-center text-sm\"\n >\n {searchTerm ? t(\"no_matching_orders\") : t(\"no_orders_found\")}\n </td>\n </tr>\n ) : (\n ordersList.map((order) => (\n <tr\n key={order.id}\n className=\"hover:bg-accent cursor-pointer transition-colors duration-200 ease-in-out\"\n onClick={() => onOrderClick(order)}\n >\n <td className=\"text-muted-foreground px-3 py-4 text-sm\">\n <div className=\"flex max-w-[280px] flex-row items-center space-x-3\">\n {order.first_item?.image_url ? (\n <img\n src={order.first_item.image_url}\n alt={t(\"no_image_available\")}\n width={42}\n height={42}\n className=\"h-[42px] w-[42px] flex-shrink-0 rounded-md object-cover\"\n />\n ) : (\n <div className=\"bg-border ml-1 h-9 w-9 flex-shrink-0 rounded-md\" />\n )}\n <div className=\"flex min-w-0 flex-col space-y-1\">\n <div className=\"flex items-center space-x-2\">\n {order.first_item?.title ? (\n <span className=\"text-foreground truncate text-sm font-medium\">\n {order.first_item.title}\n </span>\n ) : (\n <div className=\"bg-muted w-full rounded-lg p-2\">\n <div className=\"text-muted-foreground text-xs\">\n {t(\"this_product_no_longer_exists\")}\n </div>\n </div>\n )}\n {order.subscription && (\n <StatusBadge\n color=\"blue\"\n size=\"xs\"\n className=\"flex-shrink-0\"\n >\n {t(\"subscription\")}\n </StatusBadge>\n )}\n </div>\n {order.subscription && onSubscriptionClick && (\n <button\n type=\"button\"\n className=\"text-foreground hover:text-foreground/80 text-left text-xs transition-colors duration-200 hover:underline\"\n onClick={(e) => {\n e.stopPropagation();\n onSubscriptionClick(\n order.subscription!.subscription_token,\n );\n }}\n >\n {t(\"view_subscription\")}\n </button>\n )}\n </div>\n </div>\n </td>\n <td className=\"text-muted-foreground px-3 py-4 text-sm whitespace-nowrap\">\n {new Date(order.created_at).toLocaleDateString()}\n </td>\n <td className=\"text-foreground px-3 py-4 text-sm whitespace-nowrap\">\n {formatOrderTotal(order)}\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n <PaginationFooter\n currentPage={currentPage}\n totalPages={totalPages}\n pageSize={pageSize}\n totalItems={totalItems}\n cursorPaginationMode\n hasNextPage={hasNextPage}\n hasPrevPage={hasPrevPage}\n onCursorNext={handleNextPage}\n onCursorPrev={handlePrevPage}\n />\n </div>\n );\n}\n","import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\n\ninterface SectionProps {\n title: string;\n children: React.ReactNode;\n footer?: React.ReactNode;\n}\n\nexport function Section({ title, children, footer }: SectionProps) {\n return (\n <Card>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n </CardHeader>\n <CardContent>{children}</CardContent>\n {footer && <div className=\"px-6 pb-6\">{footer}</div>}\n </Card>\n );\n}\n","import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { Truck } from \"lucide-react\";\n\nexport interface FormattedAddress {\n line1: string;\n line2: string;\n line3: string;\n}\n\nexport interface ShippingAddressCardProps {\n name?: string | null;\n address?: FormattedAddress | null;\n title?: string;\n className?: string;\n}\n\nexport function ShippingAddressCard({\n name,\n address,\n title = \"Shipping Address\",\n className,\n}: ShippingAddressCardProps) {\n return (\n <Card className={className}>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n </CardHeader>\n <CardContent>\n {!address ? (\n <p className=\"text-muted-foreground text-sm\">\n No shipping address available\n </p>\n ) : (\n <div className=\"flex items-start gap-2\">\n <Truck className=\"text-muted-foreground mt-0.5 mr-2 h-4 w-4 shrink-0\" />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {name && (\n <span\n className=\"text-foreground min-w-0 truncate text-sm\"\n title={name}\n >\n {name}\n </span>\n )}\n {address.line1 && (\n <span className=\"text-muted-foreground text-sm\">\n {address.line1}\n </span>\n )}\n {address.line2 && (\n <span className=\"text-muted-foreground text-sm\">\n {address.line2}\n </span>\n )}\n {address.line3 && (\n <span className=\"text-muted-foreground text-sm\">\n {address.line3}\n </span>\n )}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\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 {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { startCase } from \"../lib/format\";\n\nexport interface PaymentMethodData {\n source?: string | null;\n payment_title?: string | null;\n logo_url?: string | null;\n card_type?: string | null;\n last_four_digits?: string | null;\n}\n\nexport interface PaymentMethodCardProps {\n paymentMethod?: PaymentMethodData | null;\n title?: string;\n className?: string;\n}\n\nfunction capitalizeFirstLetter(str?: string | null): string {\n if (!str || str.length === 0) return \"\";\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction PaymentDetails({ card }: { card: PaymentMethodData }) {\n const paymentTitle =\n card.payment_title || (card.source ? startCase(card.source) : null);\n\n // Credit card payments\n if (card.source === \"card\" || card.card_type) {\n const cardType = capitalizeFirstLetter(card.card_type || \"Card\");\n const lastFour = card.last_four_digits || \"XXXX\";\n\n return (\n <div className=\"flex w-full flex-row justify-between\">\n <div className=\"flex flex-row items-center gap-2.5\">\n {card.logo_url ? (\n <img\n src={card.logo_url}\n alt={`${cardType} Logo`}\n className=\"h-6 w-9 object-contain\"\n width={35}\n height={24}\n />\n ) : (\n <div className=\"bg-muted text-muted-foreground flex h-6 w-9 items-center justify-center rounded text-xs\">\n {cardType.charAt(0)}\n </div>\n )}\n <span className=\"text-sm font-medium\">\n {cardType} * {lastFour}\n </span>\n </div>\n </div>\n );\n }\n\n // Other payment types (PayPal, etc.)\n const displayTitle = paymentTitle || \"Payment Method\";\n\n return (\n <div className=\"flex w-full flex-row justify-between\">\n <div className=\"flex flex-row items-center gap-2.5\">\n {card.logo_url ? (\n <img\n src={card.logo_url}\n alt={`${displayTitle} Logo`}\n className=\"h-6 w-9 object-contain\"\n width={35}\n height={24}\n />\n ) : (\n <div className=\"flex h-6 w-9 items-center justify-center rounded bg-blue-100 text-xs font-medium text-blue-600 dark:bg-blue-900/30 dark:text-blue-400\">\n {displayTitle.charAt(0)}\n </div>\n )}\n <span className=\"text-sm font-medium\">{displayTitle}</span>\n </div>\n </div>\n );\n}\n\nexport function PaymentMethodCard({\n paymentMethod,\n title = \"Payment Method\",\n className,\n}: PaymentMethodCardProps) {\n return (\n <Card className={className}>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n </CardHeader>\n <CardContent>\n {paymentMethod ? (\n <PaymentDetails card={paymentMethod} />\n ) : (\n <p className=\"text-muted-foreground text-sm\">No payment method</p>\n )}\n </CardContent>\n </Card>\n );\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 { useEffect } from \"react\";\nimport type { orders } from \"@fluid-app/orders-api-client\";\nimport { useOrder } from \"@fluid-app/orders-core\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { Section } from \"./section\";\nimport {\n ShippingAddressCard,\n type FormattedAddress,\n} from \"./shipping-address-card\";\nimport { PaymentMethodCard } from \"./payment-method-card\";\nimport { OrderStatusBadge } from \"./order-status-badge\";\nimport { StatusBadge } from \"./status-badge\";\nimport { startCase, formatCurrency } from \"../lib/format\";\n\nexport interface OrderDetailProps {\n token: string;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nfunction formatAddress(address: orders.ShipTo): FormattedAddress {\n const line1 = address.address1 ?? \"\";\n const cityState = [address.city, address.state].filter(Boolean).join(\", \");\n const line2 = [cityState, address.postal_code].filter(Boolean).join(\" \");\n const line3 = address.country_code ?? \"\";\n return { line1, line2, line3 };\n}\n\nfunction OrderDetailSkeleton() {\n return (\n <div className=\"space-y-6\">\n <Skeleton className=\"h-16 w-full rounded-lg\" />\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"space-y-6 lg:col-span-2\">\n <Skeleton className=\"h-64 w-full rounded-lg\" />\n <Skeleton className=\"h-48 w-full rounded-lg\" />\n </div>\n <div className=\"space-y-6\">\n <Skeleton className=\"h-32 w-full rounded-lg\" />\n <Skeleton className=\"h-32 w-full rounded-lg\" />\n <Skeleton className=\"h-32 w-full rounded-lg\" />\n </div>\n </div>\n </div>\n );\n}\n\nfunction OrderItemRow({ item }: { item: orders.LegacyOrderItem }) {\n return (\n <div className=\"flex items-start gap-4 py-4 first:pt-0 last:pb-0\">\n {item.image_url && (\n <img\n src={item.image_url}\n alt={item.title}\n className=\"h-16 w-16 flex-shrink-0 rounded-lg object-cover\"\n />\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-foreground font-medium\">{item.title}</p>\n {item.ordered_variant.length > 0 && (\n <p className=\"text-muted-foreground text-sm\">\n {item.ordered_variant.map((v) => v.value).join(\" / \")}\n </p>\n )}\n {item.sku && (\n <p className=\"text-muted-foreground text-xs\">SKU: {item.sku}</p>\n )}\n {item.subscription && (\n <StatusBadge color=\"blue\" size=\"xs\" className=\"mt-1\">\n Subscription\n </StatusBadge>\n )}\n </div>\n <div className=\"text-right text-sm\">\n <p className=\"text-foreground font-medium\">{item.display_total}</p>\n {item.quantity > 1 && (\n <p className=\"text-muted-foreground\">\n {item.display_price} x {item.quantity}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nfunction OrderPriceSummary({ order }: { order: orders.Order }) {\n const sym = order.currency_symbol || \"$\";\n\n return (\n <Section title=\"Summary\">\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Subtotal</dt>\n <dd className=\"text-foreground font-medium\">\n {order.sub_total_in_currency}\n </dd>\n </div>\n {Number(order.discount) > 0 && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">\n Discount\n {order.discount_codes?.length\n ? ` (${order.discount_codes.join(\", \")})`\n : \"\"}\n </dt>\n <dd className=\"text-foreground font-medium\">\n -{order.discount_in_currency}\n </dd>\n </div>\n )}\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Shipping</dt>\n <dd className=\"text-foreground font-medium\">\n {order.free_shipping ? \"Free\" : order.shipping_total_for_display}\n </dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">\n Tax\n {order.price_inclusive_of_tax && order.price_inclusive_tax_name\n ? ` (${order.price_inclusive_tax_name}, included)`\n : \"\"}\n </dt>\n <dd className=\"text-foreground font-medium\">\n {order.tax_in_currency}\n </dd>\n </div>\n {order.points_applied_amount_in_currency != null &&\n order.points_applied_amount_in_currency > 0 && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Points Applied</dt>\n <dd className=\"text-foreground font-medium\">\n -{formatCurrency(sym, order.points_applied_amount_in_currency)}\n </dd>\n </div>\n )}\n <div className=\"border-border flex justify-between border-t pt-2\">\n <dt className=\"text-foreground font-semibold\">Total</dt>\n <dd className=\"text-foreground font-semibold\">\n {order.total_in_currency}\n </dd>\n </div>\n </dl>\n </Section>\n );\n}\n\nfunction OrderStatusRow({ order }: { order: orders.Order }) {\n return (\n <div className=\"border-border bg-card flex flex-wrap items-center gap-3 rounded-lg border p-6\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Payment:</span>\n <OrderStatusBadge status={order.payment_status} />\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Fulfillment:</span>\n <OrderStatusBadge status={order.fulfillment_status} />\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Delivery:</span>\n <OrderStatusBadge status={order.delivery_status} />\n </div>\n <div className=\"text-muted-foreground ml-auto text-sm\">\n {new Date(order.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })}\n </div>\n </div>\n );\n}\n\nfunction OrderInfoCard({ order }: { order: orders.Order }) {\n return (\n <Section title=\"Order Info\">\n <dl className=\"space-y-2 text-sm\">\n <div>\n <dt className=\"text-muted-foreground\">Order Number</dt>\n <dd className=\"text-foreground font-medium\">{order.order_number}</dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">Channel</dt>\n <dd className=\"text-foreground font-medium\">\n {startCase(order.channel)}\n </dd>\n </div>\n {order.email && (\n <div>\n <dt className=\"text-muted-foreground\">Email</dt>\n <dd className=\"text-foreground font-medium\">{order.email}</dd>\n </div>\n )}\n </dl>\n </Section>\n );\n}\n\nfunction ShippingMethodCard({ method }: { method: orders.ShippingMethod }) {\n return (\n <Section title=\"Shipping Method\">\n <p className=\"text-muted-foreground text-sm\">{method.title}</p>\n {method.delivery_time_estimate && (\n <p className=\"text-muted-foreground mt-1 text-xs\">\n Est. {method.delivery_time_estimate}\n </p>\n )}\n </Section>\n );\n}\n\nexport function OrderDetail({ token, onNotFound, onError }: OrderDetailProps) {\n const { data, isLoading, error } = useOrder(token);\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 <OrderDetailSkeleton />;\n }\n\n if (!order) {\n return null;\n }\n\n const visibleItems = order.items.filter(\n (item) => item.display_to_customer !== false,\n );\n\n return (\n <div className=\"space-y-6\">\n <OrderStatusRow order={order} />\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left column */}\n <div className=\"space-y-6 lg:col-span-2\">\n <Section title={`Items (${order.items_count})`}>\n <div className=\"divide-border divide-y\">\n {visibleItems.map((item) => (\n <OrderItemRow key={item.id} item={item} />\n ))}\n </div>\n </Section>\n\n <OrderPriceSummary order={order} />\n </div>\n\n {/* Right column */}\n <div className=\"space-y-6\">\n {order.payment_details && (\n <PaymentMethodCard\n paymentMethod={{\n source: order.payment_details.payment_type,\n payment_title: order.payment_details.payment_title,\n logo_url: order.payment_details.details.logo_url,\n card_type: order.payment_details.details.card_type,\n last_four_digits: order.payment_details.details.last_four,\n }}\n />\n )}\n\n {order.ship_to && (\n <ShippingAddressCard\n name={order.ship_to.name}\n address={formatAddress(order.ship_to)}\n title=\"Shipping Address\"\n />\n )}\n\n {order.bill_to && (\n <ShippingAddressCard\n name={order.bill_to.name}\n address={formatAddress(order.bill_to)}\n title=\"Billing Address\"\n />\n )}\n\n {order.shipping_method && (\n <ShippingMethodCard method={order.shipping_method} />\n )}\n\n <OrderInfoCard order={order} />\n </div>\n </div>\n </div>\n );\n}\n","import { OrdersCoreProvider } from \"@fluid-app/orders-core\";\nimport { OrdersList } from \"@fluid-app/orders-ui\";\nimport type { orders } from \"@fluid-app/orders-api-client\";\nimport { useOrdersClient } from \"../account/use-account-clients\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface AccountOrdersScreenProps {\n customerId: number | undefined;\n isLoadingCustomer: boolean;\n}\n\nconst translations: Record<string, string> = {\n search_orders: \"Search orders...\",\n order_number: \"Order #\",\n date: \"Date\",\n status: \"Status\",\n product: \"Product\",\n no_orders_found: \"No orders found\",\n no_matching_orders: \"No matching orders\",\n no_image_available: \"No image available\",\n this_product_no_longer_exists: \"This product no longer exists\",\n subscription: \"Subscription\",\n view_subscription: \"View Subscription\",\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n};\n\nexport function AccountOrdersScreen({\n customerId,\n isLoadingCustomer,\n}: AccountOrdersScreenProps): React.JSX.Element {\n const ordersClient = useOrdersClient();\n const { navigate } = useAppNavigation();\n\n const handleOrderClick = (order: orders.ListOrder) => {\n navigate(`account/orders/${order.token}`);\n };\n\n const handleSubscriptionClick = (subscriptionToken: string) => {\n navigate(`account/subscriptions/${subscriptionToken}`);\n };\n\n if (isLoadingCustomer) {\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"space-y-3\">\n <div className=\"bg-muted h-10 animate-pulse rounded\" />\n <div className=\"bg-muted h-64 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <OrdersCoreProvider client={ordersClient}>\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <OrdersList\n customerId={customerId}\n onOrderClick={handleOrderClick}\n onSubscriptionClick={handleSubscriptionClick}\n t={(key) => translations[key] ?? key}\n />\n </div>\n </OrdersCoreProvider>\n );\n}\n","import { OrdersCoreProvider } from \"@fluid-app/orders-core\";\nimport { OrderDetail } from \"@fluid-app/orders-ui\";\nimport { useOrdersClient } from \"../account/use-account-clients\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface AccountOrderDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function AccountOrderDetailScreen({\n token,\n onToast,\n}: AccountOrderDetailScreenProps): React.JSX.Element {\n const client = useOrdersClient();\n const { navigate } = useAppNavigation();\n\n return (\n <OrdersCoreProvider client={client}>\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 <OrderDetail\n token={token}\n onNotFound={() => {\n onToast(\"Order not found\", \"warning\");\n navigate(\"account/orders\");\n }}\n onError={(err) => {\n const message =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`Failed to load order: ${message}`, \"error\");\n }}\n />\n </div>\n </OrdersCoreProvider>\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\n\nconst SubscriptionsClientContext = createContext<FetchClient | null>(null);\n\nexport const SubscriptionsClientProvider = SubscriptionsClientContext.Provider;\n\nexport function useSubscriptionsClient(): FetchClient {\n const client = useContext(SubscriptionsClientContext);\n if (!client) {\n throw new Error(\n \"useSubscriptionsClient must be used within a SubscriptionsCoreProvider\",\n );\n }\n return client;\n}\n","import type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { JSX } from \"react\";\nimport { SubscriptionsClientProvider } from \"./context\";\n\nexport interface SubscriptionsCoreProviderProps {\n client: FetchClient;\n children: React.ReactNode;\n}\n\nexport function SubscriptionsCoreProvider({\n client,\n children,\n}: SubscriptionsCoreProviderProps): JSX.Element {\n return (\n <SubscriptionsClientProvider value={client}>\n {children}\n </SubscriptionsClientProvider>\n );\n}\n","import type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\n\nexport const subscriptionsKeys = {\n all: [\"subscriptions\"] as const,\n list: (params?: subscriptions.FetchSubscriptionsParams) =>\n [...subscriptionsKeys.all, \"list\", params] as const,\n detail: (token: string) =>\n [...subscriptionsKeys.all, \"detail\", token] as const,\n} as const;\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useSubscriptions(\n params: subscriptions.FetchSubscriptionsParams,\n options?: { enabled?: boolean },\n) {\n const client = useSubscriptionsClient();\n return useQuery({\n queryKey: subscriptionsKeys.list(params),\n queryFn: () => subscriptionsApi.fetchCustomerSubscriptions(client, params),\n enabled: options?.enabled ?? !!params.customerId,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useSubscription(\n token: string,\n options?: { enabled?: boolean },\n) {\n const client = useSubscriptionsClient();\n return useQuery({\n queryKey: subscriptionsKeys.detail(token),\n queryFn: () => subscriptionsApi.fetchSubscription(client, token),\n enabled: (options?.enabled ?? true) && !!token,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function usePauseSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const client = useSubscriptionsClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n pauseParams: subscriptions.PauseSubscriptionParams;\n }) =>\n subscriptionsApi.pauseSubscription(\n client,\n params.subscriptionToken,\n params.pauseParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useResumeSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const client = useSubscriptionsClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n resumeParams: subscriptions.ResumeSubscriptionParams;\n }) =>\n subscriptionsApi.resumeSubscription(\n client,\n params.subscriptionToken,\n params.resumeParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useSkipSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const client = useSubscriptionsClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n skipParams: subscriptions.SkipSubscriptionParams;\n }) =>\n subscriptionsApi.skipSubscription(\n client,\n params.subscriptionToken,\n params.skipParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useCancelSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const client = useSubscriptionsClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: { subscriptionToken: string; customerId: number }) =>\n subscriptionsApi.cancelSubscription(\n client,\n params.subscriptionToken,\n params.customerId,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useReactivateSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const client = useSubscriptionsClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n reactivateParams: subscriptions.ReactivateSubscriptionParams;\n }) =>\n subscriptionsApi.reactivateSubscription(\n client,\n params.subscriptionToken,\n params.reactivateParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","interface SubscriptionPriceItem {\n allow_subscription: boolean;\n subscription_interval: number | null;\n subscription_price_in_currency: string | null;\n}\n\nexport function getSubscriptionPrice(\n item: SubscriptionPriceItem,\n): string | null {\n if (!item.allow_subscription) return null;\n const intervalText =\n item.subscription_interval === 1\n ? \"month\"\n : `${item.subscription_interval} mo.`;\n return `${item.subscription_price_in_currency}/${intervalText}`;\n}\n\nexport function formatSubscriptionFrequency(frequency: string): string {\n if (frequency === \"day\") return \"Daily\";\n if (frequency === \"week\") return \"Weekly\";\n if (frequency === \"month\") return \"Monthly\";\n if (frequency === \"year\") return \"Yearly\";\n return frequency;\n}\n\nexport function calculateResumeDate(\n billingInterval: number,\n billingIntervalUnit: string,\n orderCount: number,\n fromDate?: string | Date | null,\n): Date {\n let startDate: Date;\n\n if (fromDate) {\n if (typeof fromDate === \"string\") {\n startDate = new Date(\n fromDate + (fromDate.includes(\"T\") ? \"\" : \"T12:00:00.000Z\"),\n );\n } else {\n startDate = new Date(\n Date.UTC(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n } else {\n const now = new Date();\n startDate = new Date(\n Date.UTC(\n now.getUTCFullYear(),\n now.getUTCMonth(),\n now.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n\n const baseDate = new Date(startDate.getTime());\n const totalIntervals = billingInterval * orderCount;\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals);\n break;\n case \"week\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals * 7);\n break;\n case \"month\": {\n const currentMonth = baseDate.getUTCMonth();\n const currentDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(currentMonth + totalIntervals);\n if (baseDate.getUTCDate() !== currentDay) {\n baseDate.setUTCDate(0);\n }\n break;\n }\n case \"year\":\n baseDate.setUTCFullYear(baseDate.getUTCFullYear() + totalIntervals);\n break;\n default: {\n const defaultMonth = baseDate.getUTCMonth();\n const defaultDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(defaultMonth + totalIntervals);\n if (baseDate.getUTCDate() !== defaultDay) {\n baseDate.setUTCDate(0);\n }\n }\n }\n\n return baseDate;\n}\n\nexport function calculateNextBillDate(\n billingInterval: number = 1,\n billingIntervalUnit: string = \"month\",\n): string {\n const now = new Date();\n const nextBillDate = new Date(now);\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n nextBillDate.setDate(now.getDate() + billingInterval);\n break;\n case \"week\":\n nextBillDate.setDate(now.getDate() + billingInterval * 7);\n break;\n case \"month\":\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n break;\n case \"year\":\n nextBillDate.setFullYear(now.getFullYear() + billingInterval);\n break;\n default:\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n }\n\n return nextBillDate.toISOString().split(\"T\")[0] || \"\";\n}\n\nexport function formatDate(\n dateString: string,\n isCancelled: boolean = false,\n): string {\n if (isCancelled) return \"Cancelled\";\n if (!dateString) return \"Paused\";\n\n const parts = dateString.split(\"-\");\n if (parts.length !== 3) return \"Invalid date\";\n\n const [year, month, day] = parts.map(Number);\n if (!year || !month || !day) return \"Invalid date\";\n const date = new Date(year, month - 1, day);\n\n const monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n\n const dayNum = date.getDate();\n const monthName = monthNames[date.getMonth()];\n const yearNum = date.getFullYear();\n\n const ordinalSuffix = (d: number) => {\n if (d > 3 && d < 21) return \"th\";\n switch (d % 10) {\n case 1:\n return \"st\";\n case 2:\n return \"nd\";\n case 3:\n return \"rd\";\n default:\n return \"th\";\n }\n };\n\n return `${monthName} ${dayNum}${ordinalSuffix(dayNum)}, ${yearNum}`;\n}\n\nexport function getNextBillDisplay<\n T extends { status?: string; next_bill_date?: string | null },\n>(subscription: T | null | undefined): string {\n if (subscription?.status === \"cancelled\") return \"Cancelled\";\n if (subscription?.next_bill_date)\n return formatDate(subscription.next_bill_date);\n if (subscription?.status === \"paused\") return \"Paused\";\n return \"N/A\";\n}\n\nexport function calculateSubscriptionPrice(\n totalPrice: number,\n subscribeAndSave: string | null | undefined,\n quantity: number,\n): string {\n if (!subscribeAndSave) return totalPrice.toFixed(2);\n\n const unitDiscountAmount = parseFloat(subscribeAndSave);\n if (isNaN(unitDiscountAmount)) return totalPrice.toFixed(2);\n\n const subscriptionAmount = totalPrice - unitDiscountAmount * quantity;\n return subscriptionAmount.toFixed(2);\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * Format a number as currency (USD).\n */\nexport function formatCurrency(value: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(value);\n}\n\n/**\n * Convert a snake_case or lowercase string to Start Case.\n * Replaces lodash startCase for simple status strings.\n */\nexport function startCase(str: string | undefined | null): string {\n if (!str) return \"\";\n return str.replace(/_/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/**\n * Format a next bill date string to M/D/YYYY (UTC).\n */\nexport function formatNextBillDate(nextBillDate: string): string {\n if (!nextBillDate) return \"N/A\";\n const date = new Date(nextBillDate);\n if (isNaN(date.getTime())) return \"N/A\";\n const month = date.getUTCMonth() + 1;\n const day = date.getUTCDate();\n const year = date.getUTCFullYear();\n return `${month}/${day}/${year}`;\n}\n","import type { JSX } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nconst STATUS_COLORS: Record<string, string> = {\n active: \"bg-green-100 text-green-800\",\n paused: \"bg-gray-100 text-gray-800\",\n cancelled: \"bg-red-100 text-red-800\",\n pending: \"bg-yellow-100 text-yellow-800\",\n inactive: \"bg-gray-100 text-gray-800\",\n disabled: \"bg-red-100 text-red-800\",\n past_due: \"bg-gray-100 text-gray-800\",\n};\n\nconst STATUS_DOT_COLORS: Record<string, string> = {\n active: \"bg-green-500\",\n paused: \"bg-gray-400\",\n cancelled: \"bg-red-500\",\n pending: \"bg-yellow-500\",\n inactive: \"bg-gray-400\",\n disabled: \"bg-red-500\",\n past_due: \"bg-gray-400\",\n};\n\nexport interface StatusPillProps {\n status: string | undefined | null;\n children: React.ReactNode;\n}\n\nexport function StatusPill({ status, children }: StatusPillProps): JSX.Element {\n const key = status?.toLowerCase() ?? \"\";\n const pillColor = STATUS_COLORS[key] ?? \"bg-gray-100 text-gray-800\";\n const dotColor = STATUS_DOT_COLORS[key] ?? \"bg-gray-400\";\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium\",\n pillColor,\n )}\n >\n <span className={cn(\"h-1.5 w-1.5 rounded-full\", dotColor)} />\n {children}\n </span>\n );\n}\n","import { useState, useEffect, type JSX } from \"react\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { useSubscriptions } from \"@fluid-app/subscriptions-core\";\nimport { TableColumn, PaginationFooter } from \"@fluid-app/orders-ui\";\nimport { Search } from \"lucide-react\";\nimport { Button, Input, Skeleton } from \"@fluid-app/ui-primitives\";\nimport { cn } from \"../lib/cn\";\nimport { formatCurrency, startCase, formatNextBillDate } from \"../lib/format\";\nimport { StatusPill } from \"./status-pill\";\n\nexport interface SubscriptionsListProps {\n customerId: number | undefined;\n onSubscriptionClick: (subscriptionToken: string) => void;\n t: (key: string) => string;\n pageSize?: number;\n}\n\nexport function SubscriptionsList({\n customerId,\n onSubscriptionClick,\n t,\n pageSize = 10,\n}: SubscriptionsListProps): JSX.Element {\n const [currentPage, setCurrentPage] = useState(1);\n const [statusFilter, setStatusFilter] = useState<string | null>(null);\n const [search, setSearch] = useState<string | null>(null);\n const [sortBy, setSortBy] = useState<{\n column: string;\n direction: \"asc\" | \"desc\";\n }>({\n column: \"next_bill_date\",\n direction: \"desc\",\n });\n\n const params: subscriptions.FetchSubscriptionsParams = {\n customerId: customerId ?? 0,\n page: currentPage,\n perPage: pageSize,\n status: statusFilter,\n search,\n sortBy: sortBy.column,\n sortDirection: sortBy.direction,\n };\n\n const { data, isLoading } = useSubscriptions(params, {\n enabled: !!customerId,\n });\n\n // Reset page when filters change\n useEffect(() => {\n setCurrentPage(1);\n }, [statusFilter, search, sortBy]);\n\n const items = data?.subscriptions ?? [];\n const totalItems = data?.meta?.pagination?.total_count ?? 0;\n const totalPages = data?.meta?.pagination?.total_pages ?? 1;\n\n const handleSubscriptionClick = (token: string) => {\n if (token) {\n onSubscriptionClick(token);\n }\n };\n\n return (\n <div className=\"border-border overflow-hidden rounded-lg border shadow-sm\">\n {/* header: filter buttons + search */}\n <div className=\"flex flex-col gap-2 p-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setStatusFilter(null)}\n className={cn(\n \"rounded-md text-xs\",\n statusFilter === null && \"bg-muted-foreground font-bold\",\n )}\n >\n {t(\"all\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setStatusFilter(\"active\")}\n className={cn(\n \"rounded-md text-xs\",\n statusFilter === \"active\" && \"bg-muted-foreground font-bold\",\n )}\n >\n {t(\"active\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setStatusFilter(\"inactive\")}\n className={cn(\n \"rounded-md text-xs\",\n statusFilter === \"inactive\" && \"bg-muted-foreground font-bold\",\n )}\n >\n {t(\"inactive\")}\n </Button>\n </div>\n <div className=\"relative w-full sm:w-auto sm:min-w-[220px]\">\n <div className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\">\n <Search className=\"text-muted-foreground h-4 w-4\" />\n </div>\n <Input\n type=\"search\"\n value={search ?? \"\"}\n onChange={(e) => setSearch(e.target.value || null)}\n className=\"h-10 w-full pl-10\"\n placeholder={t(\"subscriptions\")}\n />\n </div>\n </div>\n\n {/* mobile view */}\n <div className=\"block md:hidden\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, index) => (\n <div\n key={`skeleton-${index}`}\n className=\"border-border border-b p-4\"\n >\n <div className=\"flex space-x-3\">\n <Skeleton className=\"h-12 w-12 rounded-md\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n </div>\n </div>\n ))\n ) : items.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-8 text-center text-sm\">\n {t(\"no_subscriptions_found\")}\n </div>\n ) : (\n items.map((subscription) => (\n <div\n key={subscription.subscription_token}\n className=\"border-border hover:bg-accent cursor-pointer border-b p-4 transition-colors duration-200 ease-in-out last:border-b-0\"\n onClick={() =>\n handleSubscriptionClick(subscription.subscription_token)\n }\n >\n <div className=\"flex items-start space-x-3\">\n <img\n src={subscription.variant?.product?.image_url}\n alt={subscription.variant?.product?.title}\n width={48}\n height={48}\n className=\"h-12 w-12 flex-shrink-0 rounded-md object-cover\"\n />\n <div className=\"w-0 min-w-0 flex-1\">\n <p className=\"text-foreground truncate text-sm font-medium\">\n {subscription.variant?.product?.title}\n </p>\n <div className=\"mt-2 grid grid-cols-2 gap-x-4 gap-y-1 text-sm\">\n <div>\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"next_bill_date\")}\n </span>\n <span className=\"text-muted-foreground\">\n {formatNextBillDate(subscription.next_bill_date ?? \"\")}\n </span>\n </div>\n <div>\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"price\")}\n </span>\n <span className=\"text-foreground font-medium\">\n {formatCurrency(\n subscription.price * subscription.quantity,\n )}\n </span>\n </div>\n </div>\n <div className=\"mt-2\">\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"status\")}\n </span>\n <StatusPill status={subscription.status}>\n {startCase(subscription.status) || t(\"unknown_status\")}\n </StatusPill>\n </div>\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n\n {/* desktop view */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"min-w-full table-fixed\">\n <colgroup>\n <col className=\"w-[45%] min-w-[240px]\" />\n <col className=\"w-[20%] min-w-[100px]\" />\n <col className=\"w-[15%] min-w-[100px]\" />\n <col className=\"w-[20%] min-w-[100px]\" />\n </colgroup>\n <thead className=\"bg-muted\">\n <tr className=\"h-10\">\n <TableColumn label={t(\"product\")} sortable={false} />\n <TableColumn\n label={t(\"next_bill_date\")}\n sortBy=\"next_bill_date\"\n sortData={sortBy}\n onSortClick={(value: string) =>\n setSortBy({\n column: value,\n direction: sortBy.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n />\n <TableColumn label={t(\"price\")} sortable={false} />\n <TableColumn label={t(\"status\")} sortable={false} />\n </tr>\n </thead>\n <tbody className=\"divide-border bg-background divide-y\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, index) => (\n <tr key={`skeleton-${index}`}>\n <td className=\"px-3 py-4\">\n <div className=\"flex items-center space-x-2\">\n <Skeleton className=\"h-9 w-9 rounded-md\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-24\" />\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-24\" />\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-16\" />\n </td>\n </tr>\n ))\n ) : items.length === 0 ? (\n <tr>\n <td\n colSpan={4}\n className=\"text-muted-foreground px-3 py-8 text-center text-sm\"\n >\n {t(\"no_subscriptions_found\")}\n </td>\n </tr>\n ) : (\n items.map((subscription) => (\n <tr\n key={subscription.subscription_token}\n className=\"hover:bg-muted cursor-pointer transition-colors duration-200 ease-in-out\"\n onClick={() =>\n handleSubscriptionClick(subscription.subscription_token)\n }\n >\n <td className=\"text-muted-foreground flex max-w-[280px] items-center space-x-3 py-4 pr-3 pl-3 text-sm\">\n <img\n src={subscription.variant?.product?.image_url}\n alt={subscription.variant?.product?.title}\n width={48}\n height={48}\n className=\"h-12 w-12 flex-shrink-0 rounded-md object-cover\"\n />\n <span className=\"text-foreground truncate text-sm font-medium\">\n {subscription.variant?.product?.title}\n </span>\n </td>\n <td className=\"text-muted-foreground px-3 py-4 text-sm whitespace-nowrap\">\n {formatNextBillDate(subscription.next_bill_date ?? \"\")}\n </td>\n <td className=\"px-3 py-4 text-sm whitespace-nowrap\">\n <span className=\"text-muted-foreground\">\n {formatCurrency(\n subscription.price * subscription.quantity,\n )}\n </span>\n </td>\n <td className=\"px-3 py-4 text-sm whitespace-nowrap\">\n <StatusPill status={subscription.status}>\n {startCase(subscription.status) || t(\"unknown_status\")}\n </StatusPill>\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n <PaginationFooter\n currentPage={currentPage}\n totalPages={totalPages}\n pageSize={pageSize}\n totalItems={totalItems}\n onPageChange={setCurrentPage}\n t={t}\n />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogCancel,\n AlertDialogAction,\n} from \"@fluid-app/ui-primitives\";\n\ninterface ConfirmDialogProps {\n title: string;\n description: string;\n actionButtonText?: string;\n cancelButtonText?: string;\n open: boolean;\n setOpen: (open: boolean) => void;\n onConfirm: () => void | Promise<unknown>;\n}\n\nexport function ConfirmDialog({\n title,\n description,\n actionButtonText = \"Delete\",\n cancelButtonText = \"Cancel\",\n open,\n setOpen,\n onConfirm,\n}: ConfirmDialogProps) {\n const [isPending, setIsPending] = useState(false);\n\n const handleConfirm = async () => {\n try {\n const result = onConfirm();\n if (result instanceof Promise) {\n setIsPending(true);\n await result;\n }\n } catch (error) {\n console.error(\"ConfirmDialog: action rejected\", error);\n } finally {\n setIsPending(false);\n setOpen(false);\n }\n };\n\n return (\n <AlertDialog open={open} onOpenChange={(v) => !isPending && setOpen(v)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{description}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isPending}>\n {cancelButtonText}\n </AlertDialogCancel>\n <AlertDialogAction\n onClick={handleConfirm}\n disabled={isPending}\n className=\"bg-red-600 text-white hover:bg-red-500\"\n >\n {isPending ? \"...\" : actionButtonText}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","import { useState, useEffect, type JSX } from \"react\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport {\n useSubscription,\n usePauseSubscription,\n useResumeSubscription,\n useSkipSubscription,\n useCancelSubscription,\n useReactivateSubscription,\n formatSubscriptionFrequency,\n formatDate,\n getNextBillDisplay,\n calculateNextBillDate,\n} from \"@fluid-app/subscriptions-core\";\nimport { SkipForward, Pause, Play, XCircle, RotateCcw } from \"lucide-react\";\nimport { Skeleton, Button } from \"@fluid-app/ui-primitives\";\nimport { ConfirmDialog } from \"./confirm-dialog\";\nimport { StatusPill } from \"./status-pill\";\nimport { startCase, formatCurrency } from \"../lib/format\";\n\nexport interface SubscriptionDetailProps {\n token: string;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSuccess?: (message: string) => void;\n onMutationError?: (message: string, error: unknown) => void;\n}\n\nfunction SubscriptionDetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n {/* Left: items skeleton */}\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=\"grid grid-cols-2 gap-4\">\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n <div className=\"mt-6 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 <Skeleton className=\"h-4 w-1/4\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n {/* Right: management skeleton */}\n <div className=\"bg-background col-span-4 px-8 pt-4\">\n <div className=\"mx-auto max-w-lg\">\n <Skeleton className=\"mb-3 h-5 w-32\" />\n <div className=\"grid grid-cols-2 gap-3\">\n <Skeleton className=\"h-10 w-full rounded\" />\n <Skeleton className=\"h-10 w-full rounded\" />\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-12 flex-1 rounded\" />\n <Skeleton className=\"h-12 flex-1 rounded\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Left column: product & order summary ──────────────────────────── */\n\nfunction SubscriptionItemsSection({\n subscription,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n}) {\n const variant = subscription.variant;\n const product = variant?.product;\n const quantity = subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n const discount =\n subscription.original_price != null\n ? subscription.original_price - subscription.price\n : 0;\n const subtotal =\n discount > 0\n ? formatCurrency(subscription.original_price * quantity)\n : totalPrice;\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 {/* Upcoming order summary */}\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n Your Upcoming Order\n </h2>\n <div className=\"text-muted-foreground\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"border-border border-r pr-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n Next Order Date\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {getNextBillDisplay(subscription)}\n </div>\n </div>\n <div className=\"pl-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n Next Bill Amount\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </div>\n </div>\n </div>\n <hr className=\"border-border mt-4\" />\n </div>\n </div>\n\n {/* Product row */}\n <div className=\"py-6\">\n <div className=\"flex flex-row items-center space-x-4\">\n <div className=\"flex min-w-0 flex-1 flex-row space-x-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted h-24 w-24 overflow-hidden rounded\">\n {product?.image_url ? (\n <img\n src={product.image_url}\n alt={variant?.title || \"Product image\"}\n width={96}\n height={96}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground flex h-full w-full items-center justify-center\">\n No image\n </div>\n )}\n {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 {quantity}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex min-w-0 flex-col space-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={product?.title}\n >\n {product?.title}\n </p>\n {variant?.title && product?.title && (\n <p className=\"text-muted-foreground text-sm\">\n {variant.title}\n </p>\n )}\n <div>\n <p className=\"text-foreground text-sm font-medium\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Pricing summary */}\n <div className=\"mb-4\">\n {discount > 0 && (\n <>\n <div className=\"flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n Subtotal\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n {subtotal}\n </p>\n </div>\n <div className=\"mt-2 flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n Discount\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n -{formatCurrency(discount * quantity)}\n </p>\n </div>\n </>\n )}\n <div className=\"mt-4 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">Total</p>\n <p className=\"text-foreground text-base font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n <span className=\"text-muted-foreground text-xs\">\n *Tax and shipping calculated at checkout\n </span>\n </div>\n </div>\n </section>\n );\n}\n\n/* ── Right column: actions & details ───────────────────────────────── */\n\nfunction SubscriptionManagementSection({\n subscription,\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n onSkip,\n onPause,\n onResume,\n onCancel,\n onReactivate,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n onSkip: () => void;\n onPause: () => void;\n onResume: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n}) {\n const plan = subscription.subscription_plan;\n const quantity = subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n\n const paymentMethod = subscription.payment_method;\n const paymentDetails = paymentMethod?.details as {\n last4?: string;\n card_type?: string;\n logo_url?: string;\n } | null;\n\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"bg-background col-span-4 flex-auto px-8 pt-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Action Buttons */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h2 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order Actions\n </h2>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && plan.allow_skipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating || !subscription.next_bill_date}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Skip Next Order</span>\n </Button>\n )}\n {isActive && (\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Pause Subscription</span>\n </Button>\n )}\n {isPaused && (\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Resume Subscription</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating || isCancelled}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">\n {isCancelled ? \"Cancelled\" : \"Cancel Subscription\"}\n </span>\n </Button>\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Reactivate Subscription</span>\n </Button>\n )}\n </div>\n </div>\n\n {/* Subscription Details */}\n <div className=\"border-border mb-4 border-b\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h3 className=\"text-foreground text-sm/6 font-semibold\">\n Subscription Details\n </h3>\n <StatusPill status={subscription.status}>\n {startCase(subscription.status)}\n </StatusPill>\n </div>\n <div className=\"divide-border mb-4 flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">\n Order Frequency\n </div>\n <div className=\"text-foreground font-medium\">\n {formatSubscriptionFrequency(plan.billing_interval_unit)}\n </div>\n </div>\n <div className=\"flex-1 px-4\">\n <div className=\"text-muted-foreground text-sm\">Next Payment</div>\n <div className=\"text-foreground font-medium\">{totalPrice}</div>\n </div>\n {subscription.last_bill_date && (\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">Last Billed</div>\n <div className=\"text-foreground font-medium\">\n {formatDate(subscription.last_bill_date)}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Payment & Shipping */}\n <div className=\"pt-2\">\n <h3 className=\"text-foreground text-sm/6 font-semibold\">\n Payment & Shipping\n </h3>\n <div className=\"flex flex-col\">\n {/* Shipping Address */}\n {subscription.address && (\n <div className=\"border-border mb-6 border-b pb-4\">\n <div className=\"text-muted-foreground mt-3 mb-1 text-sm\">\n Shipping Address\n </div>\n <div className=\"text-foreground text-sm\">\n <p className=\"font-medium\">{subscription.address.name}</p>\n <p>{subscription.address.address1}</p>\n {subscription.address.address2 && (\n <p>{subscription.address.address2}</p>\n )}\n <p>\n {[subscription.address.city, subscription.address.state]\n .filter(Boolean)\n .join(\", \")}{\" \"}\n {subscription.address.postal_code}\n </p>\n {subscription.address.country_code && (\n <p>{subscription.address.country_code}</p>\n )}\n </div>\n </div>\n )}\n\n {/* Payment Method */}\n {paymentMethod && (\n <div className=\"border-border mb-6 border-b pb-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n Payment Method\n </div>\n <div className=\"text-foreground flex items-center gap-2 text-sm\">\n {paymentDetails?.logo_url && (\n <img\n src={paymentDetails.logo_url}\n alt={paymentDetails.card_type ?? \"Card\"}\n className=\"h-6\"\n />\n )}\n <span className=\"font-medium\">\n {paymentDetails?.card_type\n ? startCase(paymentDetails.card_type)\n : paymentMethod.payment_type}\n {paymentDetails?.last4\n ? ` ending in ${paymentDetails.last4}`\n : \"\"}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Order History */}\n {subscription.orders.length > 0 && (\n <div className=\"border-border mb-4 border-b pb-4\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order History\n </h3>\n <div className=\"overflow-x-auto\">\n <table className=\"divide-border min-w-full divide-y text-sm\">\n <thead>\n <tr>\n <th className=\"text-muted-foreground py-2 pr-3 text-left font-medium\">\n Order\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n Date\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n Status\n </th>\n <th className=\"text-muted-foreground py-2 pl-3 text-right font-medium\">\n Amount\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-border divide-y\">\n {subscription.orders.map((order) => (\n <tr key={order.id}>\n <td className=\"text-foreground py-2 pr-3 font-medium\">\n {order.order_number ?? `#${order.id}`}\n </td>\n <td className=\"text-muted-foreground px-3 py-2\">\n {formatDate(order.created_at.split(\"T\")[0] ?? \"\")}\n </td>\n <td className=\"px-3 py-2\">\n <StatusPill status={order.status}>\n {startCase(order.status)}\n </StatusPill>\n </td>\n <td className=\"text-foreground py-2 pl-3 text-right\">\n {order.amount != null\n ? formatCurrency(Number(order.amount))\n : \"N/A\"}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/* ── Main component ────────────────────────────────────────────────── */\n\nexport function SubscriptionDetail({\n token,\n onNotFound,\n onError,\n onSuccess,\n onMutationError,\n}: SubscriptionDetailProps): JSX.Element | null {\n const [showCancelModal, setShowCancelModal] = useState(false);\n\n const { data, isLoading, error } = useSubscription(token);\n const subscription = data?.subscription;\n const customerId = subscription?.customer?.id ?? 0;\n\n const pauseMutation = usePauseSubscription({\n onSuccess: () => onSuccess?.(\"Subscription paused\"),\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to pause subscription\", err),\n });\n\n const resumeMutation = useResumeSubscription({\n onSuccess: () => onSuccess?.(\"Subscription resumed\"),\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to resume subscription\", err),\n });\n\n const skipMutation = useSkipSubscription({\n onSuccess: () => onSuccess?.(\"Next billing skipped\"),\n onError: (err: unknown) => onMutationError?.(\"Failed to skip billing\", err),\n });\n\n const cancelMutation = useCancelSubscription({\n onSuccess: () => {\n onSuccess?.(\"Subscription cancelled\");\n setShowCancelModal(false);\n },\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to cancel subscription\", err),\n });\n\n const reactivateMutation = useReactivateSubscription({\n onSuccess: () => onSuccess?.(\"Subscription reactivated\"),\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to reactivate subscription\", err),\n });\n\n useEffect(() => {\n if (!isLoading && error) {\n onError?.(error as Error);\n }\n }, [isLoading, error, onError]);\n\n useEffect(() => {\n if (!isLoading && !error && !subscription) {\n onNotFound?.();\n }\n }, [isLoading, error, subscription, onNotFound]);\n\n if (isLoading) {\n return <SubscriptionDetailSkeleton />;\n }\n\n if (!subscription) {\n return null;\n }\n\n const plan = subscription.subscription_plan;\n const isActive = subscription.status === \"active\";\n const isPaused = subscription.status === \"paused\";\n const isCancelled = subscription.status === \"cancelled\";\n const isMutating =\n pauseMutation.isPending ||\n resumeMutation.isPending ||\n skipMutation.isPending ||\n cancelMutation.isPending ||\n reactivateMutation.isPending;\n\n const handlePause = () => {\n pauseMutation.mutate({\n subscriptionToken: token,\n pauseParams: { customerId },\n });\n };\n\n const handleResume = () => {\n const nextBillDate = calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n );\n resumeMutation.mutate({\n subscriptionToken: token,\n resumeParams: { customerId, nextBillDate },\n });\n };\n\n const handleSkip = () => {\n const nextBillDate = calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n );\n skipMutation.mutate({\n subscriptionToken: token,\n skipParams: { customerId, nextBillDate },\n });\n };\n\n const handleCancel = () => {\n cancelMutation.mutate({ subscriptionToken: token, customerId });\n };\n\n const handleReactivate = () => {\n reactivateMutation.mutate({\n subscriptionToken: token,\n reactivateParams: {},\n });\n };\n\n return (\n <>\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <SubscriptionItemsSection subscription={subscription} />\n <SubscriptionManagementSection\n subscription={subscription}\n isActive={isActive}\n isPaused={isPaused}\n isCancelled={isCancelled}\n isMutating={isMutating}\n onSkip={handleSkip}\n onPause={handlePause}\n onResume={handleResume}\n onCancel={() => setShowCancelModal(true)}\n onReactivate={handleReactivate}\n />\n </div>\n <ConfirmDialog\n title=\"Cancel Subscription\"\n actionButtonText=\"Cancel Subscription\"\n description=\"Are you sure you want to cancel this subscription? You can reactivate it later.\"\n open={showCancelModal}\n setOpen={setShowCancelModal}\n onConfirm={handleCancel}\n />\n </>\n );\n}\n\nexport interface SubscriptionActionsProps {\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n allowSkipping: boolean | null;\n onPause: () => void;\n onResume: () => void;\n onSkip: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n}\n\nexport function SubscriptionActions({\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n allowSkipping,\n onPause,\n onResume,\n onSkip,\n onCancel,\n onReactivate,\n}: SubscriptionActionsProps) {\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && (\n <>\n {allowSkipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Skip Next</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Pause</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Cancel</span>\n </Button>\n </>\n )}\n {isPaused && (\n <>\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Resume</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Cancel</span>\n </Button>\n </>\n )}\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Reactivate</span>\n </Button>\n )}\n </div>\n );\n}\n","import { SubscriptionsCoreProvider } from \"@fluid-app/subscriptions-core\";\nimport { SubscriptionsList } from \"@fluid-app/subscriptions-ui\";\nimport { useSubscriptionsClient } from \"../account/use-account-clients\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface AccountSubscriptionsScreenProps {\n customerId: number | undefined;\n isLoadingCustomer: boolean;\n}\n\nconst translations: Record<string, string> = {\n all: \"All\",\n active: \"Active\",\n inactive: \"Inactive\",\n search: \"Search\",\n subscriptions: \"Search subscriptions...\",\n product: \"Product\",\n next_bill_date: \"Next Bill Date\",\n price: \"Price\",\n status: \"Status\",\n no_subscriptions_found: \"No subscriptions found\",\n unknown_status: \"Unknown\",\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n};\n\nexport function AccountSubscriptionsScreen({\n customerId,\n isLoadingCustomer,\n}: AccountSubscriptionsScreenProps): React.JSX.Element {\n const subscriptionsClient = useSubscriptionsClient();\n const { navigate } = useAppNavigation();\n\n if (isLoadingCustomer) {\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"space-y-3\">\n <div className=\"bg-muted h-10 animate-pulse rounded\" />\n <div className=\"bg-muted h-64 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <SubscriptionsCoreProvider client={subscriptionsClient}>\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 <SubscriptionsList\n customerId={customerId}\n onSubscriptionClick={(subscriptionToken) =>\n navigate(`account/subscriptions/${subscriptionToken}`)\n }\n t={(key) => translations[key] ?? key}\n />\n </div>\n </SubscriptionsCoreProvider>\n );\n}\n","import { SubscriptionsCoreProvider } from \"@fluid-app/subscriptions-core\";\nimport { SubscriptionDetail } from \"@fluid-app/subscriptions-ui\";\nimport { useSubscriptionsClient } from \"../account/use-account-clients\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface AccountSubscriptionDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function AccountSubscriptionDetailScreen({\n token,\n onToast,\n}: AccountSubscriptionDetailScreenProps): React.JSX.Element {\n const client = useSubscriptionsClient();\n const { navigate } = useAppNavigation();\n\n return (\n <SubscriptionsCoreProvider client={client}>\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 <SubscriptionDetail\n token={token}\n onNotFound={() => {\n onToast(\"Subscription not found\", \"warning\");\n navigate(\"account/subscriptions\");\n }}\n onError={(err) => {\n const message =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`Failed to load subscription: ${message}`, \"error\");\n }}\n onSuccess={(message) => {\n onToast(message, \"success\");\n }}\n onMutationError={(message, err) => {\n const detail =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`${message}: ${detail}`, \"error\");\n }}\n />\n </div>\n </SubscriptionsCoreProvider>\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { customersApi } from \"@fluid-app/fluid-pay-api-client\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidAuth } from \"../hooks/use-fluid-auth\";\nimport { useFluidPayClient } from \"../account/use-account-clients\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { AccountManageLayout } from \"../account/AccountManageLayout\";\nimport { AccountProfileScreen } from \"./AccountProfileScreen\";\nimport { AccountOrdersScreen } from \"./AccountOrdersScreen\";\nimport { AccountOrderDetailScreen } from \"./AccountOrderDetailScreen\";\nimport { AccountSubscriptionsScreen } from \"./AccountSubscriptionsScreen\";\nimport { AccountSubscriptionDetailScreen } from \"./AccountSubscriptionDetailScreen\";\n\ntype AccountScreenProps = 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 if (type === \"error\" || type === \"warning\") {\n console.warn(\"[Account]\", message);\n } else {\n console.info(\"[Account]\", message);\n }\n}\n\nexport function AccountScreen({\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}: AccountScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n\n // Fetch customer account once at the top level so sub-screens don't duplicate this query\n const { token, user } = useFluidAuth();\n const fluidPayClient = useFluidPayClient();\n const jwt = token ?? \"\";\n\n const {\n data: customerData,\n isLoading: isLoadingCustomer,\n isError: isCustomerError,\n } = useQuery({\n queryKey: [\"fluidPayAccount\", user?.id],\n queryFn: () => customersApi.fetchCustomerAccount(fluidPayClient, jwt),\n enabled: !!jwt,\n });\n\n const customerId = customerData?.customer?.id;\n const countryIso = config.countryIso ?? \"US\";\n\n // Parse the slug to determine which sub-screen to render\n // account → profile (default)\n // account/profile → profile\n // account/orders → orders list\n // account/orders/{token} → order detail\n // account/subscriptions → subscriptions list\n // account/subscriptions/{token} → subscription detail\n const parts = currentSlug.split(\"/\");\n const subRoute = parts[1]; // \"profile\" | \"orders\" | \"subscriptions\" | undefined\n const detailToken = parts[2]; // detail token if present\n\n // For orders/subscriptions sub-screens, show skeleton while loading or error message on failure.\n // Detail screens and profile handle their own auth/loading.\n const needsCustomerId =\n (subRoute === \"orders\" && !detailToken) ||\n (subRoute === \"subscriptions\" && !detailToken);\n\n if (needsCustomerId && isCustomerError && !isLoadingCustomer) {\n return (\n <div {...divProps}>\n <AccountManageLayout>\n <div className=\"text-muted-foreground px-4 py-8 text-center text-sm\">\n Unable to load account data. Please try again later.\n </div>\n </AccountManageLayout>\n </div>\n );\n }\n\n return (\n <div {...divProps}>\n <AccountManageLayout>\n {subRoute === \"orders\" && detailToken ? (\n <AccountOrderDetailScreen\n token={detailToken}\n onToast={effectiveToast}\n />\n ) : subRoute === \"orders\" ? (\n <AccountOrdersScreen\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n />\n ) : subRoute === \"subscriptions\" && detailToken ? (\n <AccountSubscriptionDetailScreen\n token={detailToken}\n onToast={effectiveToast}\n />\n ) : subRoute === \"subscriptions\" ? (\n <AccountSubscriptionsScreen\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n />\n ) : (\n <AccountProfileScreen\n onToast={effectiveToast}\n countryIso={countryIso}\n />\n )}\n </AccountManageLayout>\n </div>\n );\n}\n\nexport const accountScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"AccountScreen\",\n displayName: \"Account Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAWA,SAAgB,gBAAgB,OAAuB;AACrD,QAAO,MACJ,QAAQ,MAAM,IAAI,CAClB,QAAQ,YAAY,MAAM,CAC1B,MAAM,IAAI,CACV,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE,CAAC,aAAa,CAAC,CACzE,KAAK,IAAI,CACT,MAAM;;;;;AAWX,SAAgB,eACd,OACyE;AACzE,KAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,QAAO;CAGT,MAAM,MAAM;AACZ,QACE,OAAO,IAAI,WAAW,YACtB,UAAU,QACT,OAAO,IAAI,YAAY,YAAY,IAAI,YAAY,KAAA;;;;;AAOxD,SAAgB,mBAAmB,MAAmC;CACpE,MAAM,SAA6B,EAAE;AAErC,KAAI,CAAC,QAAQ,OAAO,SAAS,SAC3B,QAAO;CAGT,MAAM,WAAW;AAEjB,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,CACjD,KAAI,MAAM,QAAQ,MAAM,IAAI,MAAM,SAAS,EACzC,QAAO,KAAK;EACV,OAAO,gBAAgB,IAAI;EAC3B,UAAU,MAAM,KAAK,SACnB,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,KAAK,CACvD;EACF,CAAC;UACO,OAAO,UAAU,YAAY,MAAM,SAAS,EACrD,QAAO,KAAK;EACV,OAAO,gBAAgB,IAAI;EAC3B,UAAU,CAAC,MAAM;EAClB,CAAC;UACO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,CAC/C,oBAAmB,MAAM,CACjC,SAAS,gBAAgB;AACpC,SAAO,KAAK;GACV,OAAO,GAAG,gBAAgB,IAAI,CAAC,KAAK,YAAY;GAChD,UAAU,YAAY;GACvB,CAAC;GACF;AAIN,QAAO;;;;;AAMT,SAAgB,uBAAuB,QAAoC;AACzE,KAAI,OAAO,WAAW,EACpB,QAAO;AAGT,KAAI,OAAO,WAAW,GAAG;EACvB,MAAM,MAAM,OAAO;AACnB,MAAI,CAAC,IAAK,QAAO;EACjB,MAAM,UAAU,IAAI,SAAS,MAAM;AACnC,SAAO,GAAG,IAAI,MAAM,GAAG;;AAGzB,KAAI,OAAO,UAAU,EACnB,QAAO,OACJ,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,SAAS,MAAM,eAAe,CACzD,KAAK,KAAK;CAGf,MAAM,QAAQ,OACX,MAAM,GAAG,EAAE,CACX,KAAK,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,SAAS,MAAM,eAAe,CACzD,KAAK,KAAK;CACb,MAAM,YAAY,OAAO,SAAS;AAClC,QAAO,GAAG,MAAM,WAAW,UAAU,QAAQ,cAAc,IAAI,UAAU;;;;;;;;;;;;;;;AAgB3E,SAAgB,eACd,OACA,UACoB;AACpB,KAAI,eAAe,MAAM,EAAE;AACzB,MAAI,MAAM,MAAM;GACd,MAAM,cAAc,mBAAmB,MAAM,KAAK;AAClD,OAAI,YAAY,SAAS,EACvB,QAAO,uBAAuB,YAAY;;AAI9C,MAAI,MAAM,QACR,QAAO,MAAM;YAEN,iBAAiB,MAC1B,QAAO,MAAM;AAGf,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxGT,SAAgB,eAAsC;AACpD,QAAOA,sBAAAA,qBAAqB;;;;;;;;AClC9B,eAAsB,qBACpB,QACA,KACmC;AACnC,QAAO,OAAO,IAAI,iBAAiB,EAAE,KAAK,CAAC;;;;;;AAO7C,eAAsB,eACpB,QACA,KACA,MAC2C;AAC3C,QAAO,OAAO,MAAM,4BAA4B,OAAO,EACrD,mBAAmB,MACpB,CAAC;;;;;;;;AClBJ,eAAsB,uBACpB,QACA,KAC2C;AAC3C,QAAO,OAAO,IAAI,wBAAwB;EACxC;EACA,MAAM;EACN,UAAU;EACX,CAAC;;;;;;AAOJ,eAAsB,sBACpB,QACA,KACA,MACiD;AACjD,QAAO,OAAO,KAAK,iCAAiC,OAAO,KAAK;;;;;;AAOlE,eAAsB,sBACpB,QACA,KACA,WACA,MACiD;AACjD,QAAO,OAAO,MACZ,6BAA6B,UAAU,OAAO,OAC9C,KACD;;;;;;AAOH,eAAsB,sBACpB,QACA,KACA,WACgC;AAChC,QAAO,OAAO,OAAO,6BAA6B,UAAU,OAAO,MAAM;;;;;;;;AChD3E,eAAsB,4BACpB,QACA,KACA,aACkD;CAClD,MAAM,SAAiC;EACrC;EACA,MAAM;EACN,UAAU;EACX;AACD,KAAI,YAAa,QAAO,eAAe;AAEvC,QAAO,OAAO,IAAI,8BAA8B,OAAO;;;;;;AAOzD,eAAsB,wBACpB,QACA,KACA,MACuD;AACvD,QAAO,OAAO,KAAK,wCAAwC,OAAO,KAAK;;;;;;AAOzE,eAAsB,4BACpB,QACA,KACA,iBACkB;AAClB,QAAO,OAAO,OACZ,oCAAoC,gBAAgB,OAAO,MAC5D;;;;;;AAqBH,eAAsB,oBACpB,QACA,KACA,iBACA,MAC+C;AAC/C,QAAO,OAAO,MACZ,oCAAoC,gBAAgB,OAAO,OAC3D,KACD;;;;;;;;ACpEH,eAAsB,uCACpB,QACA,KACiC;AACjC,QAAO,OAAO,IAAI,oBAAoB,EAAE,KAAK,CAAC;;;;;;;;ACJhD,eAAsB,WACpB,QACA,YAC+B;AAC/B,QAAO,OAAO,IAAI,2BAA2B,aAAa;;;;;;AAO5D,eAAsB,oBACpB,QACA,QACwC;CACxC,MAAM,QAAgC,EAAE;AAExC,KAAI,OAAO,OAAQ,OAAM,kBAAkB,OAAO;AAClD,KAAI,OAAO,SAAS,KAAM,OAAM,iBAAiB,OAAO,MAAM,UAAU;AACxE,KAAI,OAAO,OAAQ,OAAM,SAAS,OAAO;AACzC,KAAI,OAAO,KAAM,OAAM,OAAO,OAAO;AACrC,KAAI,OAAO,OAAQ,OAAM,SAAS,OAAO;AACzC,KAAI,OAAO,KAAM,OAAM,OAAO,OAAO;AACrC,KAAI,OAAO,cAAc,KACvB,OAAM,cAAc,OAAO,WAAW,UAAU;AAClD,KAAI,OAAO,iBAAiB,KAC1B,OAAM,kBAAkB,OAAO,cAAc,UAAU;AACzD,KAAI,OAAO,kBAAkB,KAC3B,OAAM,kBAAkB,OAAO,eAAe,UAAU;AAC1D,KAAI,OAAO,UAAW,OAAM,aAAa,OAAO;AAChD,KAAI,OAAO,QAAS,OAAM,WAAW,OAAO;AAC5C,KAAI,OAAO,cAAc,KACvB,OAAM,cAAc,OAAO,WAAW,UAAU;AAClD,KAAI,OAAO,WAAY,OAAM,cAAc,OAAO;AAClD,KAAI,OAAO,YAAa,OAAM,eAAe,OAAO;AACpD,KAAI,OAAO,cAAc,KACvB,OAAM,cAAc,OAAO,WAAW,UAAU;AAElD,QAAO,OAAO,IAAI,mBAAmB,MAAM;;;;;;;;ACtC7C,eAAsB,2BACpB,QACA,QAC8C;CAC9C,MAAM,QAAgC;EACpC,aAAa,OAAO,WAAW,UAAU;EACzC,OAAO,OAAO,QAAQ,GAAG,UAAU;EACnC,WAAW,OAAO,WAAW,IAAI,UAAU;EAC5C;AAED,KAAI,OAAO,UAAU,KAAM,OAAM,SAAS,OAAO;AACjD,KAAI,OAAO,UAAU,KAAM,OAAM,SAAS,OAAO;AACjD,KAAI,OAAO,UAAU,KAAM,OAAM,UAAU,OAAO;AAClD,KAAI,OAAO,iBAAiB,KAAM,OAAM,iBAAiB,OAAO;AAEhE,QAAO,OAAO,IAAI,kBAAkB,MAAM;;;;;;AAO5C,eAAsB,kBACpB,QACA,mBAC2C;AAC3C,QAAO,OAAO,IAAI,kBAAkB,oBAAoB;;;;;;AAO1D,eAAsB,kBACpB,QACA,mBACA,QAC2C;CAC3C,MAAM,cAAsC,EAC1C,aAAa,OAAO,WAAW,UAAU,EAC1C;AAED,KAAI,OAAO,gBAAgB,KACzB,aAAY,iBAAiB,OAAO;AAEtC,KAAI,OAAO,kBAAkB,KAC3B,aAAY,mBAAmB,OAAO,eAAe,UAAU;CAGjE,MAAM,QAAQ,IAAI,gBAAgB,YAAY,CAAC,UAAU;AACzD,QAAO,OAAO,KAAK,kBAAkB,kBAAkB,SAAS,QAAQ;;;;;;AAO1E,eAAsB,mBACpB,QACA,mBACA,QAC2C;CAC3C,MAAM,QAAQ,IAAI,gBAAgB;EAChC,aAAa,OAAO,WAAW,UAAU;EACzC,gBAAgB,OAAO;EACxB,CAAC,CAAC,UAAU;AAEb,QAAO,OAAO,KAAK,kBAAkB,kBAAkB,UAAU,QAAQ;;;;;;AAO3E,eAAsB,iBACpB,QACA,mBACA,QAC2C;CAC3C,MAAM,QAAQ,IAAI,gBAAgB;EAChC,aAAa,OAAO,WAAW,UAAU;EACzC,gBAAgB,OAAO;EACxB,CAAC,CAAC,UAAU;AAEb,QAAO,OAAO,KACZ,kBAAkB,kBAAkB,qBAAqB,QAC1D;;;;;;AAOH,eAAsB,mBACpB,QACA,mBACA,YAC2C;CAC3C,MAAM,QAAQ,IAAI,gBAAgB,EAChC,aAAa,WAAW,UAAU,EACnC,CAAC,CAAC,UAAU;AAEb,QAAO,OAAO,KAAK,kBAAkB,kBAAkB,UAAU,QAAQ;;;;;;AAO3E,eAAsB,uBACpB,QACA,mBACA,QAC2C;CAC3C,MAAM,OACJ,OAAO,wBAAwB,OAC3B,EAAE,qBAAqB,MAAM,GAC7B,OAAO,iBACL,EAAE,gBAAgB,OAAO,gBAAgB,GACzC,EAAE;AAEV,QAAO,OAAO,KACZ,kBAAkB,kBAAkB,cACpC,OAAO,KAAK,KAAK,CAAC,SAAS,IAAI,OAAO,KAAA,EACvC;;;;;AC9GH,MAAa,cAAc;;;;;;;;AAS3B,SAAS,cAAc,SAAyB;CAC9C,MAAM,OAAO,QAAQ,QAAQ,QAAQ,GAAG;AACxC,QAAO,KAAK,SAAS,OAAO,GAAG,OAAO,GAAG,KAAK;;AAGhD,SAAgBC,oBAAqC;CACnD,MAAM,EAAE,WAAWC,sBAAAA,iBAAiB;CACpC,MAAM,EAAE,UAAU,cAAc;AAEhC,SAAA,GAAA,MAAA,eAEIC,sBAAAA,kBAAwB;EACtB,SAAS,cAAc,OAAO,QAAQ;EACtC,oBAAoB;EACpB,aAAa,OAAO;EACrB,CAAC,EACJ;EAAC,OAAO;EAAS,OAAO;EAAa;EAAM,CAC5C;;AAGH,SAAgBC,2BAAmD;CACjE,MAAM,EAAE,WAAWF,sBAAAA,iBAAiB;CACpC,MAAM,EAAE,UAAU,cAAc;AAEhC,SAAA,GAAA,MAAA,eAEIG,sBAAAA,kBAA+B;EAC7B,SAAS,cAAc,OAAO,QAAQ;EACtC,oBAAoB;EACpB,aAAa,OAAO;EACrB,CAAC,EACJ;EAAC,OAAO;EAAS,OAAO;EAAa;EAAM,CAC5C;;AAGH,SAAgB,oBAAyC;CACvD,MAAM,EAAE,WAAWH,sBAAAA,iBAAiB;CACpC,MAAM,EAAE,UAAU,cAAc;AAEhC,SAAA,GAAA,MAAA,eAEII,sBAAAA,kBAA0B;EACxB,SAAS,cAAc,OAAO,QAAQ;EACtC,oBAAoB;EACpB,aAAa,OAAO;EACrB,CAAC,EACJ;EAAC,OAAO;EAAS,OAAO;EAAa;EAAM,CAC5C;;;;;;;AAQH,SAAgB,eAAgC;CAC9C,MAAM,EAAE,WAAWJ,sBAAAA,iBAAiB;CACpC,MAAM,EAAE,UAAU,cAAc;AAEhC,SAAA,GAAA,MAAA,eAEIK,sBAAAA,kBAAsB;EACpB,SAAS,cAAc,OAAO,QAAQ;EACtC,oBAAoB;EACpB,aAAa,OAAO;EACrB,CAAC,EACJ;EAAC,OAAO;EAAS,OAAO;EAAa;EAAM,CAC5C;;;;AC5FH,MAAM,YAKA;CACJ;EAAE,KAAK;EAAW,OAAO;EAAW,MAAM;EAAmB,MAAMC,aAAAA;EAAM;CACzE;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,MAAMC,aAAAA;EACP;CACD;EACE,KAAK;EACL,OAAO;EACP,MAAM;EACN,MAAMC,aAAAA;EACP;CACF;AAED,SAAS,aAAa,MAAyB;CAE7C,MAAM,MADQ,KAAK,MAAM,IAAI,CACX;AAClB,KAAI,QAAQ,SAAU,QAAO;AAC7B,KAAI,QAAQ,gBAAiB,QAAO;AACpC,QAAO;;AAGT,SAAgB,oBAAoB,EAClC,YAGoB;CACpB,MAAM,EAAE,aAAa,aAAaC,6BAAAA,kBAAkB;CACpD,MAAM,YAAY,aAAa,YAAY;AAE3C,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf;GAEE,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACZ,UAAU,KAAK,EAAE,KAAK,MAAM,OAAO,MAAM,WACxC,iBAAA,GAAA,kBAAA,MAAC,UAAD;KAEE,MAAK;KACL,eAAe,SAAS,KAAK;KAC7B,WAAW,sFACT,cAAc,MACV,uDACA;eAPR,CAUE,iBAAA,GAAA,kBAAA,KAAC,MAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,MACM;OAXF,IAWE,CACT;IACE,CAAA;GAGN,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACZ,UAAU,KAAK,EAAE,KAAK,MAAM,OAAO,MAAM,WACxC,iBAAA,GAAA,kBAAA,MAAC,UAAD;KAEE,MAAK;KACL,eAAe,SAAS,KAAK;KAC7B,WAAW,8EACT,cAAc,MACV,uDACA;eAPR,CAUE,iBAAA,GAAA,kBAAA,KAAC,MAAD,EAAM,WAAU,WAAY,CAAA,EAC3B,MACM;OAXF,IAWE,CACT;IACE,CAAA;GAGN,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;IAAkB;IAAe,CAAA;GAC5C;;;;;AC5EV,MAAa,oBAAA,GAAA,MAAA,eACX,KACD;AAED,SAAgB,eAAsC;CACpD,MAAM,WAAA,GAAA,MAAA,YAAqB,iBAAiB;AAC5C,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,uDAAuD;AAEzE,QAAO;;;;ACRT,SAAgB,kBAAkB,EAChC,GACA,YACsC;CACtC,MAAM,SAAA,GAAA,MAAA,gBAAuB,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;AACzC,QACE,iBAAA,GAAA,kBAAA,KAAC,iBAAiB,UAAlB;EAAkC;EAC/B;EACyB,CAAA;;;;ACPhC,MAAa,YAAqB;CAChC;EAAE,MAAM;EAAW,SAAS;EAAM;CAClC;EAAE,MAAM;EAAU,SAAS;EAAM;CACjC;EAAE,MAAM;EAAW,SAAS;EAAM;CAClC;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAc,SAAS;EAAM;CACrC;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAe,SAAS;EAAM;CACtC;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAW,SAAS;EAAM;CAClC;EAAE,MAAM;EAAW,SAAS;EAAM;CAClC;EAAE,MAAM;EAAU,SAAS;EAAM;CACjC;EAAE,MAAM;EAAS,SAAS;EAAM;CAChC;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAW,SAAS;EAAM;CAClC;EAAE,MAAM;EAAQ,SAAS;EAAM;CAC/B;EAAE,MAAM;EAAU,SAAS;EAAM;CACjC;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAa,SAAS;EAAM;CACpC;EAAE,MAAM;EAAS,SAAS;EAAM;CAChC;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAiB,SAAS;EAAM;CACxC;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAa,SAAS;EAAM;CACpC;EAAE,MAAM;EAAe,SAAS;EAAM;CACtC;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAW,SAAS;EAAM;CAClC;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAU,SAAS;EAAM;CACjC;EAAE,MAAM;EAAiB,SAAS;EAAM;CACxC;EAAE,MAAM;EAAc,SAAS;EAAM;CACrC;EAAE,MAAM;EAAc,SAAS;EAAM;CACrC;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAkB,SAAS;EAAM;CACzC;EAAE,MAAM;EAAgB,SAAS;EAAM;CACvC;EAAE,MAAM;EAAQ,SAAS;EAAM;CAC/B;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAU,SAAS;EAAM;CACjC;EAAE,MAAM;EAAgB,SAAS;EAAM;CACvC;EAAE,MAAM;EAAgB,SAAS;EAAM;CACvC;EAAE,MAAM;EAAkB,SAAS;EAAM;CACzC;EAAE,MAAM;EAAgB,SAAS;EAAM;CACvC;EAAE,MAAM;EAAa,SAAS;EAAM;CACpC;EAAE,MAAM;EAAS,SAAS;EAAM;CAChC;EAAE,MAAM;EAAQ,SAAS;EAAM;CAC/B;EAAE,MAAM;EAAW,SAAS;EAAM;CAClC;EAAE,MAAM;EAAY,SAAS;EAAM;CACnC;EAAE,MAAM;EAAc,SAAS;EAAM;CACrC;EAAE,MAAM;EAAiB,SAAS;EAAM;CACxC;EAAE,MAAM;EAAa,SAAS;EAAM;CACpC;EAAE,MAAM;EAAW,SAAS;EAAM;CAClC;EAAE,MAAM;EAAwB,SAAS;EAAM;CAChD;AAED,MAAa,kBAAgD;CAC3D,IAAI;EAAE,aAAa;EAAS,aAAa;EAAY;CACrD,IAAI;EAAE,aAAa;EAAc,aAAa;EAAe;CAC9D;AAED,MAAM,wBAAsC;CAC1C,aAAa;CACb,aAAa;CACd;AAED,SAAgB,gBAAgB,aAAmC;AACjE,QAAO,gBAAgB,gBAAgB;;;;ACpEzC,SAAwB,mBAAmB;CACzC,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,UAAuC,KAAK;CACpE,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,UAAqC,UAAU;AA0BpE,QAAO;EAAE,sBAAA,GAAA,MAAA,cAtBL,qBACA,gBACG;AACH,sBAAmB,oBAAoB;AACvC,OAAI,wBAAwB,KAC1B,iBAAgB,UAAU;YACjB,YACT,aAAY,oBAAoB,CAC7B,MAAM,WAAW,gBAAgB,OAAO,CAAC,CACzC,OAAO,UAAU;AAChB,YAAQ,MAAM,2BAA2B,MAAM;AAC/C,oBAAgB,EAAE,CAAC;KACnB;OAEJ,iBAAgB,EAAE,CAAC;KAGvB,EAAE,CACH;EAI6B;EAAc,QAF7B,gBAAgB,gBAAgB;EAEK;EAAiB;;;;ACzBvE,SAAwB,iBAAiB,EACvC,UACA,QACA,YAAY,QACZ,cAAc,UACd,WAAW,SAOG;AACd,KAAI,SACF,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;EACE,SAAQ;EACR,UAAA;EACA,WAAU;YAEV,iBAAA,GAAA,kBAAA,KAAC,OAAD;GACE,OAAM;GACN,SAAQ;GACR,WAAU;aAEV,iBAAA,GAAA,kBAAA,KAAC,QAAD,EAAM,GAAE,sIAAuI,CAAA;GAC3I,CAAA;EACC,CAAA;AAIb,QACE,iBAAA,GAAA,kBAAA,MAACC,YAAAA,cAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,qBAAD;EAAqB,SAAA;YACnB,iBAAA,GAAA,kBAAA,KAACF,YAAAA,QAAD;GAAQ,SAAQ;aACd,iBAAA,GAAA,kBAAA,KAAC,OAAD;IACE,OAAM;IACN,SAAQ;IACR,WAAU;cAEV,iBAAA,GAAA,kBAAA,KAAC,QAAD,EAAM,GAAE,sIAAuI,CAAA;IAC3I,CAAA;GACC,CAAA;EACW,CAAA,EACtB,iBAAA,GAAA,kBAAA,MAACG,YAAAA,qBAAD;EAAqB,WAAU;YAA/B,CACG,UACC,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,MAACC,YAAAA,kBAAD;GACE,WAAU;GACV,UAAU,MAAM;AACd,MAAE,iBAAiB;AACnB,YAAQ;;aAJZ,CAOE,iBAAA,GAAA,kBAAA,KAAC,QAAD,EAAA,UAAO,WAAiB,CAAA,EACxB,iBAAA,GAAA,kBAAA,KAAC,OAAD;IACE,OAAM;IACN,SAAQ;IACR,WAAU;cAEV,iBAAA,GAAA,kBAAA,KAAC,QAAD,EAAM,GAAE,wQAAyQ,CAAA;IAC7Q,CAAA,CACW;MACnB,iBAAA,GAAA,kBAAA,KAACC,YAAAA,uBAAD,EAAyB,CAAA,CACxB,EAAA,CAAA,EAEL,iBAAA,GAAA,kBAAA,MAACD,YAAAA,kBAAD;GACE,WAAU;GACV,UAAU,MAAM;AACd,MAAE,iBAAiB;AACnB,gBAAY;;aAJhB,CAOE,iBAAA,GAAA,kBAAA,KAAC,QAAD,EAAA,UAAO,aAAmB,CAAA,EAC1B,iBAAA,GAAA,kBAAA,KAAC,OAAD;IACE,OAAM;IACN,SAAQ;IACR,WAAU;cAEV,iBAAA,GAAA,kBAAA,KAAC,QAAD,EAAM,GAAE,gQAAiQ,CAAA;IACrQ,CAAA,CACW;KACC;IACT,EAAA,CAAA;;;;ACtEnB,SAAwB,oBAAoB,EAC1C,OACA,aACA,UACA,YACA,eACA,UACA,WACA,aAAa,YAC2B;CACxC,MAAM,EAAE,MAAM,cAAc;AAE5B,QACE,iBAAA,GAAA,kBAAA,KAACE,YAAAA,QAAD;EAAQ,MAAM;EAAY,cAAc;YACtC,iBAAA,GAAA,kBAAA,MAACC,YAAAA,eAAD;GAAe,WAAU;aAAzB;IACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,cAAD;KAAc,WAAU;eACtB,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD;MAAa,WAAU;gBACpB;MACW,CAAA;KACD,CAAA;IAEf,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAU;eACb,iBAAA,GAAA,kBAAA,KAAC,KAAD;MAAG,WAAU;gBAAmC;MAAgB,CAAA;KAC5D,CAAA;IAEL,YAAY,iBAAA,GAAA,kBAAA,KAAC,KAAD;KAAG,WAAU;eAAwB;KAAa,CAAA;IAE/D,iBAAA,GAAA,kBAAA,KAACC,YAAAA,cAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD;MAAa,SAAA;gBACX,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;OACE,WAAU;OACV,eAAe,cAAc,MAAM;iBAElC,EAAE,SAAS;OACL,CAAA;MACG,CAAA,EACd,iBAAA,GAAA,kBAAA,KAACA,YAAAA,QAAD;MACE,MAAK;MACL,WAAU;MACV,SAAS;MACT,UAAU;gBAET,YACC,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,2FAA4F,CAAA,GAE3G;MAEK,CAAA,CACL;QACO,CAAA;IACD;;EACT,CAAA;;;;AC5Db,SAAS,sBAAsB,QAAsB,GAA0B;CAC7E,MAAM,kBAAkB,OAAO,SAAS;AAExC,KAAI,CAAC,iBAAiB;AACpB,MAAI,OAAO,SAAS,OAClB,QAAO,OAAO,SAAS,IAAI,EAAE,iBAAiB,GAAG,EAAE,kBAAkB;AAEvE,SAAO,EAAE,cAAc;;CAGzB,MAAM,iBAAiB,gBAAgB,aAAa,CAAC,QAAQ,MAAM,IAAI;CACvE,MAAM,aAAa,EAAE,eAAe;AAEpC,KAAI,eAAe,eACjB,QAAO;AAGT,QAAO,gBACJ,MAAM,IAAI,CACV,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE,CAAC,CAC3D,KAAK,IAAI;;AAGd,SAAS,aAAa,QAAwB;AAE5C,QAAO,GADQ,UAAU,IAAI,MAAM,KAChB;;AAGrB,SAAS,eAAe,YAA4B;AAElD,QADa,IAAI,KAAK,WAAW,CACrB,mBAAmB,KAAA,GAAW;EACxC,MAAM;EACN,OAAO;EACP,KAAK;EACL,MAAM;EACN,QAAQ;EACT,CAAC;;AAQJ,SAAwB,qBAAqB,EAC3C,cACA,YAAY,SAC6B;CACzC,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,UAAsC,GAAG;CAChE,MAAM,EAAE,MAAM,cAAc;CAE5B,MAAM,kBAAkB,aAAa,IAAI,iBAAiB;AAE1D,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAU;YACb,iBAAA,GAAA,kBAAA,KAACC,YAAAA,WAAD;GACE,MAAK;GACL,aAAA;GACA,OAAO;GACP,eAAe;GACf,WAAU;aAEV,iBAAA,GAAA,kBAAA,MAACC,YAAAA,eAAD;IAAe,OAAM;IAAiB,WAAU;cAAhD;KACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;OAAK,WAAU;iBACZ,EAAE,iBAAiB;OAChB,CAAA,EACN,iBAAA,GAAA,kBAAA,KAACC,YAAAA,kBAAD,EAAkB,WAAU,+DAAgE,CAAA,CACxF;;KAEL,aAAa,iBAAA,GAAA,kBAAA,KAACC,YAAAA,UAAD,EAAU,WAAU,cAAe,CAAA;KAEhD,CAAC,aAAa,CAAC,kBACd,iBAAA,GAAA,kBAAA,KAAC,OAAD;MACE,WAAU;MACV,eAAe,kBAAkB,iBAAiB;gBAElD,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf;QACG,gBAAgB,gBAAgB;QAAE;QACnC,iBAAA,GAAA,kBAAA,KAAC,QAAD;SAAM,WAAU;mBACb,EAAE,mBAAmB,CAAC,aAAa;SAC/B,CAAA;QACH;;MACF,CAAA;KAGR,iBAAA,GAAA,kBAAA,MAACC,YAAAA,kBAAD;MAAkB,WAAU;gBAA5B,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;OAAK,WAAU;iBACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf;SACG,gBAAgB,gBAAgB;SAAE;SACnC,iBAAA,GAAA,kBAAA,KAAC,QAAD;UAAM,WAAU;oBACb,EAAE,mBAAmB,CAAC,aAAa;UAC/B,CAAA;SACH;;OACF,CAAA,EAEN,iBAAA,GAAA,kBAAA,KAAC,OAAD;OAAK,WAAU;iBACZ,aAAa,SAAS,IACrB,aAAa,KAAK,WAChB,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAEE,WAAU;kBAFZ;SAIE,iBAAA,GAAA,kBAAA,MAAC,OAAD;UAAK,WAAU;oBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,oEAAqE,CAAA,EACpF,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,sCAAuC,CAAA,CAClD;;SACN,iBAAA,GAAA,kBAAA,KAAC,OAAD;UAAK,WAAU;oBACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;WAAK,WAAU;qBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;YAAK,WAAU;sBACZ,sBAAsB,QAAQ,EAAE;YAC7B,CAAA,EACN,iBAAA,GAAA,kBAAA,KAAC,OAAD;YAAK,WAAU;sBACZ,eAAe,OAAO,WAAW;YAC9B,CAAA,CACF;;UACF,CAAA;SACN,iBAAA,GAAA,kBAAA,KAAC,OAAD;UACE,WAAWC,YAAAA,GACT,uBACA,OAAO,UAAU,IAAI,mBAAmB,eACzC;oBAEA,aAAa,OAAO,OAAO;UACxB,CAAA;SACF;UAzBC,OAAO,GAyBR,CACN,GAEF,iBAAA,GAAA,kBAAA,KAAC,OAAD;QAAK,WAAU;kBACZ,EAAE,0BAA0B;QACzB,CAAA;OAEJ,CAAA,CACW;;KACL;;GACN,CAAA;EACR,CAAA;;;;ACpIV,SAAgBC,gBAAqC,EACnD,SACA,MACA,OACA,oBACA,GAAG,SAM4C;CAC/C,MAAM,EACJ,OACA,YAAY,EAAE,aAAA,GAAA,gBAAA,eACE;EAAE;EAAM;EAAS,CAAC;AACpC,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAWC,YAAAA,GAAG,aAAa,mBAAmB;YAAnD;GACG,SACC,iBAAA,GAAA,kBAAA,KAACC,YAAAA,OAAD;IACE,SAAS;IACT,WAAU;cAET;IACK,CAAA;GAEV,iBAAA,GAAA,kBAAA,KAACC,YAAAA,OAAD;IACE,GAAI;IACJ,GAAI;IACJ,IAAI;IACJ,OAAO,MAAM,SAAS;IACtB,WAAWF,YAAAA,GAAG,SAAS,uBAAuB,MAAM,UAAU;IAC9D,CAAA;GACD,SAAS,iBAAA,GAAA,kBAAA,KAAC,KAAD;IAAG,WAAU;cAAwB,MAAM;IAAY,CAAA;GAC7D;;;AAIV,SAAgBG,kBAAuC,EACrD,SACA,MACA,OACA,SACA,aACA,oBACA,YASC;CACD,MAAM,EACJ,OACA,YAAY,EAAE,aAAA,GAAA,gBAAA,eACE;EAAE;EAAM;EAAS,CAAC;AACpC,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAWH,YAAAA,GAAG,aAAa,mBAAmB;YAAnD;GACG,SACC,iBAAA,GAAA,kBAAA,KAACC,YAAAA,OAAD;IACE,SAAS;IACT,WAAU;cAET;IACK,CAAA;GAEV,iBAAA,GAAA,kBAAA,MAACG,YAAAA,QAAD;IACE,OAAO,MAAM,OAAO,UAAU,IAAI;IAClC,gBAAgB,QAAQ;AACtB,WAAM,SAAS,IAAI;AACnB,gBAAW,IAAI;;cAJnB,CAOE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,eAAD;KAAe,WAAWL,YAAAA,GAAG,SAAS,sBAAsB;eAC1D,iBAAA,GAAA,kBAAA,KAACM,YAAAA,aAAD,EAA0B,aAAe,CAAA;KAC3B,CAAA,EAChB,iBAAA,GAAA,kBAAA,KAACC,YAAAA,eAAD,EAAA,UACG,SAAS,KAAK,QACb,iBAAA,GAAA,kBAAA,KAACC,YAAAA,YAAD;KAEE,OAAO,IAAI,MAAM,UAAU;eAE1B,IAAI;KACM,EAJN,GAAG,IAAI,KAAK,GAAG,IAAI,QAIb,CACb,EACY,CAAA,CACT;;GACR,SAAS,iBAAA,GAAA,kBAAA,KAAC,KAAD;IAAG,WAAU;cAAwB,MAAM;IAAY,CAAA;GAC7D;;;;;ACzFV,SAAwB,eAAe,EACrC,SACA,QACA,UACA,aACA,iBACA,UACA,gBASc;CACd,MAAM,EAAE,MAAM,cAAc;AAE5B,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;EAAQ,MAAM;EAAQ,eAAe,SAAS,CAAC,QAAQ,aAAa;YAClE,iBAAA,GAAA,kBAAA,MAACC,YAAAA,eAAD;GAAe,WAAU;aAAzB;IACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,cAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD;KAAa,WAAU;eACpB,EAAE,eAAe;KACN,CAAA,EACD,CAAA;IACf,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf;MACE,iBAAA,GAAA,kBAAA,KAACC,iBAAD;OACW;OACT,MAAK;OACL,OAAO,EAAE,aAAa;OACtB,CAAA;MACF,iBAAA,GAAA,kBAAA,KAACA,iBAAD;OACW;OACT,MAAK;OACL,OAAO,EAAE,YAAY;OACrB,CAAA;MACF,iBAAA,GAAA,kBAAA,KAACA,iBAAD;OACW;OACT,MAAK;OACL,OAAO,EAAE,eAAe;OACxB,MAAK;OACL,CAAA;MACF,iBAAA,GAAA,kBAAA,KAACC,mBAAD;OACW;OACT,MAAK;OACL,OAAO,EAAE,WAAW;OACpB,SAAS;OACT,aAAa,EAAE,mBAAmB;OAClC,CAAA;MACE;;IACL,YAAY,iBAAA,GAAA,kBAAA,KAAC,KAAD;KAAG,WAAU;eAAwB;KAAa,CAAA;IAC/D,iBAAA,GAAA,kBAAA,KAACC,YAAAA,cAAD;KAAc,WAAU;eACtB,iBAAA,GAAA,kBAAA,KAAC,OAAD;MAAK,WAAU;gBACb,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD;OAAa,SAAA;iBACX,iBAAA,GAAA,kBAAA,MAACC,YAAAA,QAAD;QAAQ,MAAK;QAAS,SAAS;kBAA/B,CACG,gBACC,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,gGAAiG,CAAA,EAEjH,eAAe,EAAE,SAAS,GAAG,EAAE,eAAe,CACxC;;OACG,CAAA;MACV,CAAA;KACO,CAAA;IACD;;EACT,CAAA;;;;AC5Eb,SAAS,qBAAqB,UAI3B;AACD,QAAOC,IAAAA,EAAE,OAAO;EACd,YAAYA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,EAAE,SAAS,SAAS,mBAAmB,CAAC;EACtE,WAAWA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,EAAE,SAAS,SAAS,kBAAkB,CAAC;EACpE,cAAcA,IAAAA,EAAE,QAAQ,CAAC,UAAU;EACnC,UAAUA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,EAAE,SAAS,SAAS,kBAAkB,CAAC;EACpE,CAAC;;AAUJ,SAAwB,aAAa,EACnC,iBACA,WACA,kBACA,aAAa,SACoB;CACjC,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,UAAgC,MAAM;CAC/D,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAA+C,KAAA,EAAU;CAE7E,MAAM,EAAE,MAAM,cAAc;CAE5B,MAAM,EAAE,YAAY,cAAc,gBAAgB;CAClD,MAAM,kBAAkB,UAAU,WAAW,WAAW,GACpD,UAAU,MAAM,WAAW,OAAO,CAAC,MAAM,GACzC;CACJ,MAAM,cAAc,aAAa,WAAW,OAAO,EAAE,CAAC,aAAa,GAAG;CACtE,MAAM,mBAAmB,WAAW,MACjC,aACC,SAAS,QAAQ,gBAAgB,kBAAkB,aACtD,EAAE;CAEH,MAAM,kBAA2C,WAAW,KACzD,cAAc;EACb,MAAM,SAAS;EACf,OAAO,SAAS;EACjB,EACF;CAYD,MAAM,EAAE,SAAS,cAAc,WAAA,GAAA,gBAAA,SAAgC;EAE7D,WAAA,GAAA,wBAAA,cAAA,GAAA,MAAA,eAVE,qBAAqB;GACnB,mBAAmB,EAAE,yBAAyB;GAC9C,kBAAkB,EAAE,wBAAwB;GAC5C,kBAAkB,EAAE,uBAAuB;GAC5C,CAAC,EACJ,CAAC,EAAE,CACJ,CAIqC;EACpC,eAAe;GACb,YAAY,gBAAgB,SAAS,cAAc;GACnD,WAAW;GACX,cAAc,gBAAgB,SAAS,SAAS;GAChD,UAAU,oBAAoB;GAC/B;EACF,CAAC;CAEF,MAAM,6BAA6B;AACjC,QAAM;GACJ,YAAY,gBAAgB,SAAS,cAAc;GACnD,WAAW;GACX,cAAc,gBAAgB,SAAS,SAAS;GAChD,UAAU,oBAAoB;GAC/B,CAAC;AACF,sBAAoB,KAAK;;CAG3B,MAAM,8BAA8B;AAClC,sBAAoB,MAAM;AAC1B,iBAAe,KAAA,EAAU;;CAG3B,MAAM,mBAAmB,aAAa,OAAO,SAAuB;AAClE,MAAI;AACF,SAAM,iBAAiB,KAAK;AAC5B,uBAAoB,MAAM;WACnB,OAAO;AACd,WAAQ,MAAM,2BAA2B,MAAM;AAC/C,kBACE,wEACD;;GAEH;AAEF,QACE,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,gBAAD,EAAA,UAAiB,aAA6B,CAAA,EACvC,CAAA,EACT,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;KAAG,WAAU;eACV,gBAAgB,SAAS;KACxB,CAAA,EACJ,iBAAA,GAAA,kBAAA,KAAC,KAAD;KAAG,WAAU;eACV,gBAAgB,SAAS;KACxB,CAAA,CACA;MACF;MACN,iBAAA,GAAA,kBAAA,KAAC,UAAD;GACE,WAAU;GACV,SAAS;aAET,iBAAA,GAAA,kBAAA,KAACC,aAAAA,QAAD,EAAQ,WAAU,6BAA8B,CAAA;GACzC,CAAA,CACL;KAEN,iBAAA,GAAA,kBAAA,KAAC,gBAAD;EACW;EACT,QAAQ;EACR,UAAU;EACV,aAAa;EACI;EACjB,UAAU;EACV,cAAc;EACd,CAAA,CACD,EAAA,CAAA;;;;AC/HP,SAAS,kBAAkB,SAA2C;AACpE,QAAO,QAAQ,QAAQ;;AAmBzB,SAAwB,gBAAgB,EACtC,OACA,gBACA,aACA,mBACA,eACA,iBACA,oBACA,iBACA,gBAAgB,MAChB,cAAc,sCACd,YAAY,IACZ,cAAc,MACd,YAAY,SACW;CACvB,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,UAAsC,GAAG;CAChE,MAAM,EAAE,MAAM,cAAc;AAE5B,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAW,GAAG,YAAY,GAAG;YAAlC,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,WAAD;GACE,MAAK;GACL,aAAA;GACA,OAAO;GACP,eAAe;GACf,WAAU;aAEV,iBAAA,GAAA,kBAAA,MAACC,YAAAA,eAAD;IAAe,OAAO;IAAoB,WAAU;cAApD;KACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;OAAK,WAAU;iBAAmC;OAAY,CAAA,EAC9D,iBAAA,GAAA,kBAAA,KAACC,YAAAA,kBAAD,EAAkB,WAAU,+DAAgE,CAAA,CACxF;;KAEL,aACC,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,UAAD,EAAU,WAAU,aAAc,CAAA,EAClC,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,aAAc,CAAA,CAC9B;;KAGP,CAAC,aAAa,CAAC,kBAAkB,kBAChC,iBAAA,GAAA,kBAAA,MAAC,OAAD;MACE,WAAU;MACV,eAAe,kBAAkB,mBAAmB;gBAFtD,CAIE,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf;QACG,kBAAkB,eAAe;QAAC;QAAG,eAAe;QACjD;UACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf;QACG,eAAe;QAAK;QAAG,eAAe;QAAO;QAC7C,eAAe;QACZ;SACF;;KAGR,iBAAA,GAAA,kBAAA,KAACC,YAAAA,kBAAD;MAAkB,WAAU;gBAC1B,iBAAA,GAAA,kBAAA,KAAC,OAAD;OAAK,WAAU;iBACZ,YAAY,SAAS,IACpB,YAAY,KAAK,SAAS,UACxB,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAEE,WAAWC,YAAAA,GACT,iFACA,EACE,6CACE,YAAY,SAAS,MAAM,OAC9B,CACF;kBARH,CAUE,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;UAAK,WAAU;oBAAf;WACG,kBAAkB,QAAQ;WAAC;WAAC,iBAAA,GAAA,kBAAA,KAAC,MAAD,EAAM,CAAA;WAClC,QAAQ;WAAS;WAAC,iBAAA,GAAA,kBAAA,KAAC,MAAD,EAAM,CAAA;WACxB,QAAQ;WAAK;WAAG,QAAQ;WAAM;WAAE,QAAQ;WACrC;;SACF,CAAA,EACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;SAAK,WAAU;mBAAf,CACG,QAAQ,WACP,iBAAA,GAAA,kBAAA,KAAC,KAAD;UAAG,WAAU;oBACV,EAAE,UAAU;UACX,CAAA,EAEL,eACC,iBAAA,GAAA,kBAAA,KAAC,kBAAD;UACE,gBAAgB,kBAAkB,QAAQ;UAC1C,cAAc,gBAAgB,QAAQ;UACtC,WAAW,EAAE,OAAO;UACpB,aAAa,EAAE,SAAS;UACxB,CAAA,CAEA;WACF;UA/BC,QAAQ,GA+BT,CACN,GAEF,iBAAA,GAAA,kBAAA,KAAC,OAAD;QAAK,WAAU;kBACZ,EAAE,2BAA2B;QAC1B,CAAA;OAEJ,CAAA;MACW,CAAA;KACL;;GACN,CAAA,EAEX,iBACC,iBAAA,GAAA,kBAAA,KAAC,UAAD;GACE,WAAU;GACV,SAAS;aAER;GACM,CAAA,CAEP;;;;;AC3HV,SAAwB,UAAU,EAChC,WACA,YAAY,OACZ,iBACA,iBACA,oBAAoB,OACpB,uBAC8B;CAC9B,MAAM,CAAC,mBAAmB,yBAAA,GAAA,MAAA,UAAiC,MAAM;CACjE,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,UAAgC,MAAM;CAC/D,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,UACoB,KAAK;CACjD,MAAM,CAAC,oBAAoB,0BAAA,GAAA,MAAA,UAEzB,KAAA,EAAU;CAEZ,MAAM,EAAE,MAAM,cAAc;CAE5B,MAAM,iBAAiB,UAAU,MAAM,SAAS,KAAK,QAAQ,IAAI;CAEjE,MAAM,qBAAqB,YAAsC;AAC/D,qBAAmB,QAAQ;AAC3B,wBAAsB,KAAA,EAAU;AAChC,8BAA4B;AAC1B,uBAAoB,KAAK;IACzB;;CAGJ,MAAM,mBAAmB,YAAsC;AAC7D,qBAAmB,QAAQ;AAC3B,8BAA4B;AAC1B,wBAAqB,KAAK;IAC1B;;CAGJ,MAAM,sBAAsB,YAAY;AACtC,MAAI,CAAC,gBAAiB;AACtB,MAAI;AACF,SAAM,gBAAgB,gBAAgB,GAAG;AACzC,yBAAsB,KAAA,EAAU;AAChC,uBAAoB,MAAM;AAC1B,sBAAmB,KAAK;UAClB;AACN,yBACE,2DACD;;;CAIL,MAAM,uBAAuB;AAC3B,qBAAmB,KAAK;AACxB,MAAI,gBACF,kBAAiB;AAEnB,uBAAqB,KAAK;;CAG5B,MAAM,iCAAiC;AACrC,uBAAqB,MAAM;AAC3B,qBAAmB,KAAK;;AAG1B,QACE,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,KAAC,iBAAD;GACE,OAAO,EAAE,qBAAqB;GAC9B,gBAAgB;GAChB,aAAa;GACb,mBAAmB;GACnB,eAAe;GACf,iBAAiB;GACjB,oBAAmB;GACnB,iBAAiB,KAAK,EAAE,iBAAiB;GACzC,eAAe;GACf,aAAY;GACZ,aAAa;GACF;GACX,CAAA;EAEF,iBAAA,GAAA,kBAAA,KAAC,qBAAD;GACE,OAAO,EAAE,iBAAiB;GAC1B,aAAa,EAAE,yBAAyB;GACxC,UAAU;GACV,YAAY,EAAE,SAAS;GACvB,YAAY;GACZ,eAAe;GACf,UAAU;GACV,WAAW;GACX,CAAA;EAED,sBAAsB;GACrB,QAAQ;GACR,SAAS;GACT;GACD,CAAC;EACD,EAAA,CAAA;;;;ACrFP,SAAS,mBACP,eACQ;AACR,KAAI,cAAc,iBAAiB,eAAe;EAChD,MAAM,QAAQ,cAAc,QAAQ;EACpC,MAAM,WAAW,cAAc,QAAQ;AACvC,SAAO,GAAG,SAAS,OAAO,QAAQ,YAAY;;AAEhD,QAAO,cAAc;;AAGvB,SAAS,cAAc,eAAuD;CAC5E,MAAM,EAAE,WAAW,aAAa,cAAc;AAC9C,KAAI,aAAa,QAAQ,YAAY,KACnC,QAAO,WAAW,UAAU,GAAG;AAEjC,QAAO;;AAGT,SAAwB,sBAAsB,EAC5C,OACA,sBACA,mBACA,yBACA,qBACA,uBACA,qBAAqB,kBACrB,wBAAwB,0BACxB,gBAAgB,MAChB,cAAc,sCACd,YAAY,IACZ,cAAc,MACd,YAAY,SACiB;CAC7B,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,UAAqC,GAAG;CAC9D,MAAM,EAAE,MAAM,cAAc;CAE5B,MAAM,uBACJ,kBAEA,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf,CACG,cAAc,QAAQ,YACrB,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aACb,iBAAA,GAAA,kBAAA,KAAC,OAAD;IACE,KAAK,cAAc,QAAQ;IAC3B,KAAK,cAAc,QAAQ,aAAa,EAAE,iBAAiB;IAC3D,OAAO;IACP,QAAQ;IACR,WAAU;IACV,CAAA;GACE,CAAA,EAER,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACZ,mBAAmB,cAAc;IAC9B,CAAA,EACL,cAAc,cAAc,IAC3B,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACZ,cAAc,cAAc;IACzB,CAAA,CAEJ;KACF;;AAGR,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAW,GAAG,YAAY,GAAG;YAAlC,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,WAAD;GACE,MAAK;GACL,aAAA;GACA,OAAO;GACP,eAAe;GACf,WAAU;aAEV,iBAAA,GAAA,kBAAA,MAACC,YAAAA,eAAD;IAAe,OAAO;IAAoB,WAAU;cAApD;KACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;OAAK,WAAU;iBAAmC;OAAY,CAAA,EAC9D,iBAAA,GAAA,kBAAA,KAACC,YAAAA,kBAAD,EAAkB,WAAU,+DAAgE,CAAA,CACxF;;KAEL,CAAC,iBAAiB,YACjB,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA,EACjC,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA,EACjC,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA,CAC7B;SACF;UAEN,CAAC,iBACD,wBACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;MACE,WAAU;MACV,eAAe,iBAAiB,mBAAmB;gBAElD,oBAAoB,qBAAqB;MACtC,CAAA;KAIV,iBAAA,GAAA,kBAAA,KAACC,YAAAA,kBAAD;MAAkB,WAAU;gBAC1B,iBAAA,GAAA,kBAAA,KAAC,OAAD;OAAK,WAAU;iBACZ,YACC,iBAAA,GAAA,kBAAA,KAAA,kBAAA,UAAA,EAAA,UACG,CAAC,GAAG,EAAE,CAAC,KAAK,MACX,iBAAA,GAAA,kBAAA,KAAC,OAAD;QAEE,WAAU;kBAEV,iBAAA,GAAA,kBAAA,MAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;UAAK,WAAU;oBAAf,CACE,iBAAA,GAAA,kBAAA,KAACD,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA,EACjC,iBAAA,GAAA,kBAAA,MAAC,OAAD;WAAK,WAAU;qBAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA,EACjC,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA,CAC7B;aACF;aACN,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,WAAY,CAAA,CAC5B;;QACF,EAbC,YAAY,IAab,CACN,EACD,CAAA,GAEH,kBAAkB,KAAK,eAAe,UACpC,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAEE,WAAWE,YAAAA,GACT,iFACA,EACE,6CACE,kBAAkB,SAAS,MAAM,OACpC,CACF;kBARH,CAUE,iBAAA,GAAA,kBAAA,MAAC,OAAD;SAAK,WAAU;mBAAf,CACG,cAAc,QAAQ,YACrB,iBAAA,GAAA,kBAAA,KAAC,OAAD;UAAK,WAAU;oBACb,iBAAA,GAAA,kBAAA,KAAC,OAAD;WACE,KAAK,cAAc,QAAQ;WAC3B,KACE,cAAc,QAAQ,aACtB,EAAE,iBAAiB;WAErB,OAAO;WACP,QAAQ;WACR,WAAU;WACV,CAAA;UACE,CAAA,EAER,iBAAA,GAAA,kBAAA,MAAC,OAAD;UAAK,WAAU;oBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;WAAK,WAAU;qBACZ,GAAG,cAAc,QAAQ,aAAa,OAAO,QAAQ,cAAc,QAAQ,aAAa;WACrF,CAAA,EACN,iBAAA,GAAA,kBAAA,KAAC,OAAD;WAAK,WAAU;qBACZ,GAAG,EAAE,eAAe,CAAC,GAAG,cAAc,QAAQ,UAAU,GAAG,cAAc,QAAQ;WAC9E,CAAA,CACF;YACF;YACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;SAAK,WAAU;mBAAf,CACG,cAAc,WACb,iBAAA,GAAA,kBAAA,KAAC,KAAD;UAAG,WAAU;oBACV,EAAE,UAAU;UACX,CAAA,EAEL,eACC,iBAAA,GAAA,kBAAA,KAAC,kBAAD;UACE,gBACE,wBAAwB,cAAc;UAExC,aAAa,EAAE,SAAS;UACxB,cAAc,sBAAsB,cAAc;UAClD,WAAW,EAAE,OAAO;UACpB,CAAA,CAEA;WACF;UAlDC,cAAc,GAkDf,CACN;OAEA,CAAA;MACW,CAAA;KACL;;GACN,CAAA,EAEX,iBACC,iBAAA,GAAA,kBAAA,KAAC,UAAD;GACE,WAAU;GACV,SAAS;aAER;GACM,CAAA,CAEP;;;;;AC/LV,SAAwB,wBAAwB,EAC9C,QACA,eACA,gBACA,SACA,UACmD;CACnD,MAAM,EAAE,MAAM,cAAc;AAE5B,KAAI,CAAC,cAAe,QAAO;CAE3B,MAAM,EAAE,YAAY;CACpB,MAAM,YAAY,QAAQ,aAAa;CACvC,MAAM,WAAW,QAAQ,aAAa;CACtC,MAAM,WAAW,QAAQ;CACzB,MAAM,UAAU,QAAQ;AAExB,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;EAAQ,MAAM;EAAQ,eAAe,SAAS,CAAC,QAAQ,SAAS;YAC9D,iBAAA,GAAA,kBAAA,MAACC,YAAAA,eAAD;GAAe,WAAU;aAAzB;IACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,cAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD;KAAa,WAAU;eACpB,EAAE,YAAY;KACH,CAAA,EACD,CAAA;IAEf,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACG,QAAQ,YACP,iBAAA,GAAA,kBAAA,KAAC,OAAD;QAAK,WAAU;kBACb,iBAAA,GAAA,kBAAA,KAAC,OAAD;SACE,KAAK,QAAQ;SACb,KAAK;SACL,OAAO;SACP,QAAQ;SACR,WAAU;SACV,CAAA;QACE,CAAA,EAER,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,QAAD;SAAM,WAAU;mBAAhB;UACG;UAAU;UAAO;UACb;YACN,YAAY,QAAQ,WAAW,QAC9B,iBAAA,GAAA,kBAAA,MAAC,QAAD;SAAM,WAAU;mBAAhB;UACG,EAAE,eAAe;UAAC;UAAE;UAAS;UAAE;UAC3B;WAEL;UACF;UACL,cAAc,WACb,iBAAA,GAAA,kBAAA,KAAC,QAAD;OAAM,WAAU;iBACb,EAAE,UAAU;OACR,CAAA,CAEL;SACF,CAAA,EAEN,iBAAA,GAAA,kBAAA,MAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;OAAI,WAAU;iBACX,EAAE,kBAAkB;OAClB,CAAA,EACJ,UACC,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;OACE,SAAQ;OACR,MAAK;OACL,WAAU;OACV,SAAS;iBAER,EAAE,OAAO;OACH,CAAA,CAEP;SACN,iBAAA,GAAA,kBAAA,KAAC,OAAD;MAAK,WAAU;gBACZ,iBACC,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf;QACG,eAAe,QAAQ,iBAAA,GAAA,kBAAA,KAAC,KAAD,EAAA,UAAI,eAAe,MAAS,CAAA;QACpD,iBAAA,GAAA,kBAAA,KAAC,KAAD,EAAA,UAAI,eAAe,UAAa,CAAA;QAC/B,eAAe,YAAY,iBAAA,GAAA,kBAAA,KAAC,KAAD,EAAA,UAAI,eAAe,UAAa,CAAA;QAC5D,iBAAA,GAAA,kBAAA,MAAC,KAAD,EAAA,UAAA;SACG,eAAe;SAAK;SAAG,eAAe;SAAO;SAC7C,eAAe;SACd,EAAA,CAAA;QACJ,iBAAA,GAAA,kBAAA,KAAC,KAAD,EAAA,UAAI,eAAe,cAAiB,CAAA;QAChC;WAEN,iBAAA,GAAA,kBAAA,KAAC,KAAD;OAAG,WAAU;iBACV,EAAE,qBAAqB;OACtB,CAAA;MAEF,CAAA,CACF,EAAA,CAAA,CACF;;IAEN,iBAAA,GAAA,kBAAA,KAACC,YAAAA,cAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD;KAAa,SAAA;eACX,iBAAA,GAAA,kBAAA,KAACF,YAAAA,QAAD;MACE,WAAU;MACV,SAAS;gBAER,EAAE,QAAQ;MACJ,CAAA;KACG,CAAA,EACD,CAAA;IACD;;EACT,CAAA;;;;AC1Hb,MAAM,8BAA8BG,IAAAA,EAAE,OAAO;CAC3C,iBAAiBA,IAAAA,EAAE,OAAO;EACxB,MAAMA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,mBAAmB;EAC3C,UAAUA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,6BAA6B;EACzD,UAAUA,IAAAA,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;EAC1C,MAAMA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,mBAAmB;EAC3C,OAAOA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,oBAAoB;EAC7C,KAAKA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,uBAAuB;EAC9C,cAAcA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,sBAAsB;EACvD,CAAC;CACF,gBAAgBA,IAAAA,EAAE,SAAS;CAC5B,CAAC;AAsBF,SAAwB,wBAAwB,EAC9C,QACA,eACA,gBACA,SACA,UACA,cACA,OACA,YAAY,EAAE,IACqC;CACnD,MAAM,EAAE,MAAM,cAAc;CAE5B,MAAM,EAAE,SAAS,cAAc,OAAO,cAAA,GAAA,gBAAA,SACD;EAEjC,WAAA,GAAA,wBAAA,aAAsB,4BAAmC;EACzD,eAAe;GACb,iBAAiB;IACf,MAAM;IACN,UAAU;IACV,UAAU;IACV,MAAM;IACN,OAAO;IACP,KAAK;IACL,cAAc;IACf;GACD,gBAAgB;GACjB;EACF,CAAC;CAEJ,MAAM,kBAAA,GAAA,gBAAA,UAA0B;EAC9B;EACA,MAAM;EACP,CAAC;CACF,MAAM,gBAAA,GAAA,gBAAA,UAAwB;EAAE;EAAS,MAAM;EAAkB,CAAC;CAElE,MAAM,EAAE,cAAc,QAAQ,wBAAwB,kBAAkB;CAExE,MAAM,iBAAiB,CAAC,GAAG,UAAU,CAClC,KAAK,aAAa;EACjB,MAAM,QAAQ;EACd,OAAO,QAAQ;EAChB,EAAE,CACF,MAAM,GAAG,MAAM;AACd,MAAI,EAAE,UAAU,eAAgB,QAAO;AACvC,MAAI,EAAE,UAAU,eAAgB,QAAO;AACvC,SAAO,EAAE,KAAK,cAAc,EAAE,KAAK;GACnC;CAEJ,MAAM,qBAAqB,aAAa,KAAK,WAAW;EACtD,MAAM,MAAM;EACZ,OAAO,MAAM;EACd,EAAE;AAEH,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,iBAAiB,OACnB,OAAM;GACJ,iBAAiB;IACf,MAAM,gBAAgB,QAAQ;IAC9B,UAAU,gBAAgB,YAAY;IACtC,UAAU,gBAAgB,YAAY;IACtC,MAAM,gBAAgB,QAAQ;IAC9B,OAAO,gBAAgB,SAAS;IAChC,KAAK,gBAAgB,OAAO;IAC5B,cAAc,gBAAgB,gBAAgB;IAC/C;GACD,gBAAgB,cAAc;GAC/B,CAAC;IAEH;EAAC;EAAe;EAAgB;EAAQ;EAAM,CAAC;CAElD,MAAM,uBAAuB,gBAAwB;AACnD,sBAAoB,YAAY;AAChC,WAAS,gCAAgC,aAAa,EACpD,gBAAgB,MACjB,CAAC;;CAGJ,MAAM,mBAAmB,cAAc,SAAS;AAC9C,WAAS,KAAK;GACd;AAEF,KAAI,CAAC,cAAe,QAAO;CAE3B,MAAM,EAAE,YAAY;CACpB,MAAM,YAAY,QAAQ,aAAa;CACvC,MAAM,WAAW,QAAQ,aAAa;CACtC,MAAM,WAAW,QAAQ;CACzB,MAAM,UAAU,QAAQ;AAExB,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;EAAQ,MAAM;EAAQ,eAAe,SAAS,CAAC,QAAQ,SAAS;YAC9D,iBAAA,GAAA,kBAAA,MAACC,YAAAA,eAAD;GAAe,WAAU;aAAzB;IACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,cAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD;KAAa,WAAU;eACpB,EAAE,YAAY;KACH,CAAA,EACD,CAAA;IAEf,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;MAAK,WAAU;gBACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACG,QAAQ,YACP,iBAAA,GAAA,kBAAA,KAAC,OAAD;QAAK,WAAU;kBACb,iBAAA,GAAA,kBAAA,KAAC,OAAD;SACE,KAAK,QAAQ;SACb,KAAK;SACL,OAAO;SACP,QAAQ;SACR,WAAU;SACV,CAAA;QACE,CAAA,EAER,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,QAAD;SAAM,WAAU;mBAAhB;UACG;UAAU;UAAO;UACb;YACN,YAAY,QAAQ,WAAW,QAC9B,iBAAA,GAAA,kBAAA,MAAC,QAAD;SAAM,WAAU;mBAAhB;UACG,EAAE,eAAe;UAAC;UAAE;UAAS;UAAE;UAC3B;WAEL;UACF;;MACF,CAAA,EAEN,iBAAA,GAAA,kBAAA,MAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBACX,EAAE,kBAAkB;MAClB,CAAA,EACL,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf;OACE,iBAAA,GAAA,kBAAA,KAACC,mBAAD;QACW;QACT,MAAK;QACL,OAAO,EAAE,UAAU;QACnB,SAAS;QACT,aAAa,EAAE,mBAAmB;QAClC,WAAW,QAAQ;AACjB,6BAAoB,IAAI;;QAE1B,CAAA;OACF,iBAAA,GAAA,kBAAA,KAACC,iBAAD;QACW;QACT,MAAK;QACL,OAAO,EAAE,OAAO;QAChB,CAAA;OACF,iBAAA,GAAA,kBAAA,KAACA,iBAAD;QACW;QACT,MAAK;QACL,OAAO,EAAE,iBAAiB;QAC1B,CAAA;OACF,iBAAA,GAAA,kBAAA,KAACA,iBAAD;QACW;QACT,MAAK;QACL,OAAO,EAAE,iBAAiB;QAC1B,CAAA;OACF,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf;SACE,iBAAA,GAAA,kBAAA,KAACA,iBAAD;UACW;UACT,MAAK;UACL,OAAO,EAAE,OAAO;UAChB,oBAAmB;UACnB,CAAA;SACF,iBAAA,GAAA,kBAAA,KAACD,mBAAD;UACW;UACT,MAAK;UACL,OACE,QAAQ,cAAc,EAAE,OAAO,YAAY,GAAG,EAAE,QAAQ;UAE1D,SAAS;UACT,aAAa,EAAE,eAAe;UAC9B,oBAAmB;UACnB,CAAA;SACF,iBAAA,GAAA,kBAAA,KAACC,iBAAD;UACW;UACT,MAAK;UACL,OACE,QAAQ,cAAc,EAAE,OAAO,YAAY,GAAG,EAAE,WAAW;UAE7D,oBAAmB;UACnB,CAAA;SACE;;OACF;QACF,EAAA,CAAA,CACF;;IAEN,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;MACE,MAAK;MACL,IAAG;MACH,SAAS;MACT,gBAAgB,SAAS,kBAAkB,CAAC,aAAa;MACzD,WAAU;MACV,CAAA,EACF,iBAAA,GAAA,kBAAA,KAAC,SAAD;MAAO,SAAQ;MAAiB,WAAU;gBACvC,EAAE,gCAAgC;MAC7B,CAAA,CACJ;;IAEL,SAAS,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAU;eAAwB;KAAY,CAAA;IAE7D,iBAAA,GAAA,kBAAA,MAACC,YAAAA,cAAD;KAAc,WAAU;eAAxB,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;MAAK,WAAU;gBACb,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;OACE,MAAK;OACL,WAAU;OACV,SAAS;OACT,UAAU;iBAET,EAAE,SAAS;OACL,CAAA;MACL,CAAA,EACN,iBAAA,GAAA,kBAAA,KAAC,OAAD;MAAK,WAAU;gBACb,iBAAA,GAAA,kBAAA,KAACA,YAAAA,QAAD;OACE,MAAK;OACL,SAAS;OACT,UAAU;OACV,WAAU;iBAET,eACC,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,2FAA4F,CAAA,GAE3G,EAAE,OAAO;OAEJ,CAAA;MACL,CAAA,CACO;;IACD;;EACT,CAAA;;;;AC7Ob,SAAwB,eAAe,EACrC,gBACA,YAAY,OACZ,uBACA,0BAA0B,OAC1B,uBACA,0BAA0B,OAC1B,mBACA,WACA,0BACmC;CACnC,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,UAAsB,MAAM;CAC3C,MAAM,CAAC,kBAAkB,wBAAA,GAAA,MAAA,UAAgC,MAAM;CAC/D,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,UACtB,KAAA,EACD;CACD,MAAM,CAAC,oBAAoB,0BAAA,GAAA,MAAA,UAEzB,KAAA,EAAU;CACZ,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,UAA0B,MAAM;CACnD,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,UAA0B,MAAM;CACnD,MAAM,CAAC,uBAAuB,6BAAA,GAAA,MAAA,UACoB,KAAK;CACvD,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,UAA6C,KAAA,EAAU;CAEzE,MAAM,EAAE,MAAM,cAAc;CAE5B,MAAM,uBACJ,eAAe,MAAM,WAAW,OAAO,QAAQ,IAAI;CAErD,MAAM,mBAAmB,OAAO,WAA0B;AACxD,MAAI,CAAC,OAAQ;AACb,MAAI;AACF,SAAM,sBAAsB,OAAO;AACnC,yBAAsB,KAAA,EAAU;AAChC,sBAAmB,KAAA,EAAU;AAC7B,uBAAoB,MAAM;UACpB;AACN,sBAAmB,qDAAqD;;;CAI5E,MAAM,6BACJ,kBACG;AACH,wBAAsB,cAAc;AACpC,8BAA4B;AAC1B,uBAAoB,KAAK;IACzB;;CAGJ,MAAM,2BACJ,kBACG;AACH,2BAAyB,cAAc;AACvC,8BAA4B;AAC1B,iBAAc,KAAK;IACnB;;CAGJ,MAAM,8BAA8B;AAClC,gBAAc,MAAM;AACpB,2BAAyB,KAAK;;CAGhC,MAAM,+BAA+B;AACnC,gBAAc,MAAM;AACpB,eAAa,KAAA,EAAU;AACvB,8BAA4B;AAC1B,iBAAc,KAAK;IACnB;;CAGJ,MAAM,8BAA8B;AAClC,gBAAc,MAAM;AACpB,2BAAyB,KAAK;AAC9B,eAAa,KAAA,EAAU;;CAGzB,MAAM,mBAAmB,OAAO,SAAoC;AAClE,MAAI,CAAC,sBAAuB;AAC5B,MAAI;AACF,SAAM,sBAAsB,sBAAsB,IAAI,KAAK;AAC3D,0BAAuB;AACvB,eAAA,WAAW;IACT,OAAO,EAAE,iCAAiC;IAC1C,MAAM;IACP,CAAC;WACK,OAAO;AACd,WAAQ,MAAM,kCAAkC,MAAM;AACtD,eAAA,WAAW;IACT,OAAO,EAAE,uCAAuC;IAChD,MAAM;IACN,aAAa,eAAe,MAAM;IACnC,CAAC;AACF,OAAI,iBAAiB,MACnB,cAAa,MAAM,QAAQ;OAE3B,cAAa,kDAAkD;;;CAKrE,MAAM,yBAAyB;AAC7B,YAAU,KAAK;;CAGjB,MAAM,0BAA0B;AAC9B,YAAU,MAAM;;CAGlB,MAAM,yBAAyB,wBAC1B,oBAAoB,sBAAsB,IAAI,OAC/C;AAEJ,QACE,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,KAAC,uBAAD;GACE,OAAO,EAAE,kBAAkB;GAC3B,sBAAsB;GACtB,mBAAmB;GACnB,yBAAyB;GACzB,qBAAqB;GACrB,uBAAuB;GACvB,uBAAuB,KAAK,EAAE,qBAAqB;GACxC;GACX,CAAA;EAED,yBAAyB;GACxB;GACA,SAAS;GACV,CAAC;EAEF,iBAAA,GAAA,kBAAA,KAAC,qBAAD;GACE,OAAO,EAAE,qBAAqB;GAC9B,aAAa,EAAE,6BAA6B;GAC5C,YAAY,EAAE,SAAS;GACvB,gBAAgB,iBAAiB,oBAAoB,MAAM,KAAK;GAChE,YAAY;GACZ,eAAe;GACf,UAAU;GACV,WAAW;GACX,CAAA;EAEF,iBAAA,GAAA,kBAAA,KAAC,yBAAD;GACE,QAAQ;GACR,eAAe;GACf,gBAAgB;GAChB,SAAS;GACT,QAAQ;GACR,CAAA;EAEF,iBAAA,GAAA,kBAAA,KAAC,yBAAD;GACE,QAAQ;GACR,eAAe;GACf,gBAAgB;GAChB,SAAS;GACT,UAAU;GACV,cAAc;GACd,OAAO;GACI;GACX,CAAA;EACD,EAAA,CAAA;;;;AC1JP,SAAwB,QAAQ,EAC9B,iBACA,WACA,kBACA,oBACA,uBAAuB,OACvB,cACA,uBACA,WACA,oBACA,iBACA,mBACA,qBACA,gBACA,yBACA,uBACA,yBACA,uBACA,yBACA,mBACA,WACA,0BAC4B;AAC5B,QACE,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,KAAC,cAAD;GACmB;GACN;GACO;GAClB,YAAY;GACZ,CAAA;EACD,wBACC,iBAAA,GAAA,kBAAA,KAAC,sBAAD;GACE,cAAc,gBAAgB,EAAE;GAChC,WAAW;GACX,CAAA;EAEJ,iBAAA,GAAA,kBAAA,KAAC,WAAD;GACa;GACX,WAAW;GACM;GACE;GACE;GACrB,CAAA;EACF,iBAAA,GAAA,kBAAA,KAAC,gBAAD;GACkB;GAChB,WAAW;GACY;GACE;GACF;GACE;GACN;GACR;GACa;GACxB,CAAA;EACD,EAAA,CAAA;;;;ACrFP,SAAgB,cAGd,EACA,SACA,MACA,aACA,oBACA,MACA,UACA,aAC0C;CAC1C,MAAM,EACJ,OACA,YAAY,EAAE,aAAA,GAAA,gBAAA,eACE;EAAE;EAAM;EAAS,CAAC;AAEpC,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAWC,YAAAA,GAAG,aAAa,mBAAmB;YAAnD,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,OAAD;GACE,GAAI;GACJ,OAAO,MAAM,SAAS;GACtB,IAAI;GACE;GACI;GACC;GACE;GACb,gBAAc,CAAC,CAAC;GAChB,CAAA,EACD,OAAO,WACN,iBAAA,GAAA,kBAAA,KAAC,KAAD;GAAG,WAAU;aAAwB,MAAM;GAAY,CAAA,CAErD;;;;;ACxBV,SAAgB,gBAGd,EACA,SACA,MACA,cAAc,UACd,SACA,oBACA,YAC4C;AAC5C,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAWC,YAAAA,GAAG,aAAa,mBAAmB;YACjD,iBAAA,GAAA,kBAAA,KAACC,gBAAAA,YAAD;GACW;GACH;GACN,SAAS,EAAE,OAAO,EAAE,UAAU,SAAS,YAAY,EAAE,cACnD,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,MAACC,YAAAA,QAAD;IACE,OAAO,OAAO,UAAU,IAAI;IAC5B,eAAe;IACL;cAHZ,CAKE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,eAAD;KACE,gBAAc,CAAC,CAAC;KAChB,WAAWH,YAAAA,GACT,UACA,SAAS,qCACV;eAED,iBAAA,GAAA,kBAAA,KAACI,YAAAA,aAAD,EAA0B,aAAe,CAAA;KAC3B,CAAA,EAChB,iBAAA,GAAA,kBAAA,KAACC,YAAAA,eAAD,EAAA,UACG,WAAW,QAAQ,SAAS,IAC3B,QAAQ,KAAK,QACX,iBAAA,GAAA,kBAAA,KAACC,YAAAA,YAAD;KAEE,OAAO,IAAI,MAAM,UAAU;eAE1B,IAAI;KACM,EAJN,IAAI,MAAM,UAAU,CAId,CACb,GAEF,iBAAA,GAAA,kBAAA,KAACA,YAAAA,YAAD;KAAY,OAAM;KAAU,UAAA;eAAS;KAExB,CAAA,EAED,CAAA,CACT;OACR,OAAO,WACN,iBAAA,GAAA,kBAAA,KAAC,KAAD;IAAG,WAAU;cAAwB,MAAM;IAAY,CAAA,CAExD,EAAA,CAAA;GAEL,CAAA;EACE,CAAA;;;;AC7DV,MAAM,oBAAoBC,IAAAA,EAAE,OAAO;CACjC,YAAYA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,yBAAyB;CACvD,WAAWA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,wBAAwB;CACrD,UAAUA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,6BAA6B;CACzD,UAAUA,IAAAA,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CAC1C,MAAMA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,mBAAmB;CAC3C,OAAOA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,oBAAoB;CAC7C,aAAaA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,0BAA0B;CACzD,cAAcA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,sBAAsB;CACtD,SAASA,IAAAA,EAAE,SAAS;CACrB,CAAC;AA6BF,SAAwB,kBAAkB,EACxC,QACA,SACA,iBACA,UACA,cACA,YAAY,EAAE,EACd,OACA,2BACA,KACsC;CACtC,MAAM,EAAE,SAAS,cAAc,OAAO,cAAA,GAAA,gBAAA,SAAsC;EAE1E,WAAA,GAAA,wBAAA,aAAsB,kBAAyB;EAC/C,eAAe;GACb,YAAY;GACZ,WAAW;GACX,UAAU;GACV,UAAU;GACV,MAAM;GACN,OAAO;GACP,aAAa;GACb,cAAc;GACd,SAAS;GACV;EACF,CAAC;CAEF,MAAM,uBAAA,GAAA,gBAAA,UAA+B;EAAE;EAAS,MAAM;EAAgB,CAAC;CACvE,MAAM,aAAA,GAAA,gBAAA,UAAqB;EAAE;EAAS,MAAM;EAAW,CAAC;CAExD,MAAM,EAAE,cAAc,QAAQ,wBAAwB,kBAAkB;CAExE,MAAM,uBAAuB,CAAC,GAAG,UAAU,CACxC,KAAK,aAAa;EACjB,MAAM,QAAQ;EACd,OAAO,QAAQ;EAChB,EAAE,CACF,MAAM,GAAG,MAAM;AACd,MAAI,EAAE,UAAU,oBAAqB,QAAO;AAC5C,MAAI,EAAE,UAAU,oBAAqB,QAAO;AAC5C,SAAO,EAAE,KAAK,cAAc,EAAE,KAAK;GACnC;CAEJ,MAAM,qBAAqB,aAAa,KAAK,WAAW;EACtD,MAAM,MAAM;EACZ,OAAO,MAAM;EACd,EAAE;AAEH,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,OACF,KAAI,iBAAiB;GACnB,MAAM,aAAa,gBAAgB,QAAQ,IAAI,MAAM,IAAI;AAGzD,SAAM;IACJ,YAHgB,UAAU,MAAM;IAIhC,WAHe,UAAU,MAAM,EAAE,CAAC,KAAK,IAAI;IAI3C,UAAU,gBAAgB;IAC1B,UAAU,gBAAgB,YAAY;IACtC,MAAM,gBAAgB;IACtB,OAAO,gBAAgB;IACvB,aAAa,gBAAgB;IAC7B,cAAc,gBAAgB,gBAAgB;IAC9C,SAAS,gBAAgB;IAC1B,CAAC;AACF,uBAAoB,gBAAgB,gBAAgB,KAAK;SACpD;AACL,SAAM;IACJ,YAAY;IACZ,WAAW;IACX,UAAU;IACV,UAAU;IACV,MAAM;IACN,OAAO;IACP,aAAa;IACb,cAAc;IACd,SAAS;IACV,CAAC;AACF,uBAAoB,KAAK;;IAG5B;EAAC;EAAiB;EAAQ;EAAO;EAAoB,CAAC;AAEzD,EAAA,GAAA,MAAA,iBAAgB;AACd,sBAAoB,oBAAoB;IACvC,CAAC,qBAAqB,oBAAoB,CAAC;CAE9C,MAAM,mBAAmB,cAAc,SAAS;AAC9C,WAAS,EACP,SAAS;GACP,YAAY,KAAK;GACjB,WAAW,KAAK;GAChB,UAAU,KAAK;GACf,UAAU,KAAK,YAAY;GAC3B,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,cAAc,KAAK;GACnB,SAAS,KAAK;GACf,EACF,CAAC;GACF;AAIF,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;EAAQ,MAAM;EAAQ,eAAe,SAAS,CAAC,QAAQ,SAAS;YAC9D,iBAAA,GAAA,kBAAA,MAACC,YAAAA,eAAD;GAAe,WAAU;aAAzB;IACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,cAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD;KAAa,WAAU;eANZ,oBAAoB,OAOf,EAAE,eAAe,GAAG,EAAE,iBAAiB;KACzC,CAAA,EACD,CAAA;IAEf,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf;MACE,iBAAA,GAAA,kBAAA,KAAC,iBAAD;OACW;OACT,MAAK;OACL,aAAa,EAAE,UAAU;OACzB,SAAS;OACT,UAAU;OACV,CAAA;MACF,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,eAAD;QACW;QACT,MAAK;QACL,aAAa,EAAE,aAAa;QAC5B,oBAAmB;QACnB,UAAU;QACV,CAAA,EACF,iBAAA,GAAA,kBAAA,KAAC,eAAD;QACW;QACT,MAAK;QACL,aAAa,EAAE,YAAY;QAC3B,oBAAmB;QACnB,UAAU;QACV,CAAA,CACE;;MACL,4BACC,0BAA0B;OACxB;OACA;OACA,aAAa;OACd,CAAC,GAEF,iBAAA,GAAA,kBAAA,KAAC,eAAD;OACW;OACT,MAAK;OACL,aAAa,EAAE,iBAAiB;OAChC,UAAU;OACV,CAAA;MAEJ,iBAAA,GAAA,kBAAA,KAAC,eAAD;OACW;OACT,MAAK;OACL,aAAa,EAAE,iBAAiB;OAChC,UAAU;OACV,CAAA;MACF,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf;QACE,iBAAA,GAAA,kBAAA,KAAC,eAAD;SACW;SACT,MAAK;SACL,aAAa,EAAE,OAAO;SACtB,oBAAmB;SACnB,UAAU;SACV,CAAA;QACF,iBAAA,GAAA,kBAAA,KAAC,iBAAD;SACW;SACT,MAAK;SACL,aACE,QAAQ,cAAc,EAAE,OAAO,YAAY,GAAG,EAAE,eAAe;SAEjE,SAAS;SACT,oBAAmB;SACnB,UAAU;SACV,CAAA;QACF,iBAAA,GAAA,kBAAA,KAAC,eAAD;SACW;SACT,MAAK;SACL,aACE,QAAQ,cAAc,EAAE,OAAO,YAAY,GAAG,EAAE,WAAW;SAE7D,oBAAmB;SACnB,UAAU;SACV,CAAA;QACE;;MACF;;IAEN,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;OACE,MAAK;OACL,IAAG;OACH,SAAS;OACT,gBAAgB,SAAS,WAAW,CAAC,UAAU;OAC/C,UAAU;OACV,WAAU;OACV,CAAA,EACF,iBAAA,GAAA,kBAAA,KAAC,SAAD;OAAO,SAAQ;OAAyB,WAAU;iBAC/C,EAAE,yBAAyB;OACtB,CAAA,CACJ;SAEN,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAU;gBAET,eACC,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,2FAA4F,CAAA,GAE3G,EAAE,eAAe;MAEZ,CAAA,CACL;;IAEL,SAAS,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAU;eAA6B;KAAY,CAAA;IACpD;;EACT,CAAA;;;;ACnPb,MAAM,sBAAgD;AACpD,KAAI,OAAO,WAAW,YACpB,QACG,OAAyD,cAC1D;AAGJ,QAAO;;AAGT,MAAM,sBAAoC;CACxC,aAAa;EAAE,WAAW;EAAO,SAAS;EAAO,SAAS;EAAM;CAChE,UAAU;EAAE,WAAW;EAAO,SAAS;EAAO,SAAS;EAAM;CAC7D,UAAU;EAAE,WAAW;EAAO,SAAS;EAAO,SAAS;EAAM;CAC7D,aAAa;EAAE,WAAW;EAAO,SAAS;EAAO,SAAS;EAAM;CACjE;AAED,SAAgB,gBAAgB;CAC9B,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAA2B,MAAM;CACrD,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,UAAyB,MAAM;CACjD,MAAM,CAAC,gBAAgB,sBAAA,GAAA,MAAA,UAA8B,MAAM;CAE3D,MAAM,CAAC,eAAe,qBAAA,GAAA,MAAA,UACG,oBAAoB;CAE7C,MAAM,WAAA,GAAA,MAAA,QAAwC,KAAK;CACnD,MAAM,gBAAA,GAAA,MAAA,QAEJ,KAAK;CACP,MAAM,cAAA,GAAA,MAAA,QAAsD,KAAK;AAGjE,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,OAAO,WAAW,YAAa;AAGnC,MADmB,eAAe,EAClB;GACd,MAAM,YAAY,OAAO,iBAAiB;AACxC,sBAAkB,KAAK;MACtB,EAAE;AACL,gBAAa,OAAO,aAAa,UAAU;;AAG7C,MAAI,eAAgB;EAEpB,MAAM,SAAS,SAAS,cAAc,SAAS;AAC/C,SAAO,MACL;AACF,SAAO,QAAQ;AACf,SAAO,eAAe,kBAAkB,KAAK;AAC7C,SAAO,gBAAgB,WAAW,UAAU,8BAA8B;AAC1E,WAAS,KAAK,YAAY,OAAO;IAChC,CAAC,eAAe,CAAC;CAEpB,MAAM,oBAAA,GAAA,MAAA,cACH,UAAkD;AACjD,MAAI,CAAC,MAAO;AAEZ,oBAAkB,SAAS;GACzB,MAAM,WAAyB,EAAE,GAAG,MAAM;GAC1C,IAAI,aAAa;AAEjB,UAAO,KAAK,MAAM,CAAC,SAAS,QAAQ;IAClC,MAAM,QAAQ,MAAM;AACpB,QAAI,CAAC,MAAO;IAEZ,MAAM,OAAsB;KAC1B,WAAW,CAAC,CAAC,MAAM;KACnB,SAAS,CAAC,CAAC,MAAM;KACjB,SAAS,CAAC,CAAC,MAAM;KAClB;AAED,QACE,CAAC,SAAS,QACV,KAAK,UAAU,SAAS,KAAK,KAAK,KAAK,UAAU,KAAK,EACtD;AACA,cAAS,OAAO;AAChB,kBAAa;;KAEf;AAEF,UAAO,aAAa,WAAW;IAC/B;IAEJ,EAAE,CACH;CAED,MAAM,YAAA,GAAA,MAAA,mBAA6B;AACjC,MAAI,QAAQ,SAAS;AACnB,OAAI;AACF,YAAQ,QAAQ,SAAS;YAClB,GAAG;AACV,YAAQ,KAAK,qBAAqB,EAAE;;AAEtC,WAAQ,UAAU;;AAGpB,iBAAe,MAAM;AACrB,mBAAiB,EAAE,GAAG,qBAAqB,CAAC;IAC3C,EAAE,CAAC;CAEN,MAAM,kBAAA,GAAA,MAAA,aACJ,OAAO,gBAAwC;AAC7C,MAAI,CAAC,eAAgB;EAErB,MAAM,aAAa,eAAe;AAClC,MAAI,CAAC,YAAY;AACf,cAAW,UAAU,4BAA4B;AACjD;;AAGF,MAAI;AACF,gBAAa,KAAK;GAElB,MAAM,iBACJ,YAAY,MAAM,gBAAgB,YAAY,YAAY;GAE5D,MAAM,OAAO,WAAW,OACtB,YAAY,MAAM,UAClB,iBACC,UAAU,iBAAiB,MAAM,CACnC;AAED,OAAI,YAAY,MAAM,SACpB,MAAK,WAAW,YAAY,MAAM,SAAS;AAG7C,WAAQ,UAAU;GAGlB,IAAI,UAAU;GACd,MAAM,aAAa;GACnB,MAAM,aAAa;GAEnB,MAAM,aAAa,YAA8B;AAW/C,QAViB;KACf;KACA;KACA;KACA;KACD,CAAC,OAAO,OAAO;KACd,MAAM,KAAK,SAAS,eAAe,GAAG;AACtC,YAAO,MAAM,GAAG;MAChB,CAEY,QAAO;AACrB,QAAI,WAAW,WAAY,QAAO;AAElC;AACA,UAAM,IAAI,SAAS,YAAY,WAAW,SAAS,WAAW,CAAC;AAC/D,WAAO,YAAY;;AAIrB,OAAI,CADa,MAAM,YAAY,CAEjC,OAAM,IAAI,MAAM,kCAAkC;GAGpD,MAAM,MAAM;IACV,UAAU;IACV,YACE;IACF,OAAO;IACP,YAAY;IACZ,eAAe;IACf,aAAa;IACb,cAAc;IACd,WAAW;IACX,YAAY;IACZ,QAAQ;IACR,OAAO;IACP,kBAAkB;KAAE,OAAO;KAAW,SAAS;KAAG;IAClD,WAAW,EAAE,SAAS,QAAQ;IAC/B;AAED,QAAK,MAAM,oBAAoB;IAC7B,MAAM;IACN,MAAM;IACN,aAAa;IACb,cAAc;IACd,KAAK;KAAE,GAAG;KAAK,cAAc;KAAQ;IACrC,cAAc;IACd,aAAa,CAAC,YAAY,kBAAkB;IAC7C,CAAC;AAEF,QAAK,MAAM,wBAAwB;IACjC,MAAM;IACN,MAAM;IACN,YAAY;IACZ,aAAa;IACb;IACA,cAAc;IACd,aAAa,CAAC,YAAY,0BAA0B;IACrD,CAAC;AAEF,QAAK,MAAM,YAAY;IACrB,MAAM;IACN,MAAM;IACN,aAAa;IACb;IACA,cAAc;IACd,aAAa,CAAC,YAAY,wBAAwB;IACnD,CAAC;AAEF,QAAK,MAAM,oBAAoB;IAC7B,MAAM;IACN,MAAM;IACN,aAAa;IACb;IACA,cAAc;IACd,aAAa,CAAC,WAAW;IAC1B,CAAC;AAEF,kBAAe,KAAK;WACb,OAAO;AACd,WAAQ,MAAM,6BAA6B,MAAM;AACjD,cAAW,UAAU,oCAAoC;YACjD;AACR,gBAAa,MAAM;;IAGvB,CAAC,gBAAgB,iBAAiB,CACnC;CAED,MAAM,cAAA,GAAA,MAAA,mBAA+B;AACnC,MAAI,CAAC,QAAQ,SAAS;AACpB,cAAW,UAAU,uBAAuB;AAC5C;;AAGF,UAAQ,QAAQ,OACd,SACA,EAAE,GACD,QAAgB,aAAgD;AAC/D,OAAI,UAAU,OAAO,SAAS,IAC5B,cAAa,UAAU,SAAS;OAEhC,YAAW,UAAU,iBAAiB;MAGzC,WAAqC;GACpC,MAAM,YAAY,OAAO,OAAO,OAAO,CACpC,MAAM,CACN,QACE,QACC,OAAO,QAAQ,YACf,IAAI,MAAM,CAAC,SAAS,KACpB,QAAQ,WACX;GAEH,MAAM,eAAe,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC;GAEnD,IAAI,WAAW;AACf,OAAI,aAAa,SAAS,EACxB,YAAW,aAAa,KAAK,KAAK;YAEhB,OAAO,OAAO,OAAO,CAAC,MAAM,CAChC,SAAS,EACrB,YAAW;AAIf,cAAW,UAAU,SAAS;IAEjC;IACA,EAAE,CAAC;AAGN,EAAA,GAAA,MAAA,iBAAgB;AACd,eAAa;AACX,OAAI,QAAQ,SAAS;AACnB,QAAI;AACF,aAAQ,QAAQ,SAAS;aAClB,GAAG;AACV,aAAQ,KAAK,qBAAqB,EAAE;;AAEtC,YAAQ,UAAU;;;IAGrB,EAAE,CAAC;AAEN,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;;;;ACrSH,MAAM,uBAAuBC,IAAAA,EAAE,OAAO;CACpC,MAAMA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,mBAAmB;CAC3C,UAAUA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,6BAA6B;CACzD,UAAUA,IAAAA,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU;CAC1C,MAAMA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,mBAAmB;CAC3C,OAAOA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,oBAAoB;CAC7C,KAAKA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,uBAAuB;CAC9C,cAAcA,IAAAA,EAAE,QAAQ,CAAC,IAAI,GAAG,sBAAsB;CACtD,gBAAgBA,IAAAA,EAAE,SAAS;CAC5B,CAAC;AA8BF,SAAS,gBAAgB,EACvB,IACA,YACA,aAKC;CACD,MAAM,YACJ,YAAY,YAAY,SACxB,CAAC,YAAY,aACb,CAAC,YAAY;CAEf,MAAM,YAAY,YAAY;AAE9B,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAU;YACb,iBAAA,GAAA,kBAAA,KAAC,OAAD;GACM;GACJ,WAAWC,YAAAA,GACT,4IACA,2DACA,aAAa,wCACb,aAAa,sCACb,UACD;GACD,CAAA;EACE,CAAA;;AAIV,SAAS,YAAY,EACnB,WACA,aACA,eACA,cACA,KAOC;AAGD,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;EAAY,cAAW;YAAtC;GACE,iBAAA,GAAA,kBAAA,KAAC,iBAAD;IACE,IAAG;IACH,YAAY,cAAc;IAC1B,CAAA;GAEF,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAU;eACb,iBAAA,GAAA,kBAAA,KAAC,iBAAD;MACE,IAAG;MACH,YAAY,cAAc;MAC1B,CAAA;KACE,CAAA,EACN,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAU;eACb,iBAAA,GAAA,kBAAA,KAAC,iBAAD;MACE,IAAG;MACH,YAAY,cAAc;MAC1B,CAAA;KACE,CAAA,CACF;;GAEN,iBAAA,GAAA,kBAAA,KAAC,iBAAD;IACE,IAAG;IACH,YAAY,cAAc;IAC1B,CAAA;GAED,gBAAgB,aAAa,MAAM,CAAC,SAAS,KAC5C,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACZ;IACG,CAAA;GAEJ;;;AAIV,SAAwB,qBAAqB,EAC3C,QACA,SACA,UACA,cACA,YAAY,EAAE,EACd,OACA,KACA,QACA,2BACA,KACyC;CACzC,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,UAA6C,KAAA,EAAU;CACzE,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,UAA+B,MAAM;CAE7D,MAAM,EACJ,aACA,WAAW,cACX,gBACA,gBACA,YACA,eACA,UACA,cACA,eACE,eAAe;CAEnB,MAAM,EAAE,SAAS,cAAc,OAAO,cAAA,GAAA,gBAAA,SACJ;EAE9B,WAAA,GAAA,wBAAA,aAAsB,qBAA4B;EAClD,eAAe;GACb,MAAM;GACN,UAAU;GACV,UAAU;GACV,MAAM;GACN,OAAO;GACP,KAAK;GACL,cAAc;GACd,gBAAgB;GACjB;EACF,CAAC;CAEJ,MAAM,kBAAA,GAAA,gBAAA,UAA0B;EAAE;EAAS,MAAM;EAAgB,CAAC;CAClE,MAAM,gBAAA,GAAA,gBAAA,UAAwB;EAAE;EAAS,MAAM;EAAkB,CAAC;CAElE,MAAM,EAAE,cAAc,QAAQ,wBAAwB,kBAAkB;CAExE,MAAM,uBAAuB,CAAC,GAAG,UAAU,CACxC,KAAK,aAAa;EACjB,MAAM,QAAQ;EACd,OAAO,QAAQ;EAChB,EAAE,CACF,MAAM,GAAG,MAAM;AACd,MAAI,EAAE,UAAU,eAAgB,QAAO;AACvC,MAAI,EAAE,UAAU,eAAgB,QAAO;AACvC,SAAO,EAAE,KAAK,cAAc,EAAE,KAAK;GACnC;CAEJ,MAAM,qBAAqB,aAAa,KAAK,WAAW;EACtD,MAAM,MAAM;EACZ,OAAO,MAAM;EACd,EAAE;AAEH,EAAA,GAAA,MAAA,iBAAgB;AACd,sBAAoB,eAAe;IAClC,CAAC,gBAAgB,oBAAoB,CAAC;AAGzC,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAK;EAExC,IAAI,YAAY;EAEhB,MAAM,OAAO,YAAY;AACvB,OAAI;IACF,MAAM,cACJ,MAAMC,uCAAgD,QAAQ,IAAI;AACpE,QAAI,CAAC,UACH,OAAM,eAAe,YAAY;YAE5B,KAAK;AACZ,YAAQ,MAAM,sCAAsC,IAAI;AACxD,QAAI,CAAC,UACH,cAAa,oCAAoC;;;AAKvD,QAAM;AAEN,eAAa;AACX,eAAY;;IAEb;EAAC;EAAQ;EAAgB;EAAK;EAAQ;EAAe,CAAC;CAGzD,MAAM,oBAAA,GAAA,MAAA,cACH,aAAgD;EAC/C,MAAM,WAAW,UAAU;AAC3B,MAAI,CAAC,UAAU;AACb,gBAAa,4CAA4C;AACzD,sBAAmB,MAAM;AACzB;;EAIF,MAAM,CAAC,UAAU,gBADA,SAAS,QAAQ,QAAQ,GAAG,CACH,MAAM,IAAI;AAEpD,MAAI,CAAC,YAAY,CAAC,cAAc;AAC9B,gBAAa,iCAAiC;AAC9C,sBAAmB,MAAM;AACzB;;EAGF,MAAM,UACJ,aAAa,WAAW,IAAI,KAAK,iBAAiB;EAEpD,MAAM,iBAAiB,UAAU,aAAa,MAAM;AACpD,MAAI,CAAC,gBAAgB;AACnB,gBAAa,8BAA8B;AAC3C,sBAAmB,MAAM;AACzB;;AAIF,gBAAc,aAAa;AAwBzB,YAvBmD;IACjD,MAAM;IACN,cAAc,SAAS;IACvB,wBAAwB,SAAS;IACjC,gBAAgB;KACd,OAAO,SAAS;KAChB,WAAW,SAAS;KACpB,WAAW;KACX,UAAU;KACV,aAAa;KACb,aAAa,SAAS;KACvB;IACD,iBAAiB;KACf,MAAM,SAAS;KACf,UAAU,SAAS;KACnB,UAAU,SAAS,YAAY,KAAA;KAC/B,MAAM,SAAS;KACf,OAAO,SAAS;KAChB,KAAK,SAAS;KACd,cAAc,SAAS;KACxB;IACF,CAEuB;AACxB,sBAAmB,MAAM;IACzB,EAAE;IAEN,CAAC,cAAc,SAAS,CACzB;CAED,MAAM,kBAAA,GAAA,MAAA,cAA8B,QAAgB;AAClD,eAAa,IAAI;AACjB,qBAAmB,MAAM;IACxB,EAAE,CAAC;AAEN,EAAA,GAAA,MAAA,iBAAgB;AACd,eAAa,UAAU;AACvB,aAAW,UAAU;IACpB;EAAC;EAAkB;EAAgB;EAAc;EAAW,CAAC;CAEhE,MAAM,oBAAoB;AACxB,YAAU;AACV,SAAO;AACP,eAAa,KAAA,EAAU;AACvB,qBAAmB,MAAM;AACzB,WAAS;;CAGX,MAAM,mBAAmB,mBAAmB;AAC1C,qBAAmB,KAAK;AACxB,eAAa,KAAA,EAAU;AACvB,cAAY;GACZ;CAEF,MAAM,SAAS,gBAAgB;AAE/B,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;EAAQ,MAAM;EAAQ,eAAe,SAAS,CAAC,QAAQ,aAAa;YAClE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,eAAD;GAAe,WAAU;aACvB,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf;MACI,gBAAgB,CAAC,gBACjB,iBAAA,GAAA,kBAAA,KAAC,OAAD;MAAK,WAAU;gBACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,mGAAoG,CAAA,EACnH,iBAAA,GAAA,kBAAA,KAAC,KAAD;QAAG,WAAU;kBACV,EAAE,WAAW;QACZ,CAAA,CACA;;MACF,CAAA;KAER,iBAAA,GAAA,kBAAA,KAACC,YAAAA,cAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD;MAAa,WAAU;gBACpB,EAAE,kBAAkB;MACT,CAAA,EACD,CAAA;KAEf,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,aAAD;OACE,WAAW;OACE;OACE;OACf,cAAc,aAAa;OACxB;OACH,CAAA,EAEF,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf;QACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBACX,EAAE,kBAAkB;SAClB,CAAA;QACL,iBAAA,GAAA,kBAAA,KAAC,iBAAD;SACW;SACT,MAAK;SACL,aAAa,EAAE,UAAU;SACzB,SAAS;SACT,UAAU;SACV,CAAA;QACF,iBAAA,GAAA,kBAAA,KAAC,eAAD;SACW;SACT,MAAK;SACL,aAAa,EAAE,OAAO;SACtB,UAAU;SACV,CAAA;QACD,4BACC,0BAA0B;SACxB;SACA;SACA,aAAa;SACd,CAAC,GAEF,iBAAA,GAAA,kBAAA,KAAC,eAAD;SACW;SACT,MAAK;SACL,aAAa,EAAE,iBAAiB;SAChC,UAAU;SACV,CAAA;QAEJ,iBAAA,GAAA,kBAAA,KAAC,eAAD;SACW;SACT,MAAK;SACL,aAAa,EAAE,iBAAiB;SAChC,UAAU;SACV,CAAA;QACF,iBAAA,GAAA,kBAAA,MAAC,OAAD;SAAK,WAAU;mBAAf;UACE,iBAAA,GAAA,kBAAA,KAAC,eAAD;WACW;WACT,MAAK;WACL,aAAa,EAAE,OAAO;WACtB,oBAAmB;WACnB,UAAU;WACV,CAAA;UACF,iBAAA,GAAA,kBAAA,KAAC,iBAAD;WACW;WACT,MAAK;WACL,aACE,QAAQ,cACJ,EAAE,OAAO,YAAY,GACrB,EAAE,eAAe;WAEvB,SAAS;WACT,oBAAmB;WACnB,UAAU;WACV,CAAA;UACF,iBAAA,GAAA,kBAAA,KAAC,eAAD;WACW;WACT,MAAK;WACL,aACE,QAAQ,cAAc,EAAE,OAAO,YAAY,GAAG,EAAE,WAAW;WAE7D,oBAAmB;WACnB,UAAU;WACV,CAAA;UACE;;QACF;SACF;;KAEN,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;QACE,MAAK;QACL,IAAG;QACH,SAAS;QACT,gBAAgB,SAAS,kBAAkB,CAAC,aAAa;QACzD,UAAU;QACV,WAAU;QACV,CAAA,EACF,iBAAA,GAAA,kBAAA,KAAC,SAAD;QAAO,SAAQ;QAAoB,WAAU;kBAC1C,EAAE,gCAAgC;QAC7B,CAAA,CACJ;UAEN,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;OACE,MAAK;OACL,SAAS;OACT,UAAU;OACV,WAAU;iBAET,SACC,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,2FAA4F,CAAA,GAE3G,EAAE,YAAY;OAET,CAAA,CACL;;KACF;;GACQ,CAAA;EACT,CAAA;;;;ACnbb,MAAMC,iBAAuC;CAC3C,cAAc;CACd,YAAY;CACZ,WAAW;CACX,cAAc;CACd,UAAU;CACV,wBAAwB;CACxB,uBAAuB;CACvB,sBAAsB;CACtB,QAAQ;CACR,cAAc;CACd,kBAAkB;CAClB,gBAAgB;CAChB,kBAAkB;CAClB,gBAAgB;CAChB,iBAAiB;CACjB,aAAa;CACb,yBAAyB;CACzB,oBAAoB;CACpB,gBAAgB;CAChB,gBAAgB;CAChB,wBACE;CACF,QAAQ;CACR,aAAa;CACb,cAAc;CACd,wBAAwB;CACxB,cAAc;CACd,aAAa;CACb,iBAAiB;CACjB,KAAK;CACL,iBAAiB;CACjB,iBAAiB;CACjB,WAAW;CACX,UAAU;CACV,iBAAiB;CACjB,oBAAoB;CACpB,oBAAoB;CACpB,4BACE;CACF,WAAW;CACX,iBAAiB;CACjB,SAAS;CACT,MAAM;CACN,gBAAgB;CAChB,gBAAgB;CAChB,MAAM;CACN,OAAO;CACP,UAAU;CACV,UAAU;CACV,aAAa;CACb,cAAc;CACd,+BAA+B;CAC/B,QAAQ;CACR,MAAM;CACN,OAAO;CACP,MAAM;CACN,SAAS;CACT,cAAc;CACd,oBAAoB;CACpB,gCAAgC;CAChC,sCAAsC;CACvC;AAED,SAAS,EAAE,KAAqB;AAC9B,KAAIA,eAAa,KAAM,QAAOA,eAAa;AAC3C,QAAO,IACJ,MAAM,IAAI,CACV,KAAK,SAAS,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE,CAAC,CAC3D,KAAK,IAAI;;AAoBd,SAAS,kBAAkB,OAA2C;AACpE,QAAO;EACL,IAAI,MAAM;EACV,QAAQ,MAAM;EACd,YAAY;EACZ,YAAY,MAAM;EAClB,aAAa,MAAM;EACnB,UAAU;GACR,kBAAkB,MAAM,UAAU,oBAAoB,KAAA;GACtD,QAAQ,MAAM,UAAU,UAAU,KAAA;GACnC;EACD,eAAe,MAAM,iBAAiB;EACtC,YAAY,MAAM;EACnB;;AAGH,SAAgB,qBAAqB,EACnC,SACA,cAC+C;CAC/C,MAAM,EAAE,OAAO,SAAS,cAAc;CACtC,MAAM,SAAS,mBAAmB;CAClC,MAAM,YAAY,cAAc;CAChC,MAAM,eAAA,GAAA,sBAAA,iBAA8B;CACpC,MAAM,MAAM,SAAS;CACrB,MAAM,SAAS,MAAM;CAIrB,MAAM,EACJ,MAAM,aACN,WAAW,kBACX,SAAS,oBAAA,GAAA,sBAAA,UACE;EACX,UAAU,CAAC,mBAAmB,OAAO;EACrC,eAAeC,qBAAkC,QAAQ,IAAI;EAC7D,SAAS,CAAC,CAAC;EACZ,CAAC;CAEF,MAAM,EAAE,MAAM,eAAe,WAAW,wBAAA,GAAA,sBAAA,UAAgC;EACtE,UAAU,CAAC,qBAAqB,OAAO;EACvC,eAAeC,uBAAoC,QAAQ,IAAI;EAC/D,SAAS,CAAC,CAAC;EACZ,CAAC;CAEF,MAAM,EAAE,MAAM,oBAAoB,WAAW,6BAAA,GAAA,sBAAA,UAClC;EACP,UAAU;GAAC;GAA0B;GAAQ;GAAW;EACxD,eACEC,4BAA8C,QAAQ,KAAK,WAAW;EACxE,SAAS,CAAC,CAAC;EACZ,CAAC;CAEJ,MAAM,EAAE,MAAM,mBAAA,GAAA,sBAAA,UAA2B;EACvC,UAAU,CAAC,gBAAgB;EAC3B,eACE,UAAU,IAA0C,aAAa;EACnE,aAAa,EAAE;EAChB,CAAC;CAEF,MAAM,aAAa,aAAa,UAAU;CAE1C,MAAM,EAAE,MAAM,kBAAkB,WAAW,2BAAA,GAAA,sBAAA,UACzC;EACE,UAAU,CAAC,0BAA0B,WAAW;EAChD,eACE,UAAU,IACR,GAAG,YAAY,aAAa,WAAW,iBACxC;EACH,SAAS,CAAC,CAAC;EACZ,CACF;CAID,MAAM,0BAAA,GAAA,sBAAA,aAAqC;EACzC,aAAa,SAAuB;GAClC,MAAM,cACJ,kBAAkB,MAAM,MAAM,EAAE,SAAS,KAAK,SAAS,EAAE,OAAO;AAClE,UAAOC,eAA4B,QAAQ,KAAK;IAC9C,YAAY,KAAK;IACjB,WAAW,KAAK;IAChB,OAAO,KAAK;IACZ,cAAc;IACf,CAAC;;EAEJ,iBAAiB;AACf,eAAY,kBAAkB,EAC5B,UAAU,CAAC,mBAAmB,OAAO,EACtC,CAAC;AACF,WAAQ,mBAAmB,UAAU;;EAEvC,eAAe;AACb,WAAQ,4BAA4B,QAAQ;;EAE/C,CAAC;CAEF,MAAM,yBAAA,GAAA,sBAAA,aAAoC;EACxC,aAAa,cACXC,sBAAmC,QAAQ,KAAK,UAAU;EAC5D,iBAAiB;AACf,eAAY,kBAAkB,EAC5B,UAAU,CAAC,qBAAqB,OAAO,EACxC,CAAC;;EAEL,CAAC;CAEF,MAAM,+BAAA,GAAA,sBAAA,aAA0C;EAC9C,aAAa,oBACXC,4BACE,QACA,KACA,gBACD;EACH,iBAAiB;AACf,eAAY,kBAAkB,EAC5B,UAAU;IAAC;IAA0B;IAAQ;IAAW,EACzD,CAAC;;EAEL,CAAC;CAEF,MAAM,+BAAA,GAAA,sBAAA,aAA0C;EAC9C,aAAa,EACX,iBACA,WAKAC,oBAAsC,QAAQ,KAAK,iBAAiB;GAClE,gBAAgB,KAAK;GACrB,iBAAiB,KAAK;GACvB,CAAC;EACJ,iBAAiB;AACf,eAAY,kBAAkB,EAC5B,UAAU;IAAC;IAA0B;IAAQ;IAAW,EACzD,CAAC;;EAEL,CAAC;CAEF,MAAM,yBAAA,GAAA,sBAAA,aAAoC;EACxC,aAAa,SACXC,sBAAmC,QAAQ,KAAK,KAAK;EACvD,iBAAiB;AACf,eAAY,kBAAkB,EAC5B,UAAU,CAAC,qBAAqB,OAAO,EACxC,CAAC;AACF,WAAQ,mBAAmB,UAAU;;EAEvC,eAAe;AACb,WAAQ,4BAA4B,QAAQ;;EAE/C,CAAC;CAEF,MAAM,yBAAA,GAAA,sBAAA,aAAoC;EACxC,aAAa,EACX,WACA,WAIIC,sBAAmC,QAAQ,KAAK,WAAW,KAAK;EACtE,iBAAiB;AACf,eAAY,kBAAkB,EAC5B,UAAU,CAAC,qBAAqB,OAAO,EACxC,CAAC;AACF,WAAQ,mBAAmB,UAAU;;EAEvC,eAAe;AACb,WAAQ,4BAA4B,QAAQ;;EAE/C,CAAC;CAEF,MAAM,yBAAA,GAAA,sBAAA,aAAoC;EACxC,aAAa,SACXC,wBAA0C,QAAQ,KAAK,KAAK;EAC9D,iBAAiB;AACf,eAAY,kBAAkB,EAC5B,UAAU;IAAC;IAA0B;IAAQ;IAAW,EACzD,CAAC;AACF,WAAQ,wBAAwB,UAAU;;EAE5C,eAAe;AACb,WAAQ,gCAAgC,QAAQ;;EAEnD,CAAC;CAIF,MAAM,YAAY,eAAe,aAAa,EAAE;CAChD,MAAM,iBAAiB,oBAAoB,mBAAmB,EAAE;CAEhE,MAAM,sBACJ,kBAAkB,gBAAgB,IAAI,kBAAkB,IAAI,EAAE;CAGhE,MAAM,mBAA+B,CAAC;EAAE,IAAI;EAAG,MAAM;EAAW,KAAK;EAAM,CAAC;CAE5E,MAAM,kBAAA,GAAA,MAAA,eAEF,CAAC,GAAG,cAAc,CACf,KAAK,OAAO;EAAE,KAAK,EAAE;EAAK,MAAM,EAAE;EAAM,EAAE,CAC1C,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,KAAK,CAAC,EACjD,CAAC,cAAc,CAChB;AAID,KAAI,CAAC,MACH,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAU;YACb,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aAAoC;GAAoB,CAAA;EACnE,CAAA;AAIV,KAAI,kBAAkB,CAAC,iBACrB,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAU;YACb,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aAA4C;GAErD,CAAA;EACF,CAAA;AAIV,KAAI,oBAAoB,CAAC,YACvB,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAU;YACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf;IACE,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,uCAAwC,CAAA;IACvD,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,uCAAwC,CAAA;IACvD,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,uCAAwC,CAAA;IACnD;;EACF,CAAA;AAIV,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAU;YACb,iBAAA,GAAA,kBAAA,KAAC,mBAAD;GAAsB;aACpB,iBAAA,GAAA,kBAAA,KAAC,SAAD;IACE,iBAAiB;IACjB,WAAW;IACX,kBAAkB,OAAO,SAAS;AAChC,WAAM,uBAAuB,YAAY,KAAK;;IAEhD,oBAAoB,uBAAuB;IAE3C,sBAAsB,oBAAoB,SAAS;IACnD,cAAc;IACS;IACZ;IACS;IACpB,iBAAiB,OAAO,cAAc;AACpC,WAAM,sBAAsB,YAAY,UAAU;;IAEpD,mBAAmB,sBAAsB;IACzB;IACS;IACzB,uBAAuB,OAAO,oBAAoB;AAChD,WAAM,4BAA4B,YAAY,gBAAgB;;IAEhE,yBAAyB,4BAA4B;IACrD,uBAAuB,OAAO,iBAAiB,SAAS;AACtD,WAAM,4BAA4B,YAAY;MAC5C;MACA;MACD,CAAC;;IAEJ,yBAAyB,4BAA4B;IACrD,oBAAoB,OAAO,GAAG,mBAAmB;IACjD,WAAW;IACX,sBAAsB,EAAE,QAAQ,SAAS,sBACvC,iBAAA,GAAA,kBAAA,KAAC,mBAAD;KACU;KACC;KACQ;KACd;KACH,UAAU,OAAO,aAAa;AAC5B,UAAI,gBACF,OAAM,sBAAsB,YAAY;OACtC,WAAW,gBAAgB;OAC3B,MAAM;OACP,CAAC;UAEF,OAAM,sBAAsB,YAAY,SAAS;AAEnD,eAAS;;KAEX,cACE,sBAAsB,aACtB,sBAAsB;KAExB,WAAW;KACX,4BAA4B,EAC1B,SACA,UAAU,gBAgBN,iBAAA,GAAA,kBAAA,KAAC,mBAAD;MAA4B;MAAS,MAAK;MAAa,CAAA;KAC7D,CAAA;IAEJ,yBAAyB,EAAE,QAAQ,cACjC,iBAAA,GAAA,kBAAA,KAAC,sBAAD;KACU;KACC;KACN;KACH,UAAU,OAAO,SAAS;AACxB,YAAM,sBAAsB,YAAY,KAAK;AAC7C,eAAS;;KAEX,cAAc,sBAAsB;KACpC,WAAW;KACN;KACG;KACR,4BAA4B,EAC1B,SACA,UAAU,gBAEV,iBAAA,GAAA,kBAAA,KAAC,mBAAD;MAA4B;MAAS,MAAK;MAAa,CAAA;KAEzD,CAAA;IAEJ,CAAA;GACgB,CAAA;EAChB,CAAA;;;;;;AAQV,SAAS,kBAAkB,EACzB,SACA,QAKoB;CACpB,MAAM,EAAE,WAAA,GAAA,gBAAA,eAAwB;EAAE;EAAe;EAAgB,CAAC;AAClE,QACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;EACE,MAAK;EACL,OAAQ,MAAM,SAAoB;EAClC,aAAY;EACZ,WAAU;EACV,UAAU,MAAM;EAChB,CAAA;;;;ACleN,MAAM,uBAAA,GAAA,MAAA,eAAwD,KAAK;AAEnE,MAAa,uBAAuB,oBAAoB;AAExD,SAAgB,kBAA+B;CAC7C,MAAM,UAAA,GAAA,MAAA,YAAoB,oBAAoB;AAC9C,KAAI,CAAC,OACH,OAAM,IAAI,MACR,4DACD;AAEH,QAAO;;;;ACLT,SAAgB,mBAAmB,EACjC,QACA,YACuC;AACvC,QAAO,iBAAA,GAAA,kBAAA,KAAC,sBAAD;EAAsB,OAAO;EAAS;EAAgC,CAAA;;;;ACX/E,MAAa,aAAa;CACxB,KAAK,CAAC,SAAS;CACf,OAAO,WACL;EAAC,GAAG,WAAW;EAAK;EAAQ;EAAO;CACrC,SAAS,eACP;EAAC,GAAG,WAAW;EAAK;EAAU;EAAW;CAC5C;;;ACHD,SAAgB,SAAS,YAAoB,SAAiC;CAC5E,MAAM,SAAS,iBAAiB;AAChC,SAAA,GAAA,sBAAA,UAAgB;EACd,UAAU,WAAW,OAAO,WAAW;EACvC,eAAeC,WAAqB,QAAQ,WAAW;EACvD,UAAU,SAAS,WAAW,SAAS,CAAC,CAAC;EAC1C,CAAC;;;;ACLJ,SAAgB,kBACd,QACA,SACA;CACA,MAAM,SAAS,iBAAiB;AAChC,SAAA,GAAA,sBAAA,UAAgB;EACd,UAAU,WAAW,KAAK,OAAO;EACjC,eAAeC,oBAA8B,QAAQ,OAAO;EAC5D,SAAS,SAAS,WAAW;EAC9B,CAAC;;;;ACbJ,SAAgB,iBAAiB,OAAiC;AAChE,KAAI,MAAM,uCAAuC,KAC/C,QAAO,GAAG,MAAM,mBAAmB,MAAM,OACvC,MAAM,oCACP,CAAC,QAAQ,EAAE;AAEd,QACE,MAAM,wBACN,GAAG,MAAM,mBAAmB,MAAM,OAAO,MAAM,OAAO,CAAC,QAAQ,EAAE;;;;ACDrE,SAAgB,YAAY,EAC1B,YACA,gBACA,eACmB;AACnB,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf,CACE,iBAAA,GAAA,kBAAA,KAACC,aAAAA,QAAD,EAAQ,WAAU,0EAA2E,CAAA,EAC7F,iBAAA,GAAA,kBAAA,KAACC,YAAAA,OAAD;GACE,OAAO;GACP,WAAW,MAAM,eAAe,EAAE,OAAO,MAAM;GAClC;GACb,WAAU;GACV,CAAA,CACE;;;;;ACCV,SAAgB,iBAAiB,EAC/B,aACA,YACA,UACA,YACA,cACA,sBACA,aACA,aACA,cACA,gBACwB;CACxB,MAAM,WAAW,CAAC,CAAC;CAEnB,MAAM,iBAAiB,WAAW,CAAC,cAAc,gBAAgB;CACjE,MAAM,iBAAiB,WACnB,CAAC,cACD,eAAe,KAAK,gBAAgB;CAExC,MAAM,wBAAwB;AAC5B,MAAI,SACF,iBAAgB;MAEhB,gBAAe,cAAc,EAAE;;CAInC,MAAM,wBAAwB;AAC5B,MAAI,SACF,iBAAgB;MAEhB,gBAAe,cAAc,EAAE;;CAInC,MAAM,qBAAqB;AACzB,MAAI,SACF,QACE,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA;GAAE;GACM,iBAAA,GAAA,kBAAA,KAAC,QAAD;IAAM,WAAU;cAAe;IAAkB,CAAA;;GACtD,EAAA,CAAA;EAGP,MAAM,QAAQ,eAAe,IAAI,KAAK,cAAc,KAAK,WAAW;EACpE,MAAM,MAAM,KAAK,IAAI,cAAc,UAAU,WAAW;AACxD,SACE,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA;GAAE;GACQ,iBAAA,GAAA,kBAAA,KAAC,QAAD;IAAM,WAAU;cAAe;IAAa,CAAA;;GAAI;GACxD,iBAAA,GAAA,kBAAA,KAAC,QAAD;IAAM,WAAU;cAAe;IAAW,CAAA;;GAAI;GAC9C,iBAAA,GAAA,kBAAA,KAAC,QAAD;IAAM,WAAU;cAAe;IAAkB,CAAA;;GAChD,EAAA,CAAA;KAEH;CAEJ,MAAM,aACJ;AAEF,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf,CAEE,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,UAAU;IACV,WAAWC,YAAAA,GACT,YACA,gFACD;cACF;IAEQ,CAAA,EACT,iBAAA,GAAA,kBAAA,KAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,UAAU;IACV,WAAWA,YAAAA,GACT,YACA,qFACD;cACF;IAEQ,CAAA,CACL;MAGN,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;IAAG,WAAU;cAAiC;IAAgB,CAAA,EAC9D,iBAAA,GAAA,kBAAA,MAAC,OAAD;IACE,cAAW;IACX,WAAU;cAFZ;KAIE,iBAAA,GAAA,kBAAA,MAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAWA,YAAAA,GACT,YACA,0EACD;gBAPH,CASE,iBAAA,GAAA,kBAAA,KAAC,QAAD;OAAM,WAAU;iBAAU;OAAe,CAAA,EACzC,iBAAA,GAAA,kBAAA,KAACC,aAAAA,aAAD,EAAa,WAAU,WAAY,CAAA,CAC5B;;KACR,CAAC,YACA,iBAAA,GAAA,kBAAA,MAAC,QAAD;MAAM,WAAU;gBAAhB;OACG;OAAY;OAAI;OACZ;;KAET,iBAAA,GAAA,kBAAA,MAAC,UAAD;MACE,MAAK;MACL,SAAS;MACT,UAAU;MACV,WAAWD,YAAAA,GACT,YACA,0EACD;gBAPH,CASE,iBAAA,GAAA,kBAAA,KAAC,QAAD;OAAM,WAAU;iBAAU;OAAW,CAAA,EACrC,iBAAA,GAAA,kBAAA,KAACE,aAAAA,cAAD,EAAc,WAAU,WAAY,CAAA,CAC7B;;KACL;MACF;KACF;;;;;ACrIV,MAAM,cAA0C;CAC9C,OAAO;CACP,QACE;CACF,KAAK;CACL,MAAM;CACN,MAAM;CACP;AAED,MAAM,iBAA6C;CACjD,OAAO;CACP,QAAQ;CACR,KAAK;CACL,MAAM;CACN,MAAM;CACP;AAED,MAAM,aAAwC;CAC5C,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAED,SAAgB,YAAY,EAC1B,OACA,KACA,OAAO,MACP,WACA,YACmB;AACnB,QACE,iBAAA,GAAA,kBAAA,MAAC,QAAD;EACE,WAAWC,YAAAA,GACT,6EACA,YAAY,QACZ,WAAW,OACX,UACD;YANH,CAQG,OACC,iBAAA,GAAA,kBAAA,KAAC,QAAD,EACE,WAAWA,YAAAA,GAAG,4BAA4B,eAAe,OAAO,EAChE,CAAA,EAEH,SACI;;;;;AC3CX,SAAgB,YAAY,EAC1B,OACA,WAAW,MACX,WACA,aACA,QACA,UACA,eACA,mBACmB;CACnB,MAAM,aACJ,UAAU,WAAW,UACpB,UAAU,WAAW,UAAU,UAAU,cAAc;CAE1D,MAAM,eACJ,UAAU,WAAW,UACpB,UAAU,WAAW,UAAU,UAAU,cAAc;AAE1D,QACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;EACE,WAAWC,YAAAA,GACT,6GACA,uBACA,UACD;EACD,eAAe,YAAY,cAAc,UAAU,GAAG;YAEtD,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf,CACG,OACA,YAAY,iBAAiB,mBAC5B,iBAAA,GAAA,kBAAA,KAAC,UAAD;IACE,WAAW,iFACT,UAAU,WAAW,SAAS,gBAAgB,YAC/C;cAED,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;MACE,KAAK;MACL,KAAI;MACJ,OAAO;MACP,QAAQ;MACR,WAAWA,YAAAA,GACT,sFACA,cAAc,aACd,UAAU,WAAW,UAAU,0BAChC;MACD,CAAA,EACF,iBAAA,GAAA,kBAAA,KAAC,OAAD;MACE,KAAK;MACL,KAAI;MACJ,OAAO;MACP,QAAQ;MACR,WAAWA,YAAAA,GACT,sFACA,gBAAgB,aAChB,UAAU,WAAW,UAAU,0BAChC;MACD,CAAA,CACE;;IACC,CAAA,CAEP;;EACH,CAAA;;;;AC7DT,SAAgB,WAAW,EACzB,YACA,cACA,qBACA,GACA,WAAW,MACO;CAClB,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,UAAqC,KAAK;CACzD,MAAM,CAAC,YAAY,kBAAA,GAAA,MAAA,UAA0B,GAAG;CAUhD,MAAM,EAAE,MAAM,cAAc,kBARa;EACvC;EACA,OAAO;EACP,QAAQ,cAAc,KAAA;EACtB,QAAQ,UAAU,KAAA;EAClB,MAAM;EACP,EAEqD,EACpD,SAAS,CAAC,CAAC,YACZ,CAAC;CAEF,MAAM,sBAAA,GAAA,MAAA,cAAkC,SAAiB;AACvD,gBAAc,KAAK;AACnB,YAAU,KAAK;IACd,EAAE,CAAC;CAEN,MAAM,kBAAA,GAAA,MAAA,mBAAmC;EACvC,MAAM,aAAa,MAAM,MAAM,YAAY;AAC3C,MAAI,WACF,WAAU,WAAW;IAEtB,CAAC,MAAM,MAAM,YAAY,YAAY,CAAC;CAEzC,MAAM,kBAAA,GAAA,MAAA,mBAAmC;EACvC,MAAM,aAAa,MAAM,MAAM,YAAY;AAC3C,MAAI,WACF,WAAU,WAAW;MAErB,WAAU,KAAK;IAEhB,CAAC,MAAM,MAAM,YAAY,YAAY,CAAC;CAEzC,MAAM,aAAa,MAAM,UAAU,EAAE;CACrC,MAAM,aAAa,MAAM,MAAM;CAC/B,MAAM,aAAa,YAAY,eAAe,WAAW;CACzD,MAAM,aAAa,YAAY,eAAe;CAC9C,MAAM,cAAc,YAAY,gBAAgB;CAChD,MAAM,cAAc,CAAC,CAAC,YAAY;CAClC,MAAM,cAAc,CAAC,CAAC,YAAY;AAElC,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf;GACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACb,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAU;eACb,iBAAA,GAAA,kBAAA,KAAC,aAAD;MACc;MACZ,gBAAgB;MAChB,aAAa,EAAE,gBAAgB;MAC/B,CAAA;KACE,CAAA;IACF,CAAA;GAGN,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACZ,YACC,MAAM,EAAE,CACL,KAAK,EAAE,CACP,KAAK,GAAG,UACP,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAEE,WAAU;eAEV,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,UAAD,EAAU,WAAU,wBAAyB,CAAA,EAC7C,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,aAAc,CAAA,EAClC,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,aAAc,CAAA,CAC9B;SACF;;KACF,EAVC,YAAY,QAUb,CACN,GACF,WAAW,WAAW,IACxB,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAU;eACZ,aAAa,EAAE,qBAAqB,GAAG,EAAE,kBAAkB;KACxD,CAAA,GAEN,WAAW,KAAK,UACd,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAEE,WAAU;KACV,eAAe,aAAa,MAAM;eAElC,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACG,MAAM,YAAY,YACjB,iBAAA,GAAA,kBAAA,KAAC,OAAD;OACE,KAAK,MAAM,WAAW;OACtB,KAAK,EAAE,qBAAqB;OAC5B,OAAO;OACP,QAAQ;OACR,WAAU;OACV,CAAA,GAEF,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,gDAAiD,CAAA,EAElE,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf;QACG,MAAM,YAAY,QACjB,iBAAA,GAAA,kBAAA,KAAC,KAAD;SAAG,WAAU;mBACV,MAAM,WAAW;SAChB,CAAA,GAEJ,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBACb,iBAAA,GAAA,kBAAA,KAAC,OAAD;UAAK,WAAU;oBACZ,EAAE,gCAAgC;UAC/B,CAAA;SACF,CAAA;QAEP,MAAM,gBACL,iBAAA,GAAA,kBAAA,KAAC,aAAD;SAAa,OAAM;SAAO,MAAK;SAAK,WAAU;mBAC3C,EAAE,eAAe;SACN,CAAA;QAEf,MAAM,gBAAgB,uBACrB,iBAAA,GAAA,kBAAA,KAAC,UAAD;SACE,MAAK;SACL,WAAU;SACV,UAAU,MAAM;AACd,YAAE,iBAAiB;AACnB,8BACE,MAAM,aAAc,mBACrB;;mBAGF,EAAE,oBAAoB;SAChB,CAAA;QAEX,iBAAA,GAAA,kBAAA,MAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAC,QAAD;UAAM,WAAU;oBACb,EAAE,OAAO;UACL,CAAA,EACP,iBAAA,GAAA,kBAAA,KAAC,QAAD;UAAM,WAAU;oBACb,IAAI,KAAK,MAAM,WAAW,CAAC,oBAAoB;UAC3C,CAAA,CACH,EAAA,CAAA,EACN,iBAAA,GAAA,kBAAA,MAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAC,QAAD;UAAM,WAAU;oBACb,EAAE,QAAQ;UACN,CAAA,EACP,iBAAA,GAAA,kBAAA,KAAC,QAAD;UAAM,WAAU;oBACb,iBAAiB,MAAM;UACnB,CAAA,CACH,EAAA,CAAA,CACF;;QACF;SACF;;KACF,EAnEC,MAAM,GAmEP,CACN;IAEA,CAAA;GAGN,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACb,iBAAA,GAAA,kBAAA,MAAC,SAAD;KAAO,WAAU;eAAjB;MACE,iBAAA,GAAA,kBAAA,MAAC,YAAD,EAAA,UAAA;OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,uBAAwB,CAAA;OACvC,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,uBAAwB,CAAA;OACvC,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,4BAA6B,CAAA;OACnC,EAAA,CAAA;MACX,iBAAA,GAAA,kBAAA,KAAC,SAAD;OAAO,WAAU;iBACf,iBAAA,GAAA,kBAAA,MAAC,MAAD;QAAI,WAAU;kBAAd;SACE,iBAAA,GAAA,kBAAA,KAAC,aAAD;UAAa,OAAO,EAAE,UAAU;UAAE,UAAU;UAAS,CAAA;SACrD,iBAAA,GAAA,kBAAA,KAAC,aAAD;UAAa,OAAO,EAAE,OAAO;UAAE,UAAU;UAAS,CAAA;SAClD,iBAAA,GAAA,kBAAA,KAAC,aAAD;UAAa,OAAO,EAAE,QAAQ;UAAE,UAAU;UAAS,CAAA;SAChD;;OACC,CAAA;MACR,iBAAA,GAAA,kBAAA,KAAC,SAAD;OAAO,WAAU;iBACd,YACC,MAAM,EAAE,CACL,KAAK,EAAE,CACP,KAAK,GAAG,UACP,iBAAA,GAAA,kBAAA,MAAC,MAAD,EAAA,UAAA;QACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBACZ,iBAAA,GAAA,kBAAA,MAAC,OAAD;UAAK,WAAU;oBAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,sBAAuB,CAAA,EAC3C,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA,CAC7B;;SACH,CAAA;QACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBACZ,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA;SAC9B,CAAA;QACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBACZ,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA;SAC9B,CAAA;QACF,EAAA,EAbI,YAAY,QAahB,CACL,GACF,WAAW,WAAW,IACxB,iBAAA,GAAA,kBAAA,KAAC,MAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;QACE,SAAS;QACT,WAAU;kBAET,aAAa,EAAE,qBAAqB,GAAG,EAAE,kBAAkB;QACzD,CAAA,EACF,CAAA,GAEL,WAAW,KAAK,UACd,iBAAA,GAAA,kBAAA,MAAC,MAAD;QAEE,WAAU;QACV,eAAe,aAAa,MAAM;kBAHpC;SAKE,iBAAA,GAAA,kBAAA,KAAC,MAAD;UAAI,WAAU;oBACZ,iBAAA,GAAA,kBAAA,MAAC,OAAD;WAAK,WAAU;qBAAf,CACG,MAAM,YAAY,YACjB,iBAAA,GAAA,kBAAA,KAAC,OAAD;YACE,KAAK,MAAM,WAAW;YACtB,KAAK,EAAE,qBAAqB;YAC5B,OAAO;YACP,QAAQ;YACR,WAAU;YACV,CAAA,GAEF,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,mDAAoD,CAAA,EAErE,iBAAA,GAAA,kBAAA,MAAC,OAAD;YAAK,WAAU;sBAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;aAAK,WAAU;uBAAf,CACG,MAAM,YAAY,QACjB,iBAAA,GAAA,kBAAA,KAAC,QAAD;cAAM,WAAU;wBACb,MAAM,WAAW;cACb,CAAA,GAEP,iBAAA,GAAA,kBAAA,KAAC,OAAD;cAAK,WAAU;wBACb,iBAAA,GAAA,kBAAA,KAAC,OAAD;eAAK,WAAU;yBACZ,EAAE,gCAAgC;eAC/B,CAAA;cACF,CAAA,EAEP,MAAM,gBACL,iBAAA,GAAA,kBAAA,KAAC,aAAD;cACE,OAAM;cACN,MAAK;cACL,WAAU;wBAET,EAAE,eAAe;cACN,CAAA,CAEZ;gBACL,MAAM,gBAAgB,uBACrB,iBAAA,GAAA,kBAAA,KAAC,UAAD;aACE,MAAK;aACL,WAAU;aACV,UAAU,MAAM;AACd,gBAAE,iBAAiB;AACnB,kCACE,MAAM,aAAc,mBACrB;;uBAGF,EAAE,oBAAoB;aAChB,CAAA,CAEP;cACF;;UACH,CAAA;SACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;UAAI,WAAU;oBACX,IAAI,KAAK,MAAM,WAAW,CAAC,oBAAoB;UAC7C,CAAA;SACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;UAAI,WAAU;oBACX,iBAAiB,MAAM;UACrB,CAAA;SACF;UA/DE,MAAM,GA+DR,CACL;OAEE,CAAA;MACF;;IACJ,CAAA;GAEN,iBAAA,GAAA,kBAAA,KAAC,kBAAD;IACe;IACD;IACF;IACE;IACZ,sBAAA;IACa;IACA;IACb,cAAc;IACd,cAAc;IACd,CAAA;GACE;;;;;ACrSV,SAAgB,QAAQ,EAAE,OAAO,UAAU,UAAwB;AACjE,QACE,iBAAA,GAAA,kBAAA,MAACC,YAAAA,MAAD,EAAA,UAAA;EACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,YAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,WAAD,EAAA,UAAY,OAAkB,CAAA,EACnB,CAAA;EACb,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD,EAAc,UAAuB,CAAA;EACpC,UAAU,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aAAa;GAAa,CAAA;EAC/C,EAAA,CAAA;;;;ACAX,SAAgB,oBAAoB,EAClC,MACA,SACA,QAAQ,oBACR,aAC2B;AAC3B,QACE,iBAAA,GAAA,kBAAA,MAACC,YAAAA,MAAD;EAAiB;YAAjB,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,YAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,WAAD,EAAA,UAAY,OAAkB,CAAA,EACnB,CAAA,EACb,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD,EAAA,UACG,CAAC,UACA,iBAAA,GAAA,kBAAA,KAAC,KAAD;GAAG,WAAU;aAAgC;GAEzC,CAAA,GAEJ,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf,CACE,iBAAA,GAAA,kBAAA,KAACC,aAAAA,OAAD,EAAO,WAAU,sDAAuD,CAAA,EACxE,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf;KACG,QACC,iBAAA,GAAA,kBAAA,KAAC,QAAD;MACE,WAAU;MACV,OAAO;gBAEN;MACI,CAAA;KAER,QAAQ,SACP,iBAAA,GAAA,kBAAA,KAAC,QAAD;MAAM,WAAU;gBACb,QAAQ;MACJ,CAAA;KAER,QAAQ,SACP,iBAAA,GAAA,kBAAA,KAAC,QAAD;MAAM,WAAU;gBACb,QAAQ;MACJ,CAAA;KAER,QAAQ,SACP,iBAAA,GAAA,kBAAA,KAAC,QAAD;MAAM,WAAU;gBACb,QAAQ;MACJ,CAAA;KAEL;MACF;MAEI,CAAA,CACT;;;;;ACpEX,SAAgBC,YAAU,KAAwC;AAChE,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO,IAAI,QAAQ,MAAM,IAAI,CAAC,QAAQ,UAAU,SAAS,KAAK,aAAa,CAAC;;AAG9E,SAAgBC,iBAAe,QAAgB,OAAgC;AAC7E,QAAO,GAAG,SAAS,OAAO,MAAM,CAAC,QAAQ,EAAE;;;;ACgB7C,SAAS,sBAAsB,KAA6B;AAC1D,KAAI,CAAC,OAAO,IAAI,WAAW,EAAG,QAAO;AACrC,QAAO,IAAI,OAAO,EAAE,CAAC,aAAa,GAAG,IAAI,MAAM,EAAE;;AAGnD,SAAS,eAAe,EAAE,QAAqC;CAC7D,MAAM,eACJ,KAAK,kBAAkB,KAAK,SAASC,YAAU,KAAK,OAAO,GAAG;AAGhE,KAAI,KAAK,WAAW,UAAU,KAAK,WAAW;EAC5C,MAAM,WAAW,sBAAsB,KAAK,aAAa,OAAO;EAChE,MAAM,WAAW,KAAK,oBAAoB;AAE1C,SACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACG,KAAK,WACJ,iBAAA,GAAA,kBAAA,KAAC,OAAD;KACE,KAAK,KAAK;KACV,KAAK,GAAG,SAAS;KACjB,WAAU;KACV,OAAO;KACP,QAAQ;KACR,CAAA,GAEF,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAU;eACZ,SAAS,OAAO,EAAE;KACf,CAAA,EAER,iBAAA,GAAA,kBAAA,MAAC,QAAD;KAAM,WAAU;eAAhB;MACG;MAAS;MAAI;MACT;OACH;;GACF,CAAA;;CAKV,MAAM,eAAe,gBAAgB;AAErC,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAU;YACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf,CACG,KAAK,WACJ,iBAAA,GAAA,kBAAA,KAAC,OAAD;IACE,KAAK,KAAK;IACV,KAAK,GAAG,aAAa;IACrB,WAAU;IACV,OAAO;IACP,QAAQ;IACR,CAAA,GAEF,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACZ,aAAa,OAAO,EAAE;IACnB,CAAA,EAER,iBAAA,GAAA,kBAAA,KAAC,QAAD;IAAM,WAAU;cAAuB;IAAoB,CAAA,CACvD;;EACF,CAAA;;AAIV,SAAgB,kBAAkB,EAChC,eACA,QAAQ,kBACR,aACyB;AACzB,QACE,iBAAA,GAAA,kBAAA,MAACC,YAAAA,MAAD;EAAiB;YAAjB,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,YAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,WAAD,EAAA,UAAY,OAAkB,CAAA,EACnB,CAAA,EACb,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD,EAAA,UACG,gBACC,iBAAA,GAAA,kBAAA,KAAC,gBAAD,EAAgB,MAAM,eAAiB,CAAA,GAEvC,iBAAA,GAAA,kBAAA,KAAC,KAAD;GAAG,WAAU;aAAgC;GAAqB,CAAA,EAExD,CAAA,CACT;;;;;ACnGX,MAAM,iBAA6C;CACjD,MAAM;CACN,WAAW;CACX,WAAW;CACX,UAAU;CACV,SAAS;CACT,aAAa;CACb,qBAAqB;CACrB,YAAY;CACZ,UAAU;CACV,WAAW;CACX,QAAQ;CACR,QAAQ;CACT;AAOD,SAAgB,iBAAiB,EAAE,QAAQ,aAAoC;AAE7E,QACE,iBAAA,GAAA,kBAAA,KAAC,aAAD;EAAa,OAFD,eAAe,WAAW;EAEX,KAAA;EAAI,MAAK;EAAgB;YACjDC,YAAU,OAAO;EACN,CAAA;;;;ACRlB,SAAS,cAAc,SAA0C;AAK/D,QAAO;EAAE,OAJK,QAAQ,YAAY;EAIlB,OAFF,CADI,CAAC,QAAQ,MAAM,QAAQ,MAAM,CAAC,OAAO,QAAQ,CAAC,KAAK,KAAK,EAChD,QAAQ,YAAY,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;EAEjD,OADT,QAAQ,gBAAgB;EACR;;AAGhC,SAAS,sBAAsB;AAC7B,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,UAAD,EAAU,WAAU,0BAA2B,CAAA,EAC/C,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,0BAA2B,CAAA,EAC/C,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,0BAA2B,CAAA,CAC3C;OACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf;KACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,0BAA2B,CAAA;KAC/C,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,0BAA2B,CAAA;KAC/C,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,0BAA2B,CAAA;KAC3C;MACF;KACF;;;AAIV,SAAS,aAAa,EAAE,QAA0C;AAChE,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf;GACG,KAAK,aACJ,iBAAA,GAAA,kBAAA,KAAC,OAAD;IACE,KAAK,KAAK;IACV,KAAK,KAAK;IACV,WAAU;IACV,CAAA;GAEJ,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf;KACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;MAAG,WAAU;gBAA+B,KAAK;MAAU,CAAA;KAC1D,KAAK,gBAAgB,SAAS,KAC7B,iBAAA,GAAA,kBAAA,KAAC,KAAD;MAAG,WAAU;gBACV,KAAK,gBAAgB,KAAK,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM;MACnD,CAAA;KAEL,KAAK,OACJ,iBAAA,GAAA,kBAAA,MAAC,KAAD;MAAG,WAAU;gBAAb,CAA6C,SAAM,KAAK,IAAQ;;KAEjE,KAAK,gBACJ,iBAAA,GAAA,kBAAA,KAAC,aAAD;MAAa,OAAM;MAAO,MAAK;MAAK,WAAU;gBAAO;MAEvC,CAAA;KAEZ;;GACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;KAAG,WAAU;eAA+B,KAAK;KAAkB,CAAA,EAClE,KAAK,WAAW,KACf,iBAAA,GAAA,kBAAA,MAAC,KAAD;KAAG,WAAU;eAAb;MACG,KAAK;MAAc;MAAI,KAAK;MAC3B;OAEF;;GACF;;;AAIV,SAAS,kBAAkB,EAAE,SAAkC;CAC7D,MAAM,MAAM,MAAM,mBAAmB;AAErC,QACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;EAAS,OAAM;YACb,iBAAA,GAAA,kBAAA,MAAC,MAAD;GAAI,WAAU;aAAd;IACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBAAwB;MAAa,CAAA,EACnD,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBACX,MAAM;MACJ,CAAA,CACD;;IACL,OAAO,MAAM,SAAS,GAAG,KACxB,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,MAAD;MAAI,WAAU;gBAAd,CAAsC,YAEnC,MAAM,gBAAgB,SACnB,KAAK,MAAM,eAAe,KAAK,KAAK,CAAC,KACrC,GACD;SACL,iBAAA,GAAA,kBAAA,MAAC,MAAD;MAAI,WAAU;gBAAd,CAA4C,KACxC,MAAM,qBACL;QACD;;IAER,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBAAwB;MAAa,CAAA,EACnD,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBACX,MAAM,gBAAgB,SAAS,MAAM;MACnC,CAAA,CACD;;IACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,MAAD;MAAI,WAAU;gBAAd,CAAsC,OAEnC,MAAM,0BAA0B,MAAM,2BACnC,KAAK,MAAM,yBAAyB,eACpC,GACD;SACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBACX,MAAM;MACJ,CAAA,CACD;;IACL,MAAM,qCAAqC,QAC1C,MAAM,oCAAoC,KACxC,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBAAwB;MAAmB,CAAA,EACzD,iBAAA,GAAA,kBAAA,MAAC,MAAD;MAAI,WAAU;gBAAd,CAA4C,KACxCC,iBAAe,KAAK,MAAM,kCAAkC,CAC3D;QACD;;IAEV,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBAAgC;MAAU,CAAA,EACxD,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBACX,MAAM;MACJ,CAAA,CACD;;IACH;;EACG,CAAA;;AAId,SAAS,eAAe,EAAE,SAAkC;AAC1D,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf;GACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,QAAD;KAAM,WAAU;eAAgC;KAAe,CAAA,EAC/D,iBAAA,GAAA,kBAAA,KAAC,kBAAD,EAAkB,QAAQ,MAAM,gBAAkB,CAAA,CAC9C;;GACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,QAAD;KAAM,WAAU;eAAgC;KAAmB,CAAA,EACnE,iBAAA,GAAA,kBAAA,KAAC,kBAAD,EAAkB,QAAQ,MAAM,oBAAsB,CAAA,CAClD;;GACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,QAAD;KAAM,WAAU;eAAgC;KAAgB,CAAA,EAChE,iBAAA,GAAA,kBAAA,KAAC,kBAAD,EAAkB,QAAQ,MAAM,iBAAmB,CAAA,CAC/C;;GACN,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACZ,IAAI,KAAK,MAAM,WAAW,CAAC,mBAAmB,SAAS;KACtD,MAAM;KACN,OAAO;KACP,KAAK;KACN,CAAC;IACE,CAAA;GACF;;;AAIV,SAAS,cAAc,EAAE,SAAkC;AACzD,QACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;EAAS,OAAM;YACb,iBAAA,GAAA,kBAAA,MAAC,MAAD;GAAI,WAAU;aAAd;IACE,iBAAA,GAAA,kBAAA,MAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;KAAI,WAAU;eAAwB;KAAiB,CAAA,EACvD,iBAAA,GAAA,kBAAA,KAAC,MAAD;KAAI,WAAU;eAA+B,MAAM;KAAkB,CAAA,CACjE,EAAA,CAAA;IACN,iBAAA,GAAA,kBAAA,MAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;KAAI,WAAU;eAAwB;KAAY,CAAA,EAClD,iBAAA,GAAA,kBAAA,KAAC,MAAD;KAAI,WAAU;eACXC,YAAU,MAAM,QAAQ;KACtB,CAAA,CACD,EAAA,CAAA;IACL,MAAM,SACL,iBAAA,GAAA,kBAAA,MAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;KAAI,WAAU;eAAwB;KAAU,CAAA,EAChD,iBAAA,GAAA,kBAAA,KAAC,MAAD;KAAI,WAAU;eAA+B,MAAM;KAAW,CAAA,CAC1D,EAAA,CAAA;IAEL;;EACG,CAAA;;AAId,SAAS,mBAAmB,EAAE,UAA6C;AACzE,QACE,iBAAA,GAAA,kBAAA,MAAC,SAAD;EAAS,OAAM;YAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;GAAG,WAAU;aAAiC,OAAO;GAAU,CAAA,EAC9D,OAAO,0BACN,iBAAA,GAAA,kBAAA,MAAC,KAAD;GAAG,WAAU;aAAb,CAAkD,SAC1C,OAAO,uBACX;KAEE;;;AAId,SAAgB,YAAY,EAAE,OAAO,YAAY,WAA6B;CAC5E,MAAM,EAAE,MAAM,WAAW,UAAU,SAAS,MAAM;CAClD,MAAM,QAAQ,MAAM;AAEpB,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,aAAa,MAChB,WAAU,MAAe;IAE1B;EAAC;EAAW;EAAO;EAAQ,CAAC;AAE/B,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAC3B,eAAc;IAEf;EAAC;EAAW;EAAO;EAAO;EAAW,CAAC;AAEzC,KAAI,UACF,QAAO,iBAAA,GAAA,kBAAA,KAAC,qBAAD,EAAuB,CAAA;AAGhC,KAAI,CAAC,MACH,QAAO;CAGT,MAAM,eAAe,MAAM,MAAM,QAC9B,SAAS,KAAK,wBAAwB,MACxC;AAED,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,gBAAD,EAAuB,OAAS,CAAA,EAEhC,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf,CAEE,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,SAAD;KAAS,OAAO,UAAU,MAAM,YAAY;eAC1C,iBAAA,GAAA,kBAAA,KAAC,OAAD;MAAK,WAAU;gBACZ,aAAa,KAAK,SACjB,iBAAA,GAAA,kBAAA,KAAC,cAAD,EAAkC,MAAQ,EAAvB,KAAK,GAAkB,CAC1C;MACE,CAAA;KACE,CAAA,EAEV,iBAAA,GAAA,kBAAA,KAAC,mBAAD,EAA0B,OAAS,CAAA,CAC/B;OAGN,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf;KACG,MAAM,mBACL,iBAAA,GAAA,kBAAA,KAAC,mBAAD,EACE,eAAe;MACb,QAAQ,MAAM,gBAAgB;MAC9B,eAAe,MAAM,gBAAgB;MACrC,UAAU,MAAM,gBAAgB,QAAQ;MACxC,WAAW,MAAM,gBAAgB,QAAQ;MACzC,kBAAkB,MAAM,gBAAgB,QAAQ;MACjD,EACD,CAAA;KAGH,MAAM,WACL,iBAAA,GAAA,kBAAA,KAAC,qBAAD;MACE,MAAM,MAAM,QAAQ;MACpB,SAAS,cAAc,MAAM,QAAQ;MACrC,OAAM;MACN,CAAA;KAGH,MAAM,WACL,iBAAA,GAAA,kBAAA,KAAC,qBAAD;MACE,MAAM,MAAM,QAAQ;MACpB,SAAS,cAAc,MAAM,QAAQ;MACrC,OAAM;MACN,CAAA;KAGH,MAAM,mBACL,iBAAA,GAAA,kBAAA,KAAC,oBAAD,EAAoB,QAAQ,MAAM,iBAAmB,CAAA;KAGvD,iBAAA,GAAA,kBAAA,KAAC,eAAD,EAAsB,OAAS,CAAA;KAC3B;MACF;KACF;;;;;AC3RV,MAAMC,iBAAuC;CAC3C,eAAe;CACf,cAAc;CACd,MAAM;CACN,QAAQ;CACR,SAAS;CACT,iBAAiB;CACjB,oBAAoB;CACpB,oBAAoB;CACpB,+BAA+B;CAC/B,cAAc;CACd,mBAAmB;CACnB,OAAO;CACP,SAAS;CACT,UAAU;CACV,MAAM;CACN,YAAY;CACb;AAED,SAAgB,oBAAoB,EAClC,YACA,qBAC8C;CAC9C,MAAM,eAAeC,mBAAiB;CACtC,MAAM,EAAE,aAAaC,6BAAAA,kBAAkB;CAEvC,MAAM,oBAAoB,UAA4B;AACpD,WAAS,kBAAkB,MAAM,QAAQ;;CAG3C,MAAM,2BAA2B,sBAA8B;AAC7D,WAAS,yBAAyB,oBAAoB;;AAGxD,KAAI,kBACF,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAU;YACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,uCAAwC,CAAA,EACvD,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,uCAAwC,CAAA,CACnD;;EACF,CAAA;AAIV,QACE,iBAAA,GAAA,kBAAA,KAAC,oBAAD;EAAoB,QAAQ;YAC1B,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aACb,iBAAA,GAAA,kBAAA,KAAC,YAAD;IACc;IACZ,cAAc;IACd,qBAAqB;IACrB,IAAI,QAAQF,eAAa,QAAQ;IACjC,CAAA;GACE,CAAA;EACa,CAAA;;;;ACxDzB,SAAgB,yBAAyB,EACvC,OACA,WACmD;CACnD,MAAM,SAASG,mBAAiB;CAChC,MAAM,EAAE,aAAaC,6BAAAA,kBAAkB;AAEvC,QACE,iBAAA,GAAA,kBAAA,KAAC,oBAAD;EAA4B;YAC1B,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aACb,iBAAA,GAAA,kBAAA,KAAC,aAAD;IACS;IACP,kBAAkB;AAChB,aAAQ,mBAAmB,UAAU;AACrC,cAAS,iBAAiB;;IAE5B,UAAU,QAAQ;AAGhB,aAAQ,yBADN,eAAe,QAAQ,IAAI,UAAU,uBACK,QAAQ;;IAEtD,CAAA;GACE,CAAA;EACa,CAAA;;;;AC9BzB,MAAM,8BAAA,GAAA,MAAA,eAA+D,KAAK;AAE1E,MAAa,8BAA8B,2BAA2B;AAEtE,SAAgB,yBAAsC;CACpD,MAAM,UAAA,GAAA,MAAA,YAAoB,2BAA2B;AACrD,KAAI,CAAC,OACH,OAAM,IAAI,MACR,yEACD;AAEH,QAAO;;;;ACLT,SAAgB,0BAA0B,EACxC,QACA,YAC8C;AAC9C,QACE,iBAAA,GAAA,kBAAA,KAAC,6BAAD;EAA6B,OAAO;EACjC;EAC2B,CAAA;;;;ACdlC,MAAa,oBAAoB;CAC/B,KAAK,CAAC,gBAAgB;CACtB,OAAO,WACL;EAAC,GAAG,kBAAkB;EAAK;EAAQ;EAAO;CAC5C,SAAS,UACP;EAAC,GAAG,kBAAkB;EAAK;EAAU;EAAM;CAC9C;;;ACFD,SAAgB,iBACd,QACA,SACA;CACA,MAAM,SAAS,wBAAwB;AACvC,SAAA,GAAA,sBAAA,UAAgB;EACd,UAAU,kBAAkB,KAAK,OAAO;EACxC,eAAeC,2BAA4C,QAAQ,OAAO;EAC1E,SAAS,SAAS,WAAW,CAAC,CAAC,OAAO;EACvC,CAAC;;;;ACVJ,SAAgB,gBACd,OACA,SACA;CACA,MAAM,SAAS,wBAAwB;AACvC,SAAA,GAAA,sBAAA,UAAgB;EACd,UAAU,kBAAkB,OAAO,MAAM;EACzC,eAAeC,kBAAmC,QAAQ,MAAM;EAChE,UAAU,SAAS,WAAW,SAAS,CAAC,CAAC;EAC1C,CAAC;;;;ACRJ,SAAgB,qBAAqB,SAGlC;CACD,MAAM,SAAS,wBAAwB;CACvC,MAAM,eAAA,GAAA,sBAAA,iBAA8B;AAEpC,SAAA,GAAA,sBAAA,aAAmB;EACjB,aAAa,WAIXC,kBACE,QACA,OAAO,mBACP,OAAO,YACR;EACH,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,kBAAkB,KAAK,CAAC;AAClE,YAAS,aAAa;;EAExB,SAAS,SAAS;EACnB,CAAC;;;;ACtBJ,SAAgB,sBAAsB,SAGnC;CACD,MAAM,SAAS,wBAAwB;CACvC,MAAM,eAAA,GAAA,sBAAA,iBAA8B;AAEpC,SAAA,GAAA,sBAAA,aAAmB;EACjB,aAAa,WAIXC,mBACE,QACA,OAAO,mBACP,OAAO,aACR;EACH,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,kBAAkB,KAAK,CAAC;AAClE,YAAS,aAAa;;EAExB,SAAS,SAAS;EACnB,CAAC;;;;ACtBJ,SAAgB,oBAAoB,SAGjC;CACD,MAAM,SAAS,wBAAwB;CACvC,MAAM,eAAA,GAAA,sBAAA,iBAA8B;AAEpC,SAAA,GAAA,sBAAA,aAAmB;EACjB,aAAa,WAIXC,iBACE,QACA,OAAO,mBACP,OAAO,WACR;EACH,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,kBAAkB,KAAK,CAAC;AAClE,YAAS,aAAa;;EAExB,SAAS,SAAS;EACnB,CAAC;;;;ACvBJ,SAAgB,sBAAsB,SAGnC;CACD,MAAM,SAAS,wBAAwB;CACvC,MAAM,eAAA,GAAA,sBAAA,iBAA8B;AAEpC,SAAA,GAAA,sBAAA,aAAmB;EACjB,aAAa,WACXC,mBACE,QACA,OAAO,mBACP,OAAO,WACR;EACH,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,kBAAkB,KAAK,CAAC;AAClE,YAAS,aAAa;;EAExB,SAAS,SAAS;EACnB,CAAC;;;;AClBJ,SAAgB,0BAA0B,SAGvC;CACD,MAAM,SAAS,wBAAwB;CACvC,MAAM,eAAA,GAAA,sBAAA,iBAA8B;AAEpC,SAAA,GAAA,sBAAA,aAAmB;EACjB,aAAa,WAIXC,uBACE,QACA,OAAO,mBACP,OAAO,iBACR;EACH,iBAAiB;AACf,eAAY,kBAAkB,EAAE,UAAU,kBAAkB,KAAK,CAAC;AAClE,YAAS,aAAa;;EAExB,SAAS,SAAS;EACnB,CAAC;;;;ACXJ,SAAgB,4BAA4B,WAA2B;AACrE,KAAI,cAAc,MAAO,QAAO;AAChC,KAAI,cAAc,OAAQ,QAAO;AACjC,KAAI,cAAc,QAAS,QAAO;AAClC,KAAI,cAAc,OAAQ,QAAO;AACjC,QAAO;;AA+ET,SAAgB,sBACd,kBAA0B,GAC1B,sBAA8B,SACtB;CACR,MAAM,sBAAM,IAAI,MAAM;CACtB,MAAM,eAAe,IAAI,KAAK,IAAI;AAElC,SAAQ,oBAAoB,aAAa,EAAzC;EACE,KAAK;AACH,gBAAa,QAAQ,IAAI,SAAS,GAAG,gBAAgB;AACrD;EACF,KAAK;AACH,gBAAa,QAAQ,IAAI,SAAS,GAAG,kBAAkB,EAAE;AACzD;EACF,KAAK;AACH,gBAAa,SAAS,IAAI,UAAU,GAAG,gBAAgB;AACvD;EACF,KAAK;AACH,gBAAa,YAAY,IAAI,aAAa,GAAG,gBAAgB;AAC7D;EACF,QACE,cAAa,SAAS,IAAI,UAAU,GAAG,gBAAgB;;AAG3D,QAAO,aAAa,aAAa,CAAC,MAAM,IAAI,CAAC,MAAM;;AAGrD,SAAgB,WACd,YACA,cAAuB,OACf;AACR,KAAI,YAAa,QAAO;AACxB,KAAI,CAAC,WAAY,QAAO;CAExB,MAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,KAAI,MAAM,WAAW,EAAG,QAAO;CAE/B,MAAM,CAAC,MAAM,OAAO,OAAO,MAAM,IAAI,OAAO;AAC5C,KAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAK,QAAO;CACpC,MAAM,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI;CAE3C,MAAM,aAAa;EACjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CAED,MAAM,SAAS,KAAK,SAAS;CAC7B,MAAM,YAAY,WAAW,KAAK,UAAU;CAC5C,MAAM,UAAU,KAAK,aAAa;CAElC,MAAM,iBAAiB,MAAc;AACnC,MAAI,IAAI,KAAK,IAAI,GAAI,QAAO;AAC5B,UAAQ,IAAI,IAAZ;GACE,KAAK,EACH,QAAO;GACT,KAAK,EACH,QAAO;GACT,KAAK,EACH,QAAO;GACT,QACE,QAAO;;;AAIb,QAAO,GAAG,UAAU,GAAG,SAAS,cAAc,OAAO,CAAC,IAAI;;AAG5D,SAAgB,mBAEd,cAA4C;AAC5C,KAAI,cAAc,WAAW,YAAa,QAAO;AACjD,KAAI,cAAc,eAChB,QAAO,WAAW,aAAa,eAAe;AAChD,KAAI,cAAc,WAAW,SAAU,QAAO;AAC9C,QAAO;;;;ACtLT,SAAgB,GAAG,GAAG,QAAsB;AAC1C,SAAA,GAAA,eAAA,UAAA,GAAA,KAAA,MAAoB,OAAO,CAAC;;;;;;;ACD9B,SAAgB,eAAe,OAAuB;AACpD,QAAO,IAAI,KAAK,aAAa,SAAS;EACpC,OAAO;EACP,UAAU;EACX,CAAC,CAAC,OAAO,MAAM;;;;;;AAOlB,SAAgB,UAAU,KAAwC;AAChE,KAAI,CAAC,IAAK,QAAO;AACjB,QAAO,IAAI,QAAQ,MAAM,IAAI,CAAC,QAAQ,UAAU,SAAS,KAAK,aAAa,CAAC;;;;;AAM9E,SAAgB,mBAAmB,cAA8B;AAC/D,KAAI,CAAC,aAAc,QAAO;CAC1B,MAAM,OAAO,IAAI,KAAK,aAAa;AACnC,KAAI,MAAM,KAAK,SAAS,CAAC,CAAE,QAAO;AAIlC,QAAO,GAHO,KAAK,aAAa,GAAG,EAGnB,GAFJ,KAAK,YAAY,CAEN,GADV,KAAK,gBAAgB;;;;ACzBpC,MAAM,gBAAwC;CAC5C,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,UAAU;CACV,UAAU;CACX;AAED,MAAM,oBAA4C;CAChD,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,UAAU;CACV,UAAU;CACX;AAOD,SAAgB,WAAW,EAAE,QAAQ,YAA0C;CAC7E,MAAM,MAAM,QAAQ,aAAa,IAAI;CACrC,MAAM,YAAY,cAAc,QAAQ;CACxC,MAAM,WAAW,kBAAkB,QAAQ;AAE3C,QACE,iBAAA,GAAA,kBAAA,MAAC,QAAD;EACE,WAAW,GACT,mFACA,UACD;YAJH,CAME,iBAAA,GAAA,kBAAA,KAAC,QAAD,EAAM,WAAW,GAAG,4BAA4B,SAAS,EAAI,CAAA,EAC5D,SACI;;;;;ACzBX,SAAgB,kBAAkB,EAChC,YACA,qBACA,GACA,WAAW,MAC2B;CACtC,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAA2B,EAAE;CACjD,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,UAA2C,KAAK;CACrE,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,UAAqC,KAAK;CACzD,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,UAGZ;EACD,QAAQ;EACR,WAAW;EACZ,CAAC;CAYF,MAAM,EAAE,MAAM,cAAc,iBAV2B;EACrD,YAAY,cAAc;EAC1B,MAAM;EACN,SAAS;EACT,QAAQ;EACR;EACA,QAAQ,OAAO;EACf,eAAe,OAAO;EACvB,EAEoD,EACnD,SAAS,CAAC,CAAC,YACZ,CAAC;AAGF,EAAA,GAAA,MAAA,iBAAgB;AACd,iBAAe,EAAE;IAChB;EAAC;EAAc;EAAQ;EAAO,CAAC;CAElC,MAAM,QAAQ,MAAM,iBAAiB,EAAE;CACvC,MAAM,aAAa,MAAM,MAAM,YAAY,eAAe;CAC1D,MAAM,aAAa,MAAM,MAAM,YAAY,eAAe;CAE1D,MAAM,2BAA2B,UAAkB;AACjD,MAAI,MACF,qBAAoB,MAAM;;AAI9B,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf;GAEE,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf;MACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,QAAD;OACE,SAAQ;OACR,MAAK;OACL,eAAe,gBAAgB,KAAK;OACpC,WAAW,GACT,sBACA,iBAAiB,QAAQ,gCAC1B;iBAEA,EAAE,MAAM;OACF,CAAA;MACT,iBAAA,GAAA,kBAAA,KAACA,YAAAA,QAAD;OACE,SAAQ;OACR,MAAK;OACL,eAAe,gBAAgB,SAAS;OACxC,WAAW,GACT,sBACA,iBAAiB,YAAY,gCAC9B;iBAEA,EAAE,SAAS;OACL,CAAA;MACT,iBAAA,GAAA,kBAAA,KAACA,YAAAA,QAAD;OACE,SAAQ;OACR,MAAK;OACL,eAAe,gBAAgB,WAAW;OAC1C,WAAW,GACT,sBACA,iBAAiB,cAAc,gCAChC;iBAEA,EAAE,WAAW;OACP,CAAA;MACL;QACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;MAAK,WAAU;gBACb,iBAAA,GAAA,kBAAA,KAACC,aAAAA,QAAD,EAAQ,WAAU,iCAAkC,CAAA;MAChD,CAAA,EACN,iBAAA,GAAA,kBAAA,KAACC,YAAAA,OAAD;MACE,MAAK;MACL,OAAO,UAAU;MACjB,WAAW,MAAM,UAAU,EAAE,OAAO,SAAS,KAAK;MAClD,WAAU;MACV,aAAa,EAAE,gBAAgB;MAC/B,CAAA,CACE;OACF;;GAGN,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACZ,YACC,MAAM,EAAE,CACL,KAAK,EAAE,CACP,KAAK,GAAG,UACP,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAEE,WAAU;eAEV,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,UAAD,EAAU,WAAU,wBAAyB,CAAA,EAC7C,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,aAAc,CAAA,EAClC,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,aAAc,CAAA,CAC9B;SACF;;KACF,EAVC,YAAY,QAUb,CACN,GACF,MAAM,WAAW,IACnB,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAU;eACZ,EAAE,yBAAyB;KACxB,CAAA,GAEN,MAAM,KAAK,iBACT,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAEE,WAAU;KACV,eACE,wBAAwB,aAAa,mBAAmB;eAG1D,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;OACE,KAAK,aAAa,SAAS,SAAS;OACpC,KAAK,aAAa,SAAS,SAAS;OACpC,OAAO;OACP,QAAQ;OACR,WAAU;OACV,CAAA,EACF,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf;QACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;SAAG,WAAU;mBACV,aAAa,SAAS,SAAS;SAC9B,CAAA;QACJ,iBAAA,GAAA,kBAAA,MAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAC,QAAD;UAAM,WAAU;oBACb,EAAE,iBAAiB;UACf,CAAA,EACP,iBAAA,GAAA,kBAAA,KAAC,QAAD;UAAM,WAAU;oBACb,mBAAmB,aAAa,kBAAkB,GAAG;UACjD,CAAA,CACH,EAAA,CAAA,EACN,iBAAA,GAAA,kBAAA,MAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAC,QAAD;UAAM,WAAU;oBACb,EAAE,QAAQ;UACN,CAAA,EACP,iBAAA,GAAA,kBAAA,KAAC,QAAD;UAAM,WAAU;oBACb,eACC,aAAa,QAAQ,aAAa,SACnC;UACI,CAAA,CACH,EAAA,CAAA,CACF;;QACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;SAAK,WAAU;mBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,QAAD;UAAM,WAAU;oBACb,EAAE,SAAS;UACP,CAAA,EACP,iBAAA,GAAA,kBAAA,KAAC,YAAD;UAAY,QAAQ,aAAa;oBAC9B,UAAU,aAAa,OAAO,IAAI,EAAE,iBAAiB;UAC3C,CAAA,CACT;;QACF;SACF;;KACF,EAhDC,aAAa,mBAgDd,CACN;IAEA,CAAA;GAGN,iBAAA,GAAA,kBAAA,KAAC,OAAD;IAAK,WAAU;cACb,iBAAA,GAAA,kBAAA,MAAC,SAAD;KAAO,WAAU;eAAjB;MACE,iBAAA,GAAA,kBAAA,MAAC,YAAD,EAAA,UAAA;OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,yBAA0B,CAAA;OACzC,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,yBAA0B,CAAA;OACzC,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,yBAA0B,CAAA;OACzC,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,yBAA0B,CAAA;OAChC,EAAA,CAAA;MACX,iBAAA,GAAA,kBAAA,KAAC,SAAD;OAAO,WAAU;iBACf,iBAAA,GAAA,kBAAA,MAAC,MAAD;QAAI,WAAU;kBAAd;SACE,iBAAA,GAAA,kBAAA,KAAC,aAAD;UAAa,OAAO,EAAE,UAAU;UAAE,UAAU;UAAS,CAAA;SACrD,iBAAA,GAAA,kBAAA,KAAC,aAAD;UACE,OAAO,EAAE,iBAAiB;UAC1B,QAAO;UACP,UAAU;UACV,cAAc,UACZ,UAAU;WACR,QAAQ;WACR,WAAW,OAAO,cAAc,QAAQ,SAAS;WAClD,CAAC;UAEJ,CAAA;SACF,iBAAA,GAAA,kBAAA,KAAC,aAAD;UAAa,OAAO,EAAE,QAAQ;UAAE,UAAU;UAAS,CAAA;SACnD,iBAAA,GAAA,kBAAA,KAAC,aAAD;UAAa,OAAO,EAAE,SAAS;UAAE,UAAU;UAAS,CAAA;SACjD;;OACC,CAAA;MACR,iBAAA,GAAA,kBAAA,KAAC,SAAD;OAAO,WAAU;iBACd,YACC,MAAM,EAAE,CACL,KAAK,EAAE,CACP,KAAK,GAAG,UACP,iBAAA,GAAA,kBAAA,MAAC,MAAD,EAAA,UAAA;QACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBACZ,iBAAA,GAAA,kBAAA,MAAC,OAAD;UAAK,WAAU;oBAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,sBAAuB,CAAA,EAC3C,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA,CAC7B;;SACH,CAAA;QACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBACZ,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA;SAC9B,CAAA;QACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBACZ,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA;SAC9B,CAAA;QACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBACZ,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA;SAC9B,CAAA;QACF,EAAA,EAhBI,YAAY,QAgBhB,CACL,GACF,MAAM,WAAW,IACnB,iBAAA,GAAA,kBAAA,KAAC,MAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;QACE,SAAS;QACT,WAAU;kBAET,EAAE,yBAAyB;QACzB,CAAA,EACF,CAAA,GAEL,MAAM,KAAK,iBACT,iBAAA,GAAA,kBAAA,MAAC,MAAD;QAEE,WAAU;QACV,eACE,wBAAwB,aAAa,mBAAmB;kBAJ5D;SAOE,iBAAA,GAAA,kBAAA,MAAC,MAAD;UAAI,WAAU;oBAAd,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;WACE,KAAK,aAAa,SAAS,SAAS;WACpC,KAAK,aAAa,SAAS,SAAS;WACpC,OAAO;WACP,QAAQ;WACR,WAAU;WACV,CAAA,EACF,iBAAA,GAAA,kBAAA,KAAC,QAAD;WAAM,WAAU;qBACb,aAAa,SAAS,SAAS;WAC3B,CAAA,CACJ;;SACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;UAAI,WAAU;oBACX,mBAAmB,aAAa,kBAAkB,GAAG;UACnD,CAAA;SACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;UAAI,WAAU;oBACZ,iBAAA,GAAA,kBAAA,KAAC,QAAD;WAAM,WAAU;qBACb,eACC,aAAa,QAAQ,aAAa,SACnC;WACI,CAAA;UACJ,CAAA;SACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;UAAI,WAAU;oBACZ,iBAAA,GAAA,kBAAA,KAAC,YAAD;WAAY,QAAQ,aAAa;qBAC9B,UAAU,aAAa,OAAO,IAAI,EAAE,iBAAiB;WAC3C,CAAA;UACV,CAAA;SACF;UAjCE,aAAa,mBAiCf,CACL;OAEE,CAAA;MACF;;IACJ,CAAA;GAEN,iBAAA,GAAA,kBAAA,KAAC,kBAAD;IACe;IACD;IACF;IACE;IACZ,cAAc;IACX;IACH,CAAA;GACE;;;;;AC3RV,SAAgB,cAAc,EAC5B,OACA,aACA,mBAAmB,UACnB,mBAAmB,UACnB,MACA,SACA,aACqB;CACrB,MAAM,CAAC,WAAW,iBAAA,GAAA,MAAA,UAAyB,MAAM;CAEjD,MAAM,gBAAgB,YAAY;AAChC,MAAI;GACF,MAAM,SAAS,WAAW;AAC1B,OAAI,kBAAkB,SAAS;AAC7B,iBAAa,KAAK;AAClB,UAAM;;WAED,OAAO;AACd,WAAQ,MAAM,kCAAkC,MAAM;YAC9C;AACR,gBAAa,MAAM;AACnB,WAAQ,MAAM;;;AAIlB,QACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,aAAD;EAAmB;EAAM,eAAe,MAAM,CAAC,aAAa,QAAQ,EAAE;YACpE,iBAAA,GAAA,kBAAA,MAACC,YAAAA,oBAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,MAACC,YAAAA,mBAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,kBAAD,EAAA,UAAmB,OAAyB,CAAA,EAC5C,iBAAA,GAAA,kBAAA,KAACC,YAAAA,wBAAD,EAAA,UAAyB,aAAqC,CAAA,CAC5C,EAAA,CAAA,EACpB,iBAAA,GAAA,kBAAA,MAACC,YAAAA,mBAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,mBAAD;GAAmB,UAAU;aAC1B;GACiB,CAAA,EACpB,iBAAA,GAAA,kBAAA,KAACC,YAAAA,mBAAD;GACE,SAAS;GACT,UAAU;GACV,WAAU;aAET,YAAY,QAAQ;GACH,CAAA,CACF,EAAA,CAAA,CACD,EAAA,CAAA;EACT,CAAA;;;;ACxClB,SAAS,6BAA6B;AACpC,QACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf,CAEE,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf;KACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,UAAD,EAAU,WAAU,iBAAkB,CAAA;KACtC,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,uBAAwB,CAAA,EAC5C,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,uBAAwB,CAAA,CACxC;;KACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,qBAAsB,CAAA,EAC1C,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf;QACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,aAAc,CAAA;QAClC,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,aAAc,CAAA;QAClC,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,aAAc,CAAA;QAC9B;SACF;;KACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf;OACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,cAAe,CAAA;OACnC,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,cAAe,CAAA;OACnC,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,cAAe,CAAA;OAC/B;;KACF;;GACF,CAAA,EAEN,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;IAAK,WAAU;cAAf;KACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,iBAAkB,CAAA;KACtC,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,uBAAwB,CAAA,EAC5C,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,uBAAwB,CAAA,CACxC;;KACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA,EACjC,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,uBAAwB,CAAA,EAC5C,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,uBAAwB,CAAA,CACxC;SACF;;KACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf;OACE,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,YAAa,CAAA;OACjC,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,uBAAwB,CAAA;OAC5C,iBAAA,GAAA,kBAAA,KAACA,YAAAA,UAAD,EAAU,WAAU,uBAAwB,CAAA;OACxC;;KACF;;GACF,CAAA,CACF;;;AAMV,SAAS,yBAAyB,EAChC,gBAGC;CACD,MAAM,UAAU,aAAa;CAC7B,MAAM,UAAU,SAAS;CACzB,MAAM,WAAW,aAAa;CAC9B,MAAM,aAAa,eAAe,aAAa,QAAQ,SAAS;CAChE,MAAM,WACJ,aAAa,kBAAkB,OAC3B,aAAa,iBAAiB,aAAa,QAC3C;CACN,MAAM,WACJ,WAAW,IACP,eAAe,aAAa,iBAAiB,SAAS,GACtD;AAEN,QACE,iBAAA,GAAA,kBAAA,KAAC,WAAD;EAAS,WAAU;YACjB,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf;IAEE,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBAA2C;MAEpD,CAAA,EACL,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBAAqC;SAE9C,CAAA,EACN,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBACZ,mBAAmB,aAAa;SAC7B,CAAA,CACF;WACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBAAqC;SAE9C,CAAA,EACN,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBACZ,eAAe,aAAa,QAAQ,SAAS;SAC1C,CAAA,CACF;UACF;UACN,iBAAA,GAAA,kBAAA,KAAC,MAAD,EAAI,WAAU,sBAAuB,CAAA,CACjC;QACF;;IAGN,iBAAA,GAAA,kBAAA,KAAC,OAAD;KAAK,WAAU;eACb,iBAAA,GAAA,kBAAA,KAAC,OAAD;MAAK,WAAU;gBACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;QAAK,WAAU;kBACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;SAAK,WAAU;mBAAf,CACG,SAAS,YACR,iBAAA,GAAA,kBAAA,KAAC,OAAD;UACE,KAAK,QAAQ;UACb,KAAK,SAAS,SAAS;UACvB,OAAO;UACP,QAAQ;UACR,WAAU;UACV,CAAA,GAEF,iBAAA,GAAA,kBAAA,KAAC,OAAD;UAAK,WAAU;oBAAuE;UAEhF,CAAA,EAEP,WAAW,KACV,iBAAA,GAAA,kBAAA,KAAC,QAAD;UAAM,WAAU;oBACb;UACI,CAAA,CAEL;;QACF,CAAA,EACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf;SACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;UACE,WAAU;UACV,OAAO,SAAS;oBAEf,SAAS;UACR,CAAA;SACH,SAAS,SAAS,SAAS,SAC1B,iBAAA,GAAA,kBAAA,KAAC,KAAD;UAAG,WAAU;oBACV,QAAQ;UACP,CAAA;SAEN,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;UAAG,WAAU;oBACV,eAAe,aAAa,QAAQ,SAAS;UAC5C,CAAA,EACA,CAAA;SACF;UACF;;MACF,CAAA;KACF,CAAA;IAGN,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf;MACG,WAAW,KACV,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;QAAG,WAAU;kBAA4C;QAErD,CAAA,EACJ,iBAAA,GAAA,kBAAA,KAAC,KAAD;QAAG,WAAU;kBACV;QACC,CAAA,CACA;UACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;QAAG,WAAU;kBAA4C;QAErD,CAAA,EACJ,iBAAA,GAAA,kBAAA,MAAC,KAAD;QAAG,WAAU;kBAAb,CAAyD,KACrD,eAAe,WAAW,SAAS,CACnC;UACA;SACL,EAAA,CAAA;MAEL,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;QAAG,WAAU;kBAA4C;QAAS,CAAA,EAClE,iBAAA,GAAA,kBAAA,KAAC,KAAD;QAAG,WAAU;kBACV,eAAe,aAAa,QAAQ,SAAS;QAC5C,CAAA,CACA;;MACN,iBAAA,GAAA,kBAAA,KAAC,QAAD;OAAM,WAAU;iBAAgC;OAEzC,CAAA;MACH;;IACF;;EACE,CAAA;;AAMd,SAAS,8BAA8B,EACrC,cACA,UACA,UACA,aACA,YACA,QACA,SACA,UACA,UACA,gBAYC;CACD,MAAM,OAAO,aAAa;CAC1B,MAAM,WAAW,aAAa;CAC9B,MAAM,aAAa,eAAe,aAAa,QAAQ,SAAS;CAEhE,MAAM,gBAAgB,aAAa;CACnC,MAAM,iBAAiB,eAAe;CAMtC,MAAM,oBACJ;AAEF,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAU;YACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf;IAEE,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBAA+C;MAExD,CAAA,EACL,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf;OACG,YAAY,KAAK,kBAChB,iBAAA,GAAA,kBAAA,MAACC,YAAAA,QAAD;QACE,SAAQ;QACR,SAAS;QACT,UAAU,cAAc,CAAC,aAAa;QACtC,WAAW;kBAJb,CAME,iBAAA,GAAA,kBAAA,KAACC,aAAAA,aAAD,EAAa,WAAU,oBAAqB,CAAA,EAC5C,iBAAA,GAAA,kBAAA,KAAC,QAAD;SAAM,WAAU;mBAAW;SAAsB,CAAA,CAC1C;;OAEV,YACC,iBAAA,GAAA,kBAAA,MAACD,YAAAA,QAAD;QACE,SAAQ;QACR,SAAS;QACT,UAAU;QACV,WAAW;kBAJb,CAME,iBAAA,GAAA,kBAAA,KAACE,aAAAA,OAAD,EAAO,WAAU,oBAAqB,CAAA,EACtC,iBAAA,GAAA,kBAAA,KAAC,QAAD;SAAM,WAAU;mBAAW;SAAyB,CAAA,CAC7C;;OAEV,YACC,iBAAA,GAAA,kBAAA,MAACF,YAAAA,QAAD;QACE,SAAQ;QACR,SAAS;QACT,UAAU;QACV,WAAW;kBAJb,CAME,iBAAA,GAAA,kBAAA,KAACG,aAAAA,MAAD,EAAM,WAAU,oBAAqB,CAAA,EACrC,iBAAA,GAAA,kBAAA,KAAC,QAAD;SAAM,WAAU;mBAAW;SAA0B,CAAA,CAC9C;;OAEX,iBAAA,GAAA,kBAAA,MAACH,YAAAA,QAAD;QACE,SAAQ;QACR,SAAS;QACT,UAAU,cAAc;QACxB,WAAW;kBAJb,CAME,iBAAA,GAAA,kBAAA,KAACI,aAAAA,SAAD,EAAS,WAAU,oBAAqB,CAAA,EACxC,iBAAA,GAAA,kBAAA,KAAC,QAAD;SAAM,WAAU;mBACb,cAAc,cAAc;SACxB,CAAA,CACA;;OACR,eACC,iBAAA,GAAA,kBAAA,MAACJ,YAAAA,QAAD;QACE,SAAQ;QACR,SAAS;QACT,UAAU;QACV,WAAW;kBAJb,CAME,iBAAA,GAAA,kBAAA,KAACK,aAAAA,WAAD,EAAW,WAAU,oBAAqB,CAAA,EAC1C,iBAAA,GAAA,kBAAA,KAAC,QAAD;SAAM,WAAU;mBAAW;SAA8B,CAAA,CAClD;;OAEP;QACF;;IAGN,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;OAAI,WAAU;iBAA0C;OAEnD,CAAA,EACL,iBAAA,GAAA,kBAAA,KAAC,YAAD;OAAY,QAAQ,aAAa;iBAC9B,UAAU,aAAa,OAAO;OACpB,CAAA,CACT;SACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf;OACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBAAgC;SAEzC,CAAA,EACN,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBACZ,4BAA4B,KAAK,sBAAsB;SACpD,CAAA,CACF;;OACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBAAgC;SAAkB,CAAA,EACjE,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBAA+B;SAAiB,CAAA,CAC3D;;OACL,aAAa,kBACZ,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBAAgC;SAAiB,CAAA,EAChE,iBAAA,GAAA,kBAAA,KAAC,OAAD;SAAK,WAAU;mBACZ,WAAW,aAAa,eAAe;SACpC,CAAA,CACF;;OAEJ;QACF;;IAGN,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBAA0C;MAEnD,CAAA,EACL,iBAAA,GAAA,kBAAA,MAAC,OAAD;MAAK,WAAU;gBAAf,CAEG,aAAa,WACZ,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;QAAK,WAAU;kBAA0C;QAEnD,CAAA,EACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf;SACE,iBAAA,GAAA,kBAAA,KAAC,KAAD;UAAG,WAAU;oBAAe,aAAa,QAAQ;UAAS,CAAA;SAC1D,iBAAA,GAAA,kBAAA,KAAC,KAAD,EAAA,UAAI,aAAa,QAAQ,UAAa,CAAA;SACrC,aAAa,QAAQ,YACpB,iBAAA,GAAA,kBAAA,KAAC,KAAD,EAAA,UAAI,aAAa,QAAQ,UAAa,CAAA;SAExC,iBAAA,GAAA,kBAAA,MAAC,KAAD,EAAA,UAAA;UACG,CAAC,aAAa,QAAQ,MAAM,aAAa,QAAQ,MAAM,CACrD,OAAO,QAAQ,CACf,KAAK,KAAK;UAAE;UACd,aAAa,QAAQ;UACpB,EAAA,CAAA;SACH,aAAa,QAAQ,gBACpB,iBAAA,GAAA,kBAAA,KAAC,KAAD,EAAA,UAAI,aAAa,QAAQ,cAAiB,CAAA;SAExC;UACF;UAIP,iBACC,iBAAA,GAAA,kBAAA,MAAC,OAAD;OAAK,WAAU;iBAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;QAAK,WAAU;kBAAqC;QAE9C,CAAA,EACN,iBAAA,GAAA,kBAAA,MAAC,OAAD;QAAK,WAAU;kBAAf,CACG,gBAAgB,YACf,iBAAA,GAAA,kBAAA,KAAC,OAAD;SACE,KAAK,eAAe;SACpB,KAAK,eAAe,aAAa;SACjC,WAAU;SACV,CAAA,EAEJ,iBAAA,GAAA,kBAAA,MAAC,QAAD;SAAM,WAAU;mBAAhB,CACG,gBAAgB,YACb,UAAU,eAAe,UAAU,GACnC,cAAc,cACjB,gBAAgB,QACb,cAAc,eAAe,UAC7B,GACC;WACH;UACF;SAEJ;QACF;;IAGL,aAAa,OAAO,SAAS,KAC5B,iBAAA,GAAA,kBAAA,MAAC,OAAD;KAAK,WAAU;eAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;MAAI,WAAU;gBAA+C;MAExD,CAAA,EACL,iBAAA,GAAA,kBAAA,KAAC,OAAD;MAAK,WAAU;gBACb,iBAAA,GAAA,kBAAA,MAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,iBAAA,GAAA,kBAAA,KAAC,SAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,MAAC,MAAD,EAAA,UAAA;QACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBAAwD;SAEjE,CAAA;QACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBAAwD;SAEjE,CAAA;QACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBAAwD;SAEjE,CAAA;QACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;SAAI,WAAU;mBAAyD;SAElE,CAAA;QACF,EAAA,CAAA,EACC,CAAA,EACR,iBAAA,GAAA,kBAAA,KAAC,SAAD;QAAO,WAAU;kBACd,aAAa,OAAO,KAAK,UACxB,iBAAA,GAAA,kBAAA,MAAC,MAAD,EAAA,UAAA;SACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;UAAI,WAAU;oBACX,MAAM,gBAAgB,IAAI,MAAM;UAC9B,CAAA;SACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;UAAI,WAAU;oBACX,WAAW,MAAM,WAAW,MAAM,IAAI,CAAC,MAAM,GAAG;UAC9C,CAAA;SACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;UAAI,WAAU;oBACZ,iBAAA,GAAA,kBAAA,KAAC,YAAD;WAAY,QAAQ,MAAM;qBACvB,UAAU,MAAM,OAAO;WACb,CAAA;UACV,CAAA;SACL,iBAAA,GAAA,kBAAA,KAAC,MAAD;UAAI,WAAU;oBACX,MAAM,UAAU,OACb,eAAe,OAAO,MAAM,OAAO,CAAC,GACpC;UACD,CAAA;SACF,EAAA,EAjBI,MAAM,GAiBV,CACL;QACI,CAAA,CACF;;MACJ,CAAA,CACF;;IAEJ;;EACF,CAAA;;AAMV,SAAgB,mBAAmB,EACjC,OACA,YACA,SACA,WACA,mBAC8C;CAC9C,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,UAA+B,MAAM;CAE7D,MAAM,EAAE,MAAM,WAAW,UAAU,gBAAgB,MAAM;CACzD,MAAM,eAAe,MAAM;CAC3B,MAAM,aAAa,cAAc,UAAU,MAAM;CAEjD,MAAM,gBAAgB,qBAAqB;EACzC,iBAAiB,YAAY,sBAAsB;EACnD,UAAU,QACR,kBAAkB,gCAAgC,IAAI;EACzD,CAAC;CAEF,MAAM,iBAAiB,sBAAsB;EAC3C,iBAAiB,YAAY,uBAAuB;EACpD,UAAU,QACR,kBAAkB,iCAAiC,IAAI;EAC1D,CAAC;CAEF,MAAM,eAAe,oBAAoB;EACvC,iBAAiB,YAAY,uBAAuB;EACpD,UAAU,QAAiB,kBAAkB,0BAA0B,IAAI;EAC5E,CAAC;CAEF,MAAM,iBAAiB,sBAAsB;EAC3C,iBAAiB;AACf,eAAY,yBAAyB;AACrC,sBAAmB,MAAM;;EAE3B,UAAU,QACR,kBAAkB,iCAAiC,IAAI;EAC1D,CAAC;CAEF,MAAM,qBAAqB,0BAA0B;EACnD,iBAAiB,YAAY,2BAA2B;EACxD,UAAU,QACR,kBAAkB,qCAAqC,IAAI;EAC9D,CAAC;AAEF,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,aAAa,MAChB,WAAU,MAAe;IAE1B;EAAC;EAAW;EAAO;EAAQ,CAAC;AAE/B,EAAA,GAAA,MAAA,iBAAgB;AACd,MAAI,CAAC,aAAa,CAAC,SAAS,CAAC,aAC3B,eAAc;IAEf;EAAC;EAAW;EAAO;EAAc;EAAW,CAAC;AAEhD,KAAI,UACF,QAAO,iBAAA,GAAA,kBAAA,KAAC,4BAAD,EAA8B,CAAA;AAGvC,KAAI,CAAC,aACH,QAAO;CAGT,MAAM,OAAO,aAAa;CAC1B,MAAM,WAAW,aAAa,WAAW;CACzC,MAAM,WAAW,aAAa,WAAW;CACzC,MAAM,cAAc,aAAa,WAAW;CAC5C,MAAM,aACJ,cAAc,aACd,eAAe,aACf,aAAa,aACb,eAAe,aACf,mBAAmB;CAErB,MAAM,oBAAoB;AACxB,gBAAc,OAAO;GACnB,mBAAmB;GACnB,aAAa,EAAE,YAAY;GAC5B,CAAC;;CAGJ,MAAM,qBAAqB;EACzB,MAAM,eAAe,sBACnB,KAAK,kBACL,KAAK,sBACN;AACD,iBAAe,OAAO;GACpB,mBAAmB;GACnB,cAAc;IAAE;IAAY;IAAc;GAC3C,CAAC;;CAGJ,MAAM,mBAAmB;EACvB,MAAM,eAAe,sBACnB,KAAK,kBACL,KAAK,sBACN;AACD,eAAa,OAAO;GAClB,mBAAmB;GACnB,YAAY;IAAE;IAAY;IAAc;GACzC,CAAC;;CAGJ,MAAM,qBAAqB;AACzB,iBAAe,OAAO;GAAE,mBAAmB;GAAO;GAAY,CAAC;;CAGjE,MAAM,yBAAyB;AAC7B,qBAAmB,OAAO;GACxB,mBAAmB;GACnB,kBAAkB,EAAE;GACrB,CAAC;;AAGJ,QACE,iBAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,MAAC,OAAD;EAAK,WAAU;YAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,0BAAD,EAAwC,cAAgB,CAAA,EACxD,iBAAA,GAAA,kBAAA,KAAC,+BAAD;GACgB;GACJ;GACA;GACG;GACD;GACZ,QAAQ;GACR,SAAS;GACT,UAAU;GACV,gBAAgB,mBAAmB,KAAK;GACxC,cAAc;GACd,CAAA,CACE;KACN,iBAAA,GAAA,kBAAA,KAAC,eAAD;EACE,OAAM;EACN,kBAAiB;EACjB,aAAY;EACZ,MAAM;EACN,SAAS;EACT,WAAW;EACX,CAAA,CACD,EAAA,CAAA;;;;AC3lBP,MAAM,eAAuC;CAC3C,KAAK;CACL,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,eAAe;CACf,SAAS;CACT,gBAAgB;CAChB,OAAO;CACP,QAAQ;CACR,wBAAwB;CACxB,gBAAgB;CAChB,OAAO;CACP,SAAS;CACT,UAAU;CACV,MAAM;CACN,YAAY;CACb;AAED,SAAgB,2BAA2B,EACzC,YACA,qBACqD;CACrD,MAAM,sBAAsBC,0BAAwB;CACpD,MAAM,EAAE,aAAaC,6BAAAA,kBAAkB;AAEvC,KAAI,kBACF,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAU;YACb,iBAAA,GAAA,kBAAA,MAAC,OAAD;GAAK,WAAU;aAAf,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,uCAAwC,CAAA,EACvD,iBAAA,GAAA,kBAAA,KAAC,OAAD,EAAK,WAAU,uCAAwC,CAAA,CACnD;;EACF,CAAA;AAIV,QACE,iBAAA,GAAA,kBAAA,KAAC,2BAAD;EAA2B,QAAQ;YACjC,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aACb,iBAAA,GAAA,kBAAA,KAAC,mBAAD;IACc;IACZ,sBAAsB,sBACpB,SAAS,yBAAyB,oBAAoB;IAExD,IAAI,QAAQ,aAAa,QAAQ;IACjC,CAAA;GACE,CAAA;EACoB,CAAA;;;;AChDhC,SAAgB,gCAAgC,EAC9C,OACA,WAC0D;CAC1D,MAAM,SAASC,0BAAwB;CACvC,MAAM,EAAE,aAAaC,6BAAAA,kBAAkB;AAEvC,QACE,iBAAA,GAAA,kBAAA,KAAC,2BAAD;EAAmC;YACjC,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aACb,iBAAA,GAAA,kBAAA,KAAC,oBAAD;IACS;IACP,kBAAkB;AAChB,aAAQ,0BAA0B,UAAU;AAC5C,cAAS,wBAAwB;;IAEnC,UAAU,QAAQ;AAGhB,aAAQ,gCADN,eAAe,QAAQ,IAAI,UAAU,uBACY,QAAQ;;IAE7D,YAAY,YAAY;AACtB,aAAQ,SAAS,UAAU;;IAE7B,kBAAkB,SAAS,QAAQ;AAGjC,aAAQ,GAAG,QAAQ,IADjB,eAAe,QAAQ,IAAI,UAAU,uBACN,QAAQ;;IAE3C,CAAA;GACE,CAAA;EACoB,CAAA;;;;ACXhC,SAAS,aAAa,SAAiB,MAAuC;AAC5E,KAAI,SAAS,WAAW,SAAS,UAC/B,SAAQ,KAAK,aAAa,QAAQ;KAElC,SAAQ,KAAK,aAAa,QAAQ;;AAItC,SAAgB,cAAc,EAC5B,SAEA,YACA,WACA,aACA,SACA,cAEA,GAAG,YACqC;CACxC,MAAM,EAAE,gBAAgBC,6BAAAA,kBAAkB;CAC1C,MAAM,EAAE,WAAWC,sBAAAA,iBAAiB;CACpC,MAAM,iBAAiB,WAAW;CAGlC,MAAM,EAAE,OAAO,SAAS,cAAc;CACtC,MAAM,iBAAiB,mBAAmB;CAC1C,MAAM,MAAM,SAAS;CAErB,MAAM,EACJ,MAAM,cACN,WAAW,mBACX,SAAS,qBAAA,GAAA,sBAAA,UACE;EACX,UAAU,CAAC,mBAAmB,MAAM,GAAG;EACvC,eAAeC,qBAAkC,gBAAgB,IAAI;EACrE,SAAS,CAAC,CAAC;EACZ,CAAC;CAEF,MAAM,aAAa,cAAc,UAAU;CAC3C,MAAM,aAAa,OAAO,cAAc;CASxC,MAAM,QAAQ,YAAY,MAAM,IAAI;CACpC,MAAM,WAAW,MAAM;CACvB,MAAM,cAAc,MAAM;AAQ1B,MAHG,aAAa,YAAY,CAAC,eAC1B,aAAa,mBAAmB,CAAC,gBAEb,mBAAmB,CAAC,kBACzC,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,GAAI;YACP,iBAAA,GAAA,kBAAA,KAAC,qBAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;GAAK,WAAU;aAAsD;GAE/D,CAAA,EACc,CAAA;EAClB,CAAA;AAIV,QACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,GAAI;YACP,iBAAA,GAAA,kBAAA,KAAC,qBAAD,EAAA,UACG,aAAa,YAAY,cACxB,iBAAA,GAAA,kBAAA,KAAC,0BAAD;GACE,OAAO;GACP,SAAS;GACT,CAAA,GACA,aAAa,WACf,iBAAA,GAAA,kBAAA,KAAC,qBAAD;GACc;GACO;GACnB,CAAA,GACA,aAAa,mBAAmB,cAClC,iBAAA,GAAA,kBAAA,KAAC,iCAAD;GACE,OAAO;GACP,SAAS;GACT,CAAA,GACA,aAAa,kBACf,iBAAA,GAAA,kBAAA,KAAC,4BAAD;GACc;GACO;GACnB,CAAA,GAEF,iBAAA,GAAA,kBAAA,KAAC,sBAAD;GACE,SAAS;GACG;GACZ,CAAA,EAEgB,CAAA;EAClB,CAAA;;AAIV,MAAa,8BAAoD;CAC/D,YAAY;CACZ,aAAa;CACb,YAAY,CAAC;EAAE,IAAI;EAAW,OAAO;EAAW,CAAC;CACjD,QAAQ,EAAE;CACX"}
|
|
1
|
+
{"version":3,"file":"AccountScreen-Dp6QFyEr.cjs","names":["useFluidAuthContext","useOrdersClient","useFluidContext","createOrdersFetchClient","useSubscriptionsClient","createSubscriptionsFetchClient","createFluidPayFetchClient","createCoreFetchClient","User","PackageOpen","Repeat","useAppNavigation","Button","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","Dialog","DialogContent","DialogHeader","DialogTitle","DialogFooter","DialogClose","Button","Accordion","AccordionItem","AccordionTrigger","Skeleton","AccordionContent","cn","FormTextField","cn","Label","Input","FormSelectField","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Dialog","DialogContent","DialogHeader","DialogTitle","FormTextField","FormSelectField","DialogFooter","DialogClose","Button","z","Avatar","AvatarFallback","Pencil","Accordion","AccordionItem","AccordionTrigger","Skeleton","AccordionContent","cn","Accordion","AccordionItem","AccordionTrigger","Skeleton","AccordionContent","cn","Dialog","DialogContent","DialogHeader","DialogTitle","Button","DialogFooter","DialogClose","z","Dialog","DialogContent","DialogHeader","DialogTitle","FormSelectField","FormTextField","DialogFooter","Button","cn","Input","cn","Controller","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","z","Dialog","DialogContent","DialogHeader","DialogTitle","Button","z","cn","vaultApi.fetchVaultCredentialsForPaymentAccount","Dialog","DialogContent","DialogHeader","DialogTitle","Button","translations","customersApi.fetchCustomerAccount","addressesApi.fetchCustomerAddresses","paymentMethodsApi.fetchCustomerPaymentMethods","customersApi.updateCustomer","addressesApi.deleteCustomerAddress","paymentMethodsApi.deleteCustomerPaymentMethod","paymentMethodsApi.updatePaymentMethod","addressesApi.createCustomerAddress","addressesApi.updateCustomerAddress","paymentMethodsApi.addCreditCardToCustomer","ordersApi.fetchOrder","ordersApi.fetchCustomerOrders","Search","Input","cn","ChevronLeft","ChevronRight","cn","cn","Skeleton","Card","CardHeader","CardTitle","CardContent","Card","CardHeader","CardTitle","CardContent","Truck","startCase","formatCurrency","startCase","Card","CardHeader","CardTitle","CardContent","startCase","Skeleton","formatCurrency","startCase","translations","useOrdersClient","useAppNavigation","useOrdersClient","useAppNavigation","subscriptionsApi.fetchCustomerSubscriptions","subscriptionsApi.fetchSubscription","subscriptionsApi.pauseSubscription","subscriptionsApi.resumeSubscription","subscriptionsApi.skipSubscription","subscriptionsApi.cancelSubscription","subscriptionsApi.reactivateSubscription","Button","Search","Input","Skeleton","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","Skeleton","Button","SkipForward","Pause","Play","XCircle","RotateCcw","useSubscriptionsClient","useAppNavigation","useSubscriptionsClient","useAppNavigation","useAppNavigation","useFluidContext","customersApi.fetchCustomerAccount"],"sources":["../../../platform/api-client-core/src/parse-api-errors.ts","../src/hooks/use-fluid-auth.ts","../../../fluid-pay/api-client/src/namespaces/customers.ts","../../../fluid-pay/api-client/src/namespaces/addresses.ts","../../../fluid-pay/api-client/src/namespaces/payment-methods.ts","../../../fluid-pay/api-client/src/namespaces/vault.ts","../../../orders/api-client/src/namespaces/orders.ts","../../../subscriptions/api-client/src/namespaces/subscriptions.ts","../src/account/use-account-clients.ts","../src/account/AccountManageLayout.tsx","../../../profile/core/src/context.ts","../../../profile/core/src/provider.tsx","../../../fluid-pay/core/src/utils/country-config.ts","../../../fluid-pay/core/src/hooks/use-country-states.ts","../../../profile/ui/src/components/ellipses-dropdown.tsx","../../../profile/ui/src/components/confirm-action-dialog.tsx","../../../profile/ui/src/components/customer-points-ledger.tsx","../../../profile/ui/src/components/form-fields.tsx","../../../profile/ui/src/components/user-info-dialog.tsx","../../../profile/ui/src/components/customer-info.tsx","../../../profile/ui/src/components/address-dropdown.tsx","../../../profile/ui/src/components/addresses.tsx","../../../profile/ui/src/components/payment-method-dropdown.tsx","../../../profile/ui/src/components/view-payment-method-dialog.tsx","../../../profile/ui/src/components/edit-payment-method-dialog.tsx","../../../profile/ui/src/components/payment-methods.tsx","../../../profile/ui/src/components/profile.tsx","../../../fluid-pay/ui/src/components/form-fields/FormTextField.tsx","../../../fluid-pay/ui/src/components/form-fields/FormSelectField.tsx","../../../fluid-pay/ui/src/components/AddressFormDialog.tsx","../../../fluid-pay/ui/src/hooks/use-vgs-collect.ts","../../../fluid-pay/ui/src/components/CreditCardFormDialog.tsx","../src/screens/AccountProfileScreen.tsx","../../../orders/core/src/context.ts","../../../orders/core/src/provider.tsx","../../../orders/core/src/query-keys.ts","../../../orders/core/src/hooks/use-order.ts","../../../orders/core/src/hooks/use-customer-orders.ts","../../../orders/core/src/utils/format-order-total.ts","../../../orders/ui/src/components/search-input.tsx","../../../orders/ui/src/components/pagination-footer.tsx","../../../orders/ui/src/components/status-badge.tsx","../../../orders/ui/src/components/table-column.tsx","../../../orders/ui/src/components/orders-list.tsx","../../../orders/ui/src/components/section.tsx","../../../orders/ui/src/components/shipping-address-card.tsx","../../../orders/ui/src/lib/format.ts","../../../orders/ui/src/components/payment-method-card.tsx","../../../orders/ui/src/components/order-status-badge.tsx","../../../orders/ui/src/components/order-detail.tsx","../src/screens/AccountOrdersScreen.tsx","../src/screens/AccountOrderDetailScreen.tsx","../../../subscriptions/core/src/context.ts","../../../subscriptions/core/src/provider.tsx","../../../subscriptions/core/src/query-keys.ts","../../../subscriptions/core/src/hooks/use-subscriptions.ts","../../../subscriptions/core/src/hooks/use-subscription.ts","../../../subscriptions/core/src/hooks/use-pause-subscription.ts","../../../subscriptions/core/src/hooks/use-resume-subscription.ts","../../../subscriptions/core/src/hooks/use-skip-subscription.ts","../../../subscriptions/core/src/hooks/use-cancel-subscription.ts","../../../subscriptions/core/src/hooks/use-reactivate-subscription.ts","../../../subscriptions/core/src/utils/subscription-helpers.ts","../../../subscriptions/ui/src/lib/cn.ts","../../../subscriptions/ui/src/lib/format.ts","../../../subscriptions/ui/src/components/status-pill.tsx","../../../subscriptions/ui/src/components/subscriptions-list.tsx","../../../subscriptions/ui/src/components/confirm-dialog.tsx","../../../subscriptions/ui/src/components/subscription-detail.tsx","../src/screens/AccountSubscriptionsScreen.tsx","../src/screens/AccountSubscriptionDetailScreen.tsx","../src/screens/AccountScreen.tsx"],"sourcesContent":["/**\n * Framework-agnostic API error parsing utilities.\n *\n * Extracts structured field-level errors from API responses and formats\n * them into human-readable messages. Works with ApiError from this package\n * as well as any error object that has `status`, `data`, and optional `message`.\n */\n\n/**\n * Converts snake_case or camelCase field names to Title Case\n */\nexport function formatFieldName(field: string): string {\n return field\n .replace(/_/g, \" \")\n .replace(/([A-Z])/g, \" $1\")\n .split(\" \")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\" \")\n .trim();\n}\n\nexport interface ParsedFieldError {\n field: string;\n messages: string[];\n}\n\n/**\n * Type guard to check if an error looks like an API error\n */\nexport function isApiLikeError(\n error: unknown,\n): error is { message: string | undefined; status: number; data: unknown } {\n if (!error || typeof error !== \"object\") {\n return false;\n }\n\n const err = error as Record<string, unknown>;\n return (\n typeof err.status === \"number\" &&\n \"data\" in err &&\n (typeof err.message === \"string\" || err.message === undefined)\n );\n}\n\n/**\n * Extracts field-level errors from API error data\n */\nexport function extractFieldErrors(data: unknown): ParsedFieldError[] {\n const errors: ParsedFieldError[] = [];\n\n if (!data || typeof data !== \"object\") {\n return errors;\n }\n\n const errorObj = data as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(errorObj)) {\n if (Array.isArray(value) && value.length > 0) {\n errors.push({\n field: formatFieldName(key),\n messages: value.map((item) =>\n typeof item === \"string\" ? item : JSON.stringify(item),\n ),\n });\n } else if (typeof value === \"string\" && value.length > 0) {\n errors.push({\n field: formatFieldName(key),\n messages: [value],\n });\n } else if (value && typeof value === \"object\" && !Array.isArray(value)) {\n const nestedErrors = extractFieldErrors(value);\n nestedErrors.forEach((nestedError) => {\n errors.push({\n field: `${formatFieldName(key)} → ${nestedError.field}`,\n messages: nestedError.messages,\n });\n });\n }\n }\n\n return errors;\n}\n\n/**\n * Formats field errors into a readable description string\n */\nexport function formatErrorDescription(errors: ParsedFieldError[]): string {\n if (errors.length === 0) {\n return \"\";\n }\n\n if (errors.length === 1) {\n const err = errors[0];\n if (!err) return \"\";\n const message = err.messages[0] || \"is invalid\";\n return `${err.field} ${message}`;\n }\n\n if (errors.length <= 3) {\n return errors\n .map((e) => `${e.field} ${e.messages[0] || \"is invalid\"}`)\n .join(\"\\n\");\n }\n\n const shown = errors\n .slice(0, 3)\n .map((e) => `${e.field} ${e.messages[0] || \"is invalid\"}`)\n .join(\"\\n\");\n const remaining = errors.length - 3;\n return `${shown}\\n...and ${remaining} more ${remaining === 1 ? \"error\" : \"errors\"}`;\n}\n\n/**\n * Parses an error and returns a human-readable description string.\n *\n * Handles:\n * - API-like errors with structured field-level data\n * - API-like errors with a top-level message\n * - Standard Error instances\n * - Falls back to the provided fallback string\n *\n * @param error - The error to parse (ApiError, Error, or unknown)\n * @param fallback - Optional fallback description if error cannot be parsed\n * @returns A human-readable error description, or undefined if nothing could be extracted\n */\nexport function parseApiErrors(\n error: unknown,\n fallback?: string,\n): string | undefined {\n if (isApiLikeError(error)) {\n if (error.data) {\n const fieldErrors = extractFieldErrors(error.data);\n if (fieldErrors.length > 0) {\n return formatErrorDescription(fieldErrors);\n }\n }\n\n if (error.message) {\n return error.message;\n }\n } else if (error instanceof Error) {\n return error.message;\n }\n\n return fallback;\n}\n","/**\n * useFluidAuth Hook\n *\n * Provides access to authentication state and utilities.\n * This is the primary hook for interacting with auth in components.\n */\n\nimport { useFluidAuthContext } from \"../providers/FluidAuthProvider\";\nimport type { FluidAuthContextValue } from \"../auth/types\";\n\n/**\n * Hook to access authentication state and utilities.\n *\n * Must be used within a `FluidAuthProvider`.\n *\n * @returns Authentication context with user info, loading state, and utilities\n * @throws Error if used outside FluidAuthProvider\n *\n * @example\n * ```tsx\n * function UserProfile() {\n * const { isAuthenticated, isLoading, user, clearAuth } = useFluidAuth();\n *\n * if (isLoading) {\n * return <Spinner />;\n * }\n *\n * if (!isAuthenticated) {\n * return <p>Please log in</p>;\n * }\n *\n * return (\n * <div>\n * <p>Welcome, {user.full_name}!</p>\n * <button onClick={clearAuth}>Log out</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useFluidAuth(): FluidAuthContextValue {\n return useFluidAuthContext();\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch the current customer's account info.\n * Endpoint: GET /fluid_pay/me?jwt={jwt}\n */\nexport async function fetchCustomerAccount(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.CustomerAccount> {\n return client.get(`/fluid_pay/me`, { jwt });\n}\n\n/**\n * Update customer profile (name, phone, language).\n * Endpoint: PATCH /fluid_pay/update_me?jwt={jwt}\n */\nexport async function updateCustomer(\n client: FetchClient,\n jwt: string,\n body: fluidPay.UpdateCustomerBody,\n): Promise<fluidPay.FluidPayAccountResponse> {\n return client.patch(`/fluid_pay/update_me?jwt=${jwt}`, {\n fluid_pay_account: body,\n });\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch all customer addresses.\n * Endpoint: GET /fluid_pay/addresses?jwt={jwt}\n */\nexport async function fetchCustomerAddresses(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.CustomerAddressResponse> {\n return client.get(\"/fluid_pay/addresses\", {\n jwt,\n page: \"1\",\n per_page: \"100\",\n });\n}\n\n/**\n * Create a new customer address.\n * Endpoint: POST /fluid_pay/create_address?jwt={jwt}\n */\nexport async function createCustomerAddress(\n client: FetchClient,\n jwt: string,\n body: fluidPay.CreateAddressBody,\n): Promise<fluidPay.CreateCustomerAddressResponse> {\n return client.post(`/fluid_pay/create_address?jwt=${jwt}`, body);\n}\n\n/**\n * Update an existing customer address.\n * Endpoint: PATCH /fluid_pay/update_address/{addressId}?jwt={jwt}\n */\nexport async function updateCustomerAddress(\n client: FetchClient,\n jwt: string,\n addressId: number,\n body: fluidPay.CreateAddressBody,\n): Promise<fluidPay.CreateCustomerAddressResponse> {\n return client.patch(\n `/fluid_pay/update_address/${addressId}?jwt=${jwt}`,\n body,\n );\n}\n\n/**\n * Delete a customer address.\n * Endpoint: DELETE /fluid_pay/delete_address/{addressId}?jwt={jwt}\n */\nexport async function deleteCustomerAddress(\n client: FetchClient,\n jwt: string,\n addressId: number,\n): Promise<Record<string, never>> {\n return client.delete(`/fluid_pay/delete_address/${addressId}?jwt=${jwt}`);\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch all customer payment methods.\n * Endpoint: GET /fluid_pay/payment_methods?jwt={jwt}\n */\nexport async function fetchCustomerPaymentMethods(\n client: FetchClient,\n jwt: string,\n countryCode?: string,\n): Promise<fluidPay.CustomerPaymentMethodsResponse> {\n const params: Record<string, string> = {\n jwt,\n page: \"1\",\n per_page: \"100\",\n };\n if (countryCode) params.country_code = countryCode;\n\n return client.get(\"/fluid_pay/payment_methods\", params);\n}\n\n/**\n * Add a credit card to the customer's account.\n * Endpoint: POST /fluid_pay/create_payment_method?jwt={jwt}\n */\nexport async function addCreditCardToCustomer(\n client: FetchClient,\n jwt: string,\n data: fluidPay.AddCreditCardData,\n): Promise<fluidPay.CreateCustomerPaymentMethodResponse> {\n return client.post(`/fluid_pay/create_payment_method?jwt=${jwt}`, data);\n}\n\n/**\n * Delete a customer payment method.\n * Endpoint: DELETE /fluid_pay/delete_payment_method/{id}?jwt={jwt}\n */\nexport async function deleteCustomerPaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n): Promise<unknown> {\n return client.delete(\n `/fluid_pay/delete_payment_method/${paymentMethodId}?jwt=${jwt}`,\n );\n}\n\n/**\n * Set a payment method as default.\n * Endpoint: PATCH /fluid_pay/update_payment_method/{id}?jwt={jwt}\n */\nexport async function updateDefaultPaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n): Promise<fluidPay.UpdateDefaultPaymentMethodResponse> {\n return client.patch(\n `/fluid_pay/update_payment_method/${paymentMethodId}?jwt=${jwt}`,\n );\n}\n\n/**\n * Update a payment method (default status, billing address).\n * Endpoint: PATCH /fluid_pay/update_payment_method/{id}?jwt={jwt}\n */\nexport async function updatePaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n body?: fluidPay.UpdatePaymentMethodInput,\n): Promise<fluidPay.UpdatePaymentMethodResponse> {\n return client.patch(\n `/fluid_pay/update_payment_method/${paymentMethodId}?jwt=${jwt}`,\n body,\n );\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch VGS vault credentials for the customer's payment account.\n * Endpoint: GET /fluid_pay/vault?jwt={jwt}\n */\nexport async function fetchVaultCredentialsForPaymentAccount(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.VaultResponse> {\n return client.get(\"/fluid_pay/vault\", { jwt });\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { orders } from \"../custom/orders\";\n\n/**\n * Fetch a single order by token.\n * Endpoint: GET /public/v2025-06/orders/{orderToken}\n */\nexport async function fetchOrder(\n client: FetchClient,\n orderToken: string,\n): Promise<orders.OrderResponse> {\n return client.get(`/public/v2025-06/orders/${orderToken}`);\n}\n\n/**\n * Fetch a paginated list of customer orders.\n * Endpoint: GET /v202506/orders\n */\nexport async function fetchCustomerOrders(\n client: FetchClient,\n params: orders.FetchOrdersParams,\n): Promise<orders.CustomerOrdersResponse> {\n const input: Record<string, string> = {};\n\n if (params.cursor) input[\"page[cursor]\"] = params.cursor;\n if (params.limit != null) input[\"page[limit]\"] = params.limit.toString();\n if (params.search) input.search = params.search;\n if (params.sort) input.sort = params.sort;\n if (params.status) input.status = params.status;\n if (params.type) input.type = params.type;\n if (params.customerId != null)\n input.customer_id = params.customerId.toString();\n if (params.userCompanyId != null)\n input.user_company_id = params.userCompanyId.toString();\n if (params.subscriptionId != null)\n input.subscription_id = params.subscriptionId.toString();\n if (params.startDate) input.start_date = params.startDate;\n if (params.endDate) input.end_date = params.endDate;\n if (params.withinDays != null)\n input.within_days = params.withinDays.toString();\n if (params.cartSource) input.cart_source = params.cartSource;\n if (params.countryIsos) input.country_isos = params.countryIsos;\n if (params.forceStats != null)\n input.force_stats = params.forceStats.toString();\n\n return client.get(\"/v202506/orders\", input);\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { subscriptions } from \"../custom/subscriptions\";\n\n/**\n * Fetch a paginated list of customer subscriptions.\n * Endpoint: GET /subscriptions\n */\nexport async function fetchCustomerSubscriptions(\n client: FetchClient,\n params: subscriptions.FetchSubscriptionsParams,\n): Promise<subscriptions.SubscriptionsResponse> {\n const input: Record<string, string> = {\n customer_id: params.customerId.toString(),\n page: (params.page ?? 1).toString(),\n per_page: (params.perPage ?? 10).toString(),\n };\n\n if (params.status != null) input.status = params.status;\n if (params.search != null) input.search = params.search;\n if (params.sortBy != null) input.sort_by = params.sortBy;\n if (params.sortDirection != null) input.sort_direction = params.sortDirection;\n\n return client.get(\"/subscriptions\", input);\n}\n\n/**\n * Fetch a single subscription by token.\n * Endpoint: GET /subscriptions/{token}\n */\nexport async function fetchSubscription(\n client: FetchClient,\n subscriptionToken: string,\n): Promise<subscriptions.SubscriptionDetail> {\n return client.get(`/subscriptions/${subscriptionToken}`);\n}\n\n/**\n * Pause a subscription.\n * Endpoint: POST /subscriptions/{token}/pause\n */\nexport async function pauseSubscription(\n client: FetchClient,\n subscriptionToken: string,\n params: subscriptions.PauseSubscriptionParams,\n): Promise<subscriptions.SubscriptionDetail> {\n const queryParams: Record<string, string> = {\n customer_id: params.customerId.toString(),\n };\n\n if (params.nextBillDate != null) {\n queryParams.next_bill_date = params.nextBillDate;\n }\n if (params.numberOfOrders != null) {\n queryParams.number_of_orders = params.numberOfOrders.toString();\n }\n\n const query = new URLSearchParams(queryParams).toString();\n return client.post(`/subscriptions/${subscriptionToken}/pause?${query}`);\n}\n\n/**\n * Resume a paused subscription.\n * Endpoint: POST /subscriptions/{token}/resume\n */\nexport async function resumeSubscription(\n client: FetchClient,\n subscriptionToken: string,\n params: subscriptions.ResumeSubscriptionParams,\n): Promise<subscriptions.SubscriptionDetail> {\n const query = new URLSearchParams({\n customer_id: params.customerId.toString(),\n next_bill_date: params.nextBillDate,\n }).toString();\n\n return client.post(`/subscriptions/${subscriptionToken}/resume?${query}`);\n}\n\n/**\n * Skip the next billing cycle.\n * Endpoint: POST /subscriptions/{token}/skip_next_billing\n */\nexport async function skipSubscription(\n client: FetchClient,\n subscriptionToken: string,\n params: subscriptions.SkipSubscriptionParams,\n): Promise<subscriptions.SubscriptionDetail> {\n const query = new URLSearchParams({\n customer_id: params.customerId.toString(),\n next_bill_date: params.nextBillDate,\n }).toString();\n\n return client.post(\n `/subscriptions/${subscriptionToken}/skip_next_billing?${query}`,\n );\n}\n\n/**\n * Cancel a subscription.\n * Endpoint: POST /subscriptions/{token}/cancel\n */\nexport async function cancelSubscription(\n client: FetchClient,\n subscriptionToken: string,\n customerId: number,\n): Promise<subscriptions.SubscriptionDetail> {\n const query = new URLSearchParams({\n customer_id: customerId.toString(),\n }).toString();\n\n return client.post(`/subscriptions/${subscriptionToken}/cancel?${query}`);\n}\n\n/**\n * Reactivate a cancelled subscription.\n * Endpoint: POST /subscriptions/{token}/reactivate\n */\nexport async function reactivateSubscription(\n client: FetchClient,\n subscriptionToken: string,\n params: subscriptions.ReactivateSubscriptionParams,\n): Promise<subscriptions.SubscriptionDetail> {\n const body =\n params.process_immediately === true\n ? { process_immediately: true }\n : params.next_bill_date\n ? { next_bill_date: params.next_bill_date }\n : {};\n\n return client.post(\n `/subscriptions/${subscriptionToken}/reactivate`,\n Object.keys(body).length > 0 ? body : undefined,\n );\n}\n\n/**\n * Update subscription info (plan, variant, address, payment method, quantity).\n * Endpoint: PUT /subscriptions/{token}\n */\nexport async function updateSubscriptionInfo(\n client: FetchClient,\n subscriptionToken: string,\n body: subscriptions.UpdateSubscriptionInfoBody,\n): Promise<subscriptions.SubscriptionDetail> {\n return client.put(`/subscriptions/${subscriptionToken}`, {\n subscription: body,\n });\n}\n\n/**\n * Create a new subscription. Two-step process: creates a cart first, then the subscription.\n * Endpoint: POST /carts + POST /subscriptions\n */\nexport async function createSubscription(\n client: FetchClient,\n data: subscriptions.CreateSubscriptionData,\n): Promise<subscriptions.SubscriptionCreateResponse> {\n // Step 1: Create a cart with the subscription item\n const cartResponse = await client.post<subscriptions.CartCreateResponse>(\n \"/carts\",\n {\n country_code: \"US\",\n items: [\n {\n variant_id: data.variant_id,\n quantity: data.quantity ?? 1,\n subscription: true,\n subscription_plan_id: data.subscription_plan_id,\n },\n ],\n },\n );\n\n // Step 2: Create the subscription using the cart token\n return client.post(\"/subscriptions\", {\n subscription: {\n ...data,\n cart_token: cartResponse.cart.cart_token,\n },\n });\n}\n","import { useMemo } from \"react\";\nimport {\n createFetchClient as createOrdersFetchClient,\n type FetchClient as OrdersFetchClient,\n} from \"@fluid-app/orders-api-client\";\nimport {\n createFetchClient as createSubscriptionsFetchClient,\n type FetchClient as SubscriptionsFetchClient,\n} from \"@fluid-app/subscriptions-api-client\";\nimport {\n createFetchClient as createFluidPayFetchClient,\n type FetchClient as FluidPayFetchClient,\n} from \"@fluid-app/fluid-pay-api-client\";\nimport {\n createFetchClient as createCoreFetchClient,\n type FetchClient as CoreFetchClient,\n} from \"@fluid-app/api-client-core\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { useFluidAuth } from \"../hooks/use-fluid-auth\";\n\n/** API version prefix for versioned endpoints (e.g. points ledger) */\nexport const API_VERSION = \"/v202506\";\n\n/**\n * Ensures baseUrl ends with /api.\n * Domain-specific API clients (orders, subscriptions, fluid-pay) use endpoint\n * paths without /api (e.g. /fluid_pay/me, /subscriptions), matching fluid-admin's\n * NEXT_PUBLIC_API_URL convention. The portal SDK's config.baseUrl is the domain\n * root (e.g. https://api.fluid.app), so we append /api here.\n */\nfunction withApiPrefix(baseUrl: string): string {\n const base = baseUrl.replace(/\\/+$/, \"\");\n return base.endsWith(\"/api\") ? base : `${base}/api`;\n}\n\nexport function useOrdersClient(): OrdersFetchClient {\n const { config } = useFluidContext();\n const { token } = useFluidAuth();\n\n return useMemo(\n () =>\n createOrdersFetchClient({\n baseUrl: withApiPrefix(config.baseUrl),\n getAuthToken: () => token,\n onAuthError: config.onAuthError,\n }),\n [config.baseUrl, config.onAuthError, token],\n );\n}\n\nexport function useSubscriptionsClient(): SubscriptionsFetchClient {\n const { config } = useFluidContext();\n const { token } = useFluidAuth();\n\n return useMemo(\n () =>\n createSubscriptionsFetchClient({\n baseUrl: withApiPrefix(config.baseUrl),\n getAuthToken: () => token,\n onAuthError: config.onAuthError,\n }),\n [config.baseUrl, config.onAuthError, token],\n );\n}\n\nexport function useFluidPayClient(): FluidPayFetchClient {\n const { config } = useFluidContext();\n const { token } = useFluidAuth();\n\n return useMemo(\n () =>\n createFluidPayFetchClient({\n baseUrl: withApiPrefix(config.baseUrl),\n getAuthToken: () => token,\n onAuthError: config.onAuthError,\n }),\n [config.baseUrl, config.onAuthError, token],\n );\n}\n\n/**\n * Generic SDK fetch client for endpoints not covered by domain-specific clients\n * (e.g. /countries, /v202506/customers/:id/points_ledgers).\n * Uses the same auth/baseUrl/error handling as the domain clients.\n */\nexport function useSdkClient(): CoreFetchClient {\n const { config } = useFluidContext();\n const { token } = useFluidAuth();\n\n return useMemo(\n () =>\n createCoreFetchClient({\n baseUrl: withApiPrefix(config.baseUrl),\n getAuthToken: () => token,\n onAuthError: config.onAuthError,\n }),\n [config.baseUrl, config.onAuthError, token],\n );\n}\n","import { PackageOpen, Repeat, User, type LucideIcon } from \"lucide-react\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ntype ManageTab = \"profile\" | \"orders\" | \"subscriptions\";\n\nconst NAV_ITEMS: {\n key: ManageTab;\n label: string;\n slug: string;\n icon: LucideIcon;\n}[] = [\n { key: \"profile\", label: \"Profile\", slug: \"account/profile\", icon: User },\n {\n key: \"orders\",\n label: \"Orders\",\n slug: \"account/orders\",\n icon: PackageOpen,\n },\n {\n key: \"subscriptions\",\n label: \"Subscriptions\",\n slug: \"account/subscriptions\",\n icon: Repeat,\n },\n];\n\nfunction getActiveTab(slug: string): ManageTab {\n const parts = slug.split(\"/\");\n const sub = parts[1];\n if (sub === \"orders\") return \"orders\";\n if (sub === \"subscriptions\") return \"subscriptions\";\n return \"profile\";\n}\n\nexport function AccountManageLayout({\n children,\n}: {\n children: React.ReactNode;\n}): React.JSX.Element {\n const { currentSlug, navigate } = useAppNavigation();\n const activeTab = getActiveTab(currentSlug);\n\n return (\n <div className=\"flex flex-col md:flex-row\">\n {/* Mobile: horizontal tab bar */}\n <nav className=\"flex gap-1 overflow-x-auto border-b px-4 py-2 md:hidden\">\n {NAV_ITEMS.map(({ key, slug, label, icon: Icon }) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => navigate(slug)}\n className={`flex items-center gap-2 rounded-md px-3 py-2 text-sm font-medium whitespace-nowrap ${\n activeTab === key\n ? \"bg-sidebar-primary text-sidebar-primary-foreground\"\n : \"hover:bg-sidebar-primary hover:text-sidebar-primary-foreground\"\n }`}\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </button>\n ))}\n </nav>\n\n {/* Desktop: vertical sidebar */}\n <nav className=\"hidden w-48 shrink-0 flex-col gap-1 p-4 md:flex\">\n {NAV_ITEMS.map(({ key, slug, label, icon: Icon }) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => navigate(slug)}\n className={`flex items-center gap-2 rounded-md px-3 py-2 text-left text-sm font-medium ${\n activeTab === key\n ? \"bg-sidebar-primary text-sidebar-primary-foreground\"\n : \"hover:bg-sidebar-primary hover:text-sidebar-primary-foreground\"\n }`}\n >\n <Icon className=\"h-4 w-4\" />\n {label}\n </button>\n ))}\n </nav>\n\n {/* Content */}\n <div className=\"min-w-0 flex-1\">{children}</div>\n </div>\n );\n}\n","import { createContext, useContext } from \"react\";\n\nexport type TranslationFn = (key: string) => string;\n\nexport interface ProfileUIContextValue {\n t: TranslationFn;\n}\n\nexport const ProfileUIContext = createContext<ProfileUIContextValue | null>(\n null,\n);\n\nexport function useProfileUI(): ProfileUIContextValue {\n const context = useContext(ProfileUIContext);\n if (!context) {\n throw new Error(\"useProfileUI must be used within a ProfileUIProvider\");\n }\n return context;\n}\n","import type { JSX, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { ProfileUIContext, type TranslationFn } from \"./context\";\n\nexport interface ProfileUIProviderProps {\n t: TranslationFn;\n children: ReactNode;\n}\n\nexport function ProfileUIProvider({\n t,\n children,\n}: ProfileUIProviderProps): JSX.Element {\n const value = useMemo(() => ({ t }), [t]);\n return (\n <ProfileUIContext.Provider value={value}>\n {children}\n </ProfileUIContext.Provider>\n );\n}\n","export interface State {\n name: string;\n isoCode: string;\n}\n\nexport interface RegionConfig {\n regionLabel: string;\n postalLabel: string;\n}\n\nexport const US_STATES: State[] = [\n { name: \"Alabama\", isoCode: \"AL\" },\n { name: \"Alaska\", isoCode: \"AK\" },\n { name: \"Arizona\", isoCode: \"AZ\" },\n { name: \"Arkansas\", isoCode: \"AR\" },\n { name: \"California\", isoCode: \"CA\" },\n { name: \"Colorado\", isoCode: \"CO\" },\n { name: \"Connecticut\", isoCode: \"CT\" },\n { name: \"Delaware\", isoCode: \"DE\" },\n { name: \"Florida\", isoCode: \"FL\" },\n { name: \"Georgia\", isoCode: \"GA\" },\n { name: \"Hawaii\", isoCode: \"HI\" },\n { name: \"Idaho\", isoCode: \"ID\" },\n { name: \"Illinois\", isoCode: \"IL\" },\n { name: \"Indiana\", isoCode: \"IN\" },\n { name: \"Iowa\", isoCode: \"IA\" },\n { name: \"Kansas\", isoCode: \"KS\" },\n { name: \"Kentucky\", isoCode: \"KY\" },\n { name: \"Louisiana\", isoCode: \"LA\" },\n { name: \"Maine\", isoCode: \"ME\" },\n { name: \"Maryland\", isoCode: \"MD\" },\n { name: \"Massachusetts\", isoCode: \"MA\" },\n { name: \"Michigan\", isoCode: \"MI\" },\n { name: \"Minnesota\", isoCode: \"MN\" },\n { name: \"Mississippi\", isoCode: \"MS\" },\n { name: \"Missouri\", isoCode: \"MO\" },\n { name: \"Montana\", isoCode: \"MT\" },\n { name: \"Nebraska\", isoCode: \"NE\" },\n { name: \"Nevada\", isoCode: \"NV\" },\n { name: \"New Hampshire\", isoCode: \"NH\" },\n { name: \"New Jersey\", isoCode: \"NJ\" },\n { name: \"New Mexico\", isoCode: \"NM\" },\n { name: \"New York\", isoCode: \"NY\" },\n { name: \"North Carolina\", isoCode: \"NC\" },\n { name: \"North Dakota\", isoCode: \"ND\" },\n { name: \"Ohio\", isoCode: \"OH\" },\n { name: \"Oklahoma\", isoCode: \"OK\" },\n { name: \"Oregon\", isoCode: \"OR\" },\n { name: \"Pennsylvania\", isoCode: \"PA\" },\n { name: \"Rhode Island\", isoCode: \"RI\" },\n { name: \"South Carolina\", isoCode: \"SC\" },\n { name: \"South Dakota\", isoCode: \"SD\" },\n { name: \"Tennessee\", isoCode: \"TN\" },\n { name: \"Texas\", isoCode: \"TX\" },\n { name: \"Utah\", isoCode: \"UT\" },\n { name: \"Vermont\", isoCode: \"VT\" },\n { name: \"Virginia\", isoCode: \"VA\" },\n { name: \"Washington\", isoCode: \"WA\" },\n { name: \"West Virginia\", isoCode: \"WV\" },\n { name: \"Wisconsin\", isoCode: \"WI\" },\n { name: \"Wyoming\", isoCode: \"WY\" },\n { name: \"District of Columbia\", isoCode: \"DC\" },\n];\n\nexport const COUNTRY_CONFIGS: Record<string, RegionConfig> = {\n US: { regionLabel: \"State\", postalLabel: \"ZIP Code\" },\n JP: { regionLabel: \"Prefecture\", postalLabel: \"Postal Code\" },\n};\n\nconst DEFAULT_REGION_CONFIG: RegionConfig = {\n regionLabel: \"Province\",\n postalLabel: \"Postal Code\",\n};\n\nexport function getRegionConfig(countryCode: string): RegionConfig {\n return COUNTRY_CONFIGS[countryCode] ?? DEFAULT_REGION_CONFIG;\n}\n\nexport const DEFAULT_ADDRESS_FIELDS = [\n { field: \"first_name\", label: \"First Name\", required: true },\n { field: \"last_name\", label: \"Last Name\", required: true },\n { field: \"address1\", label: \"Address\", required: true },\n { field: \"address2\", label: \"Apartment, suite, etc.\", required: false },\n { field: \"city\", label: \"City\", required: true },\n { field: \"state\", label: \"State\", required: true },\n { field: \"postal_code\", label: \"Postal Code\", required: true },\n { field: \"country_code\", label: \"Country\", required: true },\n];\n","import { useCallback, useState } from \"react\";\nimport {\n US_STATES,\n getRegionConfig,\n type State,\n} from \"../utils/country-config\";\n\nexport default function useCountryStates() {\n const [selectedCountry, setSelectedCountry] = useState<string>(\"US\");\n const [stateOptions, setStateOptions] = useState<State[]>(US_STATES);\n\n const handleCountryChange = useCallback(\n (\n selectedCountryCode: string,\n fetchStates?: (countryCode: string) => Promise<State[]>,\n ) => {\n setSelectedCountry(selectedCountryCode);\n if (selectedCountryCode === \"US\") {\n setStateOptions(US_STATES);\n } else if (fetchStates) {\n fetchStates(selectedCountryCode)\n .then((states) => setStateOptions(states))\n .catch((error) => {\n console.error(\"Failed to fetch states:\", error);\n setStateOptions([]);\n });\n } else {\n setStateOptions([]);\n }\n },\n [],\n );\n\n const config = getRegionConfig(selectedCountry);\n\n return { handleCountryChange, stateOptions, config, selectedCountry };\n}\n","import type { JSX } from \"react\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Button,\n} from \"@fluid-app/ui-primitives\";\n\nexport default function EllipsesDropdown({\n onDelete,\n onEdit,\n editLabel = \"Edit\",\n deleteLabel = \"Delete\",\n disabled = false,\n}: {\n onDelete?: () => void;\n onEdit?: () => void;\n editLabel?: string;\n deleteLabel?: string;\n disabled?: boolean;\n}): JSX.Element {\n if (disabled) {\n return (\n <Button\n variant=\"ghost\"\n disabled\n className=\"cursor-not-allowed opacity-50\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 128 512\"\n className=\"h-4 w-1 fill-gray-400\"\n >\n <path d=\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\" />\n </svg>\n </Button>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 128 512\"\n className=\"h-4 w-1 fill-gray-400\"\n >\n <path d=\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\" />\n </svg>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"min-w-20 space-y-1 text-sm text-gray-900\">\n {onEdit && (\n <>\n <DropdownMenuItem\n className=\"flex cursor-pointer flex-row items-center justify-between space-x-2 rounded px-2 hover:bg-gray-50\"\n onClick={(e) => {\n e.stopPropagation();\n onEdit();\n }}\n >\n <span>{editLabel}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n className=\"h-2.5 w-2.5 fill-current\"\n >\n <path d=\"M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z\" />\n </svg>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n className=\"flex cursor-pointer flex-row items-center justify-between space-x-2 rounded px-2 text-red-500 hover:bg-red-50\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete?.();\n }}\n >\n <span>{deleteLabel}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 448 512\"\n className=\"h-2.5 w-2.5 fill-red-500\"\n >\n <path d=\"M135.2 17.7C140.6 6.8 151.7 0 163.8 0L284.2 0c12.1 0 23.2 6.8 28.6 17.7L320 32l80 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L48 96C30.3 96 16 81.7 16 64S30.3 32 48 32l80 0 7.2-14.3zM32 128l384 0 0 320c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-320z\" />\n </svg>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import type { JSX } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\ntype ConfirmActionDialogProps = {\n title: string;\n description: string;\n onAction: () => void;\n openDialog: boolean;\n setOpenDialog: (open: boolean) => void;\n errorMsg?: string;\n isLoading?: boolean;\n actionText?: string;\n};\n\nexport default function ConfirmActionDialog({\n title,\n description,\n onAction,\n openDialog,\n setOpenDialog,\n errorMsg,\n isLoading,\n actionText = \"Delete\",\n}: ConfirmActionDialogProps): JSX.Element {\n const { t } = useProfileUI();\n\n return (\n <Dialog open={openDialog} onOpenChange={setOpenDialog}>\n <DialogContent className=\"max-w-sm rounded md:w-90\">\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {title}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p className=\"text-left text-sm text-gray-500\">{description}</p>\n </div>\n\n {errorMsg && <p className=\"text-sm text-red-500\">{errorMsg}</p>}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between space-x-2\">\n <DialogClose asChild>\n <Button\n className=\"min-w-[70px] rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={() => setOpenDialog(false)}\n >\n {t(\"cancel\")}\n </Button>\n </DialogClose>\n <Button\n type=\"button\"\n className=\"min-w-[70px] rounded bg-red-600 p-3 text-white hover:bg-red-700\"\n onClick={onAction}\n disabled={isLoading}\n >\n {isLoading ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n actionText\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport {\n useProfileUI,\n type TranslationFn,\n type PointsLedger,\n} from \"@fluid-app/profile-core\";\n\nfunction formatTransactionType(ledger: PointsLedger, t: TranslationFn): string {\n const transactionType = ledger.metadata.transaction_type;\n\n if (!transactionType) {\n if (ledger.metadata.source) {\n return ledger.amount > 0 ? t(\"points_awarded\") : t(\"points_redeemed\");\n }\n return t(\"transaction\");\n }\n\n const translationKey = transactionType.toLowerCase().replace(/ /g, \"_\");\n const translated = t(translationKey);\n\n if (translated !== translationKey) {\n return translated;\n }\n\n return transactionType\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction formatPoints(amount: number): string {\n const prefix = amount >= 0 ? \"+\" : \"\";\n return `${prefix}${amount}`;\n}\n\nfunction formatDateTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nexport interface CustomerPointsLedgerProps {\n pointsLedger: PointsLedger[];\n isLoading?: boolean;\n}\n\nexport default function CustomerPointsLedger({\n pointsLedger,\n isLoading = false,\n}: CustomerPointsLedgerProps): JSX.Element {\n const [accordionValue, setAccordionValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n const availablePoints = pointsLedger[0]?.total_balance ?? 0;\n\n return (\n <div className=\"mb-6 border-b border-gray-300 pb-4\">\n <Accordion\n type=\"single\"\n collapsible\n value={accordionValue}\n onValueChange={setAccordionValue}\n className=\"w-full\"\n >\n <AccordionItem value=\"points-history\" className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">\n {t(\"points_history\")}\n </div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {isLoading && <Skeleton className=\"h-6 w-full\" />}\n\n {!isLoading && !accordionValue && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setAccordionValue(\"points-history\")}\n >\n <div className=\"text-sm font-semibold text-gray-900\">\n {availablePoints.toLocaleString()}{\" \"}\n <span className=\"font-normal text-gray-500\">\n {t(\"points_available\").toLowerCase()}\n </span>\n </div>\n </div>\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mb-3 flex w-full flex-col\">\n <div className=\"text-sm font-semibold text-gray-900\">\n {availablePoints.toLocaleString()}{\" \"}\n <span className=\"font-normal text-gray-500\">\n {t(\"points_available\").toLowerCase()}\n </span>\n </div>\n </div>\n\n <div className=\"flex flex-col space-y-0\">\n {pointsLedger.length > 0 ? (\n pointsLedger.map((ledger) => (\n <div\n key={ledger.id}\n className=\"relative flex flex-row items-start justify-between py-3\"\n >\n <div className=\"absolute top-3 left-0\">\n <div className=\"mt-1.5 h-2 w-2 flex-shrink-0 rounded-full border border-gray-300\" />\n <div className=\"mr-1 h-10 border-r border-gray-200\" />\n </div>\n <div className=\"ml-6 flex flex-row items-start space-x-3\">\n <div className=\"flex flex-col\">\n <div className=\"text-sm font-medium text-gray-900\">\n {formatTransactionType(ledger, t)}\n </div>\n <div className=\"text-sm text-gray-500\">\n {formatDateTime(ledger.created_at)}\n </div>\n </div>\n </div>\n <div\n className={cn(\n \"text-sm font-medium\",\n ledger.amount >= 0 ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {formatPoints(ledger.amount)}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-sm text-gray-500\">\n {t(\"no_points_history_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n </div>\n );\n}\n","import {\n useController,\n type Control,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\";\nimport {\n Input,\n Label,\n Select,\n SelectTrigger,\n SelectContent,\n SelectItem,\n SelectValue,\n cn,\n} from \"@fluid-app/ui-primitives\";\n\nexport type NameValue = { name: string; value: string | number };\n\nexport function FormTextField<T extends FieldValues>({\n control,\n name,\n label,\n containerClassName,\n ...props\n}: {\n control: Control<T>;\n name: FieldPath<T>;\n label?: string;\n containerClassName?: string;\n} & Omit<React.ComponentProps<\"input\">, \"name\">) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n {label && (\n <Label\n htmlFor={name}\n className=\"mb-1.5 block text-sm font-medium text-gray-700\"\n >\n {label}\n </Label>\n )}\n <Input\n {...field}\n {...props}\n id={name}\n value={field.value ?? \"\"}\n className={cn(error && \"ring-1 ring-red-500\", props.className)}\n />\n {error && <p className=\"text-sm text-red-500\">{error.message}</p>}\n </div>\n );\n}\n\nexport function FormSelectField<T extends FieldValues>({\n control,\n name,\n label,\n options,\n placeholder,\n containerClassName,\n onChange,\n}: {\n control: Control<T>;\n name: FieldPath<T>;\n label?: string;\n options?: NameValue[];\n placeholder?: string;\n containerClassName?: string;\n onChange?: (value: string) => void;\n}) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n {label && (\n <Label\n htmlFor={name}\n className=\"block text-sm font-medium text-gray-700\"\n >\n {label}\n </Label>\n )}\n <Select\n value={field.value?.toString() ?? \"\"}\n onValueChange={(val) => {\n field.onChange(val);\n onChange?.(val);\n }}\n >\n <SelectTrigger className={cn(error && \"ring-1 ring-red-500\")}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options?.map((opt) => (\n <SelectItem\n key={`${opt.name}-${opt.value}`}\n value={opt.value.toString()}\n >\n {opt.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {error && <p className=\"text-sm text-red-500\">{error.message}</p>}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport type { Control } from \"react-hook-form\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField, FormSelectField, type NameValue } from \"./form-fields\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\nexport type UserFormData = {\n first_name: string;\n last_name: string;\n phone_number?: string;\n language: string;\n};\n\nexport default function UserInfoDialog({\n control,\n isOpen,\n onSubmit,\n handleClose,\n languageOptions,\n errorMsg,\n isSubmitting,\n}: {\n control: Control<UserFormData>;\n isOpen: boolean;\n onSubmit: () => void;\n handleClose: () => void;\n languageOptions?: NameValue[];\n errorMsg: string | undefined;\n isSubmitting: boolean;\n}): JSX.Element {\n const { t } = useProfileUI();\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"max-w-sm rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium text-gray-900\">\n {t(\"edit_profile\")}\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-0\">\n <FormTextField\n control={control}\n name=\"first_name\"\n label={t(\"first_name\")}\n />\n <FormTextField\n control={control}\n name=\"last_name\"\n label={t(\"last_name\")}\n />\n <FormTextField\n control={control}\n name=\"phone_number\"\n label={t(\"phone_number\")}\n type=\"tel\"\n />\n <FormSelectField\n control={control}\n name=\"language\"\n label={t(\"language\")}\n options={languageOptions}\n placeholder={t(\"select_an_option\")}\n />\n </div>\n {errorMsg && <p className=\"text-sm text-red-500\">{errorMsg}</p>}\n <DialogFooter className=\"flex flex-row items-center justify-end\">\n <div className=\"flex-1 text-right\">\n <DialogClose asChild>\n <Button type=\"button\" onClick={onSubmit}>\n {isSubmitting && (\n <div className=\"mr-3 h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n )}\n {isSubmitting ? t(\"saving\") : t(\"save_changes\")}\n </Button>\n </DialogClose>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z } from \"zod\";\nimport { Avatar, AvatarFallback } from \"@fluid-app/ui-primitives\";\nimport { Pencil } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport type { NameValue } from \"./form-fields\";\nimport { useProfileUI, type Language } from \"@fluid-app/profile-core\";\nimport UserInfoDialog, { type UserFormData } from \"./user-info-dialog\";\n\nfunction createUserInfoSchema(messages: {\n firstNameRequired: string;\n lastNameRequired: string;\n languageRequired: string;\n}) {\n return z.object({\n first_name: z.string().min(1, { message: messages.firstNameRequired }),\n last_name: z.string().min(1, { message: messages.lastNameRequired }),\n phone_number: z.string().optional(),\n language: z.string().min(1, { message: messages.languageRequired }),\n });\n}\n\nexport interface CustomerInfoProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: (data: UserFormData) => Promise<void> | void;\n isUpdating?: boolean;\n}\n\nexport default function CustomerInfo({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdating = false,\n}: CustomerInfoProps): JSX.Element {\n const [isEditDialogOpen, setIsEditDialogOpen] = useState(false);\n const [updateError, setUpdateError] = useState<string | undefined>(undefined);\n\n const { t } = useProfileUI();\n\n const { first_name, full_name } = customerAccount.customer;\n const derivedLastName = full_name.startsWith(first_name)\n ? full_name.slice(first_name.length).trim()\n : \"\";\n const userInitial = first_name ? first_name.charAt(0).toUpperCase() : \"\";\n const customerLanguage = languages?.find(\n (language) =>\n language.iso === customerAccount.fluid_pay_account.language_iso,\n )?.name;\n\n const languageOptions: NameValue[] | undefined = languages?.map(\n (language) => ({\n name: language.name,\n value: language.name,\n }),\n );\n\n const schema = useMemo(\n () =>\n createUserInfoSchema({\n firstNameRequired: t(\"first_name_is_required\"),\n lastNameRequired: t(\"last_name_is_required\"),\n languageRequired: t(\"language_is_required\"),\n }),\n [t],\n );\n\n const { control, handleSubmit, reset } = useForm<UserFormData>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolver: zodResolver(schema as any),\n defaultValues: {\n first_name: customerAccount.customer.first_name || \"\",\n last_name: derivedLastName,\n phone_number: customerAccount.customer.phone || \"\",\n language: customerLanguage || \"English\",\n },\n });\n\n const handleOpenEditDialog = () => {\n reset({\n first_name: customerAccount.customer.first_name || \"\",\n last_name: derivedLastName,\n phone_number: customerAccount.customer.phone || \"\",\n language: customerLanguage || \"English\",\n });\n setIsEditDialogOpen(true);\n };\n\n const handleCloseEditDialog = () => {\n setIsEditDialogOpen(false);\n setUpdateError(undefined);\n };\n\n const onSubmitUserInfo = handleSubmit(async (data: UserFormData) => {\n try {\n await onUpdateCustomer(data);\n setIsEditDialogOpen(false);\n } catch (error) {\n console.error(\"Error updating profile:\", error);\n setUpdateError(\n \"Error updating profile. Please verify your information and try again.\",\n );\n }\n });\n\n return (\n <>\n <div className=\"mb-6 flex flex-row items-center justify-between space-x-2 border-b border-gray-300 pb-4\">\n <div className=\"flex flex-row items-center space-x-2\">\n <Avatar>\n <AvatarFallback>{userInitial}</AvatarFallback>\n </Avatar>\n <div className=\"flex flex-col\">\n <p className=\"text-sm font-medium\">\n {customerAccount.customer.full_name}\n </p>\n <p className=\"text-sm text-gray-500\">\n {customerAccount.customer.email}\n </p>\n </div>\n </div>\n <button\n className=\"cursor-pointer rounded-md border border-gray-300 p-1 hover:bg-gray-50 disabled:opacity-50\"\n onClick={handleOpenEditDialog}\n >\n <Pencil className=\"h-2.5 w-2.5 text-gray-400\" />\n </button>\n </div>\n\n <UserInfoDialog\n control={control}\n isOpen={isEditDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={handleCloseEditDialog}\n languageOptions={languageOptions}\n errorMsg={updateError}\n isSubmitting={isUpdating}\n />\n </>\n );\n}\n","import { useState } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\n\nfunction formatAddressName(address: fluidPay.CustomerAddress): string {\n return address.name ?? \"\";\n}\n\ninterface AddressDropdownProps {\n title: string;\n displayAddress: fluidPay.CustomerAddress | null;\n addressList: fluidPay.CustomerAddress[];\n onAddAddressClick: () => void;\n onEditAddress?: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress?: (address: fluidPay.CustomerAddress) => void;\n accordionItemValue: string;\n addAddressLabel: string;\n showAddButton?: boolean;\n borderStyle?: string;\n className?: string;\n showActions?: boolean;\n isLoading?: boolean;\n}\n\nexport default function AddressDropdown({\n title,\n displayAddress,\n addressList,\n onAddAddressClick,\n onEditAddress,\n onDeleteAddress,\n accordionItemValue,\n addAddressLabel,\n showAddButton = true,\n borderStyle = \"border-b border-gray-300 pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: AddressDropdownProps) {\n const [addressesValue, setAddressesValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n return (\n <div className={`${borderStyle} ${className}`}>\n <Accordion\n type=\"single\"\n collapsible\n value={addressesValue}\n onValueChange={setAddressesValue}\n className=\"w-full\"\n >\n <AccordionItem value={accordionItemValue} className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">{title}</div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {isLoading && (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n )}\n\n {!isLoading && !addressesValue && displayAddress && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setAddressesValue(accordionItemValue)}\n >\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {formatAddressName(displayAddress)}, {displayAddress.address1}\n </div>\n <div className=\"text-sm text-gray-500\">\n {displayAddress.city}, {displayAddress.state}{\" \"}\n {displayAddress.postal_code}\n </div>\n </div>\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mt-2 flex flex-col justify-between space-y-4 px-0.5\">\n {addressList.length > 0 ? (\n addressList.map((address, index) => (\n <div\n key={address.id}\n className={cn(\n \"flex min-h-[48px] w-full flex-row items-center justify-between space-x-2 px-2\",\n {\n \"items-center border-b border-gray-300 p-3\":\n addressList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-col\">\n <div className=\"text-sm text-gray-900\">\n {formatAddressName(address)} <br />\n {address.address1} <br />\n {address.city}, {address.state} {address.postal_code}\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {address.default && (\n <p className=\"mt-1 w-fit rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() => onDeleteAddress?.(address)}\n onEdit={() => onEditAddress?.(address)}\n editLabel={t(\"edit\")}\n deleteLabel={t(\"delete\")}\n />\n )}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-sm text-gray-500\">\n {t(\"no_saved_addresses_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"mt-3 text-left text-sm text-gray-900\"\n onClick={onAddAddressClick}\n >\n {addAddressLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useState, type JSX, type ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport ConfirmActionDialog from \"./confirm-action-dialog\";\nimport AddressDropdown from \"./address-dropdown\";\n\nexport interface AddressDialogRenderProps {\n isOpen: boolean;\n onClose: () => void;\n selectedAddress: fluidPay.CustomerAddress | null;\n}\n\nexport interface AddressesProps {\n addresses: fluidPay.CustomerAddress[];\n isLoading?: boolean;\n onCreateAddress?: () => void;\n onDeleteAddress: (addressId: number) => Promise<void> | void;\n isDeletingAddress?: boolean;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n}\n\nexport default function Addresses({\n addresses,\n isLoading = false,\n onCreateAddress,\n onDeleteAddress,\n isDeletingAddress = false,\n renderAddressDialog,\n}: AddressesProps): JSX.Element {\n const [openAddressDialog, setOpenAddressDialog] = useState(false);\n const [openDeleteDialog, setOpenDeleteDialog] = useState(false);\n const [selectedAddress, setSelectedAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [deleteAddressError, setDeleteAddressError] = useState<\n string | undefined\n >(undefined);\n\n const { t } = useProfileUI();\n\n const defaultAddress = addresses.find((addr) => addr.default) ?? null;\n\n const handleDeleteClick = (address: fluidPay.CustomerAddress) => {\n setSelectedAddress(address);\n setDeleteAddressError(undefined);\n requestAnimationFrame(() => {\n setOpenDeleteDialog(true);\n });\n };\n\n const handleEditClick = (address: fluidPay.CustomerAddress) => {\n setSelectedAddress(address);\n requestAnimationFrame(() => {\n setOpenAddressDialog(true);\n });\n };\n\n const handleDeleteAddress = async () => {\n if (!selectedAddress) return;\n try {\n await onDeleteAddress(selectedAddress.id);\n setDeleteAddressError(undefined);\n setOpenDeleteDialog(false);\n setSelectedAddress(null);\n } catch {\n setDeleteAddressError(\n \"We were unable to delete this address. Please try again.\",\n );\n }\n };\n\n const handleAddClick = () => {\n setSelectedAddress(null);\n if (onCreateAddress) {\n onCreateAddress();\n }\n setOpenAddressDialog(true);\n };\n\n const handleCloseAddressDialog = () => {\n setOpenAddressDialog(false);\n setSelectedAddress(null);\n };\n\n return (\n <>\n <AddressDropdown\n title={t(\"shipping_addresses\")}\n displayAddress={defaultAddress}\n addressList={addresses}\n onAddAddressClick={handleAddClick}\n onEditAddress={handleEditClick}\n onDeleteAddress={handleDeleteClick}\n accordionItemValue=\"addresses\"\n addAddressLabel={`+ ${t(\"add_an_address\")}`}\n showAddButton={true}\n borderStyle=\"border-b border-gray-300 pb-4 mb-6\"\n showActions={true}\n isLoading={isLoading}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n onAction={handleDeleteAddress}\n actionText={t(\"delete\")}\n openDialog={openDeleteDialog}\n setOpenDialog={setOpenDeleteDialog}\n errorMsg={deleteAddressError}\n isLoading={isDeletingAddress}\n />\n\n {renderAddressDialog?.({\n isOpen: openAddressDialog,\n onClose: handleCloseAddressDialog,\n selectedAddress,\n })}\n </>\n );\n}\n","import { useState } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\n\ninterface PaymentMethodDropdownProps {\n title: string;\n displayPaymentMethod: fluidPay.CustomerPaymentMethod | null;\n paymentMethodList: fluidPay.CustomerPaymentMethod[];\n onAddPaymentMethodClick: () => void;\n onEditPaymentMethod?: (paymentMethod: fluidPay.CustomerPaymentMethod) => void;\n onDeletePaymentMethod?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n accordionItemValue?: string;\n addPaymentMethodLabel?: string;\n showAddButton?: boolean;\n borderStyle?: string;\n className?: string;\n showActions?: boolean;\n isLoading?: boolean;\n}\n\nfunction getCardDisplayName(\n paymentMethod: fluidPay.CustomerPaymentMethod,\n): string {\n if (paymentMethod.payment_type === \"Credit Card\") {\n const brand = paymentMethod.details.card_type;\n const lastFour = paymentMethod.details.last_four;\n return `${brand ?? \"Card\"} •••• ${lastFour ?? \"****\"}`;\n }\n return paymentMethod.payment_type;\n}\n\nfunction getCardExpiry(paymentMethod: fluidPay.CustomerPaymentMethod): string {\n const { exp_month, exp_year } = paymentMethod.details;\n if (exp_month != null && exp_year != null) {\n return `Expires ${exp_month}/${exp_year}`;\n }\n return \"\";\n}\n\nexport default function PaymentMethodDropdown({\n title,\n displayPaymentMethod,\n paymentMethodList,\n onAddPaymentMethodClick,\n onEditPaymentMethod,\n onDeletePaymentMethod,\n accordionItemValue = \"paymentMethods\",\n addPaymentMethodLabel = \"+ Add a payment method\",\n showAddButton = true,\n borderStyle = \"border-b border-gray-300 pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: PaymentMethodDropdownProps) {\n const [paymentsValue, setPaymentsValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n const renderPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => (\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={paymentMethod.details.logo_url}\n alt={paymentMethod.details.card_type ?? t(\"payment_method\")}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {getCardDisplayName(paymentMethod)}\n </div>\n {getCardExpiry(paymentMethod) && (\n <div className=\"text-sm text-gray-500\">\n {getCardExpiry(paymentMethod)}\n </div>\n )}\n </div>\n </div>\n );\n\n return (\n <div className={`${borderStyle} ${className}`}>\n <Accordion\n type=\"single\"\n collapsible\n value={paymentsValue}\n onValueChange={setPaymentsValue}\n className=\"w-full\"\n >\n <AccordionItem value={accordionItemValue} className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">{title}</div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {!paymentsValue && isLoading ? (\n <div className=\"mb-2 flex w-full flex-row items-center space-x-2\">\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col space-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n ) : (\n !paymentsValue &&\n displayPaymentMethod && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setPaymentsValue(accordionItemValue)}\n >\n {renderPaymentMethod(displayPaymentMethod)}\n </div>\n )\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mt-2 flex flex-col justify-between space-y-4 px-0.5\">\n {isLoading ? (\n <>\n {[1, 2].map((i) => (\n <div\n key={`skeleton-${i}`}\n className=\"items-center rounded bg-gray-100 p-3\"\n >\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"flex flex-row items-center space-x-2\">\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col space-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n <Skeleton className=\"h-6 w-6\" />\n </div>\n </div>\n ))}\n </>\n ) : (\n paymentMethodList.map((paymentMethod, index) => (\n <div\n key={paymentMethod.id}\n className={cn(\n \"flex min-h-[48px] w-full flex-row items-center justify-between space-x-2 px-2\",\n {\n \"items-center border-b border-gray-300 p-3\":\n paymentMethodList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={paymentMethod.details.logo_url}\n alt={\n paymentMethod.details.card_type ??\n t(\"payment_method\")\n }\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {`${paymentMethod.details.card_type ?? \"Card\"} •••• ${paymentMethod.details.last_four ?? \"****\"}`}\n </div>\n <div className=\"text-sm text-gray-500\">\n {`${t(\"card_expires\")} ${paymentMethod.details.exp_month}/${paymentMethod.details.exp_year}`}\n </div>\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.default && (\n <p className=\"mt-1 w-fit rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() =>\n onDeletePaymentMethod?.(paymentMethod)\n }\n deleteLabel={t(\"delete\")}\n onEdit={() => onEditPaymentMethod?.(paymentMethod)}\n editLabel={t(\"edit\")}\n />\n )}\n </div>\n </div>\n ))\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"mt-3 text-left text-sm text-gray-900\"\n onClick={onAddPaymentMethodClick}\n >\n {addPaymentMethodLabel}\n </button>\n )}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\nexport interface BillingAddress {\n name?: string | null;\n address1?: string | null;\n address2?: string | null;\n city?: string | null;\n state?: string | null;\n zip?: string | null;\n country_code?: string | null;\n}\n\ninterface ViewPaymentMethodDialogProps {\n isOpen: boolean;\n paymentMethod: fluidPay.CustomerPaymentMethod | null;\n billingAddress?: BillingAddress | null;\n onClose: () => void;\n onEdit?: () => void;\n}\n\nexport default function ViewPaymentMethodDialog({\n isOpen,\n paymentMethod,\n billingAddress,\n onClose,\n onEdit,\n}: ViewPaymentMethodDialogProps): JSX.Element | null {\n const { t } = useProfileUI();\n\n if (!paymentMethod) return null;\n\n const { details } = paymentMethod;\n const cardBrand = details.card_type ?? \"Card\";\n const lastFour = details.last_four ?? \"****\";\n const expMonth = details.exp_month;\n const expYear = details.exp_year;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-w-sm rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium\">\n {t(\"edit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div>\n <div className=\"rounded-lg bg-gray-50 p-4\">\n <div className=\"flex items-center space-x-3\">\n {details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={details.logo_url}\n alt={cardBrand}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-gray-900\">\n {cardBrand} •••• {lastFour}\n </span>\n {expMonth != null && expYear != null && (\n <span className=\"text-sm text-gray-500\">\n {t(\"card_expires\")} {expMonth}/{expYear}\n </span>\n )}\n </div>\n </div>\n {paymentMethod.default && (\n <span className=\"mt-2 inline-block rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </span>\n )}\n </div>\n </div>\n\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-gray-900\">\n {t(\"billing_address\")}\n </h3>\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto p-0 text-sm text-gray-600 underline hover:bg-transparent\"\n onClick={onEdit}\n >\n {t(\"edit\")}\n </Button>\n )}\n </div>\n <div className=\"rounded-lg bg-gray-50 p-4\">\n {billingAddress ? (\n <div className=\"space-y-1 text-sm text-gray-900\">\n {billingAddress.name && <p>{billingAddress.name}</p>}\n <p>{billingAddress.address1}</p>\n {billingAddress.address2 && <p>{billingAddress.address2}</p>}\n <p>\n {billingAddress.city}, {billingAddress.state}{\" \"}\n {billingAddress.zip}\n </p>\n <p>{billingAddress.country_code}</p>\n </div>\n ) : (\n <p className=\"text-sm text-gray-500 italic\">\n {t(\"no_billing_address\")}\n </p>\n )}\n </div>\n </div>\n </div>\n\n <DialogFooter>\n <DialogClose asChild>\n <Button\n className=\"rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={onClose}\n >\n {t(\"close\")}\n </Button>\n </DialogClose>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, type JSX } from \"react\";\nimport { useForm, useWatch } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField, FormSelectField } from \"./form-fields\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI, useCountryStates } from \"@fluid-app/profile-core\";\nimport type { BillingAddress } from \"./view-payment-method-dialog\";\n\nconst editPaymentMethodFormSchema = z.object({\n billing_address: z.object({\n name: z.string().min(1, \"Name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n zip: z.string().min(1, \"Zip code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n }),\n set_as_default: z.boolean(),\n});\n\nexport type EditPaymentMethodFormData = z.infer<\n typeof editPaymentMethodFormSchema\n>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\ninterface EditPaymentMethodDialogProps {\n isOpen: boolean;\n paymentMethod: fluidPay.CustomerPaymentMethod | null;\n billingAddress?: BillingAddress | null;\n onClose: () => void;\n onSubmit: (data: EditPaymentMethodFormData) => void;\n isSubmitting: boolean;\n error?: string;\n countries?: CountryOption[];\n}\n\nexport default function EditPaymentMethodDialog({\n isOpen,\n paymentMethod,\n billingAddress,\n onClose,\n onSubmit,\n isSubmitting,\n error,\n countries = [],\n}: EditPaymentMethodDialogProps): JSX.Element | null {\n const { t } = useProfileUI();\n\n const { control, handleSubmit, reset, setValue } =\n useForm<EditPaymentMethodFormData>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolver: zodResolver(editPaymentMethodFormSchema as any),\n defaultValues: {\n billing_address: {\n name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n zip: \"\",\n country_code: \"US\",\n },\n set_as_default: false,\n },\n });\n\n const billingCountry = useWatch({\n control,\n name: \"billing_address.country_code\",\n });\n const setAsDefault = useWatch({ control, name: \"set_as_default\" });\n\n const { stateOptions, config, handleCountryChange } = useCountryStates();\n\n const countryOptions = [...countries]\n .map((country) => ({\n name: country.name,\n value: country.iso,\n }))\n .sort((a, b) => {\n if (a.value === billingCountry) return -1;\n if (b.value === billingCountry) return 1;\n return a.name.localeCompare(b.name);\n });\n\n const stateSelectOptions = stateOptions.map((state) => ({\n name: state.name,\n value: state.isoCode,\n }));\n\n useEffect(() => {\n if (paymentMethod && isOpen) {\n reset({\n billing_address: {\n name: billingAddress?.name ?? \"\",\n address1: billingAddress?.address1 ?? \"\",\n address2: billingAddress?.address2 ?? \"\",\n city: billingAddress?.city ?? \"\",\n state: billingAddress?.state ?? \"\",\n zip: billingAddress?.zip ?? \"\",\n country_code: billingAddress?.country_code ?? \"US\",\n },\n set_as_default: paymentMethod.default,\n });\n }\n }, [paymentMethod, billingAddress, isOpen, reset]);\n\n const handleCountrySelect = (countryCode: string) => {\n handleCountryChange(countryCode);\n setValue(\"billing_address.country_code\", countryCode, {\n shouldValidate: true,\n });\n };\n\n const handleFormSubmit = handleSubmit((data) => {\n onSubmit(data);\n });\n\n if (!paymentMethod) return null;\n\n const { details } = paymentMethod;\n const cardBrand = details.card_type ?? \"Card\";\n const lastFour = details.last_four ?? \"****\";\n const expMonth = details.exp_month;\n const expYear = details.exp_year;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-sm overflow-y-auto rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium\">\n {t(\"edit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div className=\"rounded-lg bg-gray-50 p-4\">\n <div className=\"flex items-center space-x-3\">\n {details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={details.logo_url}\n alt={cardBrand}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-gray-900\">\n {cardBrand} •••• {lastFour}\n </span>\n {expMonth != null && expYear != null && (\n <span className=\"text-sm text-gray-500\">\n {t(\"card_expires\")} {expMonth}/{expYear}\n </span>\n )}\n </div>\n </div>\n </div>\n\n <div>\n <h3 className=\"mb-1 text-sm font-medium text-gray-900\">\n {t(\"billing_address\")}\n </h3>\n <div className=\"space-y-0\">\n <FormSelectField\n control={control}\n name=\"billing_address.country_code\"\n label={t(\"country\")}\n options={countryOptions}\n placeholder={t(\"select_an_option\")}\n onChange={(val) => {\n handleCountrySelect(val);\n }}\n />\n <FormTextField\n control={control}\n name=\"billing_address.name\"\n label={t(\"name\")}\n />\n <FormTextField\n control={control}\n name=\"billing_address.address1\"\n label={t(\"address_line_1\")}\n />\n <FormTextField\n control={control}\n name=\"billing_address.address2\"\n label={t(\"address_line_2\")}\n />\n <div className=\"sm:flex sm:gap-2\">\n <FormTextField\n control={control}\n name=\"billing_address.city\"\n label={t(\"city\")}\n containerClassName=\"flex-1\"\n />\n <FormSelectField\n control={control}\n name=\"billing_address.state\"\n label={\n config?.regionLabel ? t(config.regionLabel) : t(\"state\")\n }\n options={stateSelectOptions}\n placeholder={t(\"select_state\")}\n containerClassName=\"flex-1\"\n />\n <FormTextField\n control={control}\n name=\"billing_address.zip\"\n label={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"mt-2 flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default\"\n checked={setAsDefault}\n onChange={() => setValue(\"set_as_default\", !setAsDefault)}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default\" className=\"text-sm\">\n {t(\"set_as_default_payment_method\")}\n </label>\n </div>\n\n {error && <div className=\"text-sm text-red-500\">{error}</div>}\n\n <DialogFooter className=\"flex flex-row items-center justify-between\">\n <div className=\"flex-2\">\n <Button\n type=\"button\"\n className=\"rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={onClose}\n disabled={isSubmitting}\n >\n {t(\"cancel\")}\n </Button>\n </div>\n <div className=\"flex-1 text-right\">\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isSubmitting}\n className=\"rounded bg-gray-900 p-3 text-white hover:bg-gray-800\"\n >\n {isSubmitting ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, type JSX, type ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport ConfirmActionDialog from \"./confirm-action-dialog\";\nimport PaymentMethodDropdown from \"./payment-method-dropdown\";\nimport ViewPaymentMethodDialog, {\n type BillingAddress,\n} from \"./view-payment-method-dialog\";\nimport EditPaymentMethodDialog, {\n type EditPaymentMethodFormData,\n} from \"./edit-payment-method-dialog\";\n\nexport interface CreditCardDialogRenderProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface PaymentMethodsProps {\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n isLoading?: boolean;\n onDeletePaymentMethod: (paymentMethodId: number) => Promise<void> | void;\n isDeletingPaymentMethod?: boolean;\n onUpdatePaymentMethod: (\n paymentMethodId: number,\n data: EditPaymentMethodFormData,\n ) => Promise<void> | void;\n isUpdatingPaymentMethod?: boolean;\n getBillingAddress?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => BillingAddress | null | undefined;\n countries?: CountryOption[];\n renderCreditCardDialog?: (props: CreditCardDialogRenderProps) => ReactNode;\n}\n\nexport default function PaymentMethods({\n paymentMethods,\n isLoading = false,\n onDeletePaymentMethod,\n isDeletingPaymentMethod = false,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod = false,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n}: PaymentMethodsProps): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const [openDeleteDialog, setOpenDeleteDialog] = useState(false);\n const [deleteCardError, setDeleteCardError] = useState<string | undefined>(\n undefined,\n );\n const [selectedCreditCard, setSelectedCreditCard] = useState<\n fluidPay.CustomerPaymentMethod | undefined\n >(undefined);\n const [isViewOpen, setIsViewOpen] = useState(false);\n const [isEditOpen, setIsEditOpen] = useState(false);\n const [selectedPaymentMethod, setSelectedPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n const [editError, setEditError] = useState<string | undefined>(undefined);\n\n const { t } = useProfileUI();\n\n const defaultPaymentMethod =\n paymentMethods.find((method) => method.default) ?? null;\n\n const handleDeleteCard = async (cardId: number | null) => {\n if (!cardId) return;\n try {\n await onDeletePaymentMethod(cardId);\n setSelectedCreditCard(undefined);\n setDeleteCardError(undefined);\n setOpenDeleteDialog(false);\n } catch {\n setDeleteCardError(\"Unable to delete payment method. Please try again.\");\n }\n };\n\n const handleDeletePaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => {\n setSelectedCreditCard(paymentMethod);\n requestAnimationFrame(() => {\n setOpenDeleteDialog(true);\n });\n };\n\n const handleViewPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => {\n setSelectedPaymentMethod(paymentMethod);\n requestAnimationFrame(() => {\n setIsViewOpen(true);\n });\n };\n\n const handleCloseViewDialog = () => {\n setIsViewOpen(false);\n setSelectedPaymentMethod(null);\n };\n\n const handleOpenEditFromView = () => {\n setIsViewOpen(false);\n setEditError(undefined);\n requestAnimationFrame(() => {\n setIsEditOpen(true);\n });\n };\n\n const handleCloseEditDialog = () => {\n setIsEditOpen(false);\n setSelectedPaymentMethod(null);\n setEditError(undefined);\n };\n\n const handleEditSubmit = async (data: EditPaymentMethodFormData) => {\n if (!selectedPaymentMethod) return;\n try {\n await onUpdatePaymentMethod(selectedPaymentMethod.id, data);\n handleCloseEditDialog();\n fluidToast({\n title: t(\"default_payment_method_updated\"),\n type: \"success\",\n });\n } catch (error) {\n console.error(\"Error updating payment method:\", error);\n fluidToast({\n title: t(\"failed_to_set_default_payment_method\"),\n type: \"error\",\n description: parseApiErrors(error),\n });\n if (error instanceof Error) {\n setEditError(error.message);\n } else {\n setEditError(\"An unexpected error occurred. Please try again.\");\n }\n }\n };\n\n const handleOpenDialog = () => {\n setIsOpen(true);\n };\n\n const handleCloseDialog = () => {\n setIsOpen(false);\n };\n\n const selectedBillingAddress = selectedPaymentMethod\n ? (getBillingAddress?.(selectedPaymentMethod) ?? null)\n : null;\n\n return (\n <>\n <PaymentMethodDropdown\n title={t(\"payment_methods\")}\n displayPaymentMethod={defaultPaymentMethod}\n paymentMethodList={paymentMethods}\n onAddPaymentMethodClick={handleOpenDialog}\n onEditPaymentMethod={handleViewPaymentMethod}\n onDeletePaymentMethod={handleDeletePaymentMethod}\n addPaymentMethodLabel={`+ ${t(\"add_payment_method\")}`}\n isLoading={isLoading}\n />\n\n {renderCreditCardDialog?.({\n isOpen,\n onClose: handleCloseDialog,\n })}\n\n <ConfirmActionDialog\n title={t(\"delete_credit_card\")}\n description={t(\"delete_credit_card_message\")}\n actionText={t(\"delete\")}\n onAction={() => handleDeleteCard(selectedCreditCard?.id ?? null)}\n openDialog={openDeleteDialog}\n setOpenDialog={setOpenDeleteDialog}\n errorMsg={deleteCardError}\n isLoading={isDeletingPaymentMethod}\n />\n\n <ViewPaymentMethodDialog\n isOpen={isViewOpen}\n paymentMethod={selectedPaymentMethod}\n billingAddress={selectedBillingAddress}\n onClose={handleCloseViewDialog}\n onEdit={handleOpenEditFromView}\n />\n\n <EditPaymentMethodDialog\n isOpen={isEditOpen}\n paymentMethod={selectedPaymentMethod}\n billingAddress={selectedBillingAddress}\n onClose={handleCloseEditDialog}\n onSubmit={handleEditSubmit}\n isSubmitting={isUpdatingPaymentMethod}\n error={editError}\n countries={countries}\n />\n </>\n );\n}\n","import type { JSX, ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport CustomerInfo, { type CustomerInfoProps } from \"./customer-info\";\nimport CustomerPointsLedger from \"./customer-points-ledger\";\nimport Addresses, { type AddressDialogRenderProps } from \"./addresses\";\nimport PaymentMethods, {\n type CreditCardDialogRenderProps,\n} from \"./payment-methods\";\nimport type { EditPaymentMethodFormData } from \"./edit-payment-method-dialog\";\nimport type { BillingAddress } from \"./view-payment-method-dialog\";\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface ProfileProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: CustomerInfoProps[\"onUpdateCustomer\"];\n isUpdatingCustomer?: boolean;\n\n rewardsPointsEnabled?: boolean;\n pointsLedger?: PointsLedger[];\n isLoadingPointsLedger?: boolean;\n\n addresses: fluidPay.CustomerAddress[];\n isLoadingAddresses?: boolean;\n onDeleteAddress: (addressId: number) => Promise<void> | void;\n isDeletingAddress?: boolean;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n isLoadingPaymentMethods?: boolean;\n onDeletePaymentMethod: (paymentMethodId: number) => Promise<void> | void;\n isDeletingPaymentMethod?: boolean;\n onUpdatePaymentMethod: (\n paymentMethodId: number,\n data: EditPaymentMethodFormData,\n ) => Promise<void> | void;\n isUpdatingPaymentMethod?: boolean;\n getBillingAddress?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => BillingAddress | null | undefined;\n countries?: CountryOption[];\n renderCreditCardDialog?: (props: CreditCardDialogRenderProps) => ReactNode;\n}\n\nexport default function Profile({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdatingCustomer,\n rewardsPointsEnabled = false,\n pointsLedger,\n isLoadingPointsLedger,\n addresses,\n isLoadingAddresses,\n onDeleteAddress,\n isDeletingAddress,\n renderAddressDialog,\n paymentMethods,\n isLoadingPaymentMethods,\n onDeletePaymentMethod,\n isDeletingPaymentMethod,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n}: ProfileProps): JSX.Element {\n return (\n <>\n <CustomerInfo\n customerAccount={customerAccount}\n languages={languages}\n onUpdateCustomer={onUpdateCustomer}\n isUpdating={isUpdatingCustomer}\n />\n {rewardsPointsEnabled && (\n <CustomerPointsLedger\n pointsLedger={pointsLedger ?? []}\n isLoading={isLoadingPointsLedger}\n />\n )}\n <Addresses\n addresses={addresses}\n isLoading={isLoadingAddresses}\n onDeleteAddress={onDeleteAddress}\n isDeletingAddress={isDeletingAddress}\n renderAddressDialog={renderAddressDialog}\n />\n <PaymentMethods\n paymentMethods={paymentMethods}\n isLoading={isLoadingPaymentMethods}\n onDeletePaymentMethod={onDeletePaymentMethod}\n isDeletingPaymentMethod={isDeletingPaymentMethod}\n onUpdatePaymentMethod={onUpdatePaymentMethod}\n isUpdatingPaymentMethod={isUpdatingPaymentMethod}\n getBillingAddress={getBillingAddress}\n countries={countries}\n renderCreditCardDialog={renderCreditCardDialog}\n />\n </>\n );\n}\n","\"use client\";\n\nimport type { Control, FieldPath, FieldValues } from \"react-hook-form\";\nimport { useController } from \"react-hook-form\";\nimport { Input, cn } from \"@fluid-app/ui-primitives\";\n\ninterface FormTextFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n control: Control<TFieldValues>;\n name: TName;\n placeholder?: string;\n containerClassName?: string;\n type?: React.HTMLInputTypeAttribute;\n disabled?: boolean;\n inputMode?: React.HTMLAttributes<HTMLInputElement>[\"inputMode\"];\n}\n\nexport function FormTextField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n placeholder,\n containerClassName,\n type,\n disabled,\n inputMode,\n}: FormTextFieldProps<TFieldValues, TName>) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n <Input\n {...field}\n value={field.value ?? \"\"}\n id={name}\n type={type}\n disabled={disabled}\n inputMode={inputMode}\n placeholder={placeholder}\n aria-invalid={!!error}\n />\n {error?.message && (\n <p className=\"text-sm text-red-500\">{error.message}</p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { Control, FieldPath, FieldValues } from \"react-hook-form\";\nimport { Controller } from \"react-hook-form\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n} from \"@fluid-app/ui-primitives\";\n\ntype NameValue = { name: string; value: string | number };\n\ninterface FormSelectFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n control: Control<TFieldValues>;\n name: TName;\n placeholder?: string;\n options?: NameValue[];\n containerClassName?: string;\n disabled?: boolean;\n}\n\nexport function FormSelectField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n placeholder = \"Select\",\n options,\n containerClassName,\n disabled,\n}: FormSelectFieldProps<TFieldValues, TName>) {\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n <Controller\n control={control}\n name={name}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <Select\n value={value?.toString() ?? \"\"}\n onValueChange={onChange}\n disabled={disabled}\n >\n <SelectTrigger\n aria-invalid={!!error}\n className={cn(\n \"w-full\",\n error && \"border-red-500 ring-1 ring-red-500\",\n )}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options && options.length > 0 ? (\n options.map((opt) => (\n <SelectItem\n key={opt.value.toString()}\n value={opt.value.toString()}\n >\n {opt.name}\n </SelectItem>\n ))\n ) : (\n <SelectItem value=\"__empty\" disabled>\n No available options\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n {error?.message && (\n <p className=\"text-sm text-red-500\">{error.message}</p>\n )}\n </>\n )}\n />\n </div>\n );\n}\n","import { type JSX, type ReactNode, useEffect } from \"react\";\nimport {\n useForm,\n useWatch,\n type Control,\n type UseFormSetValue,\n} from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField } from \"./form-fields/FormTextField\";\nimport { FormSelectField } from \"./form-fields/FormSelectField\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useCountryStates } from \"@fluid-app/fluid-pay-core\";\n\nconst addressFormSchema = 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 address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n postal_code: z.string().min(1, \"Postal code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n default: z.boolean(),\n});\n\nexport type AddressFormData = z.infer<typeof addressFormSchema>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface AddressAutocompleteRenderProps {\n control: Control<AddressFormData>;\n setValue: UseFormSetValue<AddressFormData>;\n countryCode: string;\n}\n\ninterface AddressFormDialogProps {\n isOpen: boolean;\n onClose: () => void;\n selectedAddress: fluidPay.CustomerAddress | null;\n onSubmit: (data: fluidPay.CreateAddressBody) => void;\n isSubmitting: boolean;\n countries?: CountryOption[];\n error?: string;\n renderAddressAutocomplete?: (\n props: AddressAutocompleteRenderProps,\n ) => ReactNode;\n t: (key: string) => string;\n}\n\nexport default function AddressFormDialog({\n isOpen,\n onClose,\n selectedAddress,\n onSubmit,\n isSubmitting,\n countries = [],\n error,\n renderAddressAutocomplete,\n t,\n}: AddressFormDialogProps): JSX.Element {\n const { control, handleSubmit, reset, setValue } = useForm<AddressFormData>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolver: zodResolver(addressFormSchema as any),\n defaultValues: {\n first_name: \"\",\n last_name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country_code: \"US\",\n default: false,\n },\n });\n\n const selectedCountryCode = useWatch({ control, name: \"country_code\" });\n const isDefault = useWatch({ control, name: \"default\" });\n\n const { stateOptions, config, handleCountryChange } = useCountryStates();\n\n const countrySelectOptions = [...countries]\n .map((country) => ({\n name: country.name,\n value: country.iso,\n }))\n .sort((a, b) => {\n if (a.value === selectedCountryCode) return -1;\n if (b.value === selectedCountryCode) return 1;\n return a.name.localeCompare(b.name);\n });\n\n const stateSelectOptions = stateOptions.map((state) => ({\n name: state.name,\n value: state.isoCode,\n }));\n\n useEffect(() => {\n if (isOpen) {\n if (selectedAddress) {\n const nameParts = (selectedAddress.name ?? \"\").split(\" \");\n const firstName = nameParts[0] ?? \"\";\n const lastName = nameParts.slice(1).join(\" \");\n reset({\n first_name: firstName,\n last_name: lastName,\n address1: selectedAddress.address1,\n address2: selectedAddress.address2 ?? \"\",\n city: selectedAddress.city,\n state: selectedAddress.state,\n postal_code: selectedAddress.postal_code,\n country_code: selectedAddress.country_code ?? \"US\",\n default: selectedAddress.default,\n });\n handleCountryChange(selectedAddress.country_code ?? \"US\");\n } else {\n reset({\n first_name: \"\",\n last_name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country_code: \"US\",\n default: false,\n });\n handleCountryChange(\"US\");\n }\n }\n }, [selectedAddress, isOpen, reset, handleCountryChange]);\n\n useEffect(() => {\n handleCountryChange(selectedCountryCode);\n }, [selectedCountryCode, handleCountryChange]);\n\n const handleFormSubmit = handleSubmit((data) => {\n onSubmit({\n address: {\n first_name: data.first_name,\n last_name: data.last_name,\n address1: data.address1,\n address2: data.address2 ?? null,\n city: data.city,\n state: data.state,\n postal_code: data.postal_code,\n country_code: data.country_code,\n default: data.default,\n },\n });\n });\n\n const isEditMode = selectedAddress !== null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-md overflow-y-auto rounded md:max-w-xl\">\n <DialogHeader>\n <DialogTitle className=\"text-lg font-medium\">\n {isEditMode ? t(\"edit_address\") : t(\"add_an_address\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-3 pt-2\">\n <FormSelectField\n control={control}\n name=\"country_code\"\n placeholder={t(\"country\")}\n options={countrySelectOptions}\n disabled={isSubmitting}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"first_name\"\n placeholder={t(\"first_name\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormTextField\n control={control}\n name=\"last_name\"\n placeholder={t(\"last_name\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n </div>\n {renderAddressAutocomplete ? (\n renderAddressAutocomplete({\n control,\n setValue,\n countryCode: selectedCountryCode,\n })\n ) : (\n <FormTextField\n control={control}\n name=\"address1\"\n placeholder={t(\"address_line_1\")}\n disabled={isSubmitting}\n />\n )}\n <FormTextField\n control={control}\n name=\"address2\"\n placeholder={t(\"address_line_2\")}\n disabled={isSubmitting}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"city\"\n placeholder={t(\"city\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormSelectField\n control={control}\n name=\"state\"\n placeholder={\n config?.regionLabel ? t(config.regionLabel) : t(\"select_state\")\n }\n options={stateSelectOptions}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormTextField\n control={control}\n name=\"postal_code\"\n placeholder={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default_address\"\n checked={isDefault}\n onChange={() => setValue(\"default\", !isDefault)}\n disabled={isSubmitting}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default_address\" className=\"text-sm\">\n {t(\"set_as_default_address\")}\n </label>\n </div>\n\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isSubmitting}\n className=\"rounded bg-gray-900 px-5 py-2.5 text-white hover:bg-gray-800\"\n >\n {isSubmitting ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save_address\")\n )}\n </Button>\n </div>\n\n {error && <div className=\"mt-2 text-sm text-red-500\">{error}</div>}\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, useRef, useState, useCallback } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\n\nexport type VgsFieldState = {\n isFocused: boolean;\n isValid: boolean;\n isEmpty: boolean;\n};\n\nexport type VgsFormState = {\n [key: string]: VgsFieldState;\n};\n\ninterface VGSCollectForm {\n setRouteId: (routeId: string) => void;\n field: (selector: string, config: Record<string, unknown>) => void;\n submit: (\n path: string,\n options: { headers?: Record<string, string> },\n successCallback: (\n status: number,\n response: fluidPay.VgsCollectSubmitResponse,\n ) => void,\n errorCallback: (errors: Record<string, string[]>) => void,\n ) => void;\n unmount: () => void;\n}\n\ninterface VGSCollectLibrary {\n create: (\n vaultId: string,\n environment: string,\n stateCallback: (state: Record<string, Partial<VgsFieldState>>) => void,\n ) => VGSCollectForm;\n}\n\nconst getVGSCollect = (): VGSCollectLibrary | null => {\n if (typeof window !== \"undefined\") {\n return (\n (window as unknown as { VGSCollect?: VGSCollectLibrary }).VGSCollect ||\n null\n );\n }\n return null;\n};\n\nconst DEFAULT_FIELD_STATE: VgsFormState = {\n card_number: { isFocused: false, isValid: false, isEmpty: true },\n card_exp: { isFocused: false, isValid: false, isEmpty: true },\n card_cvc: { isFocused: false, isValid: false, isEmpty: true },\n card_holder: { isFocused: false, isValid: false, isEmpty: true },\n};\n\nexport function useVgsCollect() {\n const [isFormReady, setIsFormReady] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isScriptLoaded, setIsScriptLoaded] = useState(false);\n\n const [vgsFieldState, setVgsFieldState] =\n useState<VgsFormState>(DEFAULT_FIELD_STATE);\n\n const formRef = useRef<VGSCollectForm | null>(null);\n const onSuccessRef = useRef<\n ((response: fluidPay.VgsCollectSubmitResponse) => void) | null\n >(null);\n const onErrorRef = useRef<((error: string) => void) | null>(null);\n\n // Load VGS Collect script\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const vgsCollect = getVGSCollect();\n if (vgsCollect) {\n const timeoutId = window.setTimeout(() => {\n setIsScriptLoaded(true);\n }, 0);\n return () => window.clearTimeout(timeoutId);\n }\n\n if (isScriptLoaded) return;\n\n const script = document.createElement(\"script\");\n script.src =\n \"https://js.verygoodvault.com/vgs-collect/3.3.0/vgs-collect.js\";\n script.async = true;\n script.onload = () => setIsScriptLoaded(true);\n script.onerror = () => onErrorRef.current?.(\"Failed to load payment form\");\n document.head.appendChild(script);\n }, [isScriptLoaded]);\n\n const updateFieldState = useCallback(\n (state: Record<string, Partial<VgsFieldState>>) => {\n if (!state) return;\n\n setVgsFieldState((prev) => {\n const newState: VgsFormState = { ...prev };\n let hasChanges = false;\n\n Object.keys(state).forEach((key) => {\n const field = state[key];\n if (!field) return;\n\n const next: VgsFieldState = {\n isFocused: !!field.isFocused,\n isValid: !!field.isValid,\n isEmpty: !!field.isEmpty,\n };\n\n if (\n !newState[key] ||\n JSON.stringify(newState[key]) !== JSON.stringify(next)\n ) {\n newState[key] = next;\n hasChanges = true;\n }\n });\n\n return hasChanges ? newState : prev;\n });\n },\n [],\n );\n\n const resetVgs = useCallback(() => {\n if (formRef.current) {\n try {\n formRef.current.unmount();\n } catch (e) {\n console.warn(\"VGS unmount error\", e);\n }\n formRef.current = null;\n }\n\n setIsFormReady(false);\n setVgsFieldState({ ...DEFAULT_FIELD_STATE });\n }, []);\n\n const initializeForm = useCallback(\n async (credentials: fluidPay.VaultResponse) => {\n if (!isScriptLoaded) return;\n\n const VGSCollect = getVGSCollect();\n if (!VGSCollect) {\n onErrorRef.current?.(\"Payment script not loaded\");\n return;\n }\n\n try {\n setIsLoading(true);\n\n const vgsEnvironment =\n credentials.vault.environment === \"sandbox\" ? \"sandbox\" : \"live-eu-1\";\n\n const form = VGSCollect.create(\n credentials.vault.vault_id,\n vgsEnvironment,\n (state) => updateFieldState(state),\n );\n\n if (credentials.vault.route_id) {\n form.setRouteId(credentials.vault.route_id);\n }\n\n formRef.current = form;\n\n // Wait for DOM elements\n let retries = 0;\n const maxRetries = 20;\n const retryDelay = 200;\n\n const waitForDom = async (): Promise<boolean> => {\n const allExist = [\n \"vgs-card-number\",\n \"vgs-expiration-date\",\n \"vgs-cvc\",\n \"vgs-card-holder\",\n ].every((id) => {\n const el = document.getElementById(id);\n return el && el.isConnected;\n });\n\n if (allExist) return true;\n if (retries >= maxRetries) return false;\n\n retries++;\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n return waitForDom();\n };\n\n const domReady = await waitForDom();\n if (!domReady) {\n throw new Error(\"Payment form elements not ready\");\n }\n\n const css = {\n fontSize: \"14px\",\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n color: \"#1f2937\",\n paddingTop: \"0px\",\n paddingBottom: \"0px\",\n paddingLeft: \"0px\",\n paddingRight: \"0px\",\n boxSizing: \"border-box\",\n lineHeight: \"38px\",\n height: \"100%\",\n width: \"100%\",\n \"&::placeholder\": { color: \"#9ca3af\", opacity: 1 },\n \"&:focus\": { outline: \"none\" },\n };\n\n form.field(\"#vgs-card-number\", {\n type: \"card-number\",\n name: \"card_number\",\n placeholder: \"0000 0000 0000 0000\",\n showCardIcon: true,\n css: { ...css, paddingRight: \"40px\" },\n autoComplete: \"cc-number\",\n validations: [\"required\", \"validCardNumber\"],\n });\n\n form.field(\"#vgs-expiration-date\", {\n type: \"card-expiration-date\",\n name: \"card_exp\",\n yearLength: 2,\n placeholder: \"MM / YY\",\n css,\n autoComplete: \"cc-exp\",\n validations: [\"required\", \"validCardExpirationDate\"],\n });\n\n form.field(\"#vgs-cvc\", {\n type: \"card-security-code\",\n name: \"card_cvc\",\n placeholder: \"123\",\n css,\n autoComplete: \"cc-csc\",\n validations: [\"required\", \"validCardSecurityCode\"],\n });\n\n form.field(\"#vgs-card-holder\", {\n type: \"text\",\n name: \"card_holder\",\n placeholder: \"Full Name\",\n css,\n autoComplete: \"cc-name\",\n validations: [\"required\"],\n });\n\n setIsFormReady(true);\n } catch (error) {\n console.error(\"Failed to initialize VGS:\", error);\n onErrorRef.current?.(\"Failed to initialize payment form\");\n } finally {\n setIsLoading(false);\n }\n },\n [isScriptLoaded, updateFieldState],\n );\n\n const submitCard = useCallback(() => {\n if (!formRef.current) {\n onErrorRef.current?.(\"Form not initialized\");\n return;\n }\n\n formRef.current.submit(\n `/post`,\n {},\n (status: number, response: fluidPay.VgsCollectSubmitResponse) => {\n if (status >= 200 && status < 400) {\n onSuccessRef.current?.(response);\n } else {\n onErrorRef.current?.(\"Payment failed\");\n }\n },\n (errors: Record<string, string[]>) => {\n const allErrors = Object.values(errors)\n .flat()\n .filter(\n (msg) =>\n typeof msg === \"string\" &&\n msg.trim().length > 0 &&\n msg !== \"Required\",\n );\n\n const uniqueErrors = Array.from(new Set(allErrors));\n\n let errorMsg = \"Please verify your payment details.\";\n if (uniqueErrors.length > 0) {\n errorMsg = uniqueErrors.join(\", \");\n } else {\n const rawErrors = Object.values(errors).flat();\n if (rawErrors.length > 0) {\n errorMsg = \"Please fill in all required fields.\";\n }\n }\n\n onErrorRef.current?.(errorMsg);\n },\n );\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (formRef.current) {\n try {\n formRef.current.unmount();\n } catch (e) {\n console.warn(\"VGS unmount error\", e);\n }\n formRef.current = null;\n }\n };\n }, []);\n\n return {\n isFormReady,\n isLoading,\n isScriptLoaded,\n initializeForm,\n submitCard,\n vgsFieldState,\n resetVgs,\n onSuccessRef,\n onErrorRef,\n };\n}\n","import {\n type JSX,\n type ReactNode,\n useEffect,\n useState,\n useCallback,\n} from \"react\";\nimport {\n useForm,\n useWatch,\n type Control,\n type UseFormSetValue,\n} from \"react-hook-form\";\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n cn,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField } from \"./form-fields/FormTextField\";\nimport { FormSelectField } from \"./form-fields/FormSelectField\";\nimport type { fluidPay, FetchClient } from \"@fluid-app/fluid-pay-api-client\";\nimport { vaultApi } from \"@fluid-app/fluid-pay-api-client\";\nimport { useCountryStates } from \"@fluid-app/fluid-pay-core\";\nimport {\n useVgsCollect,\n type VgsFieldState,\n type VgsFormState,\n} from \"../hooks/use-vgs-collect\";\n\nconst billingAddressSchema = z.object({\n name: z.string().min(1, \"Name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n zip: z.string().min(1, \"Zip code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n set_as_default: z.boolean(),\n});\n\ntype BillingAddressFormData = z.infer<typeof billingAddressSchema>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface BillingAddressAutocompleteRenderProps {\n control: Control<BillingAddressFormData>;\n setValue: UseFormSetValue<BillingAddressFormData>;\n countryCode: string;\n}\n\ninterface CreditCardFormDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (data: fluidPay.AddCreditCardData) => void;\n isSubmitting: boolean;\n countries?: CountryOption[];\n error?: string;\n jwt: string;\n client: FetchClient;\n renderAddressAutocomplete?: (\n props: BillingAddressAutocompleteRenderProps,\n ) => ReactNode;\n t: (key: string) => string;\n}\n\nfunction VgsInputWrapper({\n id,\n fieldState,\n className,\n}: {\n id: string;\n fieldState?: VgsFieldState;\n className?: string;\n}) {\n const isInvalid =\n fieldState?.isValid === false &&\n !fieldState?.isFocused &&\n !fieldState?.isEmpty;\n\n const isFocused = fieldState?.isFocused;\n\n return (\n <div className=\"w-full\">\n <div\n id={id}\n className={cn(\n \"relative flex h-10 w-full items-center rounded-md border border-gray-300 bg-white px-3 shadow-sm transition-all duration-200 ease-in-out\",\n \"[&_iframe]:block! [&_iframe]:h-full! [&_iframe]:w-full!\",\n isFocused && \"border-blue-600 ring-1 ring-blue-600\",\n isInvalid && \"border-red-500 ring-1 ring-red-500\",\n className,\n )}\n />\n </div>\n );\n}\n\nfunction VgsCardForm({\n isLoading,\n isFormReady,\n vgsFieldState,\n networkError,\n t,\n}: {\n isLoading: boolean;\n isFormReady: boolean;\n vgsFieldState: VgsFormState;\n networkError?: string;\n t: (key: string) => string;\n}) {\n const showSpinner = isLoading || !isFormReady;\n\n return (\n <div className=\"space-y-4\" aria-label=\"Credit card form\">\n <VgsInputWrapper\n id=\"vgs-card-number\"\n fieldState={vgsFieldState[\"card_number\"]}\n />\n\n <div className=\"flex gap-3\">\n <div className=\"flex-1\">\n <VgsInputWrapper\n id=\"vgs-expiration-date\"\n fieldState={vgsFieldState[\"card_exp\"]}\n />\n </div>\n <div className=\"flex-1\">\n <VgsInputWrapper\n id=\"vgs-cvc\"\n fieldState={vgsFieldState[\"card_cvc\"]}\n />\n </div>\n </div>\n\n <VgsInputWrapper\n id=\"vgs-card-holder\"\n fieldState={vgsFieldState[\"card_holder\"]}\n />\n\n {networkError && networkError.trim().length > 0 && (\n <div className=\"rounded-md bg-red-50 p-3 text-sm text-red-600\">\n {networkError}\n </div>\n )}\n </div>\n );\n}\n\nexport default function CreditCardFormDialog({\n isOpen,\n onClose,\n onSubmit,\n isSubmitting,\n countries = [],\n error,\n jwt,\n client,\n renderAddressAutocomplete,\n t,\n}: CreditCardFormDialogProps): JSX.Element {\n const [cardError, setCardError] = useState<string | undefined>(undefined);\n const [isVgsSubmitting, setIsVgsSubmitting] = useState(false);\n\n const {\n isFormReady,\n isLoading: isVgsLoading,\n isScriptLoaded,\n initializeForm,\n submitCard,\n vgsFieldState,\n resetVgs,\n onSuccessRef,\n onErrorRef,\n } = useVgsCollect();\n\n const { control, handleSubmit, reset, setValue } =\n useForm<BillingAddressFormData>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n resolver: zodResolver(billingAddressSchema as any),\n defaultValues: {\n name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n zip: \"\",\n country_code: \"US\",\n set_as_default: false,\n },\n });\n\n const billingCountry = useWatch({ control, name: \"country_code\" });\n const setAsDefault = useWatch({ control, name: \"set_as_default\" });\n\n const { stateOptions, config, handleCountryChange } = useCountryStates();\n\n const countrySelectOptions = [...countries]\n .map((country) => ({\n name: country.name,\n value: country.iso,\n }))\n .sort((a, b) => {\n if (a.value === billingCountry) return -1;\n if (b.value === billingCountry) return 1;\n return a.name.localeCompare(b.name);\n });\n\n const stateSelectOptions = stateOptions.map((state) => ({\n name: state.name,\n value: state.isoCode,\n }));\n\n useEffect(() => {\n handleCountryChange(billingCountry);\n }, [billingCountry, handleCountryChange]);\n\n // Initialize VGS when dialog opens\n useEffect(() => {\n if (!isOpen || !isScriptLoaded || !jwt) return;\n\n let cancelled = false;\n\n const init = async () => {\n try {\n const credentials =\n await vaultApi.fetchVaultCredentialsForPaymentAccount(client, jwt);\n if (!cancelled) {\n await initializeForm(credentials);\n }\n } catch (err) {\n console.error(\"Failed to fetch vault credentials:\", err);\n if (!cancelled) {\n setCardError(\"Failed to initialize payment form\");\n }\n }\n };\n\n init();\n\n return () => {\n cancelled = true;\n };\n }, [isOpen, isScriptLoaded, jwt, client, initializeForm]);\n\n // Wire up VGS callbacks\n const handleVgsSuccess = useCallback(\n (response: fluidPay.VgsCollectSubmitResponse) => {\n const expValue = response?.card_exp;\n if (!expValue) {\n setCardError(\"Missing expiration date from payment form\");\n setIsVgsSubmitting(false);\n return;\n }\n\n const cleanExp = expValue.replace(/\\s+/g, \"\");\n const [expMonth, expYearShort] = cleanExp.split(\"/\");\n\n if (!expMonth || !expYearShort) {\n setCardError(\"Invalid expiration date format\");\n setIsVgsSubmitting(false);\n return;\n }\n\n const expYear =\n expYearShort.length === 2 ? `20${expYearShort}` : expYearShort;\n\n const cardholderName = response?.card_holder?.trim();\n if (!cardholderName) {\n setCardError(\"Cardholder name is required\");\n setIsVgsSubmitting(false);\n return;\n }\n\n // Read the current form values synchronously via handleSubmit\n handleSubmit((formData) => {\n const creditCardData: fluidPay.AddCreditCardData = {\n type: \"credit_card\",\n country_code: formData.country_code,\n default_payment_method: formData.set_as_default,\n payment_method: {\n token: response.card_number,\n cvv_token: response.card_cvc,\n exp_month: expMonth,\n exp_year: expYear,\n card_holder: cardholderName,\n billing_zip: formData.zip,\n },\n billing_address: {\n name: formData.name,\n address1: formData.address1,\n address2: formData.address2 ?? undefined,\n city: formData.city,\n state: formData.state,\n zip: formData.zip,\n country_code: formData.country_code,\n },\n };\n\n onSubmit(creditCardData);\n setIsVgsSubmitting(false);\n })();\n },\n [handleSubmit, onSubmit],\n );\n\n const handleVgsError = useCallback((err: string) => {\n setCardError(err);\n setIsVgsSubmitting(false);\n }, []);\n\n useEffect(() => {\n onSuccessRef.current = handleVgsSuccess;\n onErrorRef.current = handleVgsError;\n }, [handleVgsSuccess, handleVgsError, onSuccessRef, onErrorRef]);\n\n const handleClose = () => {\n resetVgs();\n reset();\n setCardError(undefined);\n setIsVgsSubmitting(false);\n onClose();\n };\n\n const handleFormSubmit = handleSubmit(() => {\n setIsVgsSubmitting(true);\n setCardError(undefined);\n submitCard();\n });\n\n const isBusy = isSubmitting || isVgsSubmitting;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-md overflow-y-auto rounded p-0 md:max-w-xl\">\n <div className=\"relative p-6\">\n {(isVgsLoading || !isFormReady) && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center rounded bg-white/80 backdrop-blur-[1px]\">\n <div className=\"flex items-center justify-center\">\n <div className=\"mr-3 h-5 w-5 animate-spin rounded-full border-2 border-t-2 border-blue-600 border-t-transparent\" />\n <p className=\"text-sm font-medium text-gray-600\">\n {t(\"securing\")}\n </p>\n </div>\n </div>\n )}\n <DialogHeader>\n <DialogTitle className=\"text-lg font-medium\">\n {t(\"add_credit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4 pt-6\">\n <VgsCardForm\n isLoading={isVgsLoading}\n isFormReady={isFormReady}\n vgsFieldState={vgsFieldState}\n networkError={cardError ?? error}\n t={t}\n />\n\n <div className=\"space-y-3 pt-2\">\n <h3 className=\"text-sm font-medium text-gray-500\">\n {t(\"billing_address\")}\n </h3>\n <FormSelectField\n control={control}\n name=\"country_code\"\n placeholder={t(\"country\")}\n options={countrySelectOptions}\n disabled={isBusy}\n />\n <FormTextField\n control={control}\n name=\"name\"\n placeholder={t(\"name\")}\n disabled={isBusy}\n />\n {renderAddressAutocomplete ? (\n renderAddressAutocomplete({\n control,\n setValue,\n countryCode: billingCountry,\n })\n ) : (\n <FormTextField\n control={control}\n name=\"address1\"\n placeholder={t(\"address_line_1\")}\n disabled={isBusy}\n />\n )}\n <FormTextField\n control={control}\n name=\"address2\"\n placeholder={t(\"address_line_2\")}\n disabled={isBusy}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"city\"\n placeholder={t(\"city\")}\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n <FormSelectField\n control={control}\n name=\"state\"\n placeholder={\n config?.regionLabel\n ? t(config.regionLabel)\n : t(\"select_state\")\n }\n options={stateSelectOptions}\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n <FormTextField\n control={control}\n name=\"zip\"\n placeholder={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n </div>\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default_cc\"\n checked={setAsDefault}\n onChange={() => setValue(\"set_as_default\", !setAsDefault)}\n disabled={isBusy}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default_cc\" className=\"text-sm\">\n {t(\"set_as_default_payment_method\")}\n </label>\n </div>\n\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isBusy}\n className=\"rounded bg-gray-900 px-5 py-2.5 text-white hover:bg-gray-800\"\n >\n {isBusy ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save_card\")\n )}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo } from \"react\";\nimport { useController } from \"react-hook-form\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { ProfileUIProvider } from \"@fluid-app/profile-core\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n Profile,\n AddressFormDialog,\n CreditCardFormDialog,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n BillingAddressAutocompleteRenderProps,\n} from \"@fluid-app/profile-ui\";\nimport {\n customersApi,\n addressesApi,\n paymentMethodsApi,\n} from \"@fluid-app/fluid-pay-api-client\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useFluidAuth } from \"../hooks/use-fluid-auth\";\nimport {\n useFluidPayClient,\n useSdkClient,\n API_VERSION,\n} from \"../account/use-account-clients\";\n\ninterface AccountProfileScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nconst translations: Record<string, string> = {\n edit_profile: \"Edit Profile\",\n first_name: \"First Name\",\n last_name: \"Last Name\",\n phone_number: \"Phone Number\",\n language: \"Language\",\n first_name_is_required: \"First name is required\",\n last_name_is_required: \"Last name is required\",\n language_is_required: \"Language is required\",\n saving: \"Saving...\",\n save_changes: \"Save Changes\",\n select_an_option: \"Select an option\",\n points_history: \"Points History\",\n points_available: \"Points Available\",\n points_awarded: \"Points Awarded\",\n points_redeemed: \"Points Redeemed\",\n transaction: \"Transaction\",\n no_points_history_found: \"No points history found\",\n shipping_addresses: \"Shipping Addresses\",\n add_an_address: \"Add an Address\",\n delete_address: \"Delete Address\",\n delete_address_message:\n \"Are you sure you want to delete this address? This action cannot be undone.\",\n delete: \"Delete\",\n add_address: \"Add Address\",\n edit_address: \"Edit Address\",\n set_as_default_address: \"Set as default address\",\n save_address: \"Save Address\",\n card_number: \"Card Number\",\n expiration_date: \"Expiration (MM / YY)\",\n cvc: \"CVC\",\n cardholder_name: \"Cardholder Name\",\n add_credit_card: \"Add Credit Card\",\n save_card: \"Save Card\",\n securing: \"Loading secure form...\",\n payment_methods: \"Payment Methods\",\n add_payment_method: \"Add Payment Method\",\n delete_credit_card: \"Delete Credit Card\",\n delete_credit_card_message:\n \"Are you sure you want to delete this payment method? This action cannot be undone.\",\n edit_card: \"Card Details\",\n billing_address: \"Billing Address\",\n country: \"Country\",\n name: \"Name\",\n address_line_1: \"Address Line 1\",\n address_line_2: \"Address Line 2\",\n city: \"City\",\n state: \"State\",\n province: \"Province\",\n zip_code: \"Zip Code\",\n postal_code: \"Postal Code\",\n select_state: \"Select state\",\n set_as_default_payment_method: \"Set as default payment method\",\n cancel: \"Cancel\",\n save: \"Save\",\n close: \"Close\",\n edit: \"Edit\",\n default: \"Default\",\n card_expires: \"Expires\",\n no_billing_address: \"No billing address on file\",\n default_payment_method_updated: \"Payment method updated\",\n failed_to_set_default_payment_method: \"Failed to update payment method\",\n};\n\nfunction t(key: string): string {\n if (translations[key]) return translations[key];\n return key\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\ninterface RawPointsLedgerEntry {\n id: number;\n amount: number;\n customer_id: number;\n created_at: string;\n metadata?: {\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 total_balance?: number;\n}\n\nfunction adaptPointsLedger(entry: RawPointsLedgerEntry): PointsLedger {\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: entry.customer_id,\n metadata: {\n transaction_type: entry.metadata?.transaction_type ?? undefined,\n source: entry.metadata?.source ?? undefined,\n },\n total_balance: entry.total_balance ?? 0,\n updated_at: entry.created_at,\n };\n}\n\nexport function AccountProfileScreen({\n onToast,\n countryIso,\n}: AccountProfileScreenProps): React.JSX.Element {\n const { token, user } = useFluidAuth();\n const client = useFluidPayClient();\n const sdkClient = useSdkClient();\n const queryClient = useQueryClient();\n const jwt = token ?? \"\";\n const userId = user?.id;\n\n // -- Data fetching --\n\n const {\n data: accountData,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useQuery({\n queryKey: [\"fluidPayAccount\", userId],\n queryFn: () => customersApi.fetchCustomerAccount(client, jwt),\n enabled: !!jwt,\n });\n\n const { data: addressesData, isLoading: isLoadingAddresses } = useQuery({\n queryKey: [\"fluidPayAddresses\", userId],\n queryFn: () => addressesApi.fetchCustomerAddresses(client, jwt),\n enabled: !!jwt,\n });\n\n const { data: paymentMethodsData, isLoading: isLoadingPaymentMethods } =\n useQuery({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n queryFn: () =>\n paymentMethodsApi.fetchCustomerPaymentMethods(client, jwt, countryIso),\n enabled: !!jwt,\n });\n\n const { data: countriesData } = useQuery({\n queryKey: [\"sdk-countries\"],\n queryFn: () =>\n sdkClient.get<Array<{ iso: string; name: string }>>(\"/countries\"),\n initialData: [],\n });\n\n const customerId = accountData?.customer?.id;\n\n const { data: pointsLedgerData, isLoading: isLoadingPointsLedger } = useQuery(\n {\n queryKey: [\"customer-points-ledger\", customerId],\n queryFn: () =>\n sdkClient.get<{ points_ledgers: RawPointsLedgerEntry[] }>(\n `${API_VERSION}/customers/${customerId}/points_ledgers`,\n ),\n enabled: !!customerId,\n },\n );\n\n // -- Mutations --\n\n const updateCustomerMutation = useMutation({\n mutationFn: (data: UserFormData) => {\n const languageIso =\n adaptedLanguages?.find((l) => l.name === data.language)?.iso ?? \"en\";\n return customersApi.updateCustomer(client, jwt, {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n language_iso: languageIso,\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAccount\", userId],\n });\n onToast(\"Profile updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update profile\", \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) =>\n addressesApi.deleteCustomerAddress(client, jwt, addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n paymentMethodsApi.deleteCustomerPaymentMethod(\n client,\n jwt,\n paymentMethodId,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n paymentMethodsApi.updatePaymentMethod(client, jwt, paymentMethodId, {\n set_as_default: data.set_as_default,\n billing_address: data.billing_address,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n },\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) =>\n addressesApi.createCustomerAddress(client, jwt, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\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 }) => addressesApi.updateCustomerAddress(client, jwt, addressId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\n onToast(\"Address updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update address\", \"error\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: fluidPay.AddCreditCardData) =>\n paymentMethodsApi.addCreditCardToCustomer(client, jwt, data),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n onToast(\"Payment method added\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to add payment method\", \"error\");\n },\n });\n\n // -- Derived data --\n\n const addresses = addressesData?.addresses ?? [];\n const paymentMethods = paymentMethodsData?.payment_methods ?? [];\n\n const adaptedPointsLedger: PointsLedger[] =\n pointsLedgerData?.points_ledgers?.map(adaptPointsLedger) ?? [];\n\n // MVP: Only English is supported. When the API exposes a languages endpoint, fetch dynamically.\n const adaptedLanguages: Language[] = [{ id: 0, name: \"English\", iso: \"en\" }];\n\n const countryOptions = useMemo(\n () =>\n [...countriesData]\n .map((c) => ({ iso: c.iso, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n\n // -- Loading state --\n\n if (!token) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"rounded-lg border p-4 text-center\">Login Required</div>\n </div>\n );\n }\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) {\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 return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <ProfileUIProvider t={t}>\n <Profile\n customerAccount={accountData}\n languages={adaptedLanguages}\n onUpdateCustomer={async (data) => {\n await updateCustomerMutation.mutateAsync(data);\n }}\n isUpdatingCustomer={updateCustomerMutation.isPending}\n // MVP: matches admin behavior; a merchant-level flag would be better\n rewardsPointsEnabled={adaptedPointsLedger.length > 0}\n pointsLedger={adaptedPointsLedger}\n isLoadingPointsLedger={isLoadingPointsLedger}\n addresses={addresses}\n isLoadingAddresses={isLoadingAddresses}\n onDeleteAddress={async (addressId) => {\n await deleteAddressMutation.mutateAsync(addressId);\n }}\n isDeletingAddress={deleteAddressMutation.isPending}\n paymentMethods={paymentMethods}\n isLoadingPaymentMethods={isLoadingPaymentMethods}\n onDeletePaymentMethod={async (paymentMethodId) => {\n await deletePaymentMethodMutation.mutateAsync(paymentMethodId);\n }}\n isDeletingPaymentMethod={deletePaymentMethodMutation.isPending}\n onUpdatePaymentMethod={async (paymentMethodId, data) => {\n await updatePaymentMethodMutation.mutateAsync({\n paymentMethodId,\n data,\n });\n }}\n isUpdatingPaymentMethod={updatePaymentMethodMutation.isPending}\n getBillingAddress={(pm) => pm.billing_address ?? null}\n countries={countryOptions}\n renderAddressDialog={({ isOpen, onClose, selectedAddress }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={selectedAddress}\n t={t}\n onSubmit={async (formData) => {\n if (selectedAddress) {\n await updateAddressMutation.mutateAsync({\n addressId: selectedAddress.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n onClose();\n }}\n isSubmitting={\n createAddressMutation.isPending ||\n updateAddressMutation.isPending\n }\n countries={countryOptions}\n renderAddressAutocomplete={({\n control,\n setValue: _setValue,\n }: {\n control: Parameters<\n NonNullable<\n Parameters<\n typeof AddressFormDialog\n >[0][\"renderAddressAutocomplete\"]\n >\n >[0][\"control\"];\n setValue: Parameters<\n NonNullable<\n Parameters<\n typeof AddressFormDialog\n >[0][\"renderAddressAutocomplete\"]\n >\n >[0][\"setValue\"];\n }) => <PlainAddressInput control={control} name=\"address1\" />}\n />\n )}\n renderCreditCardDialog={({ isOpen, onClose }) => (\n <CreditCardFormDialog\n isOpen={isOpen}\n onClose={onClose}\n t={t}\n onSubmit={async (data) => {\n await addCreditCardMutation.mutateAsync(data);\n onClose();\n }}\n isSubmitting={addCreditCardMutation.isPending}\n countries={countryOptions}\n jwt={jwt}\n client={client}\n renderAddressAutocomplete={({\n control,\n setValue: _setValue,\n }: BillingAddressAutocompleteRenderProps) => (\n <PlainAddressInput control={control} name=\"address1\" />\n )}\n />\n )}\n />\n </ProfileUIProvider>\n </div>\n );\n}\n\n/**\n * Plain text input fallback for address autocomplete.\n * The SDK doesn't have Google Places integration.\n */\nfunction PlainAddressInput({\n control,\n name,\n}: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n control: any;\n name: string;\n}): React.JSX.Element {\n const { field } = useController({ control, name: name as string });\n return (\n <input\n type=\"text\"\n value={(field.value as string) ?? \"\"}\n placeholder=\"Address Line 1\"\n className=\"border-input bg-background ring-offset-background placeholder:text-muted-foreground focus-visible:ring-ring flex h-10 w-full rounded-md border px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\"\n onChange={field.onChange}\n />\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\n\nconst OrdersClientContext = createContext<FetchClient | null>(null);\n\nexport const OrdersClientProvider = OrdersClientContext.Provider;\n\nexport function useOrdersClient(): FetchClient {\n const client = useContext(OrdersClientContext);\n if (!client) {\n throw new Error(\n \"useOrdersClient must be used within an OrdersCoreProvider\",\n );\n }\n return client;\n}\n","import type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { JSX, ReactNode } from \"react\";\nimport { OrdersClientProvider } from \"./context\";\n\nexport interface OrdersCoreProviderProps {\n client: FetchClient;\n children: ReactNode;\n}\n\nexport function OrdersCoreProvider({\n client,\n children,\n}: OrdersCoreProviderProps): JSX.Element {\n return <OrdersClientProvider value={client}>{children}</OrdersClientProvider>;\n}\n","import type { orders } from \"@fluid-app/orders-api-client\";\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","import { useQuery } from \"@tanstack/react-query\";\nimport { ordersApi } from \"@fluid-app/orders-api-client\";\nimport { ordersKeys } from \"../query-keys\";\nimport { useOrdersClient } from \"../context\";\n\nexport function useOrder(orderToken: string, options?: { enabled?: boolean }) {\n const client = useOrdersClient();\n return useQuery({\n queryKey: ordersKeys.detail(orderToken),\n queryFn: () => ordersApi.fetchOrder(client, orderToken),\n enabled: (options?.enabled ?? true) && !!orderToken,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { orders } from \"@fluid-app/orders-api-client\";\nimport { ordersApi } from \"@fluid-app/orders-api-client\";\nimport { ordersKeys } from \"../query-keys\";\nimport { useOrdersClient } from \"../context\";\n\nexport function useCustomerOrders(\n params: orders.FetchOrdersParams,\n options?: { enabled?: boolean },\n) {\n const client = useOrdersClient();\n return useQuery({\n queryKey: ordersKeys.list(params),\n queryFn: () => ordersApi.fetchCustomerOrders(client, params),\n enabled: options?.enabled ?? true,\n });\n}\n","import type { orders } from \"@fluid-app/orders-api-client\";\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","import { Input } from \"@fluid-app/ui-primitives\";\nimport { Search } from \"lucide-react\";\n\ninterface SearchInputProps {\n searchTerm: string;\n onSearchChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function SearchInput({\n searchTerm,\n onSearchChange,\n placeholder,\n}: SearchInputProps) {\n return (\n <div className=\"relative\">\n <Search className=\"text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2\" />\n <Input\n value={searchTerm}\n onChange={(e) => onSearchChange(e.target.value)}\n placeholder={placeholder}\n className=\"pl-9\"\n />\n </div>\n );\n}\n","import { cn } from \"@fluid-app/ui-primitives\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\n\nexport interface PaginationFooterProps {\n currentPage: number;\n totalPages: number;\n pageSize: number;\n totalItems: number;\n /** @deprecated No longer used. Kept for backward compatibility with subscriptions-ui. */\n maxVisiblePages?: number;\n onPageChange?: (page: number) => void;\n cursorPaginationMode?: boolean;\n hasNextPage?: boolean;\n hasPrevPage?: boolean;\n onCursorNext?: () => void;\n onCursorPrev?: () => void;\n /** @deprecated Use lucide icons directly. Kept for backward compatibility with subscriptions-ui. */\n chevronLeftIcon?: string;\n /** @deprecated Use lucide icons directly. Kept for backward compatibility with subscriptions-ui. */\n chevronRightIcon?: string;\n /** @deprecated Pagination labels are now hardcoded in English. Kept for backward compatibility. */\n t?: (key: string) => string;\n}\n\nexport function PaginationFooter({\n currentPage,\n totalPages,\n pageSize,\n totalItems,\n onPageChange,\n cursorPaginationMode,\n hasNextPage,\n hasPrevPage,\n onCursorNext,\n onCursorPrev,\n}: PaginationFooterProps) {\n const isCursor = !!cursorPaginationMode;\n\n const isPrevDisabled = isCursor ? !hasPrevPage : currentPage === 1;\n const isNextDisabled = isCursor\n ? !hasNextPage\n : totalPages === 0 || currentPage === totalPages;\n\n const handlePrevClick = () => {\n if (isCursor) {\n onCursorPrev?.();\n } else {\n onPageChange?.(currentPage - 1);\n }\n };\n\n const handleNextClick = () => {\n if (isCursor) {\n onCursorNext?.();\n } else {\n onPageChange?.(currentPage + 1);\n }\n };\n\n const displayText = (() => {\n if (isCursor) {\n return (\n <>\n Total <span className=\"font-medium\">{totalItems}</span> results\n </>\n );\n }\n const start = totalItems === 0 ? 0 : (currentPage - 1) * pageSize + 1;\n const end = Math.min(currentPage * pageSize, totalItems);\n return (\n <>\n Showing <span className=\"font-medium\">{start}</span> to{\" \"}\n <span className=\"font-medium\">{end}</span> of{\" \"}\n <span className=\"font-medium\">{totalItems}</span> results\n </>\n );\n })();\n\n const buttonBase =\n \"relative inline-flex items-center px-3 py-2 text-sm font-medium transition-colors disabled:pointer-events-none disabled:opacity-50\";\n\n return (\n <div className=\"border-border flex items-center justify-between border-t px-4 py-3 sm:px-6\">\n {/* Mobile prev/next */}\n <div className=\"flex flex-1 justify-between sm:hidden\">\n <button\n type=\"button\"\n onClick={handlePrevClick}\n disabled={isPrevDisabled}\n className={cn(\n buttonBase,\n \"border-border bg-background text-foreground hover:bg-accent rounded-md border\",\n )}\n >\n Previous\n </button>\n <button\n type=\"button\"\n onClick={handleNextClick}\n disabled={isNextDisabled}\n className={cn(\n buttonBase,\n \"border-border bg-background text-foreground hover:bg-accent ml-3 rounded-md border\",\n )}\n >\n Next\n </button>\n </div>\n\n {/* Desktop */}\n <div className=\"hidden sm:flex sm:flex-1 sm:items-center sm:justify-between\">\n <p className=\"text-muted-foreground text-xs\">{displayText}</p>\n <nav\n aria-label=\"Pagination\"\n className=\"isolate inline-flex -space-x-px rounded-md shadow-sm\"\n >\n <button\n type=\"button\"\n onClick={handlePrevClick}\n disabled={isPrevDisabled}\n className={cn(\n buttonBase,\n \"border-border text-muted-foreground hover:bg-accent rounded-l-md border\",\n )}\n >\n <span className=\"sr-only\">Previous</span>\n <ChevronLeft className=\"h-4 w-4\" />\n </button>\n {!isCursor && (\n <span className=\"border-border bg-background text-foreground relative inline-flex items-center border px-4 py-2 text-sm font-medium\">\n {currentPage} / {totalPages}\n </span>\n )}\n <button\n type=\"button\"\n onClick={handleNextClick}\n disabled={isNextDisabled}\n className={cn(\n buttonBase,\n \"border-border text-muted-foreground hover:bg-accent rounded-r-md border\",\n )}\n >\n <span className=\"sr-only\">Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </button>\n </nav>\n </div>\n </div>\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-100 text-green-800 dark:bg-green-900/30 dark:text-green-400\",\n yellow:\n \"bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400\",\n red: \"bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400\",\n blue: \"bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400\",\n gray: \"bg-gray-100 text-gray-800 dark:bg-gray-800 dark:text-gray-300\",\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\",\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","import { cn } from \"@fluid-app/ui-primitives\";\n\ninterface TableColumnProps {\n label: string;\n sortable?: boolean;\n className?: string;\n onSortClick?: (sortBy: string) => void;\n sortBy?: string;\n sortData?: {\n column: string;\n direction: \"asc\" | \"desc\";\n };\n chevronUpIcon?: string;\n chevronDownIcon?: string;\n}\n\nexport function TableColumn({\n label,\n sortable = true,\n className,\n onSortClick,\n sortBy,\n sortData,\n chevronUpIcon,\n chevronDownIcon,\n}: TableColumnProps) {\n const hideUpIcon =\n sortData?.column !== sortBy ||\n (sortData?.column === sortBy && sortData?.direction === \"asc\");\n\n const hideDownIcon =\n sortData?.column !== sortBy ||\n (sortData?.column === sortBy && sortData?.direction === \"desc\");\n\n return (\n <th\n className={cn(\n \"group cursor-pointer px-3 py-2 text-left text-xs font-medium text-gray-500 transition-colors duration-200\",\n \"hover:text-blue-600\",\n className,\n )}\n onClick={() => sortable && onSortClick?.(sortBy ?? \"\")}\n >\n <div className=\"relative flex items-center\">\n {label}\n {sortable && chevronUpIcon && chevronDownIcon && (\n <button\n className={`ml-2 inline-flex flex-col items-center justify-center group-hover:opacity-100 ${\n sortData?.column === sortBy ? \"opacity-100\" : \"opacity-0\"\n } transition-opacity duration-200`}\n >\n <div className=\"flex flex-col\">\n <img\n src={chevronUpIcon}\n alt=\"\"\n width={12}\n height={12}\n className={cn(\n \"h-2.5 w-2.5 text-gray-400 transition-colors duration-200 group-hover:text-blue-600\",\n hideUpIcon && \"opacity-0\",\n sortData?.column !== sortBy && \"group-hover:opacity-100\",\n )}\n />\n <img\n src={chevronDownIcon}\n alt=\"\"\n width={12}\n height={12}\n className={cn(\n \"h-2.5 w-2.5 text-gray-400 transition-colors duration-200 group-hover:text-blue-600\",\n hideDownIcon && \"opacity-0\",\n sortData?.column !== sortBy && \"group-hover:opacity-100\",\n )}\n />\n </div>\n </button>\n )}\n </div>\n </th>\n );\n}\n","import { useState, useCallback } from \"react\";\nimport type { orders } from \"@fluid-app/orders-api-client\";\nimport { useCustomerOrders, formatOrderTotal } from \"@fluid-app/orders-core\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { SearchInput } from \"./search-input\";\nimport { PaginationFooter } from \"./pagination-footer\";\nimport { StatusBadge } from \"./status-badge\";\nimport { TableColumn } from \"./table-column\";\n\nexport interface OrdersListProps {\n customerId: number | undefined;\n onOrderClick: (order: orders.ListOrder) => void;\n onSubscriptionClick?: (subscriptionToken: string) => void;\n t: (key: string) => string;\n pageSize?: number;\n}\n\nexport function OrdersList({\n customerId,\n onOrderClick,\n onSubscriptionClick,\n t,\n pageSize = 10,\n}: OrdersListProps) {\n const [cursor, setCursor] = useState<string | null>(null);\n const [searchTerm, setSearchTerm] = useState(\"\");\n\n const params: orders.FetchOrdersParams = {\n customerId,\n limit: pageSize,\n search: searchTerm || undefined,\n cursor: cursor || undefined,\n sort: \"-created_at\",\n };\n\n const { data, isLoading } = useCustomerOrders(params, {\n enabled: !!customerId,\n });\n\n const handleSearchChange = useCallback((term: string) => {\n setSearchTerm(term);\n setCursor(null);\n }, []);\n\n const handleNextPage = useCallback(() => {\n const nextCursor = data?.meta?.pagination?.next_cursor;\n if (nextCursor) {\n setCursor(nextCursor);\n }\n }, [data?.meta?.pagination?.next_cursor]);\n\n const handlePrevPage = useCallback(() => {\n const prevCursor = data?.meta?.pagination?.prev_cursor;\n if (prevCursor) {\n setCursor(prevCursor);\n } else {\n setCursor(null);\n }\n }, [data?.meta?.pagination?.prev_cursor]);\n\n const ordersList = data?.orders || [];\n const pagination = data?.meta?.pagination;\n const totalItems = pagination?.total_count ?? ordersList.length;\n const totalPages = pagination?.total_pages ?? 1;\n const currentPage = pagination?.current_page ?? 1;\n const hasNextPage = !!pagination?.next_cursor;\n const hasPrevPage = !!pagination?.prev_cursor;\n\n return (\n <div className=\"border-border overflow-hidden rounded-lg border shadow-sm\">\n <div className=\"p-3 text-left\">\n <div className=\"w-full md:mr-auto md:w-1/2 lg:w-1/3\">\n <SearchInput\n searchTerm={searchTerm}\n onSearchChange={handleSearchChange}\n placeholder={t(\"search_orders\")}\n />\n </div>\n </div>\n\n {/* mobile view */}\n <div className=\"block md:hidden\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, index) => (\n <div\n key={`skeleton-${index}`}\n className=\"border-border border-b p-4\"\n >\n <div className=\"flex space-x-3\">\n <Skeleton className=\"h-12 w-12 rounded-md\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n </div>\n </div>\n ))\n ) : ordersList.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-8 text-center text-sm\">\n {searchTerm ? t(\"no_matching_orders\") : t(\"no_orders_found\")}\n </div>\n ) : (\n ordersList.map((order) => (\n <div\n key={order.id}\n className=\"border-border hover:bg-accent cursor-pointer border-b p-4 transition-colors duration-200 ease-in-out last:border-b-0\"\n onClick={() => onOrderClick(order)}\n >\n <div className=\"flex items-start space-x-3\">\n {order.first_item?.image_url ? (\n <img\n src={order.first_item.image_url}\n alt={t(\"no_image_available\")}\n width={48}\n height={48}\n className=\"h-12 w-12 flex-shrink-0 rounded-md object-cover\"\n />\n ) : (\n <div className=\"bg-border h-12 w-12 flex-shrink-0 rounded-md\" />\n )}\n <div className=\"w-0 min-w-0 flex-1\">\n {order.first_item?.title ? (\n <p className=\"text-foreground truncate text-sm font-medium\">\n {order.first_item.title}\n </p>\n ) : (\n <div className=\"bg-muted rounded-lg p-2\">\n <div className=\"text-muted-foreground text-xs\">\n {t(\"this_product_no_longer_exists\")}\n </div>\n </div>\n )}\n {order.subscription && (\n <StatusBadge color=\"blue\" size=\"xs\" className=\"mt-1\">\n {t(\"subscription\")}\n </StatusBadge>\n )}\n {order.subscription && onSubscriptionClick && (\n <button\n type=\"button\"\n className=\"text-foreground hover:text-foreground/80 mt-1 inline-block text-xs transition-colors duration-200 hover:underline\"\n onClick={(e) => {\n e.stopPropagation();\n onSubscriptionClick(\n order.subscription!.subscription_token,\n );\n }}\n >\n {t(\"view_subscription\")}\n </button>\n )}\n <div className=\"mt-2 grid grid-cols-2 gap-x-4 gap-y-1 text-sm\">\n <div>\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"date\")}\n </span>\n <span className=\"text-muted-foreground\">\n {new Date(order.created_at).toLocaleDateString()}\n </span>\n </div>\n <div>\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"total\")}\n </span>\n <span className=\"text-foreground font-medium\">\n {formatOrderTotal(order)}\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n\n {/* desktop view */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"min-w-full table-fixed\">\n <colgroup>\n <col className=\"w-2/5 min-w-[240px]\" />\n <col className=\"w-1/3 min-w-[100px]\" />\n <col className=\"w-[26.67%] min-w-[100px]\" />\n </colgroup>\n <thead className=\"bg-muted\">\n <tr className=\"h-10\">\n <TableColumn label={t(\"product\")} sortable={false} />\n <TableColumn label={t(\"date\")} sortable={false} />\n <TableColumn label={t(\"total\")} sortable={false} />\n </tr>\n </thead>\n <tbody className=\"divide-border bg-background divide-y\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, index) => (\n <tr key={`skeleton-${index}`}>\n <td className=\"px-3 py-4\">\n <div className=\"flex items-center space-x-2\">\n <Skeleton className=\"h-9 w-9 rounded-md\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-24\" />\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-24\" />\n </td>\n </tr>\n ))\n ) : ordersList.length === 0 ? (\n <tr>\n <td\n colSpan={3}\n className=\"text-muted-foreground px-3 py-8 text-center text-sm\"\n >\n {searchTerm ? t(\"no_matching_orders\") : t(\"no_orders_found\")}\n </td>\n </tr>\n ) : (\n ordersList.map((order) => (\n <tr\n key={order.id}\n className=\"hover:bg-accent cursor-pointer transition-colors duration-200 ease-in-out\"\n onClick={() => onOrderClick(order)}\n >\n <td className=\"text-muted-foreground px-3 py-4 text-sm\">\n <div className=\"flex max-w-[280px] flex-row items-center space-x-3\">\n {order.first_item?.image_url ? (\n <img\n src={order.first_item.image_url}\n alt={t(\"no_image_available\")}\n width={42}\n height={42}\n className=\"h-[42px] w-[42px] flex-shrink-0 rounded-md object-cover\"\n />\n ) : (\n <div className=\"bg-border ml-1 h-9 w-9 flex-shrink-0 rounded-md\" />\n )}\n <div className=\"flex min-w-0 flex-col space-y-1\">\n <div className=\"flex items-center space-x-2\">\n {order.first_item?.title ? (\n <span className=\"text-foreground truncate text-sm font-medium\">\n {order.first_item.title}\n </span>\n ) : (\n <div className=\"bg-muted w-full rounded-lg p-2\">\n <div className=\"text-muted-foreground text-xs\">\n {t(\"this_product_no_longer_exists\")}\n </div>\n </div>\n )}\n {order.subscription && (\n <StatusBadge\n color=\"blue\"\n size=\"xs\"\n className=\"flex-shrink-0\"\n >\n {t(\"subscription\")}\n </StatusBadge>\n )}\n </div>\n {order.subscription && onSubscriptionClick && (\n <button\n type=\"button\"\n className=\"text-foreground hover:text-foreground/80 text-left text-xs transition-colors duration-200 hover:underline\"\n onClick={(e) => {\n e.stopPropagation();\n onSubscriptionClick(\n order.subscription!.subscription_token,\n );\n }}\n >\n {t(\"view_subscription\")}\n </button>\n )}\n </div>\n </div>\n </td>\n <td className=\"text-muted-foreground px-3 py-4 text-sm whitespace-nowrap\">\n {new Date(order.created_at).toLocaleDateString()}\n </td>\n <td className=\"text-foreground px-3 py-4 text-sm whitespace-nowrap\">\n {formatOrderTotal(order)}\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n <PaginationFooter\n currentPage={currentPage}\n totalPages={totalPages}\n pageSize={pageSize}\n totalItems={totalItems}\n cursorPaginationMode\n hasNextPage={hasNextPage}\n hasPrevPage={hasPrevPage}\n onCursorNext={handleNextPage}\n onCursorPrev={handlePrevPage}\n />\n </div>\n );\n}\n","import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\n\ninterface SectionProps {\n title: string;\n children: React.ReactNode;\n footer?: React.ReactNode;\n}\n\nexport function Section({ title, children, footer }: SectionProps) {\n return (\n <Card>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n </CardHeader>\n <CardContent>{children}</CardContent>\n {footer && <div className=\"px-6 pb-6\">{footer}</div>}\n </Card>\n );\n}\n","import {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { Truck } from \"lucide-react\";\n\nexport interface FormattedAddress {\n line1: string;\n line2: string;\n line3: string;\n}\n\nexport interface ShippingAddressCardProps {\n name?: string | null;\n address?: FormattedAddress | null;\n title?: string;\n className?: string;\n}\n\nexport function ShippingAddressCard({\n name,\n address,\n title = \"Shipping Address\",\n className,\n}: ShippingAddressCardProps) {\n return (\n <Card className={className}>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n </CardHeader>\n <CardContent>\n {!address ? (\n <p className=\"text-muted-foreground text-sm\">\n No shipping address available\n </p>\n ) : (\n <div className=\"flex items-start gap-2\">\n <Truck className=\"text-muted-foreground mt-0.5 mr-2 h-4 w-4 shrink-0\" />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n {name && (\n <span\n className=\"text-foreground min-w-0 truncate text-sm\"\n title={name}\n >\n {name}\n </span>\n )}\n {address.line1 && (\n <span className=\"text-muted-foreground text-sm\">\n {address.line1}\n </span>\n )}\n {address.line2 && (\n <span className=\"text-muted-foreground text-sm\">\n {address.line2}\n </span>\n )}\n {address.line3 && (\n <span className=\"text-muted-foreground text-sm\">\n {address.line3}\n </span>\n )}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\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 {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { startCase } from \"../lib/format\";\n\nexport interface PaymentMethodData {\n source?: string | null;\n payment_title?: string | null;\n logo_url?: string | null;\n card_type?: string | null;\n last_four_digits?: string | null;\n}\n\nexport interface PaymentMethodCardProps {\n paymentMethod?: PaymentMethodData | null;\n title?: string;\n className?: string;\n}\n\nfunction capitalizeFirstLetter(str?: string | null): string {\n if (!str || str.length === 0) return \"\";\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction PaymentDetails({ card }: { card: PaymentMethodData }) {\n const paymentTitle =\n card.payment_title || (card.source ? startCase(card.source) : null);\n\n // Credit card payments\n if (card.source === \"card\" || card.card_type) {\n const cardType = capitalizeFirstLetter(card.card_type || \"Card\");\n const lastFour = card.last_four_digits || \"XXXX\";\n\n return (\n <div className=\"flex w-full flex-row justify-between\">\n <div className=\"flex flex-row items-center gap-2.5\">\n {card.logo_url ? (\n <img\n src={card.logo_url}\n alt={`${cardType} Logo`}\n className=\"h-6 w-9 object-contain\"\n width={35}\n height={24}\n />\n ) : (\n <div className=\"bg-muted text-muted-foreground flex h-6 w-9 items-center justify-center rounded text-xs\">\n {cardType.charAt(0)}\n </div>\n )}\n <span className=\"text-sm font-medium\">\n {cardType} * {lastFour}\n </span>\n </div>\n </div>\n );\n }\n\n // Other payment types (PayPal, etc.)\n const displayTitle = paymentTitle || \"Payment Method\";\n\n return (\n <div className=\"flex w-full flex-row justify-between\">\n <div className=\"flex flex-row items-center gap-2.5\">\n {card.logo_url ? (\n <img\n src={card.logo_url}\n alt={`${displayTitle} Logo`}\n className=\"h-6 w-9 object-contain\"\n width={35}\n height={24}\n />\n ) : (\n <div className=\"flex h-6 w-9 items-center justify-center rounded bg-blue-100 text-xs font-medium text-blue-600 dark:bg-blue-900/30 dark:text-blue-400\">\n {displayTitle.charAt(0)}\n </div>\n )}\n <span className=\"text-sm font-medium\">{displayTitle}</span>\n </div>\n </div>\n );\n}\n\nexport function PaymentMethodCard({\n paymentMethod,\n title = \"Payment Method\",\n className,\n}: PaymentMethodCardProps) {\n return (\n <Card className={className}>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n </CardHeader>\n <CardContent>\n {paymentMethod ? (\n <PaymentDetails card={paymentMethod} />\n ) : (\n <p className=\"text-muted-foreground text-sm\">No payment method</p>\n )}\n </CardContent>\n </Card>\n );\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 { useEffect } from \"react\";\nimport type { orders } from \"@fluid-app/orders-api-client\";\nimport { useOrder } from \"@fluid-app/orders-core\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { Section } from \"./section\";\nimport {\n ShippingAddressCard,\n type FormattedAddress,\n} from \"./shipping-address-card\";\nimport { PaymentMethodCard } from \"./payment-method-card\";\nimport { OrderStatusBadge } from \"./order-status-badge\";\nimport { StatusBadge } from \"./status-badge\";\nimport { startCase, formatCurrency } from \"../lib/format\";\n\nexport interface OrderDetailProps {\n token: string;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n}\n\nfunction formatAddress(address: orders.ShipTo): FormattedAddress {\n const line1 = address.address1 ?? \"\";\n const cityState = [address.city, address.state].filter(Boolean).join(\", \");\n const line2 = [cityState, address.postal_code].filter(Boolean).join(\" \");\n const line3 = address.country_code ?? \"\";\n return { line1, line2, line3 };\n}\n\nfunction OrderDetailSkeleton() {\n return (\n <div className=\"space-y-6\">\n <Skeleton className=\"h-16 w-full rounded-lg\" />\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"space-y-6 lg:col-span-2\">\n <Skeleton className=\"h-64 w-full rounded-lg\" />\n <Skeleton className=\"h-48 w-full rounded-lg\" />\n </div>\n <div className=\"space-y-6\">\n <Skeleton className=\"h-32 w-full rounded-lg\" />\n <Skeleton className=\"h-32 w-full rounded-lg\" />\n <Skeleton className=\"h-32 w-full rounded-lg\" />\n </div>\n </div>\n </div>\n );\n}\n\nfunction OrderItemRow({ item }: { item: orders.LegacyOrderItem }) {\n return (\n <div className=\"flex items-start gap-4 py-4 first:pt-0 last:pb-0\">\n {item.image_url && (\n <img\n src={item.image_url}\n alt={item.title}\n className=\"h-16 w-16 flex-shrink-0 rounded-lg object-cover\"\n />\n )}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-foreground font-medium\">{item.title}</p>\n {item.ordered_variant.length > 0 && (\n <p className=\"text-muted-foreground text-sm\">\n {item.ordered_variant.map((v) => v.value).join(\" / \")}\n </p>\n )}\n {item.sku && (\n <p className=\"text-muted-foreground text-xs\">SKU: {item.sku}</p>\n )}\n {item.subscription && (\n <StatusBadge color=\"blue\" size=\"xs\" className=\"mt-1\">\n Subscription\n </StatusBadge>\n )}\n </div>\n <div className=\"text-right text-sm\">\n <p className=\"text-foreground font-medium\">{item.display_total}</p>\n {item.quantity > 1 && (\n <p className=\"text-muted-foreground\">\n {item.display_price} x {item.quantity}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nfunction OrderPriceSummary({ order }: { order: orders.Order }) {\n const sym = order.currency_symbol || \"$\";\n\n return (\n <Section title=\"Summary\">\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Subtotal</dt>\n <dd className=\"text-foreground font-medium\">\n {order.sub_total_in_currency}\n </dd>\n </div>\n {Number(order.discount) > 0 && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">\n Discount\n {order.discount_codes?.length\n ? ` (${order.discount_codes.join(\", \")})`\n : \"\"}\n </dt>\n <dd className=\"text-foreground font-medium\">\n -{order.discount_in_currency}\n </dd>\n </div>\n )}\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Shipping</dt>\n <dd className=\"text-foreground font-medium\">\n {order.free_shipping ? \"Free\" : order.shipping_total_for_display}\n </dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">\n Tax\n {order.price_inclusive_of_tax && order.price_inclusive_tax_name\n ? ` (${order.price_inclusive_tax_name}, included)`\n : \"\"}\n </dt>\n <dd className=\"text-foreground font-medium\">\n {order.tax_in_currency}\n </dd>\n </div>\n {order.points_applied_amount_in_currency != null &&\n order.points_applied_amount_in_currency > 0 && (\n <div className=\"flex justify-between\">\n <dt className=\"text-muted-foreground\">Points Applied</dt>\n <dd className=\"text-foreground font-medium\">\n -{formatCurrency(sym, order.points_applied_amount_in_currency)}\n </dd>\n </div>\n )}\n <div className=\"border-border flex justify-between border-t pt-2\">\n <dt className=\"text-foreground font-semibold\">Total</dt>\n <dd className=\"text-foreground font-semibold\">\n {order.total_in_currency}\n </dd>\n </div>\n </dl>\n </Section>\n );\n}\n\nfunction OrderStatusRow({ order }: { order: orders.Order }) {\n return (\n <div className=\"border-border bg-card flex flex-wrap items-center gap-3 rounded-lg border p-6\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Payment:</span>\n <OrderStatusBadge status={order.payment_status} />\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Fulfillment:</span>\n <OrderStatusBadge status={order.fulfillment_status} />\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground text-sm\">Delivery:</span>\n <OrderStatusBadge status={order.delivery_status} />\n </div>\n <div className=\"text-muted-foreground ml-auto text-sm\">\n {new Date(order.created_at).toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })}\n </div>\n </div>\n );\n}\n\nfunction OrderInfoCard({ order }: { order: orders.Order }) {\n return (\n <Section title=\"Order Info\">\n <dl className=\"space-y-2 text-sm\">\n <div>\n <dt className=\"text-muted-foreground\">Order Number</dt>\n <dd className=\"text-foreground font-medium\">{order.order_number}</dd>\n </div>\n <div>\n <dt className=\"text-muted-foreground\">Channel</dt>\n <dd className=\"text-foreground font-medium\">\n {startCase(order.channel)}\n </dd>\n </div>\n {order.email && (\n <div>\n <dt className=\"text-muted-foreground\">Email</dt>\n <dd className=\"text-foreground font-medium\">{order.email}</dd>\n </div>\n )}\n </dl>\n </Section>\n );\n}\n\nfunction ShippingMethodCard({ method }: { method: orders.ShippingMethod }) {\n return (\n <Section title=\"Shipping Method\">\n <p className=\"text-muted-foreground text-sm\">{method.title}</p>\n {method.delivery_time_estimate && (\n <p className=\"text-muted-foreground mt-1 text-xs\">\n Est. {method.delivery_time_estimate}\n </p>\n )}\n </Section>\n );\n}\n\nexport function OrderDetail({ token, onNotFound, onError }: OrderDetailProps) {\n const { data, isLoading, error } = useOrder(token);\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 <OrderDetailSkeleton />;\n }\n\n if (!order) {\n return null;\n }\n\n const visibleItems = order.items.filter(\n (item) => item.display_to_customer !== false,\n );\n\n return (\n <div className=\"space-y-6\">\n <OrderStatusRow order={order} />\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Left column */}\n <div className=\"space-y-6 lg:col-span-2\">\n <Section title={`Items (${order.items_count})`}>\n <div className=\"divide-border divide-y\">\n {visibleItems.map((item) => (\n <OrderItemRow key={item.id} item={item} />\n ))}\n </div>\n </Section>\n\n <OrderPriceSummary order={order} />\n </div>\n\n {/* Right column */}\n <div className=\"space-y-6\">\n {order.payment_details && (\n <PaymentMethodCard\n paymentMethod={{\n source: order.payment_details.payment_type,\n payment_title: order.payment_details.payment_title,\n logo_url: order.payment_details.details.logo_url,\n card_type: order.payment_details.details.card_type,\n last_four_digits: order.payment_details.details.last_four,\n }}\n />\n )}\n\n {order.ship_to && (\n <ShippingAddressCard\n name={order.ship_to.name}\n address={formatAddress(order.ship_to)}\n title=\"Shipping Address\"\n />\n )}\n\n {order.bill_to && (\n <ShippingAddressCard\n name={order.bill_to.name}\n address={formatAddress(order.bill_to)}\n title=\"Billing Address\"\n />\n )}\n\n {order.shipping_method && (\n <ShippingMethodCard method={order.shipping_method} />\n )}\n\n <OrderInfoCard order={order} />\n </div>\n </div>\n </div>\n );\n}\n","import { OrdersCoreProvider } from \"@fluid-app/orders-core\";\nimport { OrdersList } from \"@fluid-app/orders-ui\";\nimport type { orders } from \"@fluid-app/orders-api-client\";\nimport { useOrdersClient } from \"../account/use-account-clients\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface AccountOrdersScreenProps {\n customerId: number | undefined;\n isLoadingCustomer: boolean;\n}\n\nconst translations: Record<string, string> = {\n search_orders: \"Search orders...\",\n order_number: \"Order #\",\n date: \"Date\",\n status: \"Status\",\n product: \"Product\",\n no_orders_found: \"No orders found\",\n no_matching_orders: \"No matching orders\",\n no_image_available: \"No image available\",\n this_product_no_longer_exists: \"This product no longer exists\",\n subscription: \"Subscription\",\n view_subscription: \"View Subscription\",\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n};\n\nexport function AccountOrdersScreen({\n customerId,\n isLoadingCustomer,\n}: AccountOrdersScreenProps): React.JSX.Element {\n const ordersClient = useOrdersClient();\n const { navigate } = useAppNavigation();\n\n const handleOrderClick = (order: orders.ListOrder) => {\n navigate(`account/orders/${order.token}`);\n };\n\n const handleSubscriptionClick = (subscriptionToken: string) => {\n navigate(`account/subscriptions/${subscriptionToken}`);\n };\n\n if (isLoadingCustomer) {\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"space-y-3\">\n <div className=\"bg-muted h-10 animate-pulse rounded\" />\n <div className=\"bg-muted h-64 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <OrdersCoreProvider client={ordersClient}>\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <OrdersList\n customerId={customerId}\n onOrderClick={handleOrderClick}\n onSubscriptionClick={handleSubscriptionClick}\n t={(key) => translations[key] ?? key}\n />\n </div>\n </OrdersCoreProvider>\n );\n}\n","import { OrdersCoreProvider } from \"@fluid-app/orders-core\";\nimport { OrderDetail } from \"@fluid-app/orders-ui\";\nimport { useOrdersClient } from \"../account/use-account-clients\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface AccountOrderDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function AccountOrderDetailScreen({\n token,\n onToast,\n}: AccountOrderDetailScreenProps): React.JSX.Element {\n const client = useOrdersClient();\n const { navigate } = useAppNavigation();\n\n return (\n <OrdersCoreProvider client={client}>\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 <OrderDetail\n token={token}\n onNotFound={() => {\n onToast(\"Order not found\", \"warning\");\n navigate(\"account/orders\");\n }}\n onError={(err) => {\n const message =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`Failed to load order: ${message}`, \"error\");\n }}\n />\n </div>\n </OrdersCoreProvider>\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { FetchClient } from \"@fluid-app/api-client-core\";\n\nconst SubscriptionsClientContext = createContext<FetchClient | null>(null);\n\nexport const SubscriptionsClientProvider = SubscriptionsClientContext.Provider;\n\nexport function useSubscriptionsClient(): FetchClient {\n const client = useContext(SubscriptionsClientContext);\n if (!client) {\n throw new Error(\n \"useSubscriptionsClient must be used within a SubscriptionsCoreProvider\",\n );\n }\n return client;\n}\n","import type { FetchClient } from \"@fluid-app/api-client-core\";\nimport type { JSX } from \"react\";\nimport { SubscriptionsClientProvider } from \"./context\";\n\nexport interface SubscriptionsCoreProviderProps {\n client: FetchClient;\n children: React.ReactNode;\n}\n\nexport function SubscriptionsCoreProvider({\n client,\n children,\n}: SubscriptionsCoreProviderProps): JSX.Element {\n return (\n <SubscriptionsClientProvider value={client}>\n {children}\n </SubscriptionsClientProvider>\n );\n}\n","import type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\n\nexport const subscriptionsKeys = {\n all: [\"subscriptions\"] as const,\n list: (params?: subscriptions.FetchSubscriptionsParams) =>\n [...subscriptionsKeys.all, \"list\", params] as const,\n detail: (token: string) =>\n [...subscriptionsKeys.all, \"detail\", token] as const,\n} as const;\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useSubscriptions(\n params: subscriptions.FetchSubscriptionsParams,\n options?: { enabled?: boolean },\n) {\n const client = useSubscriptionsClient();\n return useQuery({\n queryKey: subscriptionsKeys.list(params),\n queryFn: () => subscriptionsApi.fetchCustomerSubscriptions(client, params),\n enabled: options?.enabled ?? !!params.customerId,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useSubscription(\n token: string,\n options?: { enabled?: boolean },\n) {\n const client = useSubscriptionsClient();\n return useQuery({\n queryKey: subscriptionsKeys.detail(token),\n queryFn: () => subscriptionsApi.fetchSubscription(client, token),\n enabled: (options?.enabled ?? true) && !!token,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function usePauseSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const client = useSubscriptionsClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n pauseParams: subscriptions.PauseSubscriptionParams;\n }) =>\n subscriptionsApi.pauseSubscription(\n client,\n params.subscriptionToken,\n params.pauseParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useResumeSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const client = useSubscriptionsClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n resumeParams: subscriptions.ResumeSubscriptionParams;\n }) =>\n subscriptionsApi.resumeSubscription(\n client,\n params.subscriptionToken,\n params.resumeParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useSkipSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const client = useSubscriptionsClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n skipParams: subscriptions.SkipSubscriptionParams;\n }) =>\n subscriptionsApi.skipSubscription(\n client,\n params.subscriptionToken,\n params.skipParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useCancelSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const client = useSubscriptionsClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: { subscriptionToken: string; customerId: number }) =>\n subscriptionsApi.cancelSubscription(\n client,\n params.subscriptionToken,\n params.customerId,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsApi } from \"@fluid-app/subscriptions-api-client\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsClient } from \"../context\";\n\nexport function useReactivateSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const client = useSubscriptionsClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n reactivateParams: subscriptions.ReactivateSubscriptionParams;\n }) =>\n subscriptionsApi.reactivateSubscription(\n client,\n params.subscriptionToken,\n params.reactivateParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","interface SubscriptionPriceItem {\n allow_subscription: boolean;\n subscription_interval: number | null;\n subscription_price_in_currency: string | null;\n}\n\nexport function getSubscriptionPrice(\n item: SubscriptionPriceItem,\n): string | null {\n if (!item.allow_subscription) return null;\n const intervalText =\n item.subscription_interval === 1\n ? \"month\"\n : `${item.subscription_interval} mo.`;\n return `${item.subscription_price_in_currency}/${intervalText}`;\n}\n\nexport function formatSubscriptionFrequency(frequency: string): string {\n if (frequency === \"day\") return \"Daily\";\n if (frequency === \"week\") return \"Weekly\";\n if (frequency === \"month\") return \"Monthly\";\n if (frequency === \"year\") return \"Yearly\";\n return frequency;\n}\n\nexport function calculateResumeDate(\n billingInterval: number,\n billingIntervalUnit: string,\n orderCount: number,\n fromDate?: string | Date | null,\n): Date {\n let startDate: Date;\n\n if (fromDate) {\n if (typeof fromDate === \"string\") {\n startDate = new Date(\n fromDate + (fromDate.includes(\"T\") ? \"\" : \"T12:00:00.000Z\"),\n );\n } else {\n startDate = new Date(\n Date.UTC(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n } else {\n const now = new Date();\n startDate = new Date(\n Date.UTC(\n now.getUTCFullYear(),\n now.getUTCMonth(),\n now.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n\n const baseDate = new Date(startDate.getTime());\n const totalIntervals = billingInterval * orderCount;\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals);\n break;\n case \"week\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals * 7);\n break;\n case \"month\": {\n const currentMonth = baseDate.getUTCMonth();\n const currentDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(currentMonth + totalIntervals);\n if (baseDate.getUTCDate() !== currentDay) {\n baseDate.setUTCDate(0);\n }\n break;\n }\n case \"year\":\n baseDate.setUTCFullYear(baseDate.getUTCFullYear() + totalIntervals);\n break;\n default: {\n const defaultMonth = baseDate.getUTCMonth();\n const defaultDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(defaultMonth + totalIntervals);\n if (baseDate.getUTCDate() !== defaultDay) {\n baseDate.setUTCDate(0);\n }\n }\n }\n\n return baseDate;\n}\n\nexport function calculateNextBillDate(\n billingInterval: number = 1,\n billingIntervalUnit: string = \"month\",\n): string {\n const now = new Date();\n const nextBillDate = new Date(now);\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n nextBillDate.setDate(now.getDate() + billingInterval);\n break;\n case \"week\":\n nextBillDate.setDate(now.getDate() + billingInterval * 7);\n break;\n case \"month\":\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n break;\n case \"year\":\n nextBillDate.setFullYear(now.getFullYear() + billingInterval);\n break;\n default:\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n }\n\n return nextBillDate.toISOString().split(\"T\")[0] || \"\";\n}\n\nexport function formatDate(\n dateString: string,\n isCancelled: boolean = false,\n): string {\n if (isCancelled) return \"Cancelled\";\n if (!dateString) return \"Paused\";\n\n const parts = dateString.split(\"-\");\n if (parts.length !== 3) return \"Invalid date\";\n\n const [year, month, day] = parts.map(Number);\n if (!year || !month || !day) return \"Invalid date\";\n const date = new Date(year, month - 1, day);\n\n const monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n\n const dayNum = date.getDate();\n const monthName = monthNames[date.getMonth()];\n const yearNum = date.getFullYear();\n\n const ordinalSuffix = (d: number) => {\n if (d > 3 && d < 21) return \"th\";\n switch (d % 10) {\n case 1:\n return \"st\";\n case 2:\n return \"nd\";\n case 3:\n return \"rd\";\n default:\n return \"th\";\n }\n };\n\n return `${monthName} ${dayNum}${ordinalSuffix(dayNum)}, ${yearNum}`;\n}\n\nexport function getNextBillDisplay<\n T extends { status?: string; next_bill_date?: string | null },\n>(subscription: T | null | undefined): string {\n if (subscription?.status === \"cancelled\") return \"Cancelled\";\n if (subscription?.next_bill_date)\n return formatDate(subscription.next_bill_date);\n if (subscription?.status === \"paused\") return \"Paused\";\n return \"N/A\";\n}\n\nexport function calculateSubscriptionPrice(\n totalPrice: number,\n subscribeAndSave: string | null | undefined,\n quantity: number,\n): string {\n if (!subscribeAndSave) return totalPrice.toFixed(2);\n\n const unitDiscountAmount = parseFloat(subscribeAndSave);\n if (isNaN(unitDiscountAmount)) return totalPrice.toFixed(2);\n\n const subscriptionAmount = totalPrice - unitDiscountAmount * quantity;\n return subscriptionAmount.toFixed(2);\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","/**\n * Format a number as currency (USD).\n */\nexport function formatCurrency(value: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(value);\n}\n\n/**\n * Convert a snake_case or lowercase string to Start Case.\n * Replaces lodash startCase for simple status strings.\n */\nexport function startCase(str: string | undefined | null): string {\n if (!str) return \"\";\n return str.replace(/_/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/**\n * Format a next bill date string to M/D/YYYY (UTC).\n */\nexport function formatNextBillDate(nextBillDate: string): string {\n if (!nextBillDate) return \"N/A\";\n const date = new Date(nextBillDate);\n if (isNaN(date.getTime())) return \"N/A\";\n const month = date.getUTCMonth() + 1;\n const day = date.getUTCDate();\n const year = date.getUTCFullYear();\n return `${month}/${day}/${year}`;\n}\n","import type { JSX } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nconst STATUS_COLORS: Record<string, string> = {\n active: \"bg-green-100 text-green-800\",\n paused: \"bg-gray-100 text-gray-800\",\n cancelled: \"bg-red-100 text-red-800\",\n pending: \"bg-yellow-100 text-yellow-800\",\n inactive: \"bg-gray-100 text-gray-800\",\n disabled: \"bg-red-100 text-red-800\",\n past_due: \"bg-gray-100 text-gray-800\",\n};\n\nconst STATUS_DOT_COLORS: Record<string, string> = {\n active: \"bg-green-500\",\n paused: \"bg-gray-400\",\n cancelled: \"bg-red-500\",\n pending: \"bg-yellow-500\",\n inactive: \"bg-gray-400\",\n disabled: \"bg-red-500\",\n past_due: \"bg-gray-400\",\n};\n\nexport interface StatusPillProps {\n status: string | undefined | null;\n children: React.ReactNode;\n}\n\nexport function StatusPill({ status, children }: StatusPillProps): JSX.Element {\n const key = status?.toLowerCase() ?? \"\";\n const pillColor = STATUS_COLORS[key] ?? \"bg-gray-100 text-gray-800\";\n const dotColor = STATUS_DOT_COLORS[key] ?? \"bg-gray-400\";\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium\",\n pillColor,\n )}\n >\n <span className={cn(\"h-1.5 w-1.5 rounded-full\", dotColor)} />\n {children}\n </span>\n );\n}\n","import { useState, useEffect, type JSX } from \"react\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport { useSubscriptions } from \"@fluid-app/subscriptions-core\";\nimport { TableColumn, PaginationFooter } from \"@fluid-app/orders-ui\";\nimport { Search } from \"lucide-react\";\nimport { Button, Input, Skeleton } from \"@fluid-app/ui-primitives\";\nimport { cn } from \"../lib/cn\";\nimport { formatCurrency, startCase, formatNextBillDate } from \"../lib/format\";\nimport { StatusPill } from \"./status-pill\";\n\nexport interface SubscriptionsListProps {\n customerId: number | undefined;\n onSubscriptionClick: (subscriptionToken: string) => void;\n t: (key: string) => string;\n pageSize?: number;\n}\n\nexport function SubscriptionsList({\n customerId,\n onSubscriptionClick,\n t,\n pageSize = 10,\n}: SubscriptionsListProps): JSX.Element {\n const [currentPage, setCurrentPage] = useState(1);\n const [statusFilter, setStatusFilter] = useState<string | null>(null);\n const [search, setSearch] = useState<string | null>(null);\n const [sortBy, setSortBy] = useState<{\n column: string;\n direction: \"asc\" | \"desc\";\n }>({\n column: \"next_bill_date\",\n direction: \"desc\",\n });\n\n const params: subscriptions.FetchSubscriptionsParams = {\n customerId: customerId ?? 0,\n page: currentPage,\n perPage: pageSize,\n status: statusFilter,\n search,\n sortBy: sortBy.column,\n sortDirection: sortBy.direction,\n };\n\n const { data, isLoading } = useSubscriptions(params, {\n enabled: !!customerId,\n });\n\n // Reset page when filters change\n useEffect(() => {\n setCurrentPage(1);\n }, [statusFilter, search, sortBy]);\n\n const items = data?.subscriptions ?? [];\n const totalItems = data?.meta?.pagination?.total_count ?? 0;\n const totalPages = data?.meta?.pagination?.total_pages ?? 1;\n\n const handleSubscriptionClick = (token: string) => {\n if (token) {\n onSubscriptionClick(token);\n }\n };\n\n return (\n <div className=\"border-border overflow-hidden rounded-lg border shadow-sm\">\n {/* header: filter buttons + search */}\n <div className=\"flex flex-col gap-2 p-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setStatusFilter(null)}\n className={cn(\n \"rounded-md text-xs\",\n statusFilter === null && \"bg-muted-foreground font-bold\",\n )}\n >\n {t(\"all\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setStatusFilter(\"active\")}\n className={cn(\n \"rounded-md text-xs\",\n statusFilter === \"active\" && \"bg-muted-foreground font-bold\",\n )}\n >\n {t(\"active\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setStatusFilter(\"inactive\")}\n className={cn(\n \"rounded-md text-xs\",\n statusFilter === \"inactive\" && \"bg-muted-foreground font-bold\",\n )}\n >\n {t(\"inactive\")}\n </Button>\n </div>\n <div className=\"relative w-full sm:w-auto sm:min-w-[220px]\">\n <div className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3\">\n <Search className=\"text-muted-foreground h-4 w-4\" />\n </div>\n <Input\n type=\"search\"\n value={search ?? \"\"}\n onChange={(e) => setSearch(e.target.value || null)}\n className=\"h-10 w-full pl-10\"\n placeholder={t(\"subscriptions\")}\n />\n </div>\n </div>\n\n {/* mobile view */}\n <div className=\"block md:hidden\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, index) => (\n <div\n key={`skeleton-${index}`}\n className=\"border-border border-b p-4\"\n >\n <div className=\"flex space-x-3\">\n <Skeleton className=\"h-12 w-12 rounded-md\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-3 w-1/2\" />\n </div>\n </div>\n </div>\n ))\n ) : items.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-8 text-center text-sm\">\n {t(\"no_subscriptions_found\")}\n </div>\n ) : (\n items.map((subscription) => (\n <div\n key={subscription.subscription_token}\n className=\"border-border hover:bg-accent cursor-pointer border-b p-4 transition-colors duration-200 ease-in-out last:border-b-0\"\n onClick={() =>\n handleSubscriptionClick(subscription.subscription_token)\n }\n >\n <div className=\"flex items-start space-x-3\">\n <img\n src={subscription.variant?.product?.image_url}\n alt={subscription.variant?.product?.title}\n width={48}\n height={48}\n className=\"h-12 w-12 flex-shrink-0 rounded-md object-cover\"\n />\n <div className=\"w-0 min-w-0 flex-1\">\n <p className=\"text-foreground truncate text-sm font-medium\">\n {subscription.variant?.product?.title}\n </p>\n <div className=\"mt-2 grid grid-cols-2 gap-x-4 gap-y-1 text-sm\">\n <div>\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"next_bill_date\")}\n </span>\n <span className=\"text-muted-foreground\">\n {formatNextBillDate(subscription.next_bill_date ?? \"\")}\n </span>\n </div>\n <div>\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"price\")}\n </span>\n <span className=\"text-foreground font-medium\">\n {formatCurrency(\n subscription.price * subscription.quantity,\n )}\n </span>\n </div>\n </div>\n <div className=\"mt-2\">\n <span className=\"text-muted-foreground block text-xs\">\n {t(\"status\")}\n </span>\n <StatusPill status={subscription.status}>\n {startCase(subscription.status) || t(\"unknown_status\")}\n </StatusPill>\n </div>\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n\n {/* desktop view */}\n <div className=\"hidden overflow-x-auto md:block\">\n <table className=\"min-w-full table-fixed\">\n <colgroup>\n <col className=\"w-[45%] min-w-[240px]\" />\n <col className=\"w-[20%] min-w-[100px]\" />\n <col className=\"w-[15%] min-w-[100px]\" />\n <col className=\"w-[20%] min-w-[100px]\" />\n </colgroup>\n <thead className=\"bg-muted\">\n <tr className=\"h-10\">\n <TableColumn label={t(\"product\")} sortable={false} />\n <TableColumn\n label={t(\"next_bill_date\")}\n sortBy=\"next_bill_date\"\n sortData={sortBy}\n onSortClick={(value: string) =>\n setSortBy({\n column: value,\n direction: sortBy.direction === \"asc\" ? \"desc\" : \"asc\",\n })\n }\n />\n <TableColumn label={t(\"price\")} sortable={false} />\n <TableColumn label={t(\"status\")} sortable={false} />\n </tr>\n </thead>\n <tbody className=\"divide-border bg-background divide-y\">\n {isLoading ? (\n Array(5)\n .fill(0)\n .map((_, index) => (\n <tr key={`skeleton-${index}`}>\n <td className=\"px-3 py-4\">\n <div className=\"flex items-center space-x-2\">\n <Skeleton className=\"h-9 w-9 rounded-md\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-24\" />\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-24\" />\n </td>\n <td className=\"px-3 py-4\">\n <Skeleton className=\"h-4 w-16\" />\n </td>\n </tr>\n ))\n ) : items.length === 0 ? (\n <tr>\n <td\n colSpan={4}\n className=\"text-muted-foreground px-3 py-8 text-center text-sm\"\n >\n {t(\"no_subscriptions_found\")}\n </td>\n </tr>\n ) : (\n items.map((subscription) => (\n <tr\n key={subscription.subscription_token}\n className=\"hover:bg-muted cursor-pointer transition-colors duration-200 ease-in-out\"\n onClick={() =>\n handleSubscriptionClick(subscription.subscription_token)\n }\n >\n <td className=\"text-muted-foreground flex max-w-[280px] items-center space-x-3 py-4 pr-3 pl-3 text-sm\">\n <img\n src={subscription.variant?.product?.image_url}\n alt={subscription.variant?.product?.title}\n width={48}\n height={48}\n className=\"h-12 w-12 flex-shrink-0 rounded-md object-cover\"\n />\n <span className=\"text-foreground truncate text-sm font-medium\">\n {subscription.variant?.product?.title}\n </span>\n </td>\n <td className=\"text-muted-foreground px-3 py-4 text-sm whitespace-nowrap\">\n {formatNextBillDate(subscription.next_bill_date ?? \"\")}\n </td>\n <td className=\"px-3 py-4 text-sm whitespace-nowrap\">\n <span className=\"text-muted-foreground\">\n {formatCurrency(\n subscription.price * subscription.quantity,\n )}\n </span>\n </td>\n <td className=\"px-3 py-4 text-sm whitespace-nowrap\">\n <StatusPill status={subscription.status}>\n {startCase(subscription.status) || t(\"unknown_status\")}\n </StatusPill>\n </td>\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n\n <PaginationFooter\n currentPage={currentPage}\n totalPages={totalPages}\n pageSize={pageSize}\n totalItems={totalItems}\n onPageChange={setCurrentPage}\n t={t}\n />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogCancel,\n AlertDialogAction,\n} from \"@fluid-app/ui-primitives\";\n\ninterface ConfirmDialogProps {\n title: string;\n description: string;\n actionButtonText?: string;\n cancelButtonText?: string;\n open: boolean;\n setOpen: (open: boolean) => void;\n onConfirm: () => void | Promise<unknown>;\n}\n\nexport function ConfirmDialog({\n title,\n description,\n actionButtonText = \"Delete\",\n cancelButtonText = \"Cancel\",\n open,\n setOpen,\n onConfirm,\n}: ConfirmDialogProps) {\n const [isPending, setIsPending] = useState(false);\n\n const handleConfirm = async () => {\n try {\n const result = onConfirm();\n if (result instanceof Promise) {\n setIsPending(true);\n await result;\n }\n } catch (error) {\n console.error(\"ConfirmDialog: action rejected\", error);\n } finally {\n setIsPending(false);\n setOpen(false);\n }\n };\n\n return (\n <AlertDialog open={open} onOpenChange={(v) => !isPending && setOpen(v)}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{description}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isPending}>\n {cancelButtonText}\n </AlertDialogCancel>\n <AlertDialogAction\n onClick={handleConfirm}\n disabled={isPending}\n className=\"bg-red-600 text-white hover:bg-red-500\"\n >\n {isPending ? \"...\" : actionButtonText}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","import { useState, useEffect, type JSX } from \"react\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-api-client\";\nimport {\n useSubscription,\n usePauseSubscription,\n useResumeSubscription,\n useSkipSubscription,\n useCancelSubscription,\n useReactivateSubscription,\n formatSubscriptionFrequency,\n formatDate,\n getNextBillDisplay,\n calculateNextBillDate,\n} from \"@fluid-app/subscriptions-core\";\nimport { SkipForward, Pause, Play, XCircle, RotateCcw } from \"lucide-react\";\nimport { Skeleton, Button } from \"@fluid-app/ui-primitives\";\nimport { ConfirmDialog } from \"./confirm-dialog\";\nimport { StatusPill } from \"./status-pill\";\nimport { startCase, formatCurrency } from \"../lib/format\";\n\nexport interface SubscriptionDetailProps {\n token: string;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSuccess?: (message: string) => void;\n onMutationError?: (message: string, error: unknown) => void;\n}\n\nfunction SubscriptionDetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n {/* Left: items skeleton */}\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=\"grid grid-cols-2 gap-4\">\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n <div className=\"mt-6 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 <Skeleton className=\"h-4 w-1/4\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n {/* Right: management skeleton */}\n <div className=\"bg-background col-span-4 px-8 pt-4\">\n <div className=\"mx-auto max-w-lg\">\n <Skeleton className=\"mb-3 h-5 w-32\" />\n <div className=\"grid grid-cols-2 gap-3\">\n <Skeleton className=\"h-10 w-full rounded\" />\n <Skeleton className=\"h-10 w-full rounded\" />\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-12 flex-1 rounded\" />\n <Skeleton className=\"h-12 flex-1 rounded\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Left column: product & order summary ──────────────────────────── */\n\nfunction SubscriptionItemsSection({\n subscription,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n}) {\n const variant = subscription.variant;\n const product = variant?.product;\n const quantity = subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n const discount =\n subscription.original_price != null\n ? subscription.original_price - subscription.price\n : 0;\n const subtotal =\n discount > 0\n ? formatCurrency(subscription.original_price * quantity)\n : totalPrice;\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 {/* Upcoming order summary */}\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n Your Upcoming Order\n </h2>\n <div className=\"text-muted-foreground\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"border-border border-r pr-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n Next Order Date\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {getNextBillDisplay(subscription)}\n </div>\n </div>\n <div className=\"pl-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n Next Bill Amount\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </div>\n </div>\n </div>\n <hr className=\"border-border mt-4\" />\n </div>\n </div>\n\n {/* Product row */}\n <div className=\"py-6\">\n <div className=\"flex flex-row items-center space-x-4\">\n <div className=\"flex min-w-0 flex-1 flex-row space-x-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted h-24 w-24 overflow-hidden rounded\">\n {product?.image_url ? (\n <img\n src={product.image_url}\n alt={variant?.title || \"Product image\"}\n width={96}\n height={96}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground flex h-full w-full items-center justify-center\">\n No image\n </div>\n )}\n {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 {quantity}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex min-w-0 flex-col space-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={product?.title}\n >\n {product?.title}\n </p>\n {variant?.title && product?.title && (\n <p className=\"text-muted-foreground text-sm\">\n {variant.title}\n </p>\n )}\n <div>\n <p className=\"text-foreground text-sm font-medium\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {/* Pricing summary */}\n <div className=\"mb-4\">\n {discount > 0 && (\n <>\n <div className=\"flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n Subtotal\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n {subtotal}\n </p>\n </div>\n <div className=\"mt-2 flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n Discount\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n -{formatCurrency(discount * quantity)}\n </p>\n </div>\n </>\n )}\n <div className=\"mt-4 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">Total</p>\n <p className=\"text-foreground text-base font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n <span className=\"text-muted-foreground text-xs\">\n *Tax and shipping calculated at checkout\n </span>\n </div>\n </div>\n </section>\n );\n}\n\n/* ── Right column: actions & details ───────────────────────────────── */\n\nfunction SubscriptionManagementSection({\n subscription,\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n onSkip,\n onPause,\n onResume,\n onCancel,\n onReactivate,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n onSkip: () => void;\n onPause: () => void;\n onResume: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n}) {\n const plan = subscription.subscription_plan;\n const quantity = subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n\n const paymentMethod = subscription.payment_method;\n const paymentDetails = paymentMethod?.details as {\n last4?: string;\n card_type?: string;\n logo_url?: string;\n } | null;\n\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"bg-background col-span-4 flex-auto px-8 pt-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Action Buttons */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h2 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order Actions\n </h2>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && plan.allow_skipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating || !subscription.next_bill_date}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Skip Next Order</span>\n </Button>\n )}\n {isActive && (\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Pause Subscription</span>\n </Button>\n )}\n {isPaused && (\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Resume Subscription</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating || isCancelled}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">\n {isCancelled ? \"Cancelled\" : \"Cancel Subscription\"}\n </span>\n </Button>\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Reactivate Subscription</span>\n </Button>\n )}\n </div>\n </div>\n\n {/* Subscription Details */}\n <div className=\"border-border mb-4 border-b\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h3 className=\"text-foreground text-sm/6 font-semibold\">\n Subscription Details\n </h3>\n <StatusPill status={subscription.status}>\n {startCase(subscription.status)}\n </StatusPill>\n </div>\n <div className=\"divide-border mb-4 flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">\n Order Frequency\n </div>\n <div className=\"text-foreground font-medium\">\n {formatSubscriptionFrequency(plan.billing_interval_unit)}\n </div>\n </div>\n <div className=\"flex-1 px-4\">\n <div className=\"text-muted-foreground text-sm\">Next Payment</div>\n <div className=\"text-foreground font-medium\">{totalPrice}</div>\n </div>\n {subscription.last_bill_date && (\n <div className=\"flex-1 pl-4 text-right\">\n <div className=\"text-muted-foreground text-sm\">Last Billed</div>\n <div className=\"text-foreground font-medium\">\n {formatDate(subscription.last_bill_date)}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Payment & Shipping */}\n <div className=\"pt-2\">\n <h3 className=\"text-foreground text-sm/6 font-semibold\">\n Payment & Shipping\n </h3>\n <div className=\"flex flex-col\">\n {/* Shipping Address */}\n {subscription.address && (\n <div className=\"border-border mb-6 border-b pb-4\">\n <div className=\"text-muted-foreground mt-3 mb-1 text-sm\">\n Shipping Address\n </div>\n <div className=\"text-foreground text-sm\">\n <p className=\"font-medium\">{subscription.address.name}</p>\n <p>{subscription.address.address1}</p>\n {subscription.address.address2 && (\n <p>{subscription.address.address2}</p>\n )}\n <p>\n {[subscription.address.city, subscription.address.state]\n .filter(Boolean)\n .join(\", \")}{\" \"}\n {subscription.address.postal_code}\n </p>\n {subscription.address.country_code && (\n <p>{subscription.address.country_code}</p>\n )}\n </div>\n </div>\n )}\n\n {/* Payment Method */}\n {paymentMethod && (\n <div className=\"border-border mb-6 border-b pb-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n Payment Method\n </div>\n <div className=\"text-foreground flex items-center gap-2 text-sm\">\n {paymentDetails?.logo_url && (\n <img\n src={paymentDetails.logo_url}\n alt={paymentDetails.card_type ?? \"Card\"}\n className=\"h-6\"\n />\n )}\n <span className=\"font-medium\">\n {paymentDetails?.card_type\n ? startCase(paymentDetails.card_type)\n : paymentMethod.payment_type}\n {paymentDetails?.last4\n ? ` ending in ${paymentDetails.last4}`\n : \"\"}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Order History */}\n {subscription.orders.length > 0 && (\n <div className=\"border-border mb-4 border-b pb-4\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n Order History\n </h3>\n <div className=\"overflow-x-auto\">\n <table className=\"divide-border min-w-full divide-y text-sm\">\n <thead>\n <tr>\n <th className=\"text-muted-foreground py-2 pr-3 text-left font-medium\">\n Order\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n Date\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n Status\n </th>\n <th className=\"text-muted-foreground py-2 pl-3 text-right font-medium\">\n Amount\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-border divide-y\">\n {subscription.orders.map((order) => (\n <tr key={order.id}>\n <td className=\"text-foreground py-2 pr-3 font-medium\">\n {order.order_number ?? `#${order.id}`}\n </td>\n <td className=\"text-muted-foreground px-3 py-2\">\n {formatDate(order.created_at.split(\"T\")[0] ?? \"\")}\n </td>\n <td className=\"px-3 py-2\">\n <StatusPill status={order.status}>\n {startCase(order.status)}\n </StatusPill>\n </td>\n <td className=\"text-foreground py-2 pl-3 text-right\">\n {order.amount != null\n ? formatCurrency(Number(order.amount))\n : \"N/A\"}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/* ── Main component ────────────────────────────────────────────────── */\n\nexport function SubscriptionDetail({\n token,\n onNotFound,\n onError,\n onSuccess,\n onMutationError,\n}: SubscriptionDetailProps): JSX.Element | null {\n const [showCancelModal, setShowCancelModal] = useState(false);\n\n const { data, isLoading, error } = useSubscription(token);\n const subscription = data?.subscription;\n const customerId = subscription?.customer?.id ?? 0;\n\n const pauseMutation = usePauseSubscription({\n onSuccess: () => onSuccess?.(\"Subscription paused\"),\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to pause subscription\", err),\n });\n\n const resumeMutation = useResumeSubscription({\n onSuccess: () => onSuccess?.(\"Subscription resumed\"),\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to resume subscription\", err),\n });\n\n const skipMutation = useSkipSubscription({\n onSuccess: () => onSuccess?.(\"Next billing skipped\"),\n onError: (err: unknown) => onMutationError?.(\"Failed to skip billing\", err),\n });\n\n const cancelMutation = useCancelSubscription({\n onSuccess: () => {\n onSuccess?.(\"Subscription cancelled\");\n setShowCancelModal(false);\n },\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to cancel subscription\", err),\n });\n\n const reactivateMutation = useReactivateSubscription({\n onSuccess: () => onSuccess?.(\"Subscription reactivated\"),\n onError: (err: unknown) =>\n onMutationError?.(\"Failed to reactivate subscription\", err),\n });\n\n useEffect(() => {\n if (!isLoading && error) {\n onError?.(error as Error);\n }\n }, [isLoading, error, onError]);\n\n useEffect(() => {\n if (!isLoading && !error && !subscription) {\n onNotFound?.();\n }\n }, [isLoading, error, subscription, onNotFound]);\n\n if (isLoading) {\n return <SubscriptionDetailSkeleton />;\n }\n\n if (!subscription) {\n return null;\n }\n\n const plan = subscription.subscription_plan;\n const isActive = subscription.status === \"active\";\n const isPaused = subscription.status === \"paused\";\n const isCancelled = subscription.status === \"cancelled\";\n const isMutating =\n pauseMutation.isPending ||\n resumeMutation.isPending ||\n skipMutation.isPending ||\n cancelMutation.isPending ||\n reactivateMutation.isPending;\n\n const handlePause = () => {\n pauseMutation.mutate({\n subscriptionToken: token,\n pauseParams: { customerId },\n });\n };\n\n const handleResume = () => {\n const nextBillDate = calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n );\n resumeMutation.mutate({\n subscriptionToken: token,\n resumeParams: { customerId, nextBillDate },\n });\n };\n\n const handleSkip = () => {\n const nextBillDate = calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n );\n skipMutation.mutate({\n subscriptionToken: token,\n skipParams: { customerId, nextBillDate },\n });\n };\n\n const handleCancel = () => {\n cancelMutation.mutate({ subscriptionToken: token, customerId });\n };\n\n const handleReactivate = () => {\n reactivateMutation.mutate({\n subscriptionToken: token,\n reactivateParams: {},\n });\n };\n\n return (\n <>\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <SubscriptionItemsSection subscription={subscription} />\n <SubscriptionManagementSection\n subscription={subscription}\n isActive={isActive}\n isPaused={isPaused}\n isCancelled={isCancelled}\n isMutating={isMutating}\n onSkip={handleSkip}\n onPause={handlePause}\n onResume={handleResume}\n onCancel={() => setShowCancelModal(true)}\n onReactivate={handleReactivate}\n />\n </div>\n <ConfirmDialog\n title=\"Cancel Subscription\"\n actionButtonText=\"Cancel Subscription\"\n description=\"Are you sure you want to cancel this subscription? You can reactivate it later.\"\n open={showCancelModal}\n setOpen={setShowCancelModal}\n onConfirm={handleCancel}\n />\n </>\n );\n}\n\nexport interface SubscriptionActionsProps {\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n allowSkipping: boolean | null;\n onPause: () => void;\n onResume: () => void;\n onSkip: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n}\n\nexport function SubscriptionActions({\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n allowSkipping,\n onPause,\n onResume,\n onSkip,\n onCancel,\n onReactivate,\n}: SubscriptionActionsProps) {\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && (\n <>\n {allowSkipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Skip Next</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Pause</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Cancel</span>\n </Button>\n </>\n )}\n {isPaused && (\n <>\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Resume</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Cancel</span>\n </Button>\n </>\n )}\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">Reactivate</span>\n </Button>\n )}\n </div>\n );\n}\n","import { SubscriptionsCoreProvider } from \"@fluid-app/subscriptions-core\";\nimport { SubscriptionsList } from \"@fluid-app/subscriptions-ui\";\nimport { useSubscriptionsClient } from \"../account/use-account-clients\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface AccountSubscriptionsScreenProps {\n customerId: number | undefined;\n isLoadingCustomer: boolean;\n}\n\nconst translations: Record<string, string> = {\n all: \"All\",\n active: \"Active\",\n inactive: \"Inactive\",\n search: \"Search\",\n subscriptions: \"Search subscriptions...\",\n product: \"Product\",\n next_bill_date: \"Next Bill Date\",\n price: \"Price\",\n status: \"Status\",\n no_subscriptions_found: \"No subscriptions found\",\n unknown_status: \"Unknown\",\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n};\n\nexport function AccountSubscriptionsScreen({\n customerId,\n isLoadingCustomer,\n}: AccountSubscriptionsScreenProps): React.JSX.Element {\n const subscriptionsClient = useSubscriptionsClient();\n const { navigate } = useAppNavigation();\n\n if (isLoadingCustomer) {\n return (\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <div className=\"space-y-3\">\n <div className=\"bg-muted h-10 animate-pulse rounded\" />\n <div className=\"bg-muted h-64 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <SubscriptionsCoreProvider client={subscriptionsClient}>\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 <SubscriptionsList\n customerId={customerId}\n onSubscriptionClick={(subscriptionToken) =>\n navigate(`account/subscriptions/${subscriptionToken}`)\n }\n t={(key) => translations[key] ?? key}\n />\n </div>\n </SubscriptionsCoreProvider>\n );\n}\n","import { SubscriptionsCoreProvider } from \"@fluid-app/subscriptions-core\";\nimport { SubscriptionDetail } from \"@fluid-app/subscriptions-ui\";\nimport { useSubscriptionsClient } from \"../account/use-account-clients\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\n\ninterface AccountSubscriptionDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function AccountSubscriptionDetailScreen({\n token,\n onToast,\n}: AccountSubscriptionDetailScreenProps): React.JSX.Element {\n const client = useSubscriptionsClient();\n const { navigate } = useAppNavigation();\n\n return (\n <SubscriptionsCoreProvider client={client}>\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 <SubscriptionDetail\n token={token}\n onNotFound={() => {\n onToast(\"Subscription not found\", \"warning\");\n navigate(\"account/subscriptions\");\n }}\n onError={(err) => {\n const message =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`Failed to load subscription: ${message}`, \"error\");\n }}\n onSuccess={(message) => {\n onToast(message, \"success\");\n }}\n onMutationError={(message, err) => {\n const detail =\n err instanceof Error ? err.message : \"An error occurred\";\n onToast(`${message}: ${detail}`, \"error\");\n }}\n />\n </div>\n </SubscriptionsCoreProvider>\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { customersApi } from \"@fluid-app/fluid-pay-api-client\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidAuth } from \"../hooks/use-fluid-auth\";\nimport { useFluidPayClient } from \"../account/use-account-clients\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { AccountManageLayout } from \"../account/AccountManageLayout\";\nimport { AccountProfileScreen } from \"./AccountProfileScreen\";\nimport { AccountOrdersScreen } from \"./AccountOrdersScreen\";\nimport { AccountOrderDetailScreen } from \"./AccountOrderDetailScreen\";\nimport { AccountSubscriptionsScreen } from \"./AccountSubscriptionsScreen\";\nimport { AccountSubscriptionDetailScreen } from \"./AccountSubscriptionDetailScreen\";\n\ntype AccountScreenProps = 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 if (type === \"error\" || type === \"warning\") {\n console.warn(\"[Account]\", message);\n } else {\n console.info(\"[Account]\", message);\n }\n}\n\nexport function AccountScreen({\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}: AccountScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n\n // Fetch customer account once at the top level so sub-screens don't duplicate this query\n const { token, user } = useFluidAuth();\n const fluidPayClient = useFluidPayClient();\n const jwt = token ?? \"\";\n\n const {\n data: customerData,\n isLoading: isLoadingCustomer,\n isError: isCustomerError,\n } = useQuery({\n queryKey: [\"fluidPayAccount\", user?.id],\n queryFn: () => customersApi.fetchCustomerAccount(fluidPayClient, jwt),\n enabled: !!jwt,\n });\n\n const customerId = customerData?.customer?.id;\n const countryIso = config.countryIso ?? \"US\";\n\n // Parse the slug to determine which sub-screen to render\n // account → profile (default)\n // account/profile → profile\n // account/orders → orders list\n // account/orders/{token} → order detail\n // account/subscriptions → subscriptions list\n // account/subscriptions/{token} → subscription detail\n const parts = currentSlug.split(\"/\");\n const subRoute = parts[1]; // \"profile\" | \"orders\" | \"subscriptions\" | undefined\n const detailToken = parts[2]; // detail token if present\n\n // For orders/subscriptions sub-screens, show skeleton while loading or error message on failure.\n // Detail screens and profile handle their own auth/loading.\n const needsCustomerId =\n (subRoute === \"orders\" && !detailToken) ||\n (subRoute === \"subscriptions\" && !detailToken);\n\n if (needsCustomerId && isCustomerError && !isLoadingCustomer) {\n return (\n <div {...divProps}>\n <AccountManageLayout>\n <div className=\"text-muted-foreground px-4 py-8 text-center text-sm\">\n Unable to load account data. Please try again later.\n </div>\n </AccountManageLayout>\n </div>\n );\n }\n\n return (\n <div {...divProps}>\n <AccountManageLayout>\n {subRoute === \"orders\" && detailToken ? (\n <AccountOrderDetailScreen\n token={detailToken}\n onToast={effectiveToast}\n />\n ) : subRoute === \"orders\" ? (\n <AccountOrdersScreen\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n />\n ) : subRoute === \"subscriptions\" && detailToken ? (\n <AccountSubscriptionDetailScreen\n token={detailToken}\n onToast={effectiveToast}\n />\n ) : subRoute === \"subscriptions\" ? (\n <AccountSubscriptionsScreen\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n />\n ) : (\n <AccountProfileScreen\n onToast={effectiveToast}\n countryIso={countryIso}\n />\n )}\n </AccountManageLayout>\n </div>\n );\n}\n\nexport const accountScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"AccountScreen\",\n displayName: \"Account Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|