@fluid-app/portal-sdk 0.1.13 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/AccountScreen-BH7hueZP.cjs +789 -0
  2. package/dist/AccountScreen-BH7hueZP.cjs.map +1 -0
  3. package/dist/AccountScreen-CPHYsITD.mjs +750 -0
  4. package/dist/AccountScreen-CPHYsITD.mjs.map +1 -0
  5. package/dist/AccountScreen-CjnAbct9.mjs +2 -0
  6. package/dist/{ContactsScreen-CB6l0Lf1.mjs → ContactsScreen-CHLFZX_N.mjs} +2 -2
  7. package/dist/{ContactsScreen-CB6l0Lf1.mjs.map → ContactsScreen-CHLFZX_N.mjs.map} +1 -1
  8. package/dist/{ContactsScreen-Dwn5onLu.cjs → ContactsScreen-CjnCemeI.cjs} +4 -4
  9. package/dist/{ContactsScreen-Dwn5onLu.cjs.map → ContactsScreen-CjnCemeI.cjs.map} +1 -1
  10. package/dist/{CoreScreenPlaceholder-Bw8YOPwv.cjs → CoreScreenPlaceholder-C9lBkcyc.cjs} +2 -2
  11. package/dist/{CoreScreenPlaceholder-Bw8YOPwv.cjs.map → CoreScreenPlaceholder-C9lBkcyc.cjs.map} +1 -1
  12. package/dist/{CoreScreenPlaceholder-D93ZYKt2.mjs → CoreScreenPlaceholder-DCJ1hFvJ.mjs} +1 -1
  13. package/dist/{CoreScreenPlaceholder-D93ZYKt2.mjs.map → CoreScreenPlaceholder-DCJ1hFvJ.mjs.map} +1 -1
  14. package/dist/{CustomersScreen-gQb6cWL5.cjs → CustomersScreen-CqwRJogV.cjs} +4 -4
  15. package/dist/{CustomersScreen-gQb6cWL5.cjs.map → CustomersScreen-CqwRJogV.cjs.map} +1 -1
  16. package/dist/{CustomersScreen-BEar6Leg.mjs → CustomersScreen-DBicCB3o.mjs} +2 -2
  17. package/dist/{CustomersScreen-BEar6Leg.mjs.map → CustomersScreen-DBicCB3o.mjs.map} +1 -1
  18. package/dist/{MessagingScreen-YyzXdr95.mjs → FluidProvider-BafZw8PJ.mjs} +6 -503
  19. package/dist/FluidProvider-BafZw8PJ.mjs.map +1 -0
  20. package/dist/{MessagingScreen-Ca22FObh.cjs → FluidProvider-C6SCZDjX.cjs} +3 -542
  21. package/dist/FluidProvider-C6SCZDjX.cjs.map +1 -0
  22. package/dist/MessagingScreen-Bd-1_J9q.cjs +369 -0
  23. package/dist/MessagingScreen-Bd-1_J9q.cjs.map +1 -0
  24. package/dist/MessagingScreen-D8W8V2TW.mjs +2 -0
  25. package/dist/MessagingScreen-DCS0mtbd.mjs +324 -0
  26. package/dist/MessagingScreen-DCS0mtbd.mjs.map +1 -0
  27. package/dist/{OrdersScreen-DB1v051q.mjs → OrdersScreen-B6JCMBY5.mjs} +2 -2
  28. package/dist/{OrdersScreen-DB1v051q.mjs.map → OrdersScreen-B6JCMBY5.mjs.map} +1 -1
  29. package/dist/{OrdersScreen-DbON-kBA.cjs → OrdersScreen-DBxpXgZ9.cjs} +4 -4
  30. package/dist/{OrdersScreen-DbON-kBA.cjs.map → OrdersScreen-DBxpXgZ9.cjs.map} +1 -1
  31. package/dist/{ProductsScreen-CMDGGvE2.cjs → ProductsScreen-BK8cz_MN.cjs} +4 -4
  32. package/dist/{ProductsScreen-CMDGGvE2.cjs.map → ProductsScreen-BK8cz_MN.cjs.map} +1 -1
  33. package/dist/{ProductsScreen-nVDsY6kf.mjs → ProductsScreen-DafsauTY.mjs} +2 -2
  34. package/dist/{ProductsScreen-nVDsY6kf.mjs.map → ProductsScreen-DafsauTY.mjs.map} +1 -1
  35. package/dist/index.cjs +66 -107
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.d.cts +29 -22
  38. package/dist/index.d.cts.map +1 -1
  39. package/dist/index.d.mts +29 -22
  40. package/dist/index.d.mts.map +1 -1
  41. package/dist/index.mjs +42 -85
  42. package/dist/index.mjs.map +1 -1
  43. package/package.json +17 -7
  44. package/dist/MessagingScreen-Ca22FObh.cjs.map +0 -1
  45. package/dist/MessagingScreen-YyzXdr95.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccountScreen-BH7hueZP.cjs","names":["useFluidAuthContext","useFluidContext","faUser","faBoxOpen","faArrowsRepeat","FontAwesomeIcon","translations","customersApi","addressesApi","paymentMethodsApi","ProfileUIProvider","Profile","AddressFormDialog","CreditCardFormDialog","translations","OrdersCoreProvider","OrdersList","OrdersCoreProvider","OrderDetail","SubscriptionsCoreProvider","SubscriptionsList","SubscriptionsCoreProvider","SubscriptionDetail","useFluidContext","customersApi"],"sources":["../src/hooks/use-fluid-auth.ts","../src/account/use-account-clients.ts","../src/shell/AppNavigationContext.tsx","../src/account/AccountManageLayout.tsx","../src/screens/AccountProfileScreen.tsx","../src/screens/AccountOrdersScreen.tsx","../src/screens/AccountOrderDetailScreen.tsx","../src/screens/AccountSubscriptionsScreen.tsx","../src/screens/AccountSubscriptionDetailScreen.tsx","../src/screens/AccountScreen.tsx"],"sourcesContent":["/**\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 { 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\nexport function useOrdersClient(): OrdersFetchClient {\n const { config } = useFluidContext();\n const { token } = useFluidAuth();\n\n return useMemo(\n () =>\n createOrdersFetchClient({\n baseUrl: 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: 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: 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: config.baseUrl,\n getAuthToken: () => token,\n onAuthError: config.onAuthError,\n }),\n [config.baseUrl, config.onAuthError, token],\n );\n}\n","import { createContext, useContext, useMemo, type ReactNode } from \"react\";\n\nexport interface AppNavigationContextValue {\n /** Current active slug (e.g. \"contacts/123\") */\n currentSlug: string;\n /** Base path for subpath deployments (e.g. \"/portal\"). Default: \"/\" */\n basePath: string;\n /** Navigate to a slug programmatically */\n navigate: (slug: string) => void;\n /** Build a full href for a slug (for use in <a> tags) */\n buildHref: (slug: string) => string;\n}\n\nconst AppNavigationContext = createContext<AppNavigationContextValue | null>(\n null,\n);\n\nexport interface AppNavigationProviderProps {\n currentSlug: string;\n basePath: string;\n navigate: (slug: string) => void;\n children: ReactNode;\n}\n\nexport function AppNavigationProvider({\n currentSlug,\n basePath,\n navigate,\n children,\n}: AppNavigationProviderProps): React.JSX.Element {\n const buildHref = useMemo(() => {\n return (slug: string) => {\n if (basePath === \"/\") return `/${slug}`;\n return `${basePath}/${slug}`;\n };\n }, [basePath]);\n\n const value = useMemo(\n () => ({ currentSlug, basePath, navigate, buildHref }),\n [currentSlug, basePath, navigate, buildHref],\n );\n\n return (\n <AppNavigationContext.Provider value={value}>\n {children}\n </AppNavigationContext.Provider>\n );\n}\n\nexport function useAppNavigation(): AppNavigationContextValue {\n const ctx = useContext(AppNavigationContext);\n if (!ctx) {\n throw new Error(\n \"useAppNavigation must be used within an <AppShell> or <AppNavigationProvider>\",\n );\n }\n return ctx;\n}\n","import { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\nimport { faUser } from \"@fortawesome/pro-regular-svg-icons/faUser\";\nimport { faBoxOpen } from \"@fortawesome/pro-regular-svg-icons/faBoxOpen\";\nimport { faArrowsRepeat } from \"@fortawesome/pro-regular-svg-icons/faArrowsRepeat\";\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: typeof faUser;\n}[] = [\n { key: \"profile\", label: \"Profile\", slug: \"account/profile\", icon: faUser },\n { key: \"orders\", label: \"Orders\", slug: \"account/orders\", icon: faBoxOpen },\n {\n key: \"subscriptions\",\n label: \"Subscriptions\",\n slug: \"account/subscriptions\",\n icon: faArrowsRepeat,\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((item) => (\n <button\n key={item.key}\n type=\"button\"\n onClick={() => navigate(item.slug)}\n className={`flex items-center gap-2 rounded-md px-3 py-2 text-sm font-medium whitespace-nowrap ${\n activeTab === item.key\n ? \"bg-sidebar-primary text-sidebar-primary-foreground\"\n : \"hover:bg-sidebar-primary hover:text-sidebar-primary-foreground\"\n }`}\n >\n <FontAwesomeIcon icon={item.icon} className=\"h-4 w-4\" />\n {item.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((item) => (\n <button\n key={item.key}\n type=\"button\"\n onClick={() => navigate(item.slug)}\n className={`flex items-center gap-2 rounded-md px-3 py-2 text-left text-sm font-medium ${\n activeTab === item.key\n ? \"bg-sidebar-primary text-sidebar-primary-foreground\"\n : \"hover:bg-sidebar-primary hover:text-sidebar-primary-foreground\"\n }`}\n >\n <FontAwesomeIcon icon={item.icon} className=\"h-4 w-4\" />\n {item.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 { 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 { 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 { 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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"}