@fluid-app/portal-sdk 0.1.231 → 0.1.233
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/{AppDownloadScreen-BmYJ7Zgb.cjs → AppDownloadScreen-B0YwMqYM.cjs} +2 -2
- package/dist/{AppDownloadScreen-BmYJ7Zgb.cjs.map → AppDownloadScreen-B0YwMqYM.cjs.map} +1 -1
- package/dist/{AppDownloadScreen-zrhWlSE7.mjs → AppDownloadScreen-Dj5ZPsSb.mjs} +2 -2
- package/dist/{AppDownloadScreen-zrhWlSE7.mjs.map → AppDownloadScreen-Dj5ZPsSb.mjs.map} +1 -1
- package/dist/{AppNavigationContext-C1-hd9Rw.cjs → AppNavigationContext-BDs1cOuG.cjs} +1 -1
- package/dist/{AppNavigationContext-C1-hd9Rw.cjs.map → AppNavigationContext-BDs1cOuG.cjs.map} +1 -1
- package/dist/{AppNavigationContext-BcZZMtV6.mjs → AppNavigationContext-DNod9mf6.mjs} +1 -1
- package/dist/{AppNavigationContext-BcZZMtV6.mjs.map → AppNavigationContext-DNod9mf6.mjs.map} +1 -1
- package/dist/{ContactsScreen-BfS33bcq.cjs → ContactsScreen-9cZWC9PP.cjs} +6 -6
- package/dist/{ContactsScreen-DHHzJhO4.mjs → ContactsScreen-B4Ue9m5H.mjs} +9 -22
- package/dist/ContactsScreen-B4Ue9m5H.mjs.map +1 -0
- package/dist/{ContactsScreen-gq1fPZzb.cjs → ContactsScreen-BTQ_qfq3.cjs} +10 -23
- package/dist/ContactsScreen-BTQ_qfq3.cjs.map +1 -0
- package/dist/{CustomersScreen-D55HjYHC.mjs → CustomersScreen-CX3P2KpF.mjs} +1 -1
- package/dist/{CustomersScreen-D55HjYHC.mjs.map → CustomersScreen-CX3P2KpF.mjs.map} +1 -1
- package/dist/{CustomersScreen-DW3BuhBs.cjs → CustomersScreen-GROLIynQ.cjs} +1 -1
- package/dist/{CustomersScreen-DW3BuhBs.cjs.map → CustomersScreen-GROLIynQ.cjs.map} +1 -1
- package/dist/{FluidProvider-DWNo4QTC.cjs → FluidProvider-BNL_Apw2.cjs} +26 -6
- package/dist/{FluidProvider-DWNo4QTC.cjs.map → FluidProvider-BNL_Apw2.cjs.map} +1 -1
- package/dist/{FluidProvider-i69t4zBo.mjs → FluidProvider-Dg-eouRw.mjs} +26 -6
- package/dist/FluidProvider-Dg-eouRw.mjs.map +1 -0
- package/dist/{InfiniteScrollSentinel-bVdxImf8.mjs → InfiniteScrollSentinel-CQD9JPVe.mjs} +1 -1
- package/dist/{InfiniteScrollSentinel-bVdxImf8.mjs.map → InfiniteScrollSentinel-CQD9JPVe.mjs.map} +1 -1
- package/dist/{InfiniteScrollSentinel-LcHXpBw-.cjs → InfiniteScrollSentinel-V1ubmA8z.cjs} +1 -1
- package/dist/{InfiniteScrollSentinel-LcHXpBw-.cjs.map → InfiniteScrollSentinel-V1ubmA8z.cjs.map} +1 -1
- package/dist/{MessagingScreen-CDx6ryDj.cjs → MessagingScreen-BMoCh4MT.cjs} +6 -6
- package/dist/{MessagingScreen-Crp-Kl4c.cjs → MessagingScreen-CxpLlTW_.cjs} +5 -5
- package/dist/{MessagingScreen-Crp-Kl4c.cjs.map → MessagingScreen-CxpLlTW_.cjs.map} +1 -1
- package/dist/{MessagingScreen-BbIKoH2L.mjs → MessagingScreen-Q17pdhUz.mjs} +3 -3
- package/dist/{MessagingScreen-BbIKoH2L.mjs.map → MessagingScreen-Q17pdhUz.mjs.map} +1 -1
- package/dist/{MySiteScreen-DsR9VEwa.cjs → MySiteScreen-5-eNH2S6.cjs} +3 -3
- package/dist/{MySiteScreen-DwgWY0cl.cjs → MySiteScreen-B1yomsp6.cjs} +3 -3
- package/dist/{MySiteScreen-DwgWY0cl.cjs.map → MySiteScreen-B1yomsp6.cjs.map} +1 -1
- package/dist/{MySiteScreen-Q9xN2oxD.mjs → MySiteScreen-BBT8FN5s.mjs} +3 -3
- package/dist/{MySiteScreen-Q9xN2oxD.mjs.map → MySiteScreen-BBT8FN5s.mjs.map} +1 -1
- package/dist/OrdersScreen-Co2oatu4.cjs +9 -0
- package/dist/{OrdersScreen-DcC_-N8h.mjs → OrdersScreen-DkTGTQJZ.mjs} +5 -5
- package/dist/{OrdersScreen-DcC_-N8h.mjs.map → OrdersScreen-DkTGTQJZ.mjs.map} +1 -1
- package/dist/{OrdersScreen-DxQmihvZ.cjs → OrdersScreen-e5DdNpD-.cjs} +5 -5
- package/dist/{OrdersScreen-DxQmihvZ.cjs.map → OrdersScreen-e5DdNpD-.cjs.map} +1 -1
- package/dist/{PortalProductsApiProvider-CP1xk872.mjs → PortalProductsApiProvider-BIZg_c4Y.mjs} +2 -2
- package/dist/{PortalProductsApiProvider-CP1xk872.mjs.map → PortalProductsApiProvider-BIZg_c4Y.mjs.map} +1 -1
- package/dist/{PortalProductsApiProvider-jDoPfaPB.cjs → PortalProductsApiProvider-DL8nl7To.cjs} +2 -2
- package/dist/{PortalProductsApiProvider-jDoPfaPB.cjs.map → PortalProductsApiProvider-DL8nl7To.cjs.map} +1 -1
- package/dist/{ProfileScreen-B2JEvxsd.cjs → ProfileScreen-BSWw10cc.cjs} +6 -6
- package/dist/{ProfileScreen-ftzRbWgc.mjs → ProfileScreen-CHsIDbg8.mjs} +6 -6
- package/dist/{ProfileScreen-ftzRbWgc.mjs.map → ProfileScreen-CHsIDbg8.mjs.map} +1 -1
- package/dist/{ProfileScreen-BPdHZZXV.cjs → ProfileScreen-CVOS2By3.cjs} +6 -6
- package/dist/{ProfileScreen-BPdHZZXV.cjs.map → ProfileScreen-CVOS2By3.cjs.map} +1 -1
- package/dist/{ScreenHeaderContext-4WYXIqQ5.mjs → ScreenHeaderContext-Cemdo7bM.mjs} +1 -1
- package/dist/{ScreenHeaderContext-4WYXIqQ5.mjs.map → ScreenHeaderContext-Cemdo7bM.mjs.map} +1 -1
- package/dist/{ScreenHeaderContext-PbjwAMeB.cjs → ScreenHeaderContext-oIu5Bvhs.cjs} +1 -1
- package/dist/{ScreenHeaderContext-PbjwAMeB.cjs.map → ScreenHeaderContext-oIu5Bvhs.cjs.map} +1 -1
- package/dist/{SearchSort-BQ-nf9gJ.mjs → SearchSort-DN0gsmxk.mjs} +1 -1
- package/dist/{SearchSort-BQ-nf9gJ.mjs.map → SearchSort-DN0gsmxk.mjs.map} +1 -1
- package/dist/{SearchSort-Hwga1dIi.cjs → SearchSort-O89uV2dl.cjs} +1 -1
- package/dist/{SearchSort-Hwga1dIi.cjs.map → SearchSort-O89uV2dl.cjs.map} +1 -1
- package/dist/{ShareablesScreen-BsICzJuf.cjs → ShareablesScreen-DJ1yd3qu.cjs} +24 -28
- package/dist/ShareablesScreen-DJ1yd3qu.cjs.map +1 -0
- package/dist/{ShareablesScreen-BjpwByeL.mjs → ShareablesScreen-DNjpEjLv.mjs} +23 -27
- package/dist/ShareablesScreen-DNjpEjLv.mjs.map +1 -0
- package/dist/{ShareablesScreen-iXNQCKSx.cjs → ShareablesScreen-DzswDadv.cjs} +8 -8
- package/dist/{ShopScreen-recdiuo_.cjs → ShopScreen-CFR2O1jn.cjs} +7 -7
- package/dist/{ShopScreen-d6e2Bm0N.mjs → ShopScreen-CLN8FFiL.mjs} +7 -7
- package/dist/{ShopScreen-d6e2Bm0N.mjs.map → ShopScreen-CLN8FFiL.mjs.map} +1 -1
- package/dist/{ShopScreen-DBopix8F.cjs → ShopScreen-jk3Y3-x8.cjs} +7 -7
- package/dist/{ShopScreen-DBopix8F.cjs.map → ShopScreen-jk3Y3-x8.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-CcaqnqiQ.mjs → SubscriptionsScreen-CVPj6hhP.mjs} +10 -10
- package/dist/{SubscriptionsScreen-CcaqnqiQ.mjs.map → SubscriptionsScreen-CVPj6hhP.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-BI296E2y.cjs → SubscriptionsScreen-DOf7rlRP.cjs} +6 -6
- package/dist/{SubscriptionsScreen-DkiuXzRX.cjs → SubscriptionsScreen-r2_drNFg.cjs} +11 -11
- package/dist/{SubscriptionsScreen-DkiuXzRX.cjs.map → SubscriptionsScreen-r2_drNFg.cjs.map} +1 -1
- package/dist/ToDoWidget-BgyusdPn.cjs +8 -0
- package/dist/{ToDoWidget-CaDOZtAB.cjs → ToDoWidget-CQ_zTbhz.cjs} +114 -31
- package/dist/ToDoWidget-CQ_zTbhz.cjs.map +1 -0
- package/dist/{ToDoWidget-Bv258x8F.mjs → ToDoWidget-DYGt45vL.mjs} +116 -23
- package/dist/ToDoWidget-DYGt45vL.mjs.map +1 -0
- package/dist/{UpgradeScreen-4Z5_ALSr.cjs → UpgradeScreen-BJbdv9T9.cjs} +1 -1
- package/dist/{UpgradeScreen-CGiVn0KG.mjs → UpgradeScreen-DMxxZjj_.mjs} +1 -1
- package/dist/{UpgradeScreen-CGiVn0KG.mjs.map → UpgradeScreen-DMxxZjj_.mjs.map} +1 -1
- package/dist/{UpgradeScreen-BaclFXEh.cjs → UpgradeScreen-QhhBuHXE.cjs} +1 -1
- package/dist/{UpgradeScreen-BaclFXEh.cjs.map → UpgradeScreen-QhhBuHXE.cjs.map} +1 -1
- package/dist/{VideoWidget-BntlfHhP.cjs → VideoWidget-Bc6ZAAaA.cjs} +1 -1
- package/dist/{VideoWidget-BntlfHhP.cjs.map → VideoWidget-Bc6ZAAaA.cjs.map} +1 -1
- package/dist/{VideoWidget-DmHZ05vp.mjs → VideoWidget-lTyeZypJ.mjs} +1 -1
- package/dist/{VideoWidget-DmHZ05vp.mjs.map → VideoWidget-lTyeZypJ.mjs.map} +1 -1
- package/dist/{dist-FHf4OHgt.cjs → dist-BQZkLGL6.cjs} +1 -1
- package/dist/{dist-FHf4OHgt.cjs.map → dist-BQZkLGL6.cjs.map} +1 -1
- package/dist/{dist-BQCx-9SK.cjs → dist-DbRTQ2QF.cjs} +1 -1
- package/dist/{dist-BQCx-9SK.cjs.map → dist-DbRTQ2QF.cjs.map} +1 -1
- package/dist/{dist-q1wrtxfG.mjs → dist-PbA1vxAz.mjs} +1 -1
- package/dist/{dist-q1wrtxfG.mjs.map → dist-PbA1vxAz.mjs.map} +1 -1
- package/dist/{dist-5XPflEEG.cjs → dist-myuZC8sf.cjs} +2 -2
- package/dist/{dist-5XPflEEG.cjs.map → dist-myuZC8sf.cjs.map} +1 -1
- package/dist/{dist-CsNsoBdu.mjs → dist-o2cjwzIa.mjs} +2 -2
- package/dist/{dist-CsNsoBdu.mjs.map → dist-o2cjwzIa.mjs.map} +1 -1
- package/dist/{es-nxOxb57F.cjs → es-UfEBhcZD.cjs} +1 -1
- package/dist/{es-nxOxb57F.cjs.map → es-UfEBhcZD.cjs.map} +1 -1
- package/dist/{fluid-pay-api-adapter-COBmngde.cjs → fluid-pay-api-adapter-CLP8wfno.cjs} +1 -1
- package/dist/{fluid-pay-api-adapter-COBmngde.cjs.map → fluid-pay-api-adapter-CLP8wfno.cjs.map} +1 -1
- package/dist/{fluid-pay-api-adapter-Dv2K17WN.mjs → fluid-pay-api-adapter-Dfi0LtxL.mjs} +1 -1
- package/dist/{fluid-pay-api-adapter-Dv2K17WN.mjs.map → fluid-pay-api-adapter-Dfi0LtxL.mjs.map} +1 -1
- package/dist/{format-Dyb61f6F.cjs → format-CytB2M00.cjs} +1 -1
- package/dist/{format-Dyb61f6F.cjs.map → format-CytB2M00.cjs.map} +1 -1
- package/dist/index.cjs +49 -49
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +48 -48
- package/dist/{order-status-badge-CnQE7lFJ.mjs → order-status-badge-CL5XC2va.mjs} +3 -3
- package/dist/{order-status-badge-CnQE7lFJ.mjs.map → order-status-badge-CL5XC2va.mjs.map} +1 -1
- package/dist/{order-status-badge-NMygmn5d.cjs → order-status-badge-Cqkx76d8.cjs} +3 -3
- package/dist/{order-status-badge-NMygmn5d.cjs.map → order-status-badge-Cqkx76d8.cjs.map} +1 -1
- package/dist/parse-task-body-BxbA_DC6.cjs +29 -0
- package/dist/parse-task-body-BxbA_DC6.cjs.map +1 -0
- package/dist/parse-task-body-DEmYvdNM.mjs +24 -0
- package/dist/parse-task-body-DEmYvdNM.mjs.map +1 -0
- package/dist/{portal_tenant-CxChT6OB.cjs → portal_tenant-CNmiAf_A.cjs} +18 -1
- package/dist/{portal_tenant-CxChT6OB.cjs.map → portal_tenant-CNmiAf_A.cjs.map} +1 -1
- package/dist/{portal_tenant-f_Cs2YmO.mjs → portal_tenant-Q3x7ALaZ.mjs} +13 -2
- package/dist/{portal_tenant-f_Cs2YmO.mjs.map → portal_tenant-Q3x7ALaZ.mjs.map} +1 -1
- package/dist/{query-keys-CC2PXIfJ.cjs → query-keys-D3lK70Ea.cjs} +1 -1
- package/dist/{query-keys-BkMRwfNo.mjs.map → query-keys-D3lK70Ea.cjs.map} +1 -1
- package/dist/{query-keys-BkMRwfNo.mjs → query-keys-xJy_fapN.mjs} +1 -1
- package/dist/{query-keys-CC2PXIfJ.cjs.map → query-keys-xJy_fapN.mjs.map} +1 -1
- package/dist/{sortable.esm-BSpvRpWg.mjs → sortable.esm-C8G00cCP.mjs} +1 -1
- package/dist/{sortable.esm-BSpvRpWg.mjs.map → sortable.esm-C8G00cCP.mjs.map} +1 -1
- package/dist/{use-account-Ipii17ZX.mjs → use-account-CBMPhhs7.mjs} +2 -2
- package/dist/{use-account-Ipii17ZX.mjs.map → use-account-CBMPhhs7.mjs.map} +1 -1
- package/dist/{use-account-Bv_VAVxj.cjs → use-account-DcBCP06c.cjs} +2 -2
- package/dist/{use-account-Bv_VAVxj.cjs.map → use-account-DcBCP06c.cjs.map} +1 -1
- package/dist/{use-store-3holBUj4.mjs → use-store-By_7tzrN.mjs} +1 -1
- package/dist/{use-store-3holBUj4.mjs.map → use-store-By_7tzrN.mjs.map} +1 -1
- package/dist/{use-store-D2S1FywW.cjs → use-store-lOOUcpRT.cjs} +1 -1
- package/dist/{use-store-D2S1FywW.cjs.map → use-store-lOOUcpRT.cjs.map} +1 -1
- package/package.json +13 -13
- package/dist/ContactsScreen-DHHzJhO4.mjs.map +0 -1
- package/dist/ContactsScreen-gq1fPZzb.cjs.map +0 -1
- package/dist/FluidProvider-i69t4zBo.mjs.map +0 -1
- package/dist/OrdersScreen-CfnNy52h.cjs +0 -9
- package/dist/ShareablesScreen-BjpwByeL.mjs.map +0 -1
- package/dist/ShareablesScreen-BsICzJuf.cjs.map +0 -1
- package/dist/ToDoWidget-Bv258x8F.mjs.map +0 -1
- package/dist/ToDoWidget-CaDOZtAB.cjs.map +0 -1
package/dist/{fluid-pay-api-adapter-Dv2K17WN.mjs.map → fluid-pay-api-adapter-Dfi0LtxL.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluid-pay-api-adapter-Dv2K17WN.mjs","names":["FormTextField","FormSelectField","FormTextField","FormSelectField","FormSelectField","FormTextField"],"sources":["../../../profile/core/src/context.ts","../../../profile/core/src/provider.tsx","../../../fluid-pay/core/src/context.ts","../../../fluid-pay/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-card-internals.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/adapters/fluid-pay-api-adapter.ts"],"sourcesContent":["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","import { createContext, useContext } from \"react\";\nimport type { FluidPayApi } from \"./api-interface\";\n\nconst FluidPayApiContext = createContext<FluidPayApi | null>(null);\n\nexport const FluidPayApiProvider = FluidPayApiContext.Provider;\n\nexport function useFluidPayApi(): FluidPayApi {\n const api = useContext(FluidPayApiContext);\n if (!api) {\n throw new Error(\n \"useFluidPayApi must be used within a FluidPayCoreProvider\",\n );\n }\n return api;\n}\n","import type { JSX } from \"react\";\nimport type { FluidPayApi } from \"./api-interface\";\nimport { FluidPayApiProvider } from \"./context\";\n\nexport interface FluidPayCoreProviderProps {\n api: FluidPayApi;\n children: React.ReactNode;\n}\n\nexport function FluidPayCoreProvider({\n api,\n children,\n}: FluidPayCoreProviderProps): JSX.Element {\n return <FluidPayApiProvider value={api}>{children}</FluidPayApiProvider>;\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 htmlFor={name} className=\"mb-1.5 block text-sm font-medium\">\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 htmlFor={name} className=\"block text-sm font-medium\">\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 { useState, type JSX } from \"react\";\nimport type { Control } from \"react-hook-form\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n Input,\n} from \"@fluid-app/ui-primitives\";\nimport { Info } from \"lucide-react\";\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 email,\n onChangeEmail,\n isChangingEmail,\n pendingEmail,\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 email?: string;\n onChangeEmail?: (newEmail: string) => Promise<void> | void;\n isChangingEmail?: boolean;\n pendingEmail?: string;\n}): JSX.Element {\n const { t } = useProfileUI();\n const [isEditingEmail, setIsEditingEmail] = useState(false);\n const [newEmail, setNewEmail] = useState(\"\");\n const [emailError, setEmailError] = useState<string | undefined>(undefined);\n\n const handleEmailSubmit = async () => {\n setEmailError(undefined);\n const trimmed = newEmail.trim();\n if (!trimmed) {\n setEmailError(\"Please enter a new email address\");\n return;\n }\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(trimmed)) {\n setEmailError(\"Please enter a valid email address\");\n return;\n }\n if (email && trimmed.toLowerCase() === email.toLowerCase()) {\n setEmailError(\"New email must be different from your current email\");\n return;\n }\n try {\n await onChangeEmail?.(trimmed);\n setIsEditingEmail(false);\n setNewEmail(\"\");\n } catch (err) {\n setEmailError(\n err instanceof Error ? err.message : \"Failed to initiate email change\",\n );\n }\n };\n\n const handleCancelEmailEdit = () => {\n setIsEditingEmail(false);\n setNewEmail(\"\");\n setEmailError(undefined);\n };\n\n const handleDialogClose = () => {\n handleCancelEmailEdit();\n handleClose();\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleDialogClose()}>\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-4\">\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 {email && (\n <div className=\"space-y-2\">\n <label className=\"text-foreground text-sm font-medium\">\n {t(\"email\") || \"Email\"}\n </label>\n {isEditingEmail ? (\n <div className=\"space-y-2\">\n <Input\n type=\"email\"\n placeholder=\"Enter your new email...\"\n value={newEmail}\n onChange={(e) => {\n setNewEmail(e.target.value);\n setEmailError(undefined);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleEmailSubmit();\n }\n if (e.key === \"Escape\") {\n handleCancelEmailEdit();\n }\n }}\n aria-invalid={!!emailError || undefined}\n autoFocus\n />\n {emailError && (\n <p className=\"text-xs text-red-500\">{emailError}</p>\n )}\n <div className=\"bg-muted flex items-start gap-2.5 rounded-md px-3 py-2.5\">\n <Info className=\"text-primary mt-0.5 h-4 w-4 shrink-0\" />\n <p className=\"text-muted-foreground text-xs\">\n We'll send a verification link to your new email. Click\n it to complete the change.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCancelEmailEdit}\n className=\"cursor-pointer\"\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={handleEmailSubmit}\n disabled={!newEmail.trim() || isChangingEmail}\n className=\"cursor-pointer\"\n >\n {isChangingEmail && (\n <div className=\"mr-2 h-3.5 w-3.5 animate-spin rounded-full border-2 border-current/30 border-t-current\" />\n )}\n {isChangingEmail ? \"Sending...\" : \"Send verification\"}\n </Button>\n </div>\n </div>\n ) : pendingEmail ? (\n <div className=\"space-y-2\">\n <div className=\"bg-muted text-muted-foreground min-w-0 rounded-md px-3 py-2 text-sm\">\n {email}\n </div>\n <div className=\"bg-muted flex items-start gap-2.5 rounded-md px-3 py-2.5\">\n <Info className=\"text-primary mt-0.5 h-4 w-4 shrink-0\" />\n <p className=\"text-muted-foreground text-xs\">\n Changing to{\" \"}\n <span className=\"text-foreground font-medium\">\n {pendingEmail}\n </span>\n . Check your new email inbox and click the verification link\n to complete the change.\n </p>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-muted text-muted-foreground min-w-0 flex-1 rounded-md px-3 py-2 text-sm\">\n {email}\n </div>\n {onChangeEmail && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setIsEditingEmail(true)}\n className=\"shrink-0 cursor-pointer\"\n >\n Change\n </Button>\n )}\n </div>\n )}\n </div>\n )}\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 <Button type=\"button\" onClick={onSubmit} className=\"cursor-pointer\">\n {isSubmitting && (\n <div className=\"mr-2 h-4 w-4 animate-spin rounded-full border-2 border-current/30 border-t-current\" />\n )}\n {isSubmitting ? t(\"saving\") : t(\"save_changes\")}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { z } from \"zod\";\nimport { Avatar, AvatarFallback, useZodForm } from \"@fluid-app/ui-primitives\";\nimport { Info, Pencil } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\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 PendingEmailChange {\n newEmail: string;\n newEmailConfirmed: boolean;\n expiresAt: string;\n}\n\nexport interface CustomerInfoProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: (data: UserFormData) => Promise<void> | void;\n isUpdating?: boolean;\n onChangeEmail?: (newEmail: string) => Promise<void> | void;\n isChangingEmail?: boolean;\n pendingEmailChange?: PendingEmailChange;\n onCancelEmailChange?: () => void;\n pendingEmail?: string;\n}\n\nexport default function CustomerInfo({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdating = false,\n onChangeEmail,\n isChangingEmail = false,\n pendingEmailChange,\n onCancelEmailChange,\n pendingEmail,\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\n ? first_name.charAt(0).toUpperCase()\n : (customerAccount.customer.email?.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 } = useZodForm<UserFormData>(schema, {\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 {first_name ? (\n <>\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 </>\n ) : (\n <p className=\"text-sm font-medium\">\n {customerAccount.customer.email}\n </p>\n )}\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 {pendingEmailChange && (\n <div className=\"bg-muted mb-6 flex items-start gap-2.5 rounded-md px-3 py-3\">\n <Info className=\"text-primary mt-0.5 h-4 w-4 shrink-0\" />\n <div className=\"flex-1 space-y-2\">\n <p className=\"text-foreground text-sm font-medium\">\n Email change pending\n </p>\n <p className=\"text-muted-foreground text-xs\">\n Your email is being changed to{\" \"}\n <span className=\"text-foreground font-medium\">\n {pendingEmailChange.newEmail}\n </span>\n .{\" \"}\n {pendingEmailChange.newEmailConfirmed\n ? \"Your new email has been verified.\"\n : \"Check your new inbox and click the verification link to complete the change.\"}{\" \"}\n {(() => {\n const diff =\n new Date(pendingEmailChange.expiresAt).getTime() - Date.now();\n if (diff <= 0) return \"This request has expired.\";\n const days = Math.ceil(diff / (1000 * 60 * 60 * 24));\n return `This request expires in ${days === 1 ? \"1 day\" : `${days} days`}.`;\n })()}\n </p>\n {onCancelEmailChange && (\n <button\n type=\"button\"\n onClick={onCancelEmailChange}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 cursor-pointer rounded-md px-3 py-1.5 text-xs font-medium\"\n >\n Cancel change\n </button>\n )}\n </div>\n </div>\n )}\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 email={customerAccount.customer.email}\n onChangeEmail={onChangeEmail}\n isChangingEmail={isChangingEmail}\n pendingEmail={pendingEmail}\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-core\";\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=\"text-muted-foreground mt-4 mb-1 text-sm\">\n {title}\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 && (\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=\"text-foreground flex items-center text-sm font-medium\">\n {formatAddressName(displayAddress)}, {displayAddress.address1}\n </div>\n <div className=\"text-muted-foreground text-sm\">\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-foreground text-sm\">\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-muted-foreground text-sm\">\n {t(\"no_saved_addresses_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"text-foreground mt-3 text-left text-sm\"\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-core\";\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 =\n addresses.find((addr) => addr.default) ?? addresses[0] ?? 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, type JSX } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\n\nconst PAYMENT_ICON_BASE = \"https://assets.fluid.app/images/payment_icons\";\nconst GENERIC_PAYMENT_ICON = `${PAYMENT_ICON_BASE}/generic.svg`;\n\nexport function brandIconUrl(brand: string | null | undefined): string {\n if (!brand) return GENERIC_PAYMENT_ICON;\n const slug = brand.toLowerCase().replace(/\\s+/g, \"_\");\n return `${PAYMENT_ICON_BASE}/${slug}.svg`;\n}\n\nexport function PaymentIcon({\n logoUrl,\n brand,\n alt,\n}: {\n logoUrl?: string;\n brand: string | null | undefined;\n alt: string;\n}): JSX.Element {\n const computedSrc = logoUrl || brandIconUrl(brand);\n const [hasError, setHasError] = useState(false);\n const src = hasError ? GENERIC_PAYMENT_ICON : computedSrc;\n return (\n <img\n src={src}\n alt={alt}\n width={40}\n height={24}\n className=\"object-contain\"\n onError={() => setHasError(true)}\n />\n );\n}\n\nexport function getCardDisplayName(\n paymentMethod: fluidPay.CustomerPaymentMethod,\n): string {\n const lastFour = paymentMethod.details.last_four;\n if (lastFour != null || paymentMethod.payment_type === \"Credit Card\") {\n const brand = paymentMethod.details.card_type || \"Card\";\n return `${brand} •••• ${lastFour || \"••••\"}`;\n }\n return paymentMethod.payment_type;\n}\n\nexport function getCardExpiry(\n paymentMethod: fluidPay.CustomerPaymentMethod,\n): 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","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-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\nimport {\n PaymentIcon,\n getCardDisplayName,\n getCardExpiry,\n} from \"./payment-method-card-internals\";\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\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-border pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: PaymentMethodDropdownProps) {\n const [paymentsValue, setPaymentsValue] = useState<string>(\"\");\n\n const renderPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => (\n <div className=\"flex flex-row items-center space-x-2\">\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={paymentMethod.details.logo_url}\n brand={paymentMethod.details.card_type}\n alt={paymentMethod.details.card_type ?? \"Payment Method\"}\n />\n </div>\n <div className=\"flex flex-col\">\n <div className=\"text-foreground flex items-center text-sm font-medium capitalize\">\n {getCardDisplayName(paymentMethod)}\n </div>\n {getCardExpiry(paymentMethod) && (\n <div className=\"text-muted-foreground text-sm\">\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=\"text-muted-foreground mt-4 mb-1 text-sm\">\n {title}\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 {!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=\"bg-muted items-center rounded 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 \"border-border items-center border-b p-3\":\n paymentMethodList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-row items-center space-x-2\">\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={paymentMethod.details.logo_url}\n brand={paymentMethod.details.card_type}\n alt={\n paymentMethod.details.card_type ?? \"Payment Method\"\n }\n />\n </div>\n <div className=\"flex flex-col\">\n <div className=\"text-foreground flex items-center text-sm font-medium capitalize\">\n {getCardDisplayName(paymentMethod)}\n </div>\n {getCardExpiry(paymentMethod) && (\n <div className=\"text-muted-foreground text-sm\">\n {getCardExpiry(paymentMethod)}\n </div>\n )}\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.default && (\n <p className=\"bg-secondary text-secondary-foreground mt-1 w-fit rounded px-2 py-0.5 text-xs font-medium\">\n Default\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() =>\n onDeletePaymentMethod?.(paymentMethod)\n }\n deleteLabel=\"Delete\"\n onEdit={() => onEditPaymentMethod?.(paymentMethod)}\n editLabel=\"Edit\"\n />\n )}\n </div>\n </div>\n ))\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"text-foreground mt-3 text-left text-sm\"\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-core\";\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 { useWatch } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField, FormSelectField } from \"./form-fields\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\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 useZodForm<EditPaymentMethodFormData>(editPaymentMethodFormSchema, {\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-core\";\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) ??\n paymentMethods[0] ??\n 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-core\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport CustomerInfo, {\n type CustomerInfoProps,\n type PendingEmailChange,\n} 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 onChangeEmail?: (newEmail: string) => Promise<void> | void;\n isChangingEmail?: boolean;\n pendingEmailChange?: PendingEmailChange;\n onCancelEmailChange?: () => void;\n pendingEmail?: string;\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 onChangeEmail,\n isChangingEmail,\n pendingEmailChange,\n onCancelEmailChange,\n pendingEmail,\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 onChangeEmail={onChangeEmail}\n isChangingEmail={isChangingEmail}\n pendingEmailChange={pendingEmailChange}\n onCancelEmailChange={onCancelEmailChange}\n pendingEmail={pendingEmail}\n />\n {rewardsPointsEnabled && (\n <CustomerPointsLedger\n pointsLedger={pointsLedger ?? []}\n isLoading={isLoadingPointsLedger}\n />\n )}\n <div id=\"profile-addresses\">\n <Addresses\n addresses={addresses}\n isLoading={isLoadingAddresses}\n onDeleteAddress={onDeleteAddress}\n isDeletingAddress={isDeletingAddress}\n renderAddressDialog={renderAddressDialog}\n />\n </div>\n <div id=\"profile-payment-methods\">\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 </div>\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 { useWatch, type Control, type UseFormSetValue } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n useZodForm,\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-core\";\nimport { useCountryStates, type State } 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 fetchStates?: (countryCode: string) => Promise<State[]>;\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 fetchStates,\n t,\n}: AddressFormDialogProps): JSX.Element {\n const { control, handleSubmit, reset, setValue } =\n useZodForm<AddressFormData>(addressFormSchema, {\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\", fetchStates);\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\", fetchStates);\n }\n }\n }, [selectedAddress, isOpen, reset, handleCountryChange, fetchStates]);\n\n useEffect(() => {\n handleCountryChange(selectedCountryCode, fetchStates);\n }, [selectedCountryCode, handleCountryChange, fetchStates]);\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-core\";\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 { useWatch, type Control, type UseFormSetValue } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n cn,\n useZodForm,\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-core\";\nimport { useFluidPayApi, 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 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 renderAddressAutocomplete,\n t,\n}: CreditCardFormDialogProps): JSX.Element {\n const api = useFluidPayApi();\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 useZodForm<BillingAddressFormData>(billingAddressSchema, {\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) return;\n\n let cancelled = false;\n\n const init = async () => {\n try {\n const credentials = await api.vault.fetchCredentials(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, api, 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 { type FluidPayApi, type fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { PayApi } from \"@fluid-app/portal-core/pay-api\";\nimport type { PayPaymentMethod } from \"@fluid-app/portal-core/pay-types\";\n\n/**\n * Maps a portal-tenant PayPaymentMethod to the fluidPay shape consumed by\n * profile-ui components (PaymentMethodDropdown, CreditCardFormDialog, etc.).\n * Co-located with the adapter because both speak the portal-tenant ↔ fluid-pay\n * boundary.\n */\nexport function mapToFluidPayPaymentMethod(\n raw: PayPaymentMethod,\n): fluidPay.CustomerPaymentMethod {\n return {\n id: raw.id,\n created_at: raw.created_at ?? \"\",\n default: raw.default,\n details: {\n card_type: raw.brand,\n card_brand: raw.brand,\n last_four: raw.last_four,\n exp_month: raw.exp_month ?? undefined,\n exp_year: raw.exp_year ?? undefined,\n },\n billing_address: raw.billing_address\n ? {\n name: raw.billing_address.name,\n address1: raw.billing_address.street1,\n address2: raw.billing_address.street2,\n city: raw.billing_address.city,\n state: raw.billing_address.state,\n zip: raw.billing_address.zip,\n country_code: raw.billing_address.country,\n }\n : null,\n payment_type: raw.type,\n source: \"\",\n updated_at: raw.updated_at ?? \"\",\n };\n}\n\nconst notImplemented = () => {\n throw new Error(\"Not available in portal-tenant context\");\n};\n\n/**\n * Adapts the portal-tenant PayApi to the FluidPayApi shape required by\n * FluidPayCoreProvider. Only `vault.fetchCredentials` is implemented —\n * the rest of the FluidPayApi surface is not used by the profile-ui\n * components that consume this provider in the portal context.\n */\nexport function createFluidPayApiAdapter(payApi: PayApi): FluidPayApi {\n return {\n customers: { fetchAccount: notImplemented, update: notImplemented },\n addresses: {\n fetchAll: notImplemented,\n create: notImplemented,\n update: notImplemented,\n delete: notImplemented,\n },\n paymentMethods: {\n fetchAll: notImplemented,\n addCreditCard: notImplemented,\n delete: notImplemented,\n updateDefault: notImplemented,\n update: notImplemented,\n },\n vault: {\n fetchCredentials: async () => {\n const response = await payApi.fetchVaultCredentials();\n return {\n vault: {\n vault_id: response.vault.vault_id,\n environment: response.vault.environment,\n route_id: response.vault.route_id ?? \"\",\n requires_3ds: false,\n },\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies fluidPay.VaultResponse;\n },\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fluid-pay-api-adapter-Dfi0LtxL.mjs","names":["FormTextField","FormSelectField","FormTextField","FormSelectField","FormSelectField","FormTextField"],"sources":["../../../profile/core/src/context.ts","../../../profile/core/src/provider.tsx","../../../fluid-pay/core/src/context.ts","../../../fluid-pay/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-card-internals.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/adapters/fluid-pay-api-adapter.ts"],"sourcesContent":["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","import { createContext, useContext } from \"react\";\nimport type { FluidPayApi } from \"./api-interface\";\n\nconst FluidPayApiContext = createContext<FluidPayApi | null>(null);\n\nexport const FluidPayApiProvider = FluidPayApiContext.Provider;\n\nexport function useFluidPayApi(): FluidPayApi {\n const api = useContext(FluidPayApiContext);\n if (!api) {\n throw new Error(\n \"useFluidPayApi must be used within a FluidPayCoreProvider\",\n );\n }\n return api;\n}\n","import type { JSX } from \"react\";\nimport type { FluidPayApi } from \"./api-interface\";\nimport { FluidPayApiProvider } from \"./context\";\n\nexport interface FluidPayCoreProviderProps {\n api: FluidPayApi;\n children: React.ReactNode;\n}\n\nexport function FluidPayCoreProvider({\n api,\n children,\n}: FluidPayCoreProviderProps): JSX.Element {\n return <FluidPayApiProvider value={api}>{children}</FluidPayApiProvider>;\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 htmlFor={name} className=\"mb-1.5 block text-sm font-medium\">\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 htmlFor={name} className=\"block text-sm font-medium\">\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 { useState, type JSX } from \"react\";\nimport type { Control } from \"react-hook-form\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n Input,\n} from \"@fluid-app/ui-primitives\";\nimport { Info } from \"lucide-react\";\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 email,\n onChangeEmail,\n isChangingEmail,\n pendingEmail,\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 email?: string;\n onChangeEmail?: (newEmail: string) => Promise<void> | void;\n isChangingEmail?: boolean;\n pendingEmail?: string;\n}): JSX.Element {\n const { t } = useProfileUI();\n const [isEditingEmail, setIsEditingEmail] = useState(false);\n const [newEmail, setNewEmail] = useState(\"\");\n const [emailError, setEmailError] = useState<string | undefined>(undefined);\n\n const handleEmailSubmit = async () => {\n setEmailError(undefined);\n const trimmed = newEmail.trim();\n if (!trimmed) {\n setEmailError(\"Please enter a new email address\");\n return;\n }\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(trimmed)) {\n setEmailError(\"Please enter a valid email address\");\n return;\n }\n if (email && trimmed.toLowerCase() === email.toLowerCase()) {\n setEmailError(\"New email must be different from your current email\");\n return;\n }\n try {\n await onChangeEmail?.(trimmed);\n setIsEditingEmail(false);\n setNewEmail(\"\");\n } catch (err) {\n setEmailError(\n err instanceof Error ? err.message : \"Failed to initiate email change\",\n );\n }\n };\n\n const handleCancelEmailEdit = () => {\n setIsEditingEmail(false);\n setNewEmail(\"\");\n setEmailError(undefined);\n };\n\n const handleDialogClose = () => {\n handleCancelEmailEdit();\n handleClose();\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleDialogClose()}>\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-4\">\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 {email && (\n <div className=\"space-y-2\">\n <label className=\"text-foreground text-sm font-medium\">\n {t(\"email\") || \"Email\"}\n </label>\n {isEditingEmail ? (\n <div className=\"space-y-2\">\n <Input\n type=\"email\"\n placeholder=\"Enter your new email...\"\n value={newEmail}\n onChange={(e) => {\n setNewEmail(e.target.value);\n setEmailError(undefined);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleEmailSubmit();\n }\n if (e.key === \"Escape\") {\n handleCancelEmailEdit();\n }\n }}\n aria-invalid={!!emailError || undefined}\n autoFocus\n />\n {emailError && (\n <p className=\"text-xs text-red-500\">{emailError}</p>\n )}\n <div className=\"bg-muted flex items-start gap-2.5 rounded-md px-3 py-2.5\">\n <Info className=\"text-primary mt-0.5 h-4 w-4 shrink-0\" />\n <p className=\"text-muted-foreground text-xs\">\n We'll send a verification link to your new email. Click\n it to complete the change.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCancelEmailEdit}\n className=\"cursor-pointer\"\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={handleEmailSubmit}\n disabled={!newEmail.trim() || isChangingEmail}\n className=\"cursor-pointer\"\n >\n {isChangingEmail && (\n <div className=\"mr-2 h-3.5 w-3.5 animate-spin rounded-full border-2 border-current/30 border-t-current\" />\n )}\n {isChangingEmail ? \"Sending...\" : \"Send verification\"}\n </Button>\n </div>\n </div>\n ) : pendingEmail ? (\n <div className=\"space-y-2\">\n <div className=\"bg-muted text-muted-foreground min-w-0 rounded-md px-3 py-2 text-sm\">\n {email}\n </div>\n <div className=\"bg-muted flex items-start gap-2.5 rounded-md px-3 py-2.5\">\n <Info className=\"text-primary mt-0.5 h-4 w-4 shrink-0\" />\n <p className=\"text-muted-foreground text-xs\">\n Changing to{\" \"}\n <span className=\"text-foreground font-medium\">\n {pendingEmail}\n </span>\n . Check your new email inbox and click the verification link\n to complete the change.\n </p>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-muted text-muted-foreground min-w-0 flex-1 rounded-md px-3 py-2 text-sm\">\n {email}\n </div>\n {onChangeEmail && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setIsEditingEmail(true)}\n className=\"shrink-0 cursor-pointer\"\n >\n Change\n </Button>\n )}\n </div>\n )}\n </div>\n )}\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 <Button type=\"button\" onClick={onSubmit} className=\"cursor-pointer\">\n {isSubmitting && (\n <div className=\"mr-2 h-4 w-4 animate-spin rounded-full border-2 border-current/30 border-t-current\" />\n )}\n {isSubmitting ? t(\"saving\") : t(\"save_changes\")}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { z } from \"zod\";\nimport { Avatar, AvatarFallback, useZodForm } from \"@fluid-app/ui-primitives\";\nimport { Info, Pencil } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\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 PendingEmailChange {\n newEmail: string;\n newEmailConfirmed: boolean;\n expiresAt: string;\n}\n\nexport interface CustomerInfoProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: (data: UserFormData) => Promise<void> | void;\n isUpdating?: boolean;\n onChangeEmail?: (newEmail: string) => Promise<void> | void;\n isChangingEmail?: boolean;\n pendingEmailChange?: PendingEmailChange;\n onCancelEmailChange?: () => void;\n pendingEmail?: string;\n}\n\nexport default function CustomerInfo({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdating = false,\n onChangeEmail,\n isChangingEmail = false,\n pendingEmailChange,\n onCancelEmailChange,\n pendingEmail,\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\n ? first_name.charAt(0).toUpperCase()\n : (customerAccount.customer.email?.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 } = useZodForm<UserFormData>(schema, {\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 {first_name ? (\n <>\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 </>\n ) : (\n <p className=\"text-sm font-medium\">\n {customerAccount.customer.email}\n </p>\n )}\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 {pendingEmailChange && (\n <div className=\"bg-muted mb-6 flex items-start gap-2.5 rounded-md px-3 py-3\">\n <Info className=\"text-primary mt-0.5 h-4 w-4 shrink-0\" />\n <div className=\"flex-1 space-y-2\">\n <p className=\"text-foreground text-sm font-medium\">\n Email change pending\n </p>\n <p className=\"text-muted-foreground text-xs\">\n Your email is being changed to{\" \"}\n <span className=\"text-foreground font-medium\">\n {pendingEmailChange.newEmail}\n </span>\n .{\" \"}\n {pendingEmailChange.newEmailConfirmed\n ? \"Your new email has been verified.\"\n : \"Check your new inbox and click the verification link to complete the change.\"}{\" \"}\n {(() => {\n const diff =\n new Date(pendingEmailChange.expiresAt).getTime() - Date.now();\n if (diff <= 0) return \"This request has expired.\";\n const days = Math.ceil(diff / (1000 * 60 * 60 * 24));\n return `This request expires in ${days === 1 ? \"1 day\" : `${days} days`}.`;\n })()}\n </p>\n {onCancelEmailChange && (\n <button\n type=\"button\"\n onClick={onCancelEmailChange}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 cursor-pointer rounded-md px-3 py-1.5 text-xs font-medium\"\n >\n Cancel change\n </button>\n )}\n </div>\n </div>\n )}\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 email={customerAccount.customer.email}\n onChangeEmail={onChangeEmail}\n isChangingEmail={isChangingEmail}\n pendingEmail={pendingEmail}\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-core\";\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=\"text-muted-foreground mt-4 mb-1 text-sm\">\n {title}\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 && (\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=\"text-foreground flex items-center text-sm font-medium\">\n {formatAddressName(displayAddress)}, {displayAddress.address1}\n </div>\n <div className=\"text-muted-foreground text-sm\">\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-foreground text-sm\">\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-muted-foreground text-sm\">\n {t(\"no_saved_addresses_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"text-foreground mt-3 text-left text-sm\"\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-core\";\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 =\n addresses.find((addr) => addr.default) ?? addresses[0] ?? 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, type JSX } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\n\nconst PAYMENT_ICON_BASE = \"https://assets.fluid.app/images/payment_icons\";\nconst GENERIC_PAYMENT_ICON = `${PAYMENT_ICON_BASE}/generic.svg`;\n\nexport function brandIconUrl(brand: string | null | undefined): string {\n if (!brand) return GENERIC_PAYMENT_ICON;\n const slug = brand.toLowerCase().replace(/\\s+/g, \"_\");\n return `${PAYMENT_ICON_BASE}/${slug}.svg`;\n}\n\nexport function PaymentIcon({\n logoUrl,\n brand,\n alt,\n}: {\n logoUrl?: string;\n brand: string | null | undefined;\n alt: string;\n}): JSX.Element {\n const computedSrc = logoUrl || brandIconUrl(brand);\n const [hasError, setHasError] = useState(false);\n const src = hasError ? GENERIC_PAYMENT_ICON : computedSrc;\n return (\n <img\n src={src}\n alt={alt}\n width={40}\n height={24}\n className=\"object-contain\"\n onError={() => setHasError(true)}\n />\n );\n}\n\nexport function getCardDisplayName(\n paymentMethod: fluidPay.CustomerPaymentMethod,\n): string {\n const lastFour = paymentMethod.details.last_four;\n if (lastFour != null || paymentMethod.payment_type === \"Credit Card\") {\n const brand = paymentMethod.details.card_type || \"Card\";\n return `${brand} •••• ${lastFour || \"••••\"}`;\n }\n return paymentMethod.payment_type;\n}\n\nexport function getCardExpiry(\n paymentMethod: fluidPay.CustomerPaymentMethod,\n): 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","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-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\nimport {\n PaymentIcon,\n getCardDisplayName,\n getCardExpiry,\n} from \"./payment-method-card-internals\";\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\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-border pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: PaymentMethodDropdownProps) {\n const [paymentsValue, setPaymentsValue] = useState<string>(\"\");\n\n const renderPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => (\n <div className=\"flex flex-row items-center space-x-2\">\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={paymentMethod.details.logo_url}\n brand={paymentMethod.details.card_type}\n alt={paymentMethod.details.card_type ?? \"Payment Method\"}\n />\n </div>\n <div className=\"flex flex-col\">\n <div className=\"text-foreground flex items-center text-sm font-medium capitalize\">\n {getCardDisplayName(paymentMethod)}\n </div>\n {getCardExpiry(paymentMethod) && (\n <div className=\"text-muted-foreground text-sm\">\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=\"text-muted-foreground mt-4 mb-1 text-sm\">\n {title}\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 {!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=\"bg-muted items-center rounded 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 \"border-border items-center border-b p-3\":\n paymentMethodList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-row items-center space-x-2\">\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={paymentMethod.details.logo_url}\n brand={paymentMethod.details.card_type}\n alt={\n paymentMethod.details.card_type ?? \"Payment Method\"\n }\n />\n </div>\n <div className=\"flex flex-col\">\n <div className=\"text-foreground flex items-center text-sm font-medium capitalize\">\n {getCardDisplayName(paymentMethod)}\n </div>\n {getCardExpiry(paymentMethod) && (\n <div className=\"text-muted-foreground text-sm\">\n {getCardExpiry(paymentMethod)}\n </div>\n )}\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.default && (\n <p className=\"bg-secondary text-secondary-foreground mt-1 w-fit rounded px-2 py-0.5 text-xs font-medium\">\n Default\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() =>\n onDeletePaymentMethod?.(paymentMethod)\n }\n deleteLabel=\"Delete\"\n onEdit={() => onEditPaymentMethod?.(paymentMethod)}\n editLabel=\"Edit\"\n />\n )}\n </div>\n </div>\n ))\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"text-foreground mt-3 text-left text-sm\"\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-core\";\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 { useWatch } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField, FormSelectField } from \"./form-fields\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\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 useZodForm<EditPaymentMethodFormData>(editPaymentMethodFormSchema, {\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-core\";\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) ??\n paymentMethods[0] ??\n 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-core\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport CustomerInfo, {\n type CustomerInfoProps,\n type PendingEmailChange,\n} 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 onChangeEmail?: (newEmail: string) => Promise<void> | void;\n isChangingEmail?: boolean;\n pendingEmailChange?: PendingEmailChange;\n onCancelEmailChange?: () => void;\n pendingEmail?: string;\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 onChangeEmail,\n isChangingEmail,\n pendingEmailChange,\n onCancelEmailChange,\n pendingEmail,\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 onChangeEmail={onChangeEmail}\n isChangingEmail={isChangingEmail}\n pendingEmailChange={pendingEmailChange}\n onCancelEmailChange={onCancelEmailChange}\n pendingEmail={pendingEmail}\n />\n {rewardsPointsEnabled && (\n <CustomerPointsLedger\n pointsLedger={pointsLedger ?? []}\n isLoading={isLoadingPointsLedger}\n />\n )}\n <div id=\"profile-addresses\">\n <Addresses\n addresses={addresses}\n isLoading={isLoadingAddresses}\n onDeleteAddress={onDeleteAddress}\n isDeletingAddress={isDeletingAddress}\n renderAddressDialog={renderAddressDialog}\n />\n </div>\n <div id=\"profile-payment-methods\">\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 </div>\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 { useWatch, type Control, type UseFormSetValue } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n useZodForm,\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-core\";\nimport { useCountryStates, type State } 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 fetchStates?: (countryCode: string) => Promise<State[]>;\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 fetchStates,\n t,\n}: AddressFormDialogProps): JSX.Element {\n const { control, handleSubmit, reset, setValue } =\n useZodForm<AddressFormData>(addressFormSchema, {\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\", fetchStates);\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\", fetchStates);\n }\n }\n }, [selectedAddress, isOpen, reset, handleCountryChange, fetchStates]);\n\n useEffect(() => {\n handleCountryChange(selectedCountryCode, fetchStates);\n }, [selectedCountryCode, handleCountryChange, fetchStates]);\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-core\";\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 { useWatch, type Control, type UseFormSetValue } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n cn,\n useZodForm,\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-core\";\nimport { useFluidPayApi, 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 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 renderAddressAutocomplete,\n t,\n}: CreditCardFormDialogProps): JSX.Element {\n const api = useFluidPayApi();\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 useZodForm<BillingAddressFormData>(billingAddressSchema, {\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) return;\n\n let cancelled = false;\n\n const init = async () => {\n try {\n const credentials = await api.vault.fetchCredentials(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, api, 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 { type FluidPayApi, type fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { PayApi } from \"@fluid-app/portal-core/pay-api\";\nimport type { PayPaymentMethod } from \"@fluid-app/portal-core/pay-types\";\n\n/**\n * Maps a portal-tenant PayPaymentMethod to the fluidPay shape consumed by\n * profile-ui components (PaymentMethodDropdown, CreditCardFormDialog, etc.).\n * Co-located with the adapter because both speak the portal-tenant ↔ fluid-pay\n * boundary.\n */\nexport function mapToFluidPayPaymentMethod(\n raw: PayPaymentMethod,\n): fluidPay.CustomerPaymentMethod {\n return {\n id: raw.id,\n created_at: raw.created_at ?? \"\",\n default: raw.default,\n details: {\n card_type: raw.brand,\n card_brand: raw.brand,\n last_four: raw.last_four,\n exp_month: raw.exp_month ?? undefined,\n exp_year: raw.exp_year ?? undefined,\n },\n billing_address: raw.billing_address\n ? {\n name: raw.billing_address.name,\n address1: raw.billing_address.street1,\n address2: raw.billing_address.street2,\n city: raw.billing_address.city,\n state: raw.billing_address.state,\n zip: raw.billing_address.zip,\n country_code: raw.billing_address.country,\n }\n : null,\n payment_type: raw.type,\n source: \"\",\n updated_at: raw.updated_at ?? \"\",\n };\n}\n\nconst notImplemented = () => {\n throw new Error(\"Not available in portal-tenant context\");\n};\n\n/**\n * Adapts the portal-tenant PayApi to the FluidPayApi shape required by\n * FluidPayCoreProvider. Only `vault.fetchCredentials` is implemented —\n * the rest of the FluidPayApi surface is not used by the profile-ui\n * components that consume this provider in the portal context.\n */\nexport function createFluidPayApiAdapter(payApi: PayApi): FluidPayApi {\n return {\n customers: { fetchAccount: notImplemented, update: notImplemented },\n addresses: {\n fetchAll: notImplemented,\n create: notImplemented,\n update: notImplemented,\n delete: notImplemented,\n },\n paymentMethods: {\n fetchAll: notImplemented,\n addCreditCard: notImplemented,\n delete: notImplemented,\n updateDefault: notImplemented,\n update: notImplemented,\n },\n vault: {\n fetchCredentials: async () => {\n const response = await payApi.fetchVaultCredentials();\n return {\n vault: {\n vault_id: response.vault.vault_id,\n environment: response.vault.environment,\n route_id: response.vault.route_id ?? \"\",\n requires_3ds: false,\n },\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies fluidPay.VaultResponse;\n },\n },\n };\n}\n"],"mappings":"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"}
|