@fluid-app/portal-sdk 0.1.78 → 0.1.80
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-C_NGlFZa.mjs → AppDownloadScreen-B0BNM-6c.mjs} +2 -2
- package/dist/{AppDownloadScreen-C_NGlFZa.mjs.map → AppDownloadScreen-B0BNM-6c.mjs.map} +1 -1
- package/dist/{AppDownloadScreen-BlfMkfi_.cjs → AppDownloadScreen-CgfEU2wC.cjs} +5 -5
- package/dist/{AppDownloadScreen-Cw1sGNNg.cjs → AppDownloadScreen-DRwTJHQ8.cjs} +2 -2
- package/dist/{AppDownloadScreen-Cw1sGNNg.cjs.map → AppDownloadScreen-DRwTJHQ8.cjs.map} +1 -1
- package/dist/{CalendarWidget-Bj0prW4s.cjs → CalendarWidget-BG5_GulK.cjs} +3 -3
- package/dist/CalendarWidget-BG5_GulK.cjs.map +1 -0
- package/dist/{CalendarWidget-DDFVe7-h.mjs → CalendarWidget-BHSLd43x.mjs} +3 -3
- package/dist/CalendarWidget-BHSLd43x.mjs.map +1 -0
- package/dist/{ContactsScreen-D4Cj5AKH.mjs → ContactsScreen-BeN-m9ht.mjs} +2 -2
- package/dist/{ContactsScreen-D4Cj5AKH.mjs.map → ContactsScreen-BeN-m9ht.mjs.map} +1 -1
- package/dist/{ContactsScreen-CwBXsCW8.cjs → ContactsScreen-DY-cfJc-.cjs} +2 -2
- package/dist/{ContactsScreen-CwBXsCW8.cjs.map → ContactsScreen-DY-cfJc-.cjs.map} +1 -1
- package/dist/{ContactsScreen-C6T8Vfz4.cjs → ContactsScreen-Dt74iM-l.cjs} +5 -5
- package/dist/{FluidProvider-CidgidrK.cjs → FluidProvider-B7whI5Fk.cjs} +7 -7
- package/dist/{FluidProvider-CidgidrK.cjs.map → FluidProvider-B7whI5Fk.cjs.map} +1 -1
- package/dist/{FluidProvider-6ARIhCTq.mjs → FluidProvider-C4OAgBdt.mjs} +7 -7
- package/dist/{FluidProvider-6ARIhCTq.mjs.map → FluidProvider-C4OAgBdt.mjs.map} +1 -1
- package/dist/{ListWidget-CunZTx5S.cjs → ListWidget-BKdwD5kR.cjs} +1 -1
- package/dist/{ListWidget-g2qBtmNZ.cjs → ListWidget-Ch386fkp.cjs} +7 -7
- package/dist/ListWidget-Ch386fkp.cjs.map +1 -0
- package/dist/{ListWidget-xPZwneuu.mjs → ListWidget-DhRPDaP7.mjs} +7 -7
- package/dist/ListWidget-DhRPDaP7.mjs.map +1 -0
- package/dist/{MessagingScreen-Dkm1cqJ8.mjs → MessagingScreen-BgDTY3Ej.mjs} +3 -3
- package/dist/{MessagingScreen-Dkm1cqJ8.mjs.map → MessagingScreen-BgDTY3Ej.mjs.map} +1 -1
- package/dist/{MessagingScreen-BshcZj2z.cjs → MessagingScreen-CUbqMqWe.cjs} +3 -3
- package/dist/{MessagingScreen-BshcZj2z.cjs.map → MessagingScreen-CUbqMqWe.cjs.map} +1 -1
- package/dist/{MessagingScreen-DevHJI6g.mjs → MessagingScreen-UiC3gK4x.mjs} +5 -5
- package/dist/{MessagingScreen-BA8ujs72.cjs → MessagingScreen-rTJ0M2md.cjs} +5 -5
- package/dist/{MySiteScreen-O7m3F8bT.mjs → MySiteScreen-CGXVSu2s.mjs} +2 -2
- package/dist/{MySiteScreen-O7m3F8bT.mjs.map → MySiteScreen-CGXVSu2s.mjs.map} +1 -1
- package/dist/{MySiteScreen-i8J8Ttzz.cjs → MySiteScreen-I6ebtBnN.cjs} +5 -5
- package/dist/{MySiteScreen-BTGBB4-v.cjs → MySiteScreen-jAT4_j14.cjs} +2 -2
- package/dist/{MySiteScreen-BTGBB4-v.cjs.map → MySiteScreen-jAT4_j14.cjs.map} +1 -1
- package/dist/{MySiteWidget-DI9-dyjX.mjs → MySiteWidget-DLBW4V7P.mjs} +25 -4
- package/dist/MySiteWidget-DLBW4V7P.mjs.map +1 -0
- package/dist/{MySiteWidget-BfBdrYgj.cjs → MySiteWidget-DUS5TAjk.cjs} +25 -4
- package/dist/MySiteWidget-DUS5TAjk.cjs.map +1 -0
- package/dist/{OrdersScreen-CWIKWDTW.cjs → OrdersScreen-B5ANhAJJ.cjs} +5 -5
- package/dist/{OrdersScreen-BF86JWxG.cjs → OrdersScreen-D2wDUClf.cjs} +3 -3
- package/dist/{OrdersScreen-BF86JWxG.cjs.map → OrdersScreen-D2wDUClf.cjs.map} +1 -1
- package/dist/{OrdersScreen-DoXE66il.mjs → OrdersScreen-gYB5v9-2.mjs} +3 -3
- package/dist/{OrdersScreen-DoXE66il.mjs.map → OrdersScreen-gYB5v9-2.mjs.map} +1 -1
- package/dist/{ProductsScreen-Bef0sSgj.mjs → ProductsScreen-D0-AZMm-.mjs} +5 -5
- package/dist/{ProductsScreen-868va-qn.cjs → ProductsScreen-DerVrACc.cjs} +5 -5
- package/dist/{ProductsScreen-CFKSDJJ0.mjs → ProductsScreen-yuVjp5Ia.mjs} +3 -3
- package/dist/{ProductsScreen-CFKSDJJ0.mjs.map → ProductsScreen-yuVjp5Ia.mjs.map} +1 -1
- package/dist/{ProductsScreen-D4dDVYFJ.cjs → ProductsScreen-zPoSxUNt.cjs} +3 -3
- package/dist/{ProductsScreen-D4dDVYFJ.cjs.map → ProductsScreen-zPoSxUNt.cjs.map} +1 -1
- package/dist/{ProfileScreen-BsUzZmHF.mjs → ProfileScreen-B6YgnBLf.mjs} +3 -3
- package/dist/{ProfileScreen-BsUzZmHF.mjs.map → ProfileScreen-B6YgnBLf.mjs.map} +1 -1
- package/dist/{ProfileScreen-B_I_A77d.cjs → ProfileScreen-BUtP6J5R.cjs} +3 -3
- package/dist/{ProfileScreen-B_I_A77d.cjs.map → ProfileScreen-BUtP6J5R.cjs.map} +1 -1
- package/dist/{ProfileScreen-C168MNNR.cjs → ProfileScreen-H6Bf48IB.cjs} +5 -5
- package/dist/{ShareablesScreen-2N0DWP77.mjs → ShareablesScreen-D-1sBYBA.mjs} +5 -5
- package/dist/{ShareablesScreen-D9uPu6DJ.cjs → ShareablesScreen-DQJX1_hv.cjs} +3 -3
- package/dist/{ShareablesScreen-D9uPu6DJ.cjs.map → ShareablesScreen-DQJX1_hv.cjs.map} +1 -1
- package/dist/{ShareablesScreen-2EJChSOH.mjs → ShareablesScreen-_W9PMbTW.mjs} +3 -3
- package/dist/{ShareablesScreen-2EJChSOH.mjs.map → ShareablesScreen-_W9PMbTW.mjs.map} +1 -1
- package/dist/{ShareablesScreen-BgUQxGzL.cjs → ShareablesScreen-vgMekz5j.cjs} +5 -5
- package/dist/{ShopScreen-CTp2FaRe.cjs → ShopScreen-D7c5SS1G.cjs} +5 -5
- package/dist/{ShopScreen-BaqN34iX.mjs → ShopScreen-DRYCLI2E.mjs} +4 -4
- package/dist/{ShopScreen-BaqN34iX.mjs.map → ShopScreen-DRYCLI2E.mjs.map} +1 -1
- package/dist/{ShopScreen-DhbYFraU.cjs → ShopScreen-DRgM8del.cjs} +4 -4
- package/dist/{ShopScreen-DhbYFraU.cjs.map → ShopScreen-DRgM8del.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-fliVeZk_.mjs → SubscriptionsScreen-B3c1ueS_.mjs} +3 -3
- package/dist/{SubscriptionsScreen-fliVeZk_.mjs.map → SubscriptionsScreen-B3c1ueS_.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-CwDH0DNT.cjs → SubscriptionsScreen-CUE6aS8F.cjs} +3 -3
- package/dist/{SubscriptionsScreen-CwDH0DNT.cjs.map → SubscriptionsScreen-CUE6aS8F.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-nkxjIDie.cjs → SubscriptionsScreen-CwBXa8Ft.cjs} +5 -5
- package/dist/index.cjs +37 -37
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +37 -37
- package/dist/{use-account-clients-CDAazmHw.mjs → use-account-clients-Bqwc4jT0.mjs} +2 -2
- package/dist/{use-account-clients-CDAazmHw.mjs.map → use-account-clients-Bqwc4jT0.mjs.map} +1 -1
- package/dist/{use-account-clients-CgP9ZZbx.cjs → use-account-clients-N3gfibU3.cjs} +2 -2
- package/dist/{use-account-clients-CgP9ZZbx.cjs.map → use-account-clients-N3gfibU3.cjs.map} +1 -1
- package/dist/{use-current-user-CudhrJtA.mjs → use-current-user-BUXtOeFz.mjs} +3 -3
- package/dist/{use-current-user-CudhrJtA.mjs.map → use-current-user-BUXtOeFz.mjs.map} +1 -1
- package/dist/{use-current-user-C3xp6f2-.cjs → use-current-user-C2A379kM.cjs} +3 -3
- package/dist/{use-current-user-C3xp6f2-.cjs.map → use-current-user-C2A379kM.cjs.map} +1 -1
- package/dist/{use-customer-account-72qR-BtL.cjs → use-customer-account-DJxnOr1n.cjs} +3 -3
- package/dist/{use-customer-account-72qR-BtL.cjs.map → use-customer-account-DJxnOr1n.cjs.map} +1 -1
- package/dist/{use-customer-account-Dfyhs3LY.mjs → use-customer-account-DVQzpWxo.mjs} +3 -3
- package/dist/{use-customer-account-Dfyhs3LY.mjs.map → use-customer-account-DVQzpWxo.mjs.map} +1 -1
- package/dist/{use-fluid-api-C53ZoBpG.mjs → use-fluid-api-BwYwsyDl.mjs} +2 -2
- package/dist/{use-fluid-api-C53ZoBpG.mjs.map → use-fluid-api-BwYwsyDl.mjs.map} +1 -1
- package/dist/{use-fluid-api-Cc0xHt74.cjs → use-fluid-api-C3T17MND.cjs} +2 -2
- package/dist/{use-fluid-api-Cc0xHt74.cjs.map → use-fluid-api-C3T17MND.cjs.map} +1 -1
- package/package.json +14 -14
- package/dist/CalendarWidget-Bj0prW4s.cjs.map +0 -1
- package/dist/CalendarWidget-DDFVe7-h.mjs.map +0 -1
- package/dist/ListWidget-g2qBtmNZ.cjs.map +0 -1
- package/dist/ListWidget-xPZwneuu.mjs.map +0 -1
- package/dist/MySiteWidget-BfBdrYgj.cjs.map +0 -1
- package/dist/MySiteWidget-DI9-dyjX.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProfileScreen-BsUzZmHF.mjs","names":["FormTextField","FormSelectField","FormTextField","FormSelectField","FormSelectField","FormTextField","vaultApi.fetchVaultCredentialsForPaymentAccount","customersApi.fetchCustomerAccount","addressesApi.fetchCustomerAddresses","paymentMethodsApi.fetchCustomerPaymentMethods","customersApi.updateCustomer","addressesApi.deleteCustomerAddress","paymentMethodsApi.deleteCustomerPaymentMethod","paymentMethodsApi.updatePaymentMethod","addressesApi.createCustomerAddress","addressesApi.updateCustomerAddress","paymentMethodsApi.addCreditCardToCustomer"],"sources":["../../../fluid-pay/api-client/src/namespaces/addresses.ts","../../../fluid-pay/api-client/src/namespaces/payment-methods.ts","../../../fluid-pay/api-client/src/namespaces/vault.ts","../../../profile/core/src/context.ts","../../../profile/core/src/provider.tsx","../../../fluid-pay/core/src/utils/country-config.ts","../../../fluid-pay/core/src/hooks/use-country-states.ts","../../../profile/ui/src/components/ellipses-dropdown.tsx","../../../profile/ui/src/components/confirm-action-dialog.tsx","../../../profile/ui/src/components/customer-points-ledger.tsx","../../../profile/ui/src/components/form-fields.tsx","../../../profile/ui/src/components/user-info-dialog.tsx","../../../profile/ui/src/components/customer-info.tsx","../../../profile/ui/src/components/address-dropdown.tsx","../../../profile/ui/src/components/addresses.tsx","../../../profile/ui/src/components/payment-method-dropdown.tsx","../../../profile/ui/src/components/view-payment-method-dialog.tsx","../../../profile/ui/src/components/edit-payment-method-dialog.tsx","../../../profile/ui/src/components/payment-methods.tsx","../../../profile/ui/src/components/profile.tsx","../../../fluid-pay/ui/src/components/form-fields/FormTextField.tsx","../../../fluid-pay/ui/src/components/form-fields/FormSelectField.tsx","../../../fluid-pay/ui/src/components/AddressFormDialog.tsx","../../../fluid-pay/ui/src/hooks/use-vgs-collect.ts","../../../fluid-pay/ui/src/components/CreditCardFormDialog.tsx","../src/screens/ProfileContentScreen.tsx","../src/screens/ProfileScreen.tsx"],"sourcesContent":["import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch all customer addresses.\n * Endpoint: GET /fluid_pay/addresses?jwt={jwt}\n */\nexport async function fetchCustomerAddresses(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.CustomerAddressResponse> {\n return client.get(\"/fluid_pay/addresses\", {\n jwt,\n page: \"1\",\n per_page: \"100\",\n });\n}\n\n/**\n * Create a new customer address.\n * Endpoint: POST /fluid_pay/create_address?jwt={jwt}\n */\nexport async function createCustomerAddress(\n client: FetchClient,\n jwt: string,\n body: fluidPay.CreateAddressBody,\n): Promise<fluidPay.CreateCustomerAddressResponse> {\n return client.post(`/fluid_pay/create_address?jwt=${jwt}`, body);\n}\n\n/**\n * Update an existing customer address.\n * Endpoint: PATCH /fluid_pay/update_address/{addressId}?jwt={jwt}\n */\nexport async function updateCustomerAddress(\n client: FetchClient,\n jwt: string,\n addressId: number,\n body: fluidPay.CreateAddressBody,\n): Promise<fluidPay.CreateCustomerAddressResponse> {\n return client.patch(\n `/fluid_pay/update_address/${addressId}?jwt=${jwt}`,\n body,\n );\n}\n\n/**\n * Delete a customer address.\n * Endpoint: DELETE /fluid_pay/delete_address/{addressId}?jwt={jwt}\n */\nexport async function deleteCustomerAddress(\n client: FetchClient,\n jwt: string,\n addressId: number,\n): Promise<Record<string, never>> {\n return client.delete(`/fluid_pay/delete_address/${addressId}?jwt=${jwt}`);\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch all customer payment methods.\n * Endpoint: GET /fluid_pay/payment_methods?jwt={jwt}\n */\nexport async function fetchCustomerPaymentMethods(\n client: FetchClient,\n jwt: string,\n countryCode?: string,\n): Promise<fluidPay.CustomerPaymentMethodsResponse> {\n const params: Record<string, string> = {\n jwt,\n page: \"1\",\n per_page: \"100\",\n };\n if (countryCode) params.country_code = countryCode;\n\n return client.get(\"/fluid_pay/payment_methods\", params);\n}\n\n/**\n * Add a credit card to the customer's account.\n * Endpoint: POST /fluid_pay/create_payment_method?jwt={jwt}\n */\nexport async function addCreditCardToCustomer(\n client: FetchClient,\n jwt: string,\n data: fluidPay.AddCreditCardData,\n): Promise<fluidPay.CreateCustomerPaymentMethodResponse> {\n return client.post(`/fluid_pay/create_payment_method?jwt=${jwt}`, data);\n}\n\n/**\n * Delete a customer payment method.\n * Endpoint: DELETE /fluid_pay/delete_payment_method/{id}?jwt={jwt}\n */\nexport async function deleteCustomerPaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n): Promise<unknown> {\n return client.delete(\n `/fluid_pay/delete_payment_method/${paymentMethodId}?jwt=${jwt}`,\n );\n}\n\n/**\n * Set a payment method as default.\n * Endpoint: PATCH /fluid_pay/update_payment_method/{id}?jwt={jwt}\n */\nexport async function updateDefaultPaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n): Promise<fluidPay.UpdateDefaultPaymentMethodResponse> {\n return client.patch(\n `/fluid_pay/update_payment_method/${paymentMethodId}?jwt=${jwt}`,\n );\n}\n\n/**\n * Update a payment method (default status, billing address).\n * Endpoint: PATCH /fluid_pay/update_payment_method/{id}?jwt={jwt}\n */\nexport async function updatePaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n body?: fluidPay.UpdatePaymentMethodInput,\n): Promise<fluidPay.UpdatePaymentMethodResponse> {\n return client.patch(\n `/fluid_pay/update_payment_method/${paymentMethodId}?jwt=${jwt}`,\n body,\n );\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch VGS vault credentials for the customer's payment account.\n * Endpoint: GET /fluid_pay/vault?jwt={jwt}\n */\nexport async function fetchVaultCredentialsForPaymentAccount(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.VaultResponse> {\n return client.get(\"/fluid_pay/vault\", { jwt });\n}\n","import { createContext, useContext } from \"react\";\n\nexport type TranslationFn = (key: string) => string;\n\nexport interface ProfileUIContextValue {\n t: TranslationFn;\n}\n\nexport const ProfileUIContext = createContext<ProfileUIContextValue | null>(\n null,\n);\n\nexport function useProfileUI(): ProfileUIContextValue {\n const context = useContext(ProfileUIContext);\n if (!context) {\n throw new Error(\"useProfileUI must be used within a ProfileUIProvider\");\n }\n return context;\n}\n","import type { JSX, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { ProfileUIContext, type TranslationFn } from \"./context\";\n\nexport interface ProfileUIProviderProps {\n t: TranslationFn;\n children: ReactNode;\n}\n\nexport function ProfileUIProvider({\n t,\n children,\n}: ProfileUIProviderProps): JSX.Element {\n const value = useMemo(() => ({ t }), [t]);\n return (\n <ProfileUIContext.Provider value={value}>\n {children}\n </ProfileUIContext.Provider>\n );\n}\n","export interface State {\n name: string;\n isoCode: string;\n}\n\nexport interface RegionConfig {\n regionLabel: string;\n postalLabel: string;\n}\n\nexport const US_STATES: State[] = [\n { name: \"Alabama\", isoCode: \"AL\" },\n { name: \"Alaska\", isoCode: \"AK\" },\n { name: \"Arizona\", isoCode: \"AZ\" },\n { name: \"Arkansas\", isoCode: \"AR\" },\n { name: \"California\", isoCode: \"CA\" },\n { name: \"Colorado\", isoCode: \"CO\" },\n { name: \"Connecticut\", isoCode: \"CT\" },\n { name: \"Delaware\", isoCode: \"DE\" },\n { name: \"Florida\", isoCode: \"FL\" },\n { name: \"Georgia\", isoCode: \"GA\" },\n { name: \"Hawaii\", isoCode: \"HI\" },\n { name: \"Idaho\", isoCode: \"ID\" },\n { name: \"Illinois\", isoCode: \"IL\" },\n { name: \"Indiana\", isoCode: \"IN\" },\n { name: \"Iowa\", isoCode: \"IA\" },\n { name: \"Kansas\", isoCode: \"KS\" },\n { name: \"Kentucky\", isoCode: \"KY\" },\n { name: \"Louisiana\", isoCode: \"LA\" },\n { name: \"Maine\", isoCode: \"ME\" },\n { name: \"Maryland\", isoCode: \"MD\" },\n { name: \"Massachusetts\", isoCode: \"MA\" },\n { name: \"Michigan\", isoCode: \"MI\" },\n { name: \"Minnesota\", isoCode: \"MN\" },\n { name: \"Mississippi\", isoCode: \"MS\" },\n { name: \"Missouri\", isoCode: \"MO\" },\n { name: \"Montana\", isoCode: \"MT\" },\n { name: \"Nebraska\", isoCode: \"NE\" },\n { name: \"Nevada\", isoCode: \"NV\" },\n { name: \"New Hampshire\", isoCode: \"NH\" },\n { name: \"New Jersey\", isoCode: \"NJ\" },\n { name: \"New Mexico\", isoCode: \"NM\" },\n { name: \"New York\", isoCode: \"NY\" },\n { name: \"North Carolina\", isoCode: \"NC\" },\n { name: \"North Dakota\", isoCode: \"ND\" },\n { name: \"Ohio\", isoCode: \"OH\" },\n { name: \"Oklahoma\", isoCode: \"OK\" },\n { name: \"Oregon\", isoCode: \"OR\" },\n { name: \"Pennsylvania\", isoCode: \"PA\" },\n { name: \"Rhode Island\", isoCode: \"RI\" },\n { name: \"South Carolina\", isoCode: \"SC\" },\n { name: \"South Dakota\", isoCode: \"SD\" },\n { name: \"Tennessee\", isoCode: \"TN\" },\n { name: \"Texas\", isoCode: \"TX\" },\n { name: \"Utah\", isoCode: \"UT\" },\n { name: \"Vermont\", isoCode: \"VT\" },\n { name: \"Virginia\", isoCode: \"VA\" },\n { name: \"Washington\", isoCode: \"WA\" },\n { name: \"West Virginia\", isoCode: \"WV\" },\n { name: \"Wisconsin\", isoCode: \"WI\" },\n { name: \"Wyoming\", isoCode: \"WY\" },\n { name: \"District of Columbia\", isoCode: \"DC\" },\n];\n\nexport const COUNTRY_CONFIGS: Record<string, RegionConfig> = {\n US: { regionLabel: \"State\", postalLabel: \"ZIP Code\" },\n JP: { regionLabel: \"Prefecture\", postalLabel: \"Postal Code\" },\n};\n\nconst DEFAULT_REGION_CONFIG: RegionConfig = {\n regionLabel: \"Province\",\n postalLabel: \"Postal Code\",\n};\n\nexport function getRegionConfig(countryCode: string): RegionConfig {\n return COUNTRY_CONFIGS[countryCode] ?? DEFAULT_REGION_CONFIG;\n}\n\nexport const DEFAULT_ADDRESS_FIELDS = [\n { field: \"first_name\", label: \"First Name\", required: true },\n { field: \"last_name\", label: \"Last Name\", required: true },\n { field: \"address1\", label: \"Address\", required: true },\n { field: \"address2\", label: \"Apartment, suite, etc.\", required: false },\n { field: \"city\", label: \"City\", required: true },\n { field: \"state\", label: \"State\", required: true },\n { field: \"postal_code\", label: \"Postal Code\", required: true },\n { field: \"country_code\", label: \"Country\", required: true },\n];\n","import { useCallback, useState } from \"react\";\nimport {\n US_STATES,\n getRegionConfig,\n type State,\n} from \"../utils/country-config\";\n\nexport default function useCountryStates() {\n const [selectedCountry, setSelectedCountry] = useState<string>(\"US\");\n const [stateOptions, setStateOptions] = useState<State[]>(US_STATES);\n\n const handleCountryChange = useCallback(\n (\n selectedCountryCode: string,\n fetchStates?: (countryCode: string) => Promise<State[]>,\n ) => {\n setSelectedCountry(selectedCountryCode);\n if (selectedCountryCode === \"US\") {\n setStateOptions(US_STATES);\n } else if (fetchStates) {\n fetchStates(selectedCountryCode)\n .then((states) => setStateOptions(states))\n .catch((error) => {\n console.error(\"Failed to fetch states:\", error);\n setStateOptions([]);\n });\n } else {\n setStateOptions([]);\n }\n },\n [],\n );\n\n const config = getRegionConfig(selectedCountry);\n\n return { handleCountryChange, stateOptions, config, selectedCountry };\n}\n","import type { JSX } from \"react\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Button,\n} from \"@fluid-app/ui-primitives\";\n\nexport default function EllipsesDropdown({\n onDelete,\n onEdit,\n editLabel = \"Edit\",\n deleteLabel = \"Delete\",\n disabled = false,\n}: {\n onDelete?: () => void;\n onEdit?: () => void;\n editLabel?: string;\n deleteLabel?: string;\n disabled?: boolean;\n}): JSX.Element {\n if (disabled) {\n return (\n <Button\n variant=\"ghost\"\n disabled\n className=\"cursor-not-allowed opacity-50\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 128 512\"\n className=\"h-4 w-1 fill-gray-400\"\n >\n <path d=\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\" />\n </svg>\n </Button>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 128 512\"\n className=\"h-4 w-1 fill-gray-400\"\n >\n <path d=\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\" />\n </svg>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"min-w-20 space-y-1 text-sm text-gray-900\">\n {onEdit && (\n <>\n <DropdownMenuItem\n className=\"flex cursor-pointer flex-row items-center justify-between space-x-2 rounded px-2 hover:bg-gray-50\"\n onClick={(e) => {\n e.stopPropagation();\n onEdit();\n }}\n >\n <span>{editLabel}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n className=\"h-2.5 w-2.5 fill-current\"\n >\n <path d=\"M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z\" />\n </svg>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n className=\"flex cursor-pointer flex-row items-center justify-between space-x-2 rounded px-2 text-red-500 hover:bg-red-50\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete?.();\n }}\n >\n <span>{deleteLabel}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 448 512\"\n className=\"h-2.5 w-2.5 fill-red-500\"\n >\n <path d=\"M135.2 17.7C140.6 6.8 151.7 0 163.8 0L284.2 0c12.1 0 23.2 6.8 28.6 17.7L320 32l80 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L48 96C30.3 96 16 81.7 16 64S30.3 32 48 32l80 0 7.2-14.3zM32 128l384 0 0 320c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-320z\" />\n </svg>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import type { JSX } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\ntype ConfirmActionDialogProps = {\n title: string;\n description: string;\n onAction: () => void;\n openDialog: boolean;\n setOpenDialog: (open: boolean) => void;\n errorMsg?: string;\n isLoading?: boolean;\n actionText?: string;\n};\n\nexport default function ConfirmActionDialog({\n title,\n description,\n onAction,\n openDialog,\n setOpenDialog,\n errorMsg,\n isLoading,\n actionText = \"Delete\",\n}: ConfirmActionDialogProps): JSX.Element {\n const { t } = useProfileUI();\n\n return (\n <Dialog open={openDialog} onOpenChange={setOpenDialog}>\n <DialogContent className=\"max-w-sm rounded md:w-90\">\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {title}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p className=\"text-left text-sm text-gray-500\">{description}</p>\n </div>\n\n {errorMsg && <p className=\"text-sm text-red-500\">{errorMsg}</p>}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between space-x-2\">\n <DialogClose asChild>\n <Button\n className=\"min-w-[70px] rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={() => setOpenDialog(false)}\n >\n {t(\"cancel\")}\n </Button>\n </DialogClose>\n <Button\n type=\"button\"\n className=\"min-w-[70px] rounded bg-red-600 p-3 text-white hover:bg-red-700\"\n onClick={onAction}\n disabled={isLoading}\n >\n {isLoading ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n actionText\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport {\n useProfileUI,\n type TranslationFn,\n type PointsLedger,\n} from \"@fluid-app/profile-core\";\n\nfunction formatTransactionType(ledger: PointsLedger, t: TranslationFn): string {\n const transactionType = ledger.metadata.transaction_type;\n\n if (!transactionType) {\n if (ledger.metadata.source) {\n return ledger.amount > 0 ? t(\"points_awarded\") : t(\"points_redeemed\");\n }\n return t(\"transaction\");\n }\n\n const translationKey = transactionType.toLowerCase().replace(/ /g, \"_\");\n const translated = t(translationKey);\n\n if (translated !== translationKey) {\n return translated;\n }\n\n return transactionType\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction formatPoints(amount: number): string {\n const prefix = amount >= 0 ? \"+\" : \"\";\n return `${prefix}${amount}`;\n}\n\nfunction formatDateTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nexport interface CustomerPointsLedgerProps {\n pointsLedger: PointsLedger[];\n isLoading?: boolean;\n}\n\nexport default function CustomerPointsLedger({\n pointsLedger,\n isLoading = false,\n}: CustomerPointsLedgerProps): JSX.Element {\n const [accordionValue, setAccordionValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n const availablePoints = pointsLedger[0]?.total_balance ?? 0;\n\n return (\n <div className=\"mb-6 border-b border-gray-300 pb-4\">\n <Accordion\n type=\"single\"\n collapsible\n value={accordionValue}\n onValueChange={setAccordionValue}\n className=\"w-full\"\n >\n <AccordionItem value=\"points-history\" className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">\n {t(\"points_history\")}\n </div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {isLoading && <Skeleton className=\"h-6 w-full\" />}\n\n {!isLoading && !accordionValue && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setAccordionValue(\"points-history\")}\n >\n <div className=\"text-sm font-semibold text-gray-900\">\n {availablePoints.toLocaleString()}{\" \"}\n <span className=\"font-normal text-gray-500\">\n {t(\"points_available\").toLowerCase()}\n </span>\n </div>\n </div>\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mb-3 flex w-full flex-col\">\n <div className=\"text-sm font-semibold text-gray-900\">\n {availablePoints.toLocaleString()}{\" \"}\n <span className=\"font-normal text-gray-500\">\n {t(\"points_available\").toLowerCase()}\n </span>\n </div>\n </div>\n\n <div className=\"flex flex-col space-y-0\">\n {pointsLedger.length > 0 ? (\n pointsLedger.map((ledger) => (\n <div\n key={ledger.id}\n className=\"relative flex flex-row items-start justify-between py-3\"\n >\n <div className=\"absolute top-3 left-0\">\n <div className=\"mt-1.5 h-2 w-2 flex-shrink-0 rounded-full border border-gray-300\" />\n <div className=\"mr-1 h-10 border-r border-gray-200\" />\n </div>\n <div className=\"ml-6 flex flex-row items-start space-x-3\">\n <div className=\"flex flex-col\">\n <div className=\"text-sm font-medium text-gray-900\">\n {formatTransactionType(ledger, t)}\n </div>\n <div className=\"text-sm text-gray-500\">\n {formatDateTime(ledger.created_at)}\n </div>\n </div>\n </div>\n <div\n className={cn(\n \"text-sm font-medium\",\n ledger.amount >= 0 ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {formatPoints(ledger.amount)}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-sm text-gray-500\">\n {t(\"no_points_history_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n </div>\n );\n}\n","import {\n useController,\n type Control,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\";\nimport {\n Input,\n Label,\n Select,\n SelectTrigger,\n SelectContent,\n SelectItem,\n SelectValue,\n cn,\n} from \"@fluid-app/ui-primitives\";\n\nexport type NameValue = { name: string; value: string | number };\n\nexport function FormTextField<T extends FieldValues>({\n control,\n name,\n label,\n containerClassName,\n ...props\n}: {\n control: Control<T>;\n name: FieldPath<T>;\n label?: string;\n containerClassName?: string;\n} & Omit<React.ComponentProps<\"input\">, \"name\">) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n {label && (\n <Label\n htmlFor={name}\n className=\"mb-1.5 block text-sm font-medium text-gray-700\"\n >\n {label}\n </Label>\n )}\n <Input\n {...field}\n {...props}\n id={name}\n value={field.value ?? \"\"}\n className={cn(error && \"ring-1 ring-red-500\", props.className)}\n />\n {error && <p className=\"text-sm text-red-500\">{error.message}</p>}\n </div>\n );\n}\n\nexport function FormSelectField<T extends FieldValues>({\n control,\n name,\n label,\n options,\n placeholder,\n containerClassName,\n onChange,\n}: {\n control: Control<T>;\n name: FieldPath<T>;\n label?: string;\n options?: NameValue[];\n placeholder?: string;\n containerClassName?: string;\n onChange?: (value: string) => void;\n}) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n {label && (\n <Label\n htmlFor={name}\n className=\"block text-sm font-medium text-gray-700\"\n >\n {label}\n </Label>\n )}\n <Select\n value={field.value?.toString() ?? \"\"}\n onValueChange={(val) => {\n field.onChange(val);\n onChange?.(val);\n }}\n >\n <SelectTrigger className={cn(error && \"ring-1 ring-red-500\")}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options?.map((opt) => (\n <SelectItem\n key={`${opt.name}-${opt.value}`}\n value={opt.value.toString()}\n >\n {opt.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {error && <p className=\"text-sm text-red-500\">{error.message}</p>}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport type { Control } from \"react-hook-form\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField, FormSelectField, type NameValue } from \"./form-fields\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\nexport type UserFormData = {\n first_name: string;\n last_name: string;\n phone_number?: string;\n language: string;\n};\n\nexport default function UserInfoDialog({\n control,\n isOpen,\n onSubmit,\n handleClose,\n languageOptions,\n errorMsg,\n isSubmitting,\n}: {\n control: Control<UserFormData>;\n isOpen: boolean;\n onSubmit: () => void;\n handleClose: () => void;\n languageOptions?: NameValue[];\n errorMsg: string | undefined;\n isSubmitting: boolean;\n}): JSX.Element {\n const { t } = useProfileUI();\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"max-w-sm rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium text-gray-900\">\n {t(\"edit_profile\")}\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-0\">\n <FormTextField\n control={control}\n name=\"first_name\"\n label={t(\"first_name\")}\n />\n <FormTextField\n control={control}\n name=\"last_name\"\n label={t(\"last_name\")}\n />\n <FormTextField\n control={control}\n name=\"phone_number\"\n label={t(\"phone_number\")}\n type=\"tel\"\n />\n <FormSelectField\n control={control}\n name=\"language\"\n label={t(\"language\")}\n options={languageOptions}\n placeholder={t(\"select_an_option\")}\n />\n </div>\n {errorMsg && <p className=\"text-sm text-red-500\">{errorMsg}</p>}\n <DialogFooter className=\"flex flex-row items-center justify-end\">\n <div className=\"flex-1 text-right\">\n <DialogClose asChild>\n <Button type=\"button\" onClick={onSubmit}>\n {isSubmitting && (\n <div className=\"mr-3 h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n )}\n {isSubmitting ? t(\"saving\") : t(\"save_changes\")}\n </Button>\n </DialogClose>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { z } from \"zod\";\nimport { Avatar, AvatarFallback, useZodForm } from \"@fluid-app/ui-primitives\";\nimport { Pencil } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport type { NameValue } from \"./form-fields\";\nimport { useProfileUI, type Language } from \"@fluid-app/profile-core\";\nimport UserInfoDialog, { type UserFormData } from \"./user-info-dialog\";\n\nfunction createUserInfoSchema(messages: {\n firstNameRequired: string;\n lastNameRequired: string;\n languageRequired: string;\n}) {\n return z.object({\n first_name: z.string().min(1, { message: messages.firstNameRequired }),\n last_name: z.string().min(1, { message: messages.lastNameRequired }),\n phone_number: z.string().optional(),\n language: z.string().min(1, { message: messages.languageRequired }),\n });\n}\n\nexport interface CustomerInfoProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: (data: UserFormData) => Promise<void> | void;\n isUpdating?: boolean;\n}\n\nexport default function CustomerInfo({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdating = false,\n}: CustomerInfoProps): JSX.Element {\n const [isEditDialogOpen, setIsEditDialogOpen] = useState(false);\n const [updateError, setUpdateError] = useState<string | undefined>(undefined);\n\n const { t } = useProfileUI();\n\n const { first_name, full_name } = customerAccount.customer;\n const derivedLastName = full_name.startsWith(first_name)\n ? full_name.slice(first_name.length).trim()\n : \"\";\n const userInitial = first_name ? first_name.charAt(0).toUpperCase() : \"\";\n const customerLanguage = languages?.find(\n (language) =>\n language.iso === customerAccount.fluid_pay_account.language_iso,\n )?.name;\n\n const languageOptions: NameValue[] | undefined = languages?.map(\n (language) => ({\n name: language.name,\n value: language.name,\n }),\n );\n\n const schema = useMemo(\n () =>\n createUserInfoSchema({\n firstNameRequired: t(\"first_name_is_required\"),\n lastNameRequired: t(\"last_name_is_required\"),\n languageRequired: t(\"language_is_required\"),\n }),\n [t],\n );\n\n const { control, handleSubmit, reset } = 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 <p className=\"text-sm font-medium\">\n {customerAccount.customer.full_name}\n </p>\n <p className=\"text-sm text-gray-500\">\n {customerAccount.customer.email}\n </p>\n </div>\n </div>\n <button\n className=\"cursor-pointer rounded-md border border-gray-300 p-1 hover:bg-gray-50 disabled:opacity-50\"\n onClick={handleOpenEditDialog}\n >\n <Pencil className=\"h-2.5 w-2.5 text-gray-400\" />\n </button>\n </div>\n\n <UserInfoDialog\n control={control}\n isOpen={isEditDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={handleCloseEditDialog}\n languageOptions={languageOptions}\n errorMsg={updateError}\n isSubmitting={isUpdating}\n />\n </>\n );\n}\n","import { useState } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\n\nfunction formatAddressName(address: fluidPay.CustomerAddress): string {\n return address.name ?? \"\";\n}\n\ninterface AddressDropdownProps {\n title: string;\n displayAddress: fluidPay.CustomerAddress | null;\n addressList: fluidPay.CustomerAddress[];\n onAddAddressClick: () => void;\n onEditAddress?: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress?: (address: fluidPay.CustomerAddress) => void;\n accordionItemValue: string;\n addAddressLabel: string;\n showAddButton?: boolean;\n borderStyle?: string;\n className?: string;\n showActions?: boolean;\n isLoading?: boolean;\n}\n\nexport default function AddressDropdown({\n title,\n displayAddress,\n addressList,\n onAddAddressClick,\n onEditAddress,\n onDeleteAddress,\n accordionItemValue,\n addAddressLabel,\n showAddButton = true,\n borderStyle = \"border-b border-gray-300 pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: AddressDropdownProps) {\n const [addressesValue, setAddressesValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n return (\n <div className={`${borderStyle} ${className}`}>\n <Accordion\n type=\"single\"\n collapsible\n value={addressesValue}\n onValueChange={setAddressesValue}\n className=\"w-full\"\n >\n <AccordionItem value={accordionItemValue} className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">{title}</div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {isLoading && (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n )}\n\n {!isLoading && !addressesValue && displayAddress && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setAddressesValue(accordionItemValue)}\n >\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {formatAddressName(displayAddress)}, {displayAddress.address1}\n </div>\n <div className=\"text-sm text-gray-500\">\n {displayAddress.city}, {displayAddress.state}{\" \"}\n {displayAddress.postal_code}\n </div>\n </div>\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mt-2 flex flex-col justify-between space-y-4 px-0.5\">\n {addressList.length > 0 ? (\n addressList.map((address, index) => (\n <div\n key={address.id}\n className={cn(\n \"flex min-h-[48px] w-full flex-row items-center justify-between space-x-2 px-2\",\n {\n \"items-center border-b border-gray-300 p-3\":\n addressList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-col\">\n <div className=\"text-sm text-gray-900\">\n {formatAddressName(address)} <br />\n {address.address1} <br />\n {address.city}, {address.state} {address.postal_code}\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {address.default && (\n <p className=\"mt-1 w-fit rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() => onDeleteAddress?.(address)}\n onEdit={() => onEditAddress?.(address)}\n editLabel={t(\"edit\")}\n deleteLabel={t(\"delete\")}\n />\n )}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-sm text-gray-500\">\n {t(\"no_saved_addresses_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"mt-3 text-left text-sm text-gray-900\"\n onClick={onAddAddressClick}\n >\n {addAddressLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useState, type JSX, type ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport ConfirmActionDialog from \"./confirm-action-dialog\";\nimport AddressDropdown from \"./address-dropdown\";\n\nexport interface AddressDialogRenderProps {\n isOpen: boolean;\n onClose: () => void;\n selectedAddress: fluidPay.CustomerAddress | null;\n}\n\nexport interface AddressesProps {\n addresses: fluidPay.CustomerAddress[];\n isLoading?: boolean;\n onCreateAddress?: () => void;\n onDeleteAddress: (addressId: number) => Promise<void> | void;\n isDeletingAddress?: boolean;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n}\n\nexport default function Addresses({\n addresses,\n isLoading = false,\n onCreateAddress,\n onDeleteAddress,\n isDeletingAddress = false,\n renderAddressDialog,\n}: AddressesProps): JSX.Element {\n const [openAddressDialog, setOpenAddressDialog] = useState(false);\n const [openDeleteDialog, setOpenDeleteDialog] = useState(false);\n const [selectedAddress, setSelectedAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [deleteAddressError, setDeleteAddressError] = useState<\n string | undefined\n >(undefined);\n\n const { t } = useProfileUI();\n\n const defaultAddress = addresses.find((addr) => addr.default) ?? null;\n\n const handleDeleteClick = (address: fluidPay.CustomerAddress) => {\n setSelectedAddress(address);\n setDeleteAddressError(undefined);\n requestAnimationFrame(() => {\n setOpenDeleteDialog(true);\n });\n };\n\n const handleEditClick = (address: fluidPay.CustomerAddress) => {\n setSelectedAddress(address);\n requestAnimationFrame(() => {\n setOpenAddressDialog(true);\n });\n };\n\n const handleDeleteAddress = async () => {\n if (!selectedAddress) return;\n try {\n await onDeleteAddress(selectedAddress.id);\n setDeleteAddressError(undefined);\n setOpenDeleteDialog(false);\n setSelectedAddress(null);\n } catch {\n setDeleteAddressError(\n \"We were unable to delete this address. Please try again.\",\n );\n }\n };\n\n const handleAddClick = () => {\n setSelectedAddress(null);\n if (onCreateAddress) {\n onCreateAddress();\n }\n setOpenAddressDialog(true);\n };\n\n const handleCloseAddressDialog = () => {\n setOpenAddressDialog(false);\n setSelectedAddress(null);\n };\n\n return (\n <>\n <AddressDropdown\n title={t(\"shipping_addresses\")}\n displayAddress={defaultAddress}\n addressList={addresses}\n onAddAddressClick={handleAddClick}\n onEditAddress={handleEditClick}\n onDeleteAddress={handleDeleteClick}\n accordionItemValue=\"addresses\"\n addAddressLabel={`+ ${t(\"add_an_address\")}`}\n showAddButton={true}\n borderStyle=\"border-b border-gray-300 pb-4 mb-6\"\n showActions={true}\n isLoading={isLoading}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n onAction={handleDeleteAddress}\n actionText={t(\"delete\")}\n openDialog={openDeleteDialog}\n setOpenDialog={setOpenDeleteDialog}\n errorMsg={deleteAddressError}\n isLoading={isDeletingAddress}\n />\n\n {renderAddressDialog?.({\n isOpen: openAddressDialog,\n onClose: handleCloseAddressDialog,\n selectedAddress,\n })}\n </>\n );\n}\n","import { useState } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\n\ninterface PaymentMethodDropdownProps {\n title: string;\n displayPaymentMethod: fluidPay.CustomerPaymentMethod | null;\n paymentMethodList: fluidPay.CustomerPaymentMethod[];\n onAddPaymentMethodClick: () => void;\n onEditPaymentMethod?: (paymentMethod: fluidPay.CustomerPaymentMethod) => void;\n onDeletePaymentMethod?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n accordionItemValue?: string;\n addPaymentMethodLabel?: string;\n showAddButton?: boolean;\n borderStyle?: string;\n className?: string;\n showActions?: boolean;\n isLoading?: boolean;\n}\n\nfunction getCardDisplayName(\n paymentMethod: fluidPay.CustomerPaymentMethod,\n): string {\n if (paymentMethod.payment_type === \"Credit Card\") {\n const brand = paymentMethod.details.card_type;\n const lastFour = paymentMethod.details.last_four;\n return `${brand ?? \"Card\"} •••• ${lastFour ?? \"****\"}`;\n }\n return paymentMethod.payment_type;\n}\n\nfunction getCardExpiry(paymentMethod: fluidPay.CustomerPaymentMethod): string {\n const { exp_month, exp_year } = paymentMethod.details;\n if (exp_month != null && exp_year != null) {\n return `Expires ${exp_month}/${exp_year}`;\n }\n return \"\";\n}\n\nexport default function PaymentMethodDropdown({\n title,\n displayPaymentMethod,\n paymentMethodList,\n onAddPaymentMethodClick,\n onEditPaymentMethod,\n onDeletePaymentMethod,\n accordionItemValue = \"paymentMethods\",\n addPaymentMethodLabel = \"+ Add a payment method\",\n showAddButton = true,\n borderStyle = \"border-b border-gray-300 pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: PaymentMethodDropdownProps) {\n const [paymentsValue, setPaymentsValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n const renderPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => (\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={paymentMethod.details.logo_url}\n alt={paymentMethod.details.card_type ?? t(\"payment_method\")}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {getCardDisplayName(paymentMethod)}\n </div>\n {getCardExpiry(paymentMethod) && (\n <div className=\"text-sm text-gray-500\">\n {getCardExpiry(paymentMethod)}\n </div>\n )}\n </div>\n </div>\n );\n\n return (\n <div className={`${borderStyle} ${className}`}>\n <Accordion\n type=\"single\"\n collapsible\n value={paymentsValue}\n onValueChange={setPaymentsValue}\n className=\"w-full\"\n >\n <AccordionItem value={accordionItemValue} className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">{title}</div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {!paymentsValue && isLoading ? (\n <div className=\"mb-2 flex w-full flex-row items-center space-x-2\">\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col space-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n ) : (\n !paymentsValue &&\n displayPaymentMethod && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setPaymentsValue(accordionItemValue)}\n >\n {renderPaymentMethod(displayPaymentMethod)}\n </div>\n )\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mt-2 flex flex-col justify-between space-y-4 px-0.5\">\n {isLoading ? (\n <>\n {[1, 2].map((i) => (\n <div\n key={`skeleton-${i}`}\n className=\"items-center rounded bg-gray-100 p-3\"\n >\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"flex flex-row items-center space-x-2\">\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col space-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n <Skeleton className=\"h-6 w-6\" />\n </div>\n </div>\n ))}\n </>\n ) : (\n paymentMethodList.map((paymentMethod, index) => (\n <div\n key={paymentMethod.id}\n className={cn(\n \"flex min-h-[48px] w-full flex-row items-center justify-between space-x-2 px-2\",\n {\n \"items-center border-b border-gray-300 p-3\":\n paymentMethodList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={paymentMethod.details.logo_url}\n alt={\n paymentMethod.details.card_type ??\n t(\"payment_method\")\n }\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {`${paymentMethod.details.card_type ?? \"Card\"} •••• ${paymentMethod.details.last_four ?? \"****\"}`}\n </div>\n <div className=\"text-sm text-gray-500\">\n {`${t(\"card_expires\")} ${paymentMethod.details.exp_month}/${paymentMethod.details.exp_year}`}\n </div>\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.default && (\n <p className=\"mt-1 w-fit rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() =>\n onDeletePaymentMethod?.(paymentMethod)\n }\n deleteLabel={t(\"delete\")}\n onEdit={() => onEditPaymentMethod?.(paymentMethod)}\n editLabel={t(\"edit\")}\n />\n )}\n </div>\n </div>\n ))\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"mt-3 text-left text-sm text-gray-900\"\n onClick={onAddPaymentMethodClick}\n >\n {addPaymentMethodLabel}\n </button>\n )}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\nexport interface BillingAddress {\n name?: string | null;\n address1?: string | null;\n address2?: string | null;\n city?: string | null;\n state?: string | null;\n zip?: string | null;\n country_code?: string | null;\n}\n\ninterface ViewPaymentMethodDialogProps {\n isOpen: boolean;\n paymentMethod: fluidPay.CustomerPaymentMethod | null;\n billingAddress?: BillingAddress | null;\n onClose: () => void;\n onEdit?: () => void;\n}\n\nexport default function ViewPaymentMethodDialog({\n isOpen,\n paymentMethod,\n billingAddress,\n onClose,\n onEdit,\n}: ViewPaymentMethodDialogProps): JSX.Element | null {\n const { t } = useProfileUI();\n\n if (!paymentMethod) return null;\n\n const { details } = paymentMethod;\n const cardBrand = details.card_type ?? \"Card\";\n const lastFour = details.last_four ?? \"****\";\n const expMonth = details.exp_month;\n const expYear = details.exp_year;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-w-sm rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium\">\n {t(\"edit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div>\n <div className=\"rounded-lg bg-gray-50 p-4\">\n <div className=\"flex items-center space-x-3\">\n {details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={details.logo_url}\n alt={cardBrand}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-gray-900\">\n {cardBrand} •••• {lastFour}\n </span>\n {expMonth != null && expYear != null && (\n <span className=\"text-sm text-gray-500\">\n {t(\"card_expires\")} {expMonth}/{expYear}\n </span>\n )}\n </div>\n </div>\n {paymentMethod.default && (\n <span className=\"mt-2 inline-block rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </span>\n )}\n </div>\n </div>\n\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-gray-900\">\n {t(\"billing_address\")}\n </h3>\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto p-0 text-sm text-gray-600 underline hover:bg-transparent\"\n onClick={onEdit}\n >\n {t(\"edit\")}\n </Button>\n )}\n </div>\n <div className=\"rounded-lg bg-gray-50 p-4\">\n {billingAddress ? (\n <div className=\"space-y-1 text-sm text-gray-900\">\n {billingAddress.name && <p>{billingAddress.name}</p>}\n <p>{billingAddress.address1}</p>\n {billingAddress.address2 && <p>{billingAddress.address2}</p>}\n <p>\n {billingAddress.city}, {billingAddress.state}{\" \"}\n {billingAddress.zip}\n </p>\n <p>{billingAddress.country_code}</p>\n </div>\n ) : (\n <p className=\"text-sm text-gray-500 italic\">\n {t(\"no_billing_address\")}\n </p>\n )}\n </div>\n </div>\n </div>\n\n <DialogFooter>\n <DialogClose asChild>\n <Button\n className=\"rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={onClose}\n >\n {t(\"close\")}\n </Button>\n </DialogClose>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, type JSX } from \"react\";\nimport { 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-api-client\";\nimport { useProfileUI, useCountryStates } from \"@fluid-app/profile-core\";\nimport type { BillingAddress } from \"./view-payment-method-dialog\";\n\nconst editPaymentMethodFormSchema = z.object({\n billing_address: z.object({\n name: z.string().min(1, \"Name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n zip: z.string().min(1, \"Zip code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n }),\n set_as_default: z.boolean(),\n});\n\nexport type EditPaymentMethodFormData = z.infer<\n typeof editPaymentMethodFormSchema\n>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\ninterface EditPaymentMethodDialogProps {\n isOpen: boolean;\n paymentMethod: fluidPay.CustomerPaymentMethod | null;\n billingAddress?: BillingAddress | null;\n onClose: () => void;\n onSubmit: (data: EditPaymentMethodFormData) => void;\n isSubmitting: boolean;\n error?: string;\n countries?: CountryOption[];\n}\n\nexport default function EditPaymentMethodDialog({\n isOpen,\n paymentMethod,\n billingAddress,\n onClose,\n onSubmit,\n isSubmitting,\n error,\n countries = [],\n}: EditPaymentMethodDialogProps): JSX.Element | null {\n const { t } = useProfileUI();\n\n const { control, handleSubmit, reset, setValue } =\n 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-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport ConfirmActionDialog from \"./confirm-action-dialog\";\nimport PaymentMethodDropdown from \"./payment-method-dropdown\";\nimport ViewPaymentMethodDialog, {\n type BillingAddress,\n} from \"./view-payment-method-dialog\";\nimport EditPaymentMethodDialog, {\n type EditPaymentMethodFormData,\n} from \"./edit-payment-method-dialog\";\n\nexport interface CreditCardDialogRenderProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface PaymentMethodsProps {\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n isLoading?: boolean;\n onDeletePaymentMethod: (paymentMethodId: number) => Promise<void> | void;\n isDeletingPaymentMethod?: boolean;\n onUpdatePaymentMethod: (\n paymentMethodId: number,\n data: EditPaymentMethodFormData,\n ) => Promise<void> | void;\n isUpdatingPaymentMethod?: boolean;\n getBillingAddress?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => BillingAddress | null | undefined;\n countries?: CountryOption[];\n renderCreditCardDialog?: (props: CreditCardDialogRenderProps) => ReactNode;\n}\n\nexport default function PaymentMethods({\n paymentMethods,\n isLoading = false,\n onDeletePaymentMethod,\n isDeletingPaymentMethod = false,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod = false,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n}: PaymentMethodsProps): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const [openDeleteDialog, setOpenDeleteDialog] = useState(false);\n const [deleteCardError, setDeleteCardError] = useState<string | undefined>(\n undefined,\n );\n const [selectedCreditCard, setSelectedCreditCard] = useState<\n fluidPay.CustomerPaymentMethod | undefined\n >(undefined);\n const [isViewOpen, setIsViewOpen] = useState(false);\n const [isEditOpen, setIsEditOpen] = useState(false);\n const [selectedPaymentMethod, setSelectedPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n const [editError, setEditError] = useState<string | undefined>(undefined);\n\n const { t } = useProfileUI();\n\n const defaultPaymentMethod =\n paymentMethods.find((method) => method.default) ?? null;\n\n const handleDeleteCard = async (cardId: number | null) => {\n if (!cardId) return;\n try {\n await onDeletePaymentMethod(cardId);\n setSelectedCreditCard(undefined);\n setDeleteCardError(undefined);\n setOpenDeleteDialog(false);\n } catch {\n setDeleteCardError(\"Unable to delete payment method. Please try again.\");\n }\n };\n\n const handleDeletePaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => {\n setSelectedCreditCard(paymentMethod);\n requestAnimationFrame(() => {\n setOpenDeleteDialog(true);\n });\n };\n\n const handleViewPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => {\n setSelectedPaymentMethod(paymentMethod);\n requestAnimationFrame(() => {\n setIsViewOpen(true);\n });\n };\n\n const handleCloseViewDialog = () => {\n setIsViewOpen(false);\n setSelectedPaymentMethod(null);\n };\n\n const handleOpenEditFromView = () => {\n setIsViewOpen(false);\n setEditError(undefined);\n requestAnimationFrame(() => {\n setIsEditOpen(true);\n });\n };\n\n const handleCloseEditDialog = () => {\n setIsEditOpen(false);\n setSelectedPaymentMethod(null);\n setEditError(undefined);\n };\n\n const handleEditSubmit = async (data: EditPaymentMethodFormData) => {\n if (!selectedPaymentMethod) return;\n try {\n await onUpdatePaymentMethod(selectedPaymentMethod.id, data);\n handleCloseEditDialog();\n fluidToast({\n title: t(\"default_payment_method_updated\"),\n type: \"success\",\n });\n } catch (error) {\n console.error(\"Error updating payment method:\", error);\n fluidToast({\n title: t(\"failed_to_set_default_payment_method\"),\n type: \"error\",\n description: parseApiErrors(error),\n });\n if (error instanceof Error) {\n setEditError(error.message);\n } else {\n setEditError(\"An unexpected error occurred. Please try again.\");\n }\n }\n };\n\n const handleOpenDialog = () => {\n setIsOpen(true);\n };\n\n const handleCloseDialog = () => {\n setIsOpen(false);\n };\n\n const selectedBillingAddress = selectedPaymentMethod\n ? (getBillingAddress?.(selectedPaymentMethod) ?? null)\n : null;\n\n return (\n <>\n <PaymentMethodDropdown\n title={t(\"payment_methods\")}\n displayPaymentMethod={defaultPaymentMethod}\n paymentMethodList={paymentMethods}\n onAddPaymentMethodClick={handleOpenDialog}\n onEditPaymentMethod={handleViewPaymentMethod}\n onDeletePaymentMethod={handleDeletePaymentMethod}\n addPaymentMethodLabel={`+ ${t(\"add_payment_method\")}`}\n isLoading={isLoading}\n />\n\n {renderCreditCardDialog?.({\n isOpen,\n onClose: handleCloseDialog,\n })}\n\n <ConfirmActionDialog\n title={t(\"delete_credit_card\")}\n description={t(\"delete_credit_card_message\")}\n actionText={t(\"delete\")}\n onAction={() => handleDeleteCard(selectedCreditCard?.id ?? null)}\n openDialog={openDeleteDialog}\n setOpenDialog={setOpenDeleteDialog}\n errorMsg={deleteCardError}\n isLoading={isDeletingPaymentMethod}\n />\n\n <ViewPaymentMethodDialog\n isOpen={isViewOpen}\n paymentMethod={selectedPaymentMethod}\n billingAddress={selectedBillingAddress}\n onClose={handleCloseViewDialog}\n onEdit={handleOpenEditFromView}\n />\n\n <EditPaymentMethodDialog\n isOpen={isEditOpen}\n paymentMethod={selectedPaymentMethod}\n billingAddress={selectedBillingAddress}\n onClose={handleCloseEditDialog}\n onSubmit={handleEditSubmit}\n isSubmitting={isUpdatingPaymentMethod}\n error={editError}\n countries={countries}\n />\n </>\n );\n}\n","import type { JSX, ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport CustomerInfo, { type CustomerInfoProps } from \"./customer-info\";\nimport CustomerPointsLedger from \"./customer-points-ledger\";\nimport Addresses, { type AddressDialogRenderProps } from \"./addresses\";\nimport PaymentMethods, {\n type CreditCardDialogRenderProps,\n} from \"./payment-methods\";\nimport type { EditPaymentMethodFormData } from \"./edit-payment-method-dialog\";\nimport type { BillingAddress } from \"./view-payment-method-dialog\";\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface ProfileProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: CustomerInfoProps[\"onUpdateCustomer\"];\n isUpdatingCustomer?: boolean;\n\n rewardsPointsEnabled?: boolean;\n pointsLedger?: PointsLedger[];\n isLoadingPointsLedger?: boolean;\n\n addresses: fluidPay.CustomerAddress[];\n isLoadingAddresses?: boolean;\n onDeleteAddress: (addressId: number) => Promise<void> | void;\n isDeletingAddress?: boolean;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n isLoadingPaymentMethods?: boolean;\n onDeletePaymentMethod: (paymentMethodId: number) => Promise<void> | void;\n isDeletingPaymentMethod?: boolean;\n onUpdatePaymentMethod: (\n paymentMethodId: number,\n data: EditPaymentMethodFormData,\n ) => Promise<void> | void;\n isUpdatingPaymentMethod?: boolean;\n getBillingAddress?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => BillingAddress | null | undefined;\n countries?: CountryOption[];\n renderCreditCardDialog?: (props: CreditCardDialogRenderProps) => ReactNode;\n}\n\nexport default function Profile({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdatingCustomer,\n rewardsPointsEnabled = false,\n pointsLedger,\n isLoadingPointsLedger,\n addresses,\n isLoadingAddresses,\n onDeleteAddress,\n isDeletingAddress,\n renderAddressDialog,\n paymentMethods,\n isLoadingPaymentMethods,\n onDeletePaymentMethod,\n isDeletingPaymentMethod,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n}: ProfileProps): JSX.Element {\n return (\n <>\n <CustomerInfo\n customerAccount={customerAccount}\n languages={languages}\n onUpdateCustomer={onUpdateCustomer}\n isUpdating={isUpdatingCustomer}\n />\n {rewardsPointsEnabled && (\n <CustomerPointsLedger\n pointsLedger={pointsLedger ?? []}\n isLoading={isLoadingPointsLedger}\n />\n )}\n <Addresses\n addresses={addresses}\n isLoading={isLoadingAddresses}\n onDeleteAddress={onDeleteAddress}\n isDeletingAddress={isDeletingAddress}\n renderAddressDialog={renderAddressDialog}\n />\n <PaymentMethods\n paymentMethods={paymentMethods}\n isLoading={isLoadingPaymentMethods}\n onDeletePaymentMethod={onDeletePaymentMethod}\n isDeletingPaymentMethod={isDeletingPaymentMethod}\n onUpdatePaymentMethod={onUpdatePaymentMethod}\n isUpdatingPaymentMethod={isUpdatingPaymentMethod}\n getBillingAddress={getBillingAddress}\n countries={countries}\n renderCreditCardDialog={renderCreditCardDialog}\n />\n </>\n );\n}\n","\"use client\";\n\nimport type { Control, FieldPath, FieldValues } from \"react-hook-form\";\nimport { useController } from \"react-hook-form\";\nimport { Input, cn } from \"@fluid-app/ui-primitives\";\n\ninterface FormTextFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n control: Control<TFieldValues>;\n name: TName;\n placeholder?: string;\n containerClassName?: string;\n type?: React.HTMLInputTypeAttribute;\n disabled?: boolean;\n inputMode?: React.HTMLAttributes<HTMLInputElement>[\"inputMode\"];\n}\n\nexport function FormTextField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n placeholder,\n containerClassName,\n type,\n disabled,\n inputMode,\n}: FormTextFieldProps<TFieldValues, TName>) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n <Input\n {...field}\n value={field.value ?? \"\"}\n id={name}\n type={type}\n disabled={disabled}\n inputMode={inputMode}\n placeholder={placeholder}\n aria-invalid={!!error}\n />\n {error?.message && (\n <p className=\"text-sm text-red-500\">{error.message}</p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { Control, FieldPath, FieldValues } from \"react-hook-form\";\nimport { Controller } from \"react-hook-form\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n} from \"@fluid-app/ui-primitives\";\n\ntype NameValue = { name: string; value: string | number };\n\ninterface FormSelectFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n control: Control<TFieldValues>;\n name: TName;\n placeholder?: string;\n options?: NameValue[];\n containerClassName?: string;\n disabled?: boolean;\n}\n\nexport function FormSelectField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n placeholder = \"Select\",\n options,\n containerClassName,\n disabled,\n}: FormSelectFieldProps<TFieldValues, TName>) {\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n <Controller\n control={control}\n name={name}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <Select\n value={value?.toString() ?? \"\"}\n onValueChange={onChange}\n disabled={disabled}\n >\n <SelectTrigger\n aria-invalid={!!error}\n className={cn(\n \"w-full\",\n error && \"border-red-500 ring-1 ring-red-500\",\n )}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options && options.length > 0 ? (\n options.map((opt) => (\n <SelectItem\n key={opt.value.toString()}\n value={opt.value.toString()}\n >\n {opt.name}\n </SelectItem>\n ))\n ) : (\n <SelectItem value=\"__empty\" disabled>\n No available options\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n {error?.message && (\n <p className=\"text-sm text-red-500\">{error.message}</p>\n )}\n </>\n )}\n />\n </div>\n );\n}\n","import { type JSX, type ReactNode, useEffect } from \"react\";\nimport { 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-api-client\";\nimport { useCountryStates } from \"@fluid-app/fluid-pay-core\";\n\nconst addressFormSchema = z.object({\n first_name: z.string().min(1, \"First name is required\"),\n last_name: z.string().min(1, \"Last name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n postal_code: z.string().min(1, \"Postal code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n default: z.boolean(),\n});\n\nexport type AddressFormData = z.infer<typeof addressFormSchema>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface AddressAutocompleteRenderProps {\n control: Control<AddressFormData>;\n setValue: UseFormSetValue<AddressFormData>;\n countryCode: string;\n}\n\ninterface AddressFormDialogProps {\n isOpen: boolean;\n onClose: () => void;\n selectedAddress: fluidPay.CustomerAddress | null;\n onSubmit: (data: fluidPay.CreateAddressBody) => void;\n isSubmitting: boolean;\n countries?: CountryOption[];\n error?: string;\n renderAddressAutocomplete?: (\n props: AddressAutocompleteRenderProps,\n ) => ReactNode;\n t: (key: string) => string;\n}\n\nexport default function AddressFormDialog({\n isOpen,\n onClose,\n selectedAddress,\n onSubmit,\n isSubmitting,\n countries = [],\n error,\n renderAddressAutocomplete,\n t,\n}: AddressFormDialogProps): JSX.Element {\n const { control, handleSubmit, reset, setValue } =\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\");\n } else {\n reset({\n first_name: \"\",\n last_name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country_code: \"US\",\n default: false,\n });\n handleCountryChange(\"US\");\n }\n }\n }, [selectedAddress, isOpen, reset, handleCountryChange]);\n\n useEffect(() => {\n handleCountryChange(selectedCountryCode);\n }, [selectedCountryCode, handleCountryChange]);\n\n const handleFormSubmit = handleSubmit((data) => {\n onSubmit({\n address: {\n first_name: data.first_name,\n last_name: data.last_name,\n address1: data.address1,\n address2: data.address2 ?? null,\n city: data.city,\n state: data.state,\n postal_code: data.postal_code,\n country_code: data.country_code,\n default: data.default,\n },\n });\n });\n\n const isEditMode = selectedAddress !== null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-md overflow-y-auto rounded md:max-w-xl\">\n <DialogHeader>\n <DialogTitle className=\"text-lg font-medium\">\n {isEditMode ? t(\"edit_address\") : t(\"add_an_address\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-3 pt-2\">\n <FormSelectField\n control={control}\n name=\"country_code\"\n placeholder={t(\"country\")}\n options={countrySelectOptions}\n disabled={isSubmitting}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"first_name\"\n placeholder={t(\"first_name\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormTextField\n control={control}\n name=\"last_name\"\n placeholder={t(\"last_name\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n </div>\n {renderAddressAutocomplete ? (\n renderAddressAutocomplete({\n control,\n setValue,\n countryCode: selectedCountryCode,\n })\n ) : (\n <FormTextField\n control={control}\n name=\"address1\"\n placeholder={t(\"address_line_1\")}\n disabled={isSubmitting}\n />\n )}\n <FormTextField\n control={control}\n name=\"address2\"\n placeholder={t(\"address_line_2\")}\n disabled={isSubmitting}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"city\"\n placeholder={t(\"city\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormSelectField\n control={control}\n name=\"state\"\n placeholder={\n config?.regionLabel ? t(config.regionLabel) : t(\"select_state\")\n }\n options={stateSelectOptions}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormTextField\n control={control}\n name=\"postal_code\"\n placeholder={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default_address\"\n checked={isDefault}\n onChange={() => setValue(\"default\", !isDefault)}\n disabled={isSubmitting}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default_address\" className=\"text-sm\">\n {t(\"set_as_default_address\")}\n </label>\n </div>\n\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isSubmitting}\n className=\"rounded bg-gray-900 px-5 py-2.5 text-white hover:bg-gray-800\"\n >\n {isSubmitting ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save_address\")\n )}\n </Button>\n </div>\n\n {error && <div className=\"mt-2 text-sm text-red-500\">{error}</div>}\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, useRef, useState, useCallback } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\n\nexport type VgsFieldState = {\n isFocused: boolean;\n isValid: boolean;\n isEmpty: boolean;\n};\n\nexport type VgsFormState = {\n [key: string]: VgsFieldState;\n};\n\ninterface VGSCollectForm {\n setRouteId: (routeId: string) => void;\n field: (selector: string, config: Record<string, unknown>) => void;\n submit: (\n path: string,\n options: { headers?: Record<string, string> },\n successCallback: (\n status: number,\n response: fluidPay.VgsCollectSubmitResponse,\n ) => void,\n errorCallback: (errors: Record<string, string[]>) => void,\n ) => void;\n unmount: () => void;\n}\n\ninterface VGSCollectLibrary {\n create: (\n vaultId: string,\n environment: string,\n stateCallback: (state: Record<string, Partial<VgsFieldState>>) => void,\n ) => VGSCollectForm;\n}\n\nconst getVGSCollect = (): VGSCollectLibrary | null => {\n if (typeof window !== \"undefined\") {\n return (\n (window as unknown as { VGSCollect?: VGSCollectLibrary }).VGSCollect ||\n null\n );\n }\n return null;\n};\n\nconst DEFAULT_FIELD_STATE: VgsFormState = {\n card_number: { isFocused: false, isValid: false, isEmpty: true },\n card_exp: { isFocused: false, isValid: false, isEmpty: true },\n card_cvc: { isFocused: false, isValid: false, isEmpty: true },\n card_holder: { isFocused: false, isValid: false, isEmpty: true },\n};\n\nexport function useVgsCollect() {\n const [isFormReady, setIsFormReady] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isScriptLoaded, setIsScriptLoaded] = useState(false);\n\n const [vgsFieldState, setVgsFieldState] =\n useState<VgsFormState>(DEFAULT_FIELD_STATE);\n\n const formRef = useRef<VGSCollectForm | null>(null);\n const onSuccessRef = useRef<\n ((response: fluidPay.VgsCollectSubmitResponse) => void) | null\n >(null);\n const onErrorRef = useRef<((error: string) => void) | null>(null);\n\n // Load VGS Collect script\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const vgsCollect = getVGSCollect();\n if (vgsCollect) {\n const timeoutId = window.setTimeout(() => {\n setIsScriptLoaded(true);\n }, 0);\n return () => window.clearTimeout(timeoutId);\n }\n\n if (isScriptLoaded) return;\n\n const script = document.createElement(\"script\");\n script.src =\n \"https://js.verygoodvault.com/vgs-collect/3.3.0/vgs-collect.js\";\n script.async = true;\n script.onload = () => setIsScriptLoaded(true);\n script.onerror = () => onErrorRef.current?.(\"Failed to load payment form\");\n document.head.appendChild(script);\n }, [isScriptLoaded]);\n\n const updateFieldState = useCallback(\n (state: Record<string, Partial<VgsFieldState>>) => {\n if (!state) return;\n\n setVgsFieldState((prev) => {\n const newState: VgsFormState = { ...prev };\n let hasChanges = false;\n\n Object.keys(state).forEach((key) => {\n const field = state[key];\n if (!field) return;\n\n const next: VgsFieldState = {\n isFocused: !!field.isFocused,\n isValid: !!field.isValid,\n isEmpty: !!field.isEmpty,\n };\n\n if (\n !newState[key] ||\n JSON.stringify(newState[key]) !== JSON.stringify(next)\n ) {\n newState[key] = next;\n hasChanges = true;\n }\n });\n\n return hasChanges ? newState : prev;\n });\n },\n [],\n );\n\n const resetVgs = useCallback(() => {\n if (formRef.current) {\n try {\n formRef.current.unmount();\n } catch (e) {\n console.warn(\"VGS unmount error\", e);\n }\n formRef.current = null;\n }\n\n setIsFormReady(false);\n setVgsFieldState({ ...DEFAULT_FIELD_STATE });\n }, []);\n\n const initializeForm = useCallback(\n async (credentials: fluidPay.VaultResponse) => {\n if (!isScriptLoaded) return;\n\n const VGSCollect = getVGSCollect();\n if (!VGSCollect) {\n onErrorRef.current?.(\"Payment script not loaded\");\n return;\n }\n\n try {\n setIsLoading(true);\n\n const vgsEnvironment =\n credentials.vault.environment === \"sandbox\" ? \"sandbox\" : \"live-eu-1\";\n\n const form = VGSCollect.create(\n credentials.vault.vault_id,\n vgsEnvironment,\n (state) => updateFieldState(state),\n );\n\n if (credentials.vault.route_id) {\n form.setRouteId(credentials.vault.route_id);\n }\n\n formRef.current = form;\n\n // Wait for DOM elements\n let retries = 0;\n const maxRetries = 20;\n const retryDelay = 200;\n\n const waitForDom = async (): Promise<boolean> => {\n const allExist = [\n \"vgs-card-number\",\n \"vgs-expiration-date\",\n \"vgs-cvc\",\n \"vgs-card-holder\",\n ].every((id) => {\n const el = document.getElementById(id);\n return el && el.isConnected;\n });\n\n if (allExist) return true;\n if (retries >= maxRetries) return false;\n\n retries++;\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n return waitForDom();\n };\n\n const domReady = await waitForDom();\n if (!domReady) {\n throw new Error(\"Payment form elements not ready\");\n }\n\n const css = {\n fontSize: \"14px\",\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n color: \"#1f2937\",\n paddingTop: \"0px\",\n paddingBottom: \"0px\",\n paddingLeft: \"0px\",\n paddingRight: \"0px\",\n boxSizing: \"border-box\",\n lineHeight: \"38px\",\n height: \"100%\",\n width: \"100%\",\n \"&::placeholder\": { color: \"#9ca3af\", opacity: 1 },\n \"&:focus\": { outline: \"none\" },\n };\n\n form.field(\"#vgs-card-number\", {\n type: \"card-number\",\n name: \"card_number\",\n placeholder: \"0000 0000 0000 0000\",\n showCardIcon: true,\n css: { ...css, paddingRight: \"40px\" },\n autoComplete: \"cc-number\",\n validations: [\"required\", \"validCardNumber\"],\n });\n\n form.field(\"#vgs-expiration-date\", {\n type: \"card-expiration-date\",\n name: \"card_exp\",\n yearLength: 2,\n placeholder: \"MM / YY\",\n css,\n autoComplete: \"cc-exp\",\n validations: [\"required\", \"validCardExpirationDate\"],\n });\n\n form.field(\"#vgs-cvc\", {\n type: \"card-security-code\",\n name: \"card_cvc\",\n placeholder: \"123\",\n css,\n autoComplete: \"cc-csc\",\n validations: [\"required\", \"validCardSecurityCode\"],\n });\n\n form.field(\"#vgs-card-holder\", {\n type: \"text\",\n name: \"card_holder\",\n placeholder: \"Full Name\",\n css,\n autoComplete: \"cc-name\",\n validations: [\"required\"],\n });\n\n setIsFormReady(true);\n } catch (error) {\n console.error(\"Failed to initialize VGS:\", error);\n onErrorRef.current?.(\"Failed to initialize payment form\");\n } finally {\n setIsLoading(false);\n }\n },\n [isScriptLoaded, updateFieldState],\n );\n\n const submitCard = useCallback(() => {\n if (!formRef.current) {\n onErrorRef.current?.(\"Form not initialized\");\n return;\n }\n\n formRef.current.submit(\n `/post`,\n {},\n (status: number, response: fluidPay.VgsCollectSubmitResponse) => {\n if (status >= 200 && status < 400) {\n onSuccessRef.current?.(response);\n } else {\n onErrorRef.current?.(\"Payment failed\");\n }\n },\n (errors: Record<string, string[]>) => {\n const allErrors = Object.values(errors)\n .flat()\n .filter(\n (msg) =>\n typeof msg === \"string\" &&\n msg.trim().length > 0 &&\n msg !== \"Required\",\n );\n\n const uniqueErrors = Array.from(new Set(allErrors));\n\n let errorMsg = \"Please verify your payment details.\";\n if (uniqueErrors.length > 0) {\n errorMsg = uniqueErrors.join(\", \");\n } else {\n const rawErrors = Object.values(errors).flat();\n if (rawErrors.length > 0) {\n errorMsg = \"Please fill in all required fields.\";\n }\n }\n\n onErrorRef.current?.(errorMsg);\n },\n );\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (formRef.current) {\n try {\n formRef.current.unmount();\n } catch (e) {\n console.warn(\"VGS unmount error\", e);\n }\n formRef.current = null;\n }\n };\n }, []);\n\n return {\n isFormReady,\n isLoading,\n isScriptLoaded,\n initializeForm,\n submitCard,\n vgsFieldState,\n resetVgs,\n onSuccessRef,\n onErrorRef,\n };\n}\n","import {\n type JSX,\n type ReactNode,\n useEffect,\n useState,\n useCallback,\n} from \"react\";\nimport { 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, FetchClient } from \"@fluid-app/fluid-pay-api-client\";\nimport { vaultApi } from \"@fluid-app/fluid-pay-api-client\";\nimport { useCountryStates } from \"@fluid-app/fluid-pay-core\";\nimport {\n useVgsCollect,\n type VgsFieldState,\n type VgsFormState,\n} from \"../hooks/use-vgs-collect\";\n\nconst billingAddressSchema = z.object({\n name: z.string().min(1, \"Name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n zip: z.string().min(1, \"Zip code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n set_as_default: z.boolean(),\n});\n\ntype BillingAddressFormData = z.infer<typeof billingAddressSchema>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface BillingAddressAutocompleteRenderProps {\n control: Control<BillingAddressFormData>;\n setValue: UseFormSetValue<BillingAddressFormData>;\n countryCode: string;\n}\n\ninterface CreditCardFormDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (data: fluidPay.AddCreditCardData) => void;\n isSubmitting: boolean;\n countries?: CountryOption[];\n error?: string;\n jwt: string;\n client: FetchClient;\n renderAddressAutocomplete?: (\n props: BillingAddressAutocompleteRenderProps,\n ) => ReactNode;\n t: (key: string) => string;\n}\n\nfunction VgsInputWrapper({\n id,\n fieldState,\n className,\n}: {\n id: string;\n fieldState?: VgsFieldState;\n className?: string;\n}) {\n const isInvalid =\n fieldState?.isValid === false &&\n !fieldState?.isFocused &&\n !fieldState?.isEmpty;\n\n const isFocused = fieldState?.isFocused;\n\n return (\n <div className=\"w-full\">\n <div\n id={id}\n className={cn(\n \"relative flex h-10 w-full items-center rounded-md border border-gray-300 bg-white px-3 shadow-sm transition-all duration-200 ease-in-out\",\n \"[&_iframe]:block! [&_iframe]:h-full! [&_iframe]:w-full!\",\n isFocused && \"border-blue-600 ring-1 ring-blue-600\",\n isInvalid && \"border-red-500 ring-1 ring-red-500\",\n className,\n )}\n />\n </div>\n );\n}\n\nfunction VgsCardForm({\n isLoading,\n isFormReady,\n vgsFieldState,\n networkError,\n t,\n}: {\n isLoading: boolean;\n isFormReady: boolean;\n vgsFieldState: VgsFormState;\n networkError?: string;\n t: (key: string) => string;\n}) {\n const showSpinner = isLoading || !isFormReady;\n\n return (\n <div className=\"space-y-4\" aria-label=\"Credit card form\">\n <VgsInputWrapper\n id=\"vgs-card-number\"\n fieldState={vgsFieldState[\"card_number\"]}\n />\n\n <div className=\"flex gap-3\">\n <div className=\"flex-1\">\n <VgsInputWrapper\n id=\"vgs-expiration-date\"\n fieldState={vgsFieldState[\"card_exp\"]}\n />\n </div>\n <div className=\"flex-1\">\n <VgsInputWrapper\n id=\"vgs-cvc\"\n fieldState={vgsFieldState[\"card_cvc\"]}\n />\n </div>\n </div>\n\n <VgsInputWrapper\n id=\"vgs-card-holder\"\n fieldState={vgsFieldState[\"card_holder\"]}\n />\n\n {networkError && networkError.trim().length > 0 && (\n <div className=\"rounded-md bg-red-50 p-3 text-sm text-red-600\">\n {networkError}\n </div>\n )}\n </div>\n );\n}\n\nexport default function CreditCardFormDialog({\n isOpen,\n onClose,\n onSubmit,\n isSubmitting,\n countries = [],\n error,\n jwt,\n client,\n renderAddressAutocomplete,\n t,\n}: CreditCardFormDialogProps): JSX.Element {\n const [cardError, setCardError] = useState<string | undefined>(undefined);\n const [isVgsSubmitting, setIsVgsSubmitting] = useState(false);\n\n const {\n isFormReady,\n isLoading: isVgsLoading,\n isScriptLoaded,\n initializeForm,\n submitCard,\n vgsFieldState,\n resetVgs,\n onSuccessRef,\n onErrorRef,\n } = useVgsCollect();\n\n const { control, handleSubmit, reset, setValue } =\n 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 || !jwt) return;\n\n let cancelled = false;\n\n const init = async () => {\n try {\n const credentials =\n await vaultApi.fetchVaultCredentialsForPaymentAccount(client, jwt);\n if (!cancelled) {\n await initializeForm(credentials);\n }\n } catch (err) {\n console.error(\"Failed to fetch vault credentials:\", err);\n if (!cancelled) {\n setCardError(\"Failed to initialize payment form\");\n }\n }\n };\n\n init();\n\n return () => {\n cancelled = true;\n };\n }, [isOpen, isScriptLoaded, jwt, client, initializeForm]);\n\n // Wire up VGS callbacks\n const handleVgsSuccess = useCallback(\n (response: fluidPay.VgsCollectSubmitResponse) => {\n const expValue = response?.card_exp;\n if (!expValue) {\n setCardError(\"Missing expiration date from payment form\");\n setIsVgsSubmitting(false);\n return;\n }\n\n const cleanExp = expValue.replace(/\\s+/g, \"\");\n const [expMonth, expYearShort] = cleanExp.split(\"/\");\n\n if (!expMonth || !expYearShort) {\n setCardError(\"Invalid expiration date format\");\n setIsVgsSubmitting(false);\n return;\n }\n\n const expYear =\n expYearShort.length === 2 ? `20${expYearShort}` : expYearShort;\n\n const cardholderName = response?.card_holder?.trim();\n if (!cardholderName) {\n setCardError(\"Cardholder name is required\");\n setIsVgsSubmitting(false);\n return;\n }\n\n // Read the current form values synchronously via handleSubmit\n handleSubmit((formData) => {\n const creditCardData: fluidPay.AddCreditCardData = {\n type: \"credit_card\",\n country_code: formData.country_code,\n default_payment_method: formData.set_as_default,\n payment_method: {\n token: response.card_number,\n cvv_token: response.card_cvc,\n exp_month: expMonth,\n exp_year: expYear,\n card_holder: cardholderName,\n billing_zip: formData.zip,\n },\n billing_address: {\n name: formData.name,\n address1: formData.address1,\n address2: formData.address2 ?? undefined,\n city: formData.city,\n state: formData.state,\n zip: formData.zip,\n country_code: formData.country_code,\n },\n };\n\n onSubmit(creditCardData);\n setIsVgsSubmitting(false);\n })();\n },\n [handleSubmit, onSubmit],\n );\n\n const handleVgsError = useCallback((err: string) => {\n setCardError(err);\n setIsVgsSubmitting(false);\n }, []);\n\n useEffect(() => {\n onSuccessRef.current = handleVgsSuccess;\n onErrorRef.current = handleVgsError;\n }, [handleVgsSuccess, handleVgsError, onSuccessRef, onErrorRef]);\n\n const handleClose = () => {\n resetVgs();\n reset();\n setCardError(undefined);\n setIsVgsSubmitting(false);\n onClose();\n };\n\n const handleFormSubmit = handleSubmit(() => {\n setIsVgsSubmitting(true);\n setCardError(undefined);\n submitCard();\n });\n\n const isBusy = isSubmitting || isVgsSubmitting;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-md overflow-y-auto rounded p-0 md:max-w-xl\">\n <div className=\"relative p-6\">\n {(isVgsLoading || !isFormReady) && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center rounded bg-white/80 backdrop-blur-[1px]\">\n <div className=\"flex items-center justify-center\">\n <div className=\"mr-3 h-5 w-5 animate-spin rounded-full border-2 border-t-2 border-blue-600 border-t-transparent\" />\n <p className=\"text-sm font-medium text-gray-600\">\n {t(\"securing\")}\n </p>\n </div>\n </div>\n )}\n <DialogHeader>\n <DialogTitle className=\"text-lg font-medium\">\n {t(\"add_credit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4 pt-6\">\n <VgsCardForm\n isLoading={isVgsLoading}\n isFormReady={isFormReady}\n vgsFieldState={vgsFieldState}\n networkError={cardError ?? error}\n t={t}\n />\n\n <div className=\"space-y-3 pt-2\">\n <h3 className=\"text-sm font-medium text-gray-500\">\n {t(\"billing_address\")}\n </h3>\n <FormSelectField\n control={control}\n name=\"country_code\"\n placeholder={t(\"country\")}\n options={countrySelectOptions}\n disabled={isBusy}\n />\n <FormTextField\n control={control}\n name=\"name\"\n placeholder={t(\"name\")}\n disabled={isBusy}\n />\n {renderAddressAutocomplete ? (\n renderAddressAutocomplete({\n control,\n setValue,\n countryCode: billingCountry,\n })\n ) : (\n <FormTextField\n control={control}\n name=\"address1\"\n placeholder={t(\"address_line_1\")}\n disabled={isBusy}\n />\n )}\n <FormTextField\n control={control}\n name=\"address2\"\n placeholder={t(\"address_line_2\")}\n disabled={isBusy}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"city\"\n placeholder={t(\"city\")}\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n <FormSelectField\n control={control}\n name=\"state\"\n placeholder={\n config?.regionLabel\n ? t(config.regionLabel)\n : t(\"select_state\")\n }\n options={stateSelectOptions}\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n <FormTextField\n control={control}\n name=\"zip\"\n placeholder={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n </div>\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default_cc\"\n checked={setAsDefault}\n onChange={() => setValue(\"set_as_default\", !setAsDefault)}\n disabled={isBusy}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default_cc\" className=\"text-sm\">\n {t(\"set_as_default_payment_method\")}\n </label>\n </div>\n\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isBusy}\n className=\"rounded bg-gray-900 px-5 py-2.5 text-white hover:bg-gray-800\"\n >\n {isBusy ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save_card\")\n )}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo } from \"react\";\nimport { useController } from \"react-hook-form\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { ProfileUIProvider } from \"@fluid-app/profile-core\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n Profile,\n AddressFormDialog,\n CreditCardFormDialog,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n BillingAddressAutocompleteRenderProps,\n} from \"@fluid-app/profile-ui\";\nimport {\n customersApi,\n addressesApi,\n paymentMethodsApi,\n} from \"@fluid-app/fluid-pay-api-client\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useFluidAuth } from \"../hooks/use-fluid-auth\";\nimport {\n useFluidPayClient,\n useSdkClient,\n API_VERSION,\n} from \"../account/use-account-clients\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nconst translations: Record<string, string> = {\n edit_profile: \"Edit Profile\",\n first_name: \"First Name\",\n last_name: \"Last Name\",\n phone_number: \"Phone Number\",\n language: \"Language\",\n first_name_is_required: \"First name is required\",\n last_name_is_required: \"Last name is required\",\n language_is_required: \"Language is required\",\n saving: \"Saving...\",\n save_changes: \"Save Changes\",\n select_an_option: \"Select an option\",\n points_history: \"Points History\",\n points_available: \"Points Available\",\n points_awarded: \"Points Awarded\",\n points_redeemed: \"Points Redeemed\",\n transaction: \"Transaction\",\n no_points_history_found: \"No points history found\",\n shipping_addresses: \"Shipping Addresses\",\n add_an_address: \"Add an Address\",\n delete_address: \"Delete Address\",\n delete_address_message:\n \"Are you sure you want to delete this address? This action cannot be undone.\",\n delete: \"Delete\",\n add_address: \"Add Address\",\n edit_address: \"Edit Address\",\n set_as_default_address: \"Set as default address\",\n save_address: \"Save Address\",\n card_number: \"Card Number\",\n expiration_date: \"Expiration (MM / YY)\",\n cvc: \"CVC\",\n cardholder_name: \"Cardholder Name\",\n add_credit_card: \"Add Credit Card\",\n save_card: \"Save Card\",\n securing: \"Loading secure form...\",\n payment_methods: \"Payment Methods\",\n add_payment_method: \"Add Payment Method\",\n delete_credit_card: \"Delete Credit Card\",\n delete_credit_card_message:\n \"Are you sure you want to delete this payment method? This action cannot be undone.\",\n edit_card: \"Card Details\",\n billing_address: \"Billing Address\",\n country: \"Country\",\n name: \"Name\",\n address_line_1: \"Address Line 1\",\n address_line_2: \"Address Line 2\",\n city: \"City\",\n state: \"State\",\n province: \"Province\",\n zip_code: \"Zip Code\",\n postal_code: \"Postal Code\",\n select_state: \"Select state\",\n set_as_default_payment_method: \"Set as default payment method\",\n cancel: \"Cancel\",\n save: \"Save\",\n close: \"Close\",\n edit: \"Edit\",\n default: \"Default\",\n card_expires: \"Expires\",\n no_billing_address: \"No billing address on file\",\n default_payment_method_updated: \"Payment method updated\",\n failed_to_set_default_payment_method: \"Failed to update payment method\",\n};\n\nfunction t(key: string): string {\n if (translations[key]) return translations[key];\n return key\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\ninterface RawPointsLedgerEntry {\n id: number;\n amount: number;\n customer_id: number;\n created_at: string;\n metadata?: {\n transaction_type?: string | null;\n source?: {\n name: string;\n email?: string;\n reason?: string;\n user_id?: number;\n } | null;\n } | null;\n total_balance?: number;\n}\n\nfunction adaptPointsLedger(entry: RawPointsLedgerEntry): PointsLedger {\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: entry.customer_id,\n metadata: {\n transaction_type: entry.metadata?.transaction_type ?? undefined,\n source: entry.metadata?.source ?? undefined,\n },\n total_balance: entry.total_balance ?? 0,\n updated_at: entry.created_at,\n };\n}\n\nexport function ProfileContentScreen({\n onToast,\n countryIso,\n}: ProfileContentScreenProps): React.JSX.Element {\n const { token, user } = useFluidAuth();\n const client = useFluidPayClient();\n const sdkClient = useSdkClient();\n const queryClient = useQueryClient();\n const jwt = token ?? \"\";\n const userId = user?.id;\n\n // -- Data fetching --\n\n const {\n data: accountData,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useQuery({\n queryKey: [\"fluidPayAccount\", userId],\n queryFn: () => customersApi.fetchCustomerAccount(client, jwt),\n enabled: !!jwt,\n });\n\n const { data: addressesData, isLoading: isLoadingAddresses } = useQuery({\n queryKey: [\"fluidPayAddresses\", userId],\n queryFn: () => addressesApi.fetchCustomerAddresses(client, jwt),\n enabled: !!jwt,\n });\n\n const { data: paymentMethodsData, isLoading: isLoadingPaymentMethods } =\n useQuery({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n queryFn: () =>\n paymentMethodsApi.fetchCustomerPaymentMethods(client, jwt, countryIso),\n enabled: !!jwt,\n });\n\n const { data: countriesData } = useQuery({\n queryKey: [\"sdk-countries\"],\n queryFn: () =>\n sdkClient.get<Array<{ iso: string; name: string }>>(\"/countries\"),\n initialData: [],\n });\n\n const customerId = accountData?.customer?.id;\n\n const { data: pointsLedgerData, isLoading: isLoadingPointsLedger } = useQuery(\n {\n queryKey: [\"customer-points-ledger\", customerId],\n queryFn: () =>\n sdkClient.get<{ points_ledgers: RawPointsLedgerEntry[] }>(\n `${API_VERSION}/customers/${customerId}/points_ledgers`,\n ),\n enabled: !!customerId,\n },\n );\n\n // -- Mutations --\n\n const updateCustomerMutation = useMutation({\n mutationFn: (data: UserFormData) => {\n const languageIso =\n adaptedLanguages?.find((l) => l.name === data.language)?.iso ?? \"en\";\n return customersApi.updateCustomer(client, jwt, {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n language_iso: languageIso,\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAccount\", userId],\n });\n onToast(\"Profile updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update profile\", \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) =>\n addressesApi.deleteCustomerAddress(client, jwt, addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n paymentMethodsApi.deleteCustomerPaymentMethod(\n client,\n jwt,\n paymentMethodId,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n paymentMethodsApi.updatePaymentMethod(client, jwt, paymentMethodId, {\n set_as_default: data.set_as_default,\n billing_address: data.billing_address,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n },\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) =>\n addressesApi.createCustomerAddress(client, jwt, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\n onToast(\"Address created\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to create address\", \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) => addressesApi.updateCustomerAddress(client, jwt, addressId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\n onToast(\"Address updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update address\", \"error\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: fluidPay.AddCreditCardData) =>\n paymentMethodsApi.addCreditCardToCustomer(client, jwt, data),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n onToast(\"Payment method added\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to add payment method\", \"error\");\n },\n });\n\n // -- Derived data --\n\n const addresses = addressesData?.addresses ?? [];\n const paymentMethods = paymentMethodsData?.payment_methods ?? [];\n\n const adaptedPointsLedger: PointsLedger[] =\n pointsLedgerData?.points_ledgers?.map(adaptPointsLedger) ?? [];\n\n // MVP: Only English is supported. When the API exposes a languages endpoint, fetch dynamically.\n const adaptedLanguages: Language[] = [{ id: 0, name: \"English\", iso: \"en\" }];\n\n const countryOptions = useMemo(\n () =>\n [...countriesData]\n .map((c) => ({ iso: c.iso, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n\n // -- Loading state --\n\n if (!token) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"rounded-lg border p-4 text-center\">Login Required</div>\n </div>\n );\n }\n\n if (isAccountError && !isLoadingAccount) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"text-muted-foreground text-center text-sm\">\n Unable to load account data. Please try again later.\n </div>\n </div>\n );\n }\n\n if (isLoadingAccount || !accountData) {\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-16 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <ProfileUIProvider t={t}>\n <Profile\n customerAccount={accountData}\n languages={adaptedLanguages}\n onUpdateCustomer={async (data) => {\n await updateCustomerMutation.mutateAsync(data);\n }}\n isUpdatingCustomer={updateCustomerMutation.isPending}\n // MVP: matches admin behavior; a merchant-level flag would be better\n rewardsPointsEnabled={adaptedPointsLedger.length > 0}\n pointsLedger={adaptedPointsLedger}\n isLoadingPointsLedger={isLoadingPointsLedger}\n addresses={addresses}\n isLoadingAddresses={isLoadingAddresses}\n onDeleteAddress={async (addressId) => {\n await deleteAddressMutation.mutateAsync(addressId);\n }}\n isDeletingAddress={deleteAddressMutation.isPending}\n paymentMethods={paymentMethods}\n isLoadingPaymentMethods={isLoadingPaymentMethods}\n onDeletePaymentMethod={async (paymentMethodId) => {\n await deletePaymentMethodMutation.mutateAsync(paymentMethodId);\n }}\n isDeletingPaymentMethod={deletePaymentMethodMutation.isPending}\n onUpdatePaymentMethod={async (paymentMethodId, data) => {\n await updatePaymentMethodMutation.mutateAsync({\n paymentMethodId,\n data,\n });\n }}\n isUpdatingPaymentMethod={updatePaymentMethodMutation.isPending}\n getBillingAddress={(pm) => pm.billing_address ?? null}\n countries={countryOptions}\n renderAddressDialog={({ isOpen, onClose, selectedAddress }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={selectedAddress}\n t={t}\n onSubmit={async (formData) => {\n if (selectedAddress) {\n await updateAddressMutation.mutateAsync({\n addressId: selectedAddress.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n onClose();\n }}\n isSubmitting={\n createAddressMutation.isPending ||\n updateAddressMutation.isPending\n }\n countries={countryOptions}\n renderAddressAutocomplete={({\n control,\n setValue: _setValue,\n }: {\n control: Parameters<\n NonNullable<\n Parameters<\n typeof AddressFormDialog\n >[0][\"renderAddressAutocomplete\"]\n >\n >[0][\"control\"];\n setValue: Parameters<\n NonNullable<\n Parameters<\n typeof AddressFormDialog\n >[0][\"renderAddressAutocomplete\"]\n >\n >[0][\"setValue\"];\n }) => <PlainAddressInput control={control} name=\"address1\" />}\n />\n )}\n renderCreditCardDialog={({ isOpen, onClose }) => (\n <CreditCardFormDialog\n isOpen={isOpen}\n onClose={onClose}\n t={t}\n onSubmit={async (data) => {\n await addCreditCardMutation.mutateAsync(data);\n onClose();\n }}\n isSubmitting={addCreditCardMutation.isPending}\n countries={countryOptions}\n jwt={jwt}\n client={client}\n renderAddressAutocomplete={({\n control,\n setValue: _setValue,\n }: BillingAddressAutocompleteRenderProps) => (\n <PlainAddressInput control={control} name=\"address1\" />\n )}\n />\n )}\n />\n </ProfileUIProvider>\n </div>\n );\n}\n\n/**\n * Plain text input fallback for address autocomplete.\n * The SDK doesn't have Google Places integration.\n */\nfunction PlainAddressInput({\n control,\n name,\n}: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n control: any;\n name: string;\n}): React.JSX.Element {\n const { field } = useController({ control, name: name as string });\n return (\n <input\n type=\"text\"\n value={(field.value as string) ?? \"\"}\n placeholder=\"Address Line 1\"\n className=\"border-input bg-background ring-offset-background placeholder:text-muted-foreground focus-visible:ring-ring flex h-10 w-full rounded-md border px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\"\n onChange={field.onChange}\n />\n );\n}\n","import { type ComponentProps, useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n if (type === \"error\" || type === \"warning\") {\n console.warn(\"[Profile]\", message);\n } else {\n console.info(\"[Profile]\", message);\n }\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Profile</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div {...divProps}>\n <ProfileContentScreen onToast={effectiveToast} countryIso={countryIso} />\n </div>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProfileScreen-B6YgnBLf.mjs","names":["FormTextField","FormSelectField","FormTextField","FormSelectField","FormSelectField","FormTextField","vaultApi.fetchVaultCredentialsForPaymentAccount","customersApi.fetchCustomerAccount","addressesApi.fetchCustomerAddresses","paymentMethodsApi.fetchCustomerPaymentMethods","customersApi.updateCustomer","addressesApi.deleteCustomerAddress","paymentMethodsApi.deleteCustomerPaymentMethod","paymentMethodsApi.updatePaymentMethod","addressesApi.createCustomerAddress","addressesApi.updateCustomerAddress","paymentMethodsApi.addCreditCardToCustomer"],"sources":["../../../fluid-pay/api-client/src/namespaces/addresses.ts","../../../fluid-pay/api-client/src/namespaces/payment-methods.ts","../../../fluid-pay/api-client/src/namespaces/vault.ts","../../../profile/core/src/context.ts","../../../profile/core/src/provider.tsx","../../../fluid-pay/core/src/utils/country-config.ts","../../../fluid-pay/core/src/hooks/use-country-states.ts","../../../profile/ui/src/components/ellipses-dropdown.tsx","../../../profile/ui/src/components/confirm-action-dialog.tsx","../../../profile/ui/src/components/customer-points-ledger.tsx","../../../profile/ui/src/components/form-fields.tsx","../../../profile/ui/src/components/user-info-dialog.tsx","../../../profile/ui/src/components/customer-info.tsx","../../../profile/ui/src/components/address-dropdown.tsx","../../../profile/ui/src/components/addresses.tsx","../../../profile/ui/src/components/payment-method-dropdown.tsx","../../../profile/ui/src/components/view-payment-method-dialog.tsx","../../../profile/ui/src/components/edit-payment-method-dialog.tsx","../../../profile/ui/src/components/payment-methods.tsx","../../../profile/ui/src/components/profile.tsx","../../../fluid-pay/ui/src/components/form-fields/FormTextField.tsx","../../../fluid-pay/ui/src/components/form-fields/FormSelectField.tsx","../../../fluid-pay/ui/src/components/AddressFormDialog.tsx","../../../fluid-pay/ui/src/hooks/use-vgs-collect.ts","../../../fluid-pay/ui/src/components/CreditCardFormDialog.tsx","../src/screens/ProfileContentScreen.tsx","../src/screens/ProfileScreen.tsx"],"sourcesContent":["import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch all customer addresses.\n * Endpoint: GET /fluid_pay/addresses?jwt={jwt}\n */\nexport async function fetchCustomerAddresses(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.CustomerAddressResponse> {\n return client.get(\"/fluid_pay/addresses\", {\n jwt,\n page: \"1\",\n per_page: \"100\",\n });\n}\n\n/**\n * Create a new customer address.\n * Endpoint: POST /fluid_pay/create_address?jwt={jwt}\n */\nexport async function createCustomerAddress(\n client: FetchClient,\n jwt: string,\n body: fluidPay.CreateAddressBody,\n): Promise<fluidPay.CreateCustomerAddressResponse> {\n return client.post(`/fluid_pay/create_address?jwt=${jwt}`, body);\n}\n\n/**\n * Update an existing customer address.\n * Endpoint: PATCH /fluid_pay/update_address/{addressId}?jwt={jwt}\n */\nexport async function updateCustomerAddress(\n client: FetchClient,\n jwt: string,\n addressId: number,\n body: fluidPay.CreateAddressBody,\n): Promise<fluidPay.CreateCustomerAddressResponse> {\n return client.patch(\n `/fluid_pay/update_address/${addressId}?jwt=${jwt}`,\n body,\n );\n}\n\n/**\n * Delete a customer address.\n * Endpoint: DELETE /fluid_pay/delete_address/{addressId}?jwt={jwt}\n */\nexport async function deleteCustomerAddress(\n client: FetchClient,\n jwt: string,\n addressId: number,\n): Promise<Record<string, never>> {\n return client.delete(`/fluid_pay/delete_address/${addressId}?jwt=${jwt}`);\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch all customer payment methods.\n * Endpoint: GET /fluid_pay/payment_methods?jwt={jwt}\n */\nexport async function fetchCustomerPaymentMethods(\n client: FetchClient,\n jwt: string,\n countryCode?: string,\n): Promise<fluidPay.CustomerPaymentMethodsResponse> {\n const params: Record<string, string> = {\n jwt,\n page: \"1\",\n per_page: \"100\",\n };\n if (countryCode) params.country_code = countryCode;\n\n return client.get(\"/fluid_pay/payment_methods\", params);\n}\n\n/**\n * Add a credit card to the customer's account.\n * Endpoint: POST /fluid_pay/create_payment_method?jwt={jwt}\n */\nexport async function addCreditCardToCustomer(\n client: FetchClient,\n jwt: string,\n data: fluidPay.AddCreditCardData,\n): Promise<fluidPay.CreateCustomerPaymentMethodResponse> {\n return client.post(`/fluid_pay/create_payment_method?jwt=${jwt}`, data);\n}\n\n/**\n * Delete a customer payment method.\n * Endpoint: DELETE /fluid_pay/delete_payment_method/{id}?jwt={jwt}\n */\nexport async function deleteCustomerPaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n): Promise<unknown> {\n return client.delete(\n `/fluid_pay/delete_payment_method/${paymentMethodId}?jwt=${jwt}`,\n );\n}\n\n/**\n * Set a payment method as default.\n * Endpoint: PATCH /fluid_pay/update_payment_method/{id}?jwt={jwt}\n */\nexport async function updateDefaultPaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n): Promise<fluidPay.UpdateDefaultPaymentMethodResponse> {\n return client.patch(\n `/fluid_pay/update_payment_method/${paymentMethodId}?jwt=${jwt}`,\n );\n}\n\n/**\n * Update a payment method (default status, billing address).\n * Endpoint: PATCH /fluid_pay/update_payment_method/{id}?jwt={jwt}\n */\nexport async function updatePaymentMethod(\n client: FetchClient,\n jwt: string,\n paymentMethodId: number,\n body?: fluidPay.UpdatePaymentMethodInput,\n): Promise<fluidPay.UpdatePaymentMethodResponse> {\n return client.patch(\n `/fluid_pay/update_payment_method/${paymentMethodId}?jwt=${jwt}`,\n body,\n );\n}\n","import type { FetchClient } from \"../lib/fetch-client\";\nimport type { fluidPay } from \"../custom/fluid-pay\";\n\n/**\n * Fetch VGS vault credentials for the customer's payment account.\n * Endpoint: GET /fluid_pay/vault?jwt={jwt}\n */\nexport async function fetchVaultCredentialsForPaymentAccount(\n client: FetchClient,\n jwt: string,\n): Promise<fluidPay.VaultResponse> {\n return client.get(\"/fluid_pay/vault\", { jwt });\n}\n","import { createContext, useContext } from \"react\";\n\nexport type TranslationFn = (key: string) => string;\n\nexport interface ProfileUIContextValue {\n t: TranslationFn;\n}\n\nexport const ProfileUIContext = createContext<ProfileUIContextValue | null>(\n null,\n);\n\nexport function useProfileUI(): ProfileUIContextValue {\n const context = useContext(ProfileUIContext);\n if (!context) {\n throw new Error(\"useProfileUI must be used within a ProfileUIProvider\");\n }\n return context;\n}\n","import type { JSX, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { ProfileUIContext, type TranslationFn } from \"./context\";\n\nexport interface ProfileUIProviderProps {\n t: TranslationFn;\n children: ReactNode;\n}\n\nexport function ProfileUIProvider({\n t,\n children,\n}: ProfileUIProviderProps): JSX.Element {\n const value = useMemo(() => ({ t }), [t]);\n return (\n <ProfileUIContext.Provider value={value}>\n {children}\n </ProfileUIContext.Provider>\n );\n}\n","export interface State {\n name: string;\n isoCode: string;\n}\n\nexport interface RegionConfig {\n regionLabel: string;\n postalLabel: string;\n}\n\nexport const US_STATES: State[] = [\n { name: \"Alabama\", isoCode: \"AL\" },\n { name: \"Alaska\", isoCode: \"AK\" },\n { name: \"Arizona\", isoCode: \"AZ\" },\n { name: \"Arkansas\", isoCode: \"AR\" },\n { name: \"California\", isoCode: \"CA\" },\n { name: \"Colorado\", isoCode: \"CO\" },\n { name: \"Connecticut\", isoCode: \"CT\" },\n { name: \"Delaware\", isoCode: \"DE\" },\n { name: \"Florida\", isoCode: \"FL\" },\n { name: \"Georgia\", isoCode: \"GA\" },\n { name: \"Hawaii\", isoCode: \"HI\" },\n { name: \"Idaho\", isoCode: \"ID\" },\n { name: \"Illinois\", isoCode: \"IL\" },\n { name: \"Indiana\", isoCode: \"IN\" },\n { name: \"Iowa\", isoCode: \"IA\" },\n { name: \"Kansas\", isoCode: \"KS\" },\n { name: \"Kentucky\", isoCode: \"KY\" },\n { name: \"Louisiana\", isoCode: \"LA\" },\n { name: \"Maine\", isoCode: \"ME\" },\n { name: \"Maryland\", isoCode: \"MD\" },\n { name: \"Massachusetts\", isoCode: \"MA\" },\n { name: \"Michigan\", isoCode: \"MI\" },\n { name: \"Minnesota\", isoCode: \"MN\" },\n { name: \"Mississippi\", isoCode: \"MS\" },\n { name: \"Missouri\", isoCode: \"MO\" },\n { name: \"Montana\", isoCode: \"MT\" },\n { name: \"Nebraska\", isoCode: \"NE\" },\n { name: \"Nevada\", isoCode: \"NV\" },\n { name: \"New Hampshire\", isoCode: \"NH\" },\n { name: \"New Jersey\", isoCode: \"NJ\" },\n { name: \"New Mexico\", isoCode: \"NM\" },\n { name: \"New York\", isoCode: \"NY\" },\n { name: \"North Carolina\", isoCode: \"NC\" },\n { name: \"North Dakota\", isoCode: \"ND\" },\n { name: \"Ohio\", isoCode: \"OH\" },\n { name: \"Oklahoma\", isoCode: \"OK\" },\n { name: \"Oregon\", isoCode: \"OR\" },\n { name: \"Pennsylvania\", isoCode: \"PA\" },\n { name: \"Rhode Island\", isoCode: \"RI\" },\n { name: \"South Carolina\", isoCode: \"SC\" },\n { name: \"South Dakota\", isoCode: \"SD\" },\n { name: \"Tennessee\", isoCode: \"TN\" },\n { name: \"Texas\", isoCode: \"TX\" },\n { name: \"Utah\", isoCode: \"UT\" },\n { name: \"Vermont\", isoCode: \"VT\" },\n { name: \"Virginia\", isoCode: \"VA\" },\n { name: \"Washington\", isoCode: \"WA\" },\n { name: \"West Virginia\", isoCode: \"WV\" },\n { name: \"Wisconsin\", isoCode: \"WI\" },\n { name: \"Wyoming\", isoCode: \"WY\" },\n { name: \"District of Columbia\", isoCode: \"DC\" },\n];\n\nexport const COUNTRY_CONFIGS: Record<string, RegionConfig> = {\n US: { regionLabel: \"State\", postalLabel: \"ZIP Code\" },\n JP: { regionLabel: \"Prefecture\", postalLabel: \"Postal Code\" },\n};\n\nconst DEFAULT_REGION_CONFIG: RegionConfig = {\n regionLabel: \"Province\",\n postalLabel: \"Postal Code\",\n};\n\nexport function getRegionConfig(countryCode: string): RegionConfig {\n return COUNTRY_CONFIGS[countryCode] ?? DEFAULT_REGION_CONFIG;\n}\n\nexport const DEFAULT_ADDRESS_FIELDS = [\n { field: \"first_name\", label: \"First Name\", required: true },\n { field: \"last_name\", label: \"Last Name\", required: true },\n { field: \"address1\", label: \"Address\", required: true },\n { field: \"address2\", label: \"Apartment, suite, etc.\", required: false },\n { field: \"city\", label: \"City\", required: true },\n { field: \"state\", label: \"State\", required: true },\n { field: \"postal_code\", label: \"Postal Code\", required: true },\n { field: \"country_code\", label: \"Country\", required: true },\n];\n","import { useCallback, useState } from \"react\";\nimport {\n US_STATES,\n getRegionConfig,\n type State,\n} from \"../utils/country-config\";\n\nexport default function useCountryStates() {\n const [selectedCountry, setSelectedCountry] = useState<string>(\"US\");\n const [stateOptions, setStateOptions] = useState<State[]>(US_STATES);\n\n const handleCountryChange = useCallback(\n (\n selectedCountryCode: string,\n fetchStates?: (countryCode: string) => Promise<State[]>,\n ) => {\n setSelectedCountry(selectedCountryCode);\n if (selectedCountryCode === \"US\") {\n setStateOptions(US_STATES);\n } else if (fetchStates) {\n fetchStates(selectedCountryCode)\n .then((states) => setStateOptions(states))\n .catch((error) => {\n console.error(\"Failed to fetch states:\", error);\n setStateOptions([]);\n });\n } else {\n setStateOptions([]);\n }\n },\n [],\n );\n\n const config = getRegionConfig(selectedCountry);\n\n return { handleCountryChange, stateOptions, config, selectedCountry };\n}\n","import type { JSX } from \"react\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Button,\n} from \"@fluid-app/ui-primitives\";\n\nexport default function EllipsesDropdown({\n onDelete,\n onEdit,\n editLabel = \"Edit\",\n deleteLabel = \"Delete\",\n disabled = false,\n}: {\n onDelete?: () => void;\n onEdit?: () => void;\n editLabel?: string;\n deleteLabel?: string;\n disabled?: boolean;\n}): JSX.Element {\n if (disabled) {\n return (\n <Button\n variant=\"ghost\"\n disabled\n className=\"cursor-not-allowed opacity-50\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 128 512\"\n className=\"h-4 w-1 fill-gray-400\"\n >\n <path d=\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\" />\n </svg>\n </Button>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 128 512\"\n className=\"h-4 w-1 fill-gray-400\"\n >\n <path d=\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\" />\n </svg>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"min-w-20 space-y-1 text-sm text-gray-900\">\n {onEdit && (\n <>\n <DropdownMenuItem\n className=\"flex cursor-pointer flex-row items-center justify-between space-x-2 rounded px-2 hover:bg-gray-50\"\n onClick={(e) => {\n e.stopPropagation();\n onEdit();\n }}\n >\n <span>{editLabel}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n className=\"h-2.5 w-2.5 fill-current\"\n >\n <path d=\"M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z\" />\n </svg>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n className=\"flex cursor-pointer flex-row items-center justify-between space-x-2 rounded px-2 text-red-500 hover:bg-red-50\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete?.();\n }}\n >\n <span>{deleteLabel}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 448 512\"\n className=\"h-2.5 w-2.5 fill-red-500\"\n >\n <path d=\"M135.2 17.7C140.6 6.8 151.7 0 163.8 0L284.2 0c12.1 0 23.2 6.8 28.6 17.7L320 32l80 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L48 96C30.3 96 16 81.7 16 64S30.3 32 48 32l80 0 7.2-14.3zM32 128l384 0 0 320c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-320z\" />\n </svg>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import type { JSX } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\ntype ConfirmActionDialogProps = {\n title: string;\n description: string;\n onAction: () => void;\n openDialog: boolean;\n setOpenDialog: (open: boolean) => void;\n errorMsg?: string;\n isLoading?: boolean;\n actionText?: string;\n};\n\nexport default function ConfirmActionDialog({\n title,\n description,\n onAction,\n openDialog,\n setOpenDialog,\n errorMsg,\n isLoading,\n actionText = \"Delete\",\n}: ConfirmActionDialogProps): JSX.Element {\n const { t } = useProfileUI();\n\n return (\n <Dialog open={openDialog} onOpenChange={setOpenDialog}>\n <DialogContent className=\"max-w-sm rounded md:w-90\">\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {title}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p className=\"text-left text-sm text-gray-500\">{description}</p>\n </div>\n\n {errorMsg && <p className=\"text-sm text-red-500\">{errorMsg}</p>}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between space-x-2\">\n <DialogClose asChild>\n <Button\n className=\"min-w-[70px] rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={() => setOpenDialog(false)}\n >\n {t(\"cancel\")}\n </Button>\n </DialogClose>\n <Button\n type=\"button\"\n className=\"min-w-[70px] rounded bg-red-600 p-3 text-white hover:bg-red-700\"\n onClick={onAction}\n disabled={isLoading}\n >\n {isLoading ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n actionText\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport {\n useProfileUI,\n type TranslationFn,\n type PointsLedger,\n} from \"@fluid-app/profile-core\";\n\nfunction formatTransactionType(ledger: PointsLedger, t: TranslationFn): string {\n const transactionType = ledger.metadata.transaction_type;\n\n if (!transactionType) {\n if (ledger.metadata.source) {\n return ledger.amount > 0 ? t(\"points_awarded\") : t(\"points_redeemed\");\n }\n return t(\"transaction\");\n }\n\n const translationKey = transactionType.toLowerCase().replace(/ /g, \"_\");\n const translated = t(translationKey);\n\n if (translated !== translationKey) {\n return translated;\n }\n\n return transactionType\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction formatPoints(amount: number): string {\n const prefix = amount >= 0 ? \"+\" : \"\";\n return `${prefix}${amount}`;\n}\n\nfunction formatDateTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nexport interface CustomerPointsLedgerProps {\n pointsLedger: PointsLedger[];\n isLoading?: boolean;\n}\n\nexport default function CustomerPointsLedger({\n pointsLedger,\n isLoading = false,\n}: CustomerPointsLedgerProps): JSX.Element {\n const [accordionValue, setAccordionValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n const availablePoints = pointsLedger[0]?.total_balance ?? 0;\n\n return (\n <div className=\"mb-6 border-b border-gray-300 pb-4\">\n <Accordion\n type=\"single\"\n collapsible\n value={accordionValue}\n onValueChange={setAccordionValue}\n className=\"w-full\"\n >\n <AccordionItem value=\"points-history\" className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">\n {t(\"points_history\")}\n </div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {isLoading && <Skeleton className=\"h-6 w-full\" />}\n\n {!isLoading && !accordionValue && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setAccordionValue(\"points-history\")}\n >\n <div className=\"text-sm font-semibold text-gray-900\">\n {availablePoints.toLocaleString()}{\" \"}\n <span className=\"font-normal text-gray-500\">\n {t(\"points_available\").toLowerCase()}\n </span>\n </div>\n </div>\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mb-3 flex w-full flex-col\">\n <div className=\"text-sm font-semibold text-gray-900\">\n {availablePoints.toLocaleString()}{\" \"}\n <span className=\"font-normal text-gray-500\">\n {t(\"points_available\").toLowerCase()}\n </span>\n </div>\n </div>\n\n <div className=\"flex flex-col space-y-0\">\n {pointsLedger.length > 0 ? (\n pointsLedger.map((ledger) => (\n <div\n key={ledger.id}\n className=\"relative flex flex-row items-start justify-between py-3\"\n >\n <div className=\"absolute top-3 left-0\">\n <div className=\"mt-1.5 h-2 w-2 flex-shrink-0 rounded-full border border-gray-300\" />\n <div className=\"mr-1 h-10 border-r border-gray-200\" />\n </div>\n <div className=\"ml-6 flex flex-row items-start space-x-3\">\n <div className=\"flex flex-col\">\n <div className=\"text-sm font-medium text-gray-900\">\n {formatTransactionType(ledger, t)}\n </div>\n <div className=\"text-sm text-gray-500\">\n {formatDateTime(ledger.created_at)}\n </div>\n </div>\n </div>\n <div\n className={cn(\n \"text-sm font-medium\",\n ledger.amount >= 0 ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {formatPoints(ledger.amount)}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-sm text-gray-500\">\n {t(\"no_points_history_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n </div>\n );\n}\n","import {\n useController,\n type Control,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\";\nimport {\n Input,\n Label,\n Select,\n SelectTrigger,\n SelectContent,\n SelectItem,\n SelectValue,\n cn,\n} from \"@fluid-app/ui-primitives\";\n\nexport type NameValue = { name: string; value: string | number };\n\nexport function FormTextField<T extends FieldValues>({\n control,\n name,\n label,\n containerClassName,\n ...props\n}: {\n control: Control<T>;\n name: FieldPath<T>;\n label?: string;\n containerClassName?: string;\n} & Omit<React.ComponentProps<\"input\">, \"name\">) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n {label && (\n <Label\n htmlFor={name}\n className=\"mb-1.5 block text-sm font-medium text-gray-700\"\n >\n {label}\n </Label>\n )}\n <Input\n {...field}\n {...props}\n id={name}\n value={field.value ?? \"\"}\n className={cn(error && \"ring-1 ring-red-500\", props.className)}\n />\n {error && <p className=\"text-sm text-red-500\">{error.message}</p>}\n </div>\n );\n}\n\nexport function FormSelectField<T extends FieldValues>({\n control,\n name,\n label,\n options,\n placeholder,\n containerClassName,\n onChange,\n}: {\n control: Control<T>;\n name: FieldPath<T>;\n label?: string;\n options?: NameValue[];\n placeholder?: string;\n containerClassName?: string;\n onChange?: (value: string) => void;\n}) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n {label && (\n <Label\n htmlFor={name}\n className=\"block text-sm font-medium text-gray-700\"\n >\n {label}\n </Label>\n )}\n <Select\n value={field.value?.toString() ?? \"\"}\n onValueChange={(val) => {\n field.onChange(val);\n onChange?.(val);\n }}\n >\n <SelectTrigger className={cn(error && \"ring-1 ring-red-500\")}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options?.map((opt) => (\n <SelectItem\n key={`${opt.name}-${opt.value}`}\n value={opt.value.toString()}\n >\n {opt.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {error && <p className=\"text-sm text-red-500\">{error.message}</p>}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport type { Control } from \"react-hook-form\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField, FormSelectField, type NameValue } from \"./form-fields\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\nexport type UserFormData = {\n first_name: string;\n last_name: string;\n phone_number?: string;\n language: string;\n};\n\nexport default function UserInfoDialog({\n control,\n isOpen,\n onSubmit,\n handleClose,\n languageOptions,\n errorMsg,\n isSubmitting,\n}: {\n control: Control<UserFormData>;\n isOpen: boolean;\n onSubmit: () => void;\n handleClose: () => void;\n languageOptions?: NameValue[];\n errorMsg: string | undefined;\n isSubmitting: boolean;\n}): JSX.Element {\n const { t } = useProfileUI();\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"max-w-sm rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium text-gray-900\">\n {t(\"edit_profile\")}\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-0\">\n <FormTextField\n control={control}\n name=\"first_name\"\n label={t(\"first_name\")}\n />\n <FormTextField\n control={control}\n name=\"last_name\"\n label={t(\"last_name\")}\n />\n <FormTextField\n control={control}\n name=\"phone_number\"\n label={t(\"phone_number\")}\n type=\"tel\"\n />\n <FormSelectField\n control={control}\n name=\"language\"\n label={t(\"language\")}\n options={languageOptions}\n placeholder={t(\"select_an_option\")}\n />\n </div>\n {errorMsg && <p className=\"text-sm text-red-500\">{errorMsg}</p>}\n <DialogFooter className=\"flex flex-row items-center justify-end\">\n <div className=\"flex-1 text-right\">\n <DialogClose asChild>\n <Button type=\"button\" onClick={onSubmit}>\n {isSubmitting && (\n <div className=\"mr-3 h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n )}\n {isSubmitting ? t(\"saving\") : t(\"save_changes\")}\n </Button>\n </DialogClose>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { z } from \"zod\";\nimport { Avatar, AvatarFallback, useZodForm } from \"@fluid-app/ui-primitives\";\nimport { Pencil } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport type { NameValue } from \"./form-fields\";\nimport { useProfileUI, type Language } from \"@fluid-app/profile-core\";\nimport UserInfoDialog, { type UserFormData } from \"./user-info-dialog\";\n\nfunction createUserInfoSchema(messages: {\n firstNameRequired: string;\n lastNameRequired: string;\n languageRequired: string;\n}) {\n return z.object({\n first_name: z.string().min(1, { message: messages.firstNameRequired }),\n last_name: z.string().min(1, { message: messages.lastNameRequired }),\n phone_number: z.string().optional(),\n language: z.string().min(1, { message: messages.languageRequired }),\n });\n}\n\nexport interface CustomerInfoProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: (data: UserFormData) => Promise<void> | void;\n isUpdating?: boolean;\n}\n\nexport default function CustomerInfo({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdating = false,\n}: CustomerInfoProps): JSX.Element {\n const [isEditDialogOpen, setIsEditDialogOpen] = useState(false);\n const [updateError, setUpdateError] = useState<string | undefined>(undefined);\n\n const { t } = useProfileUI();\n\n const { first_name, full_name } = customerAccount.customer;\n const derivedLastName = full_name.startsWith(first_name)\n ? full_name.slice(first_name.length).trim()\n : \"\";\n const userInitial = first_name ? first_name.charAt(0).toUpperCase() : \"\";\n const customerLanguage = languages?.find(\n (language) =>\n language.iso === customerAccount.fluid_pay_account.language_iso,\n )?.name;\n\n const languageOptions: NameValue[] | undefined = languages?.map(\n (language) => ({\n name: language.name,\n value: language.name,\n }),\n );\n\n const schema = useMemo(\n () =>\n createUserInfoSchema({\n firstNameRequired: t(\"first_name_is_required\"),\n lastNameRequired: t(\"last_name_is_required\"),\n languageRequired: t(\"language_is_required\"),\n }),\n [t],\n );\n\n const { control, handleSubmit, reset } = 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 <p className=\"text-sm font-medium\">\n {customerAccount.customer.full_name}\n </p>\n <p className=\"text-sm text-gray-500\">\n {customerAccount.customer.email}\n </p>\n </div>\n </div>\n <button\n className=\"cursor-pointer rounded-md border border-gray-300 p-1 hover:bg-gray-50 disabled:opacity-50\"\n onClick={handleOpenEditDialog}\n >\n <Pencil className=\"h-2.5 w-2.5 text-gray-400\" />\n </button>\n </div>\n\n <UserInfoDialog\n control={control}\n isOpen={isEditDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={handleCloseEditDialog}\n languageOptions={languageOptions}\n errorMsg={updateError}\n isSubmitting={isUpdating}\n />\n </>\n );\n}\n","import { useState } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\n\nfunction formatAddressName(address: fluidPay.CustomerAddress): string {\n return address.name ?? \"\";\n}\n\ninterface AddressDropdownProps {\n title: string;\n displayAddress: fluidPay.CustomerAddress | null;\n addressList: fluidPay.CustomerAddress[];\n onAddAddressClick: () => void;\n onEditAddress?: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress?: (address: fluidPay.CustomerAddress) => void;\n accordionItemValue: string;\n addAddressLabel: string;\n showAddButton?: boolean;\n borderStyle?: string;\n className?: string;\n showActions?: boolean;\n isLoading?: boolean;\n}\n\nexport default function AddressDropdown({\n title,\n displayAddress,\n addressList,\n onAddAddressClick,\n onEditAddress,\n onDeleteAddress,\n accordionItemValue,\n addAddressLabel,\n showAddButton = true,\n borderStyle = \"border-b border-gray-300 pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: AddressDropdownProps) {\n const [addressesValue, setAddressesValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n return (\n <div className={`${borderStyle} ${className}`}>\n <Accordion\n type=\"single\"\n collapsible\n value={addressesValue}\n onValueChange={setAddressesValue}\n className=\"w-full\"\n >\n <AccordionItem value={accordionItemValue} className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">{title}</div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {isLoading && (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n )}\n\n {!isLoading && !addressesValue && displayAddress && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setAddressesValue(accordionItemValue)}\n >\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {formatAddressName(displayAddress)}, {displayAddress.address1}\n </div>\n <div className=\"text-sm text-gray-500\">\n {displayAddress.city}, {displayAddress.state}{\" \"}\n {displayAddress.postal_code}\n </div>\n </div>\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mt-2 flex flex-col justify-between space-y-4 px-0.5\">\n {addressList.length > 0 ? (\n addressList.map((address, index) => (\n <div\n key={address.id}\n className={cn(\n \"flex min-h-[48px] w-full flex-row items-center justify-between space-x-2 px-2\",\n {\n \"items-center border-b border-gray-300 p-3\":\n addressList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-col\">\n <div className=\"text-sm text-gray-900\">\n {formatAddressName(address)} <br />\n {address.address1} <br />\n {address.city}, {address.state} {address.postal_code}\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {address.default && (\n <p className=\"mt-1 w-fit rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() => onDeleteAddress?.(address)}\n onEdit={() => onEditAddress?.(address)}\n editLabel={t(\"edit\")}\n deleteLabel={t(\"delete\")}\n />\n )}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-sm text-gray-500\">\n {t(\"no_saved_addresses_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"mt-3 text-left text-sm text-gray-900\"\n onClick={onAddAddressClick}\n >\n {addAddressLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useState, type JSX, type ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport ConfirmActionDialog from \"./confirm-action-dialog\";\nimport AddressDropdown from \"./address-dropdown\";\n\nexport interface AddressDialogRenderProps {\n isOpen: boolean;\n onClose: () => void;\n selectedAddress: fluidPay.CustomerAddress | null;\n}\n\nexport interface AddressesProps {\n addresses: fluidPay.CustomerAddress[];\n isLoading?: boolean;\n onCreateAddress?: () => void;\n onDeleteAddress: (addressId: number) => Promise<void> | void;\n isDeletingAddress?: boolean;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n}\n\nexport default function Addresses({\n addresses,\n isLoading = false,\n onCreateAddress,\n onDeleteAddress,\n isDeletingAddress = false,\n renderAddressDialog,\n}: AddressesProps): JSX.Element {\n const [openAddressDialog, setOpenAddressDialog] = useState(false);\n const [openDeleteDialog, setOpenDeleteDialog] = useState(false);\n const [selectedAddress, setSelectedAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [deleteAddressError, setDeleteAddressError] = useState<\n string | undefined\n >(undefined);\n\n const { t } = useProfileUI();\n\n const defaultAddress = addresses.find((addr) => addr.default) ?? null;\n\n const handleDeleteClick = (address: fluidPay.CustomerAddress) => {\n setSelectedAddress(address);\n setDeleteAddressError(undefined);\n requestAnimationFrame(() => {\n setOpenDeleteDialog(true);\n });\n };\n\n const handleEditClick = (address: fluidPay.CustomerAddress) => {\n setSelectedAddress(address);\n requestAnimationFrame(() => {\n setOpenAddressDialog(true);\n });\n };\n\n const handleDeleteAddress = async () => {\n if (!selectedAddress) return;\n try {\n await onDeleteAddress(selectedAddress.id);\n setDeleteAddressError(undefined);\n setOpenDeleteDialog(false);\n setSelectedAddress(null);\n } catch {\n setDeleteAddressError(\n \"We were unable to delete this address. Please try again.\",\n );\n }\n };\n\n const handleAddClick = () => {\n setSelectedAddress(null);\n if (onCreateAddress) {\n onCreateAddress();\n }\n setOpenAddressDialog(true);\n };\n\n const handleCloseAddressDialog = () => {\n setOpenAddressDialog(false);\n setSelectedAddress(null);\n };\n\n return (\n <>\n <AddressDropdown\n title={t(\"shipping_addresses\")}\n displayAddress={defaultAddress}\n addressList={addresses}\n onAddAddressClick={handleAddClick}\n onEditAddress={handleEditClick}\n onDeleteAddress={handleDeleteClick}\n accordionItemValue=\"addresses\"\n addAddressLabel={`+ ${t(\"add_an_address\")}`}\n showAddButton={true}\n borderStyle=\"border-b border-gray-300 pb-4 mb-6\"\n showActions={true}\n isLoading={isLoading}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n onAction={handleDeleteAddress}\n actionText={t(\"delete\")}\n openDialog={openDeleteDialog}\n setOpenDialog={setOpenDeleteDialog}\n errorMsg={deleteAddressError}\n isLoading={isDeletingAddress}\n />\n\n {renderAddressDialog?.({\n isOpen: openAddressDialog,\n onClose: handleCloseAddressDialog,\n selectedAddress,\n })}\n </>\n );\n}\n","import { useState } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\n\ninterface PaymentMethodDropdownProps {\n title: string;\n displayPaymentMethod: fluidPay.CustomerPaymentMethod | null;\n paymentMethodList: fluidPay.CustomerPaymentMethod[];\n onAddPaymentMethodClick: () => void;\n onEditPaymentMethod?: (paymentMethod: fluidPay.CustomerPaymentMethod) => void;\n onDeletePaymentMethod?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n accordionItemValue?: string;\n addPaymentMethodLabel?: string;\n showAddButton?: boolean;\n borderStyle?: string;\n className?: string;\n showActions?: boolean;\n isLoading?: boolean;\n}\n\nfunction getCardDisplayName(\n paymentMethod: fluidPay.CustomerPaymentMethod,\n): string {\n if (paymentMethod.payment_type === \"Credit Card\") {\n const brand = paymentMethod.details.card_type;\n const lastFour = paymentMethod.details.last_four;\n return `${brand ?? \"Card\"} •••• ${lastFour ?? \"****\"}`;\n }\n return paymentMethod.payment_type;\n}\n\nfunction getCardExpiry(paymentMethod: fluidPay.CustomerPaymentMethod): string {\n const { exp_month, exp_year } = paymentMethod.details;\n if (exp_month != null && exp_year != null) {\n return `Expires ${exp_month}/${exp_year}`;\n }\n return \"\";\n}\n\nexport default function PaymentMethodDropdown({\n title,\n displayPaymentMethod,\n paymentMethodList,\n onAddPaymentMethodClick,\n onEditPaymentMethod,\n onDeletePaymentMethod,\n accordionItemValue = \"paymentMethods\",\n addPaymentMethodLabel = \"+ Add a payment method\",\n showAddButton = true,\n borderStyle = \"border-b border-gray-300 pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: PaymentMethodDropdownProps) {\n const [paymentsValue, setPaymentsValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n const renderPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => (\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={paymentMethod.details.logo_url}\n alt={paymentMethod.details.card_type ?? t(\"payment_method\")}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {getCardDisplayName(paymentMethod)}\n </div>\n {getCardExpiry(paymentMethod) && (\n <div className=\"text-sm text-gray-500\">\n {getCardExpiry(paymentMethod)}\n </div>\n )}\n </div>\n </div>\n );\n\n return (\n <div className={`${borderStyle} ${className}`}>\n <Accordion\n type=\"single\"\n collapsible\n value={paymentsValue}\n onValueChange={setPaymentsValue}\n className=\"w-full\"\n >\n <AccordionItem value={accordionItemValue} className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">{title}</div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {!paymentsValue && isLoading ? (\n <div className=\"mb-2 flex w-full flex-row items-center space-x-2\">\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col space-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n ) : (\n !paymentsValue &&\n displayPaymentMethod && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setPaymentsValue(accordionItemValue)}\n >\n {renderPaymentMethod(displayPaymentMethod)}\n </div>\n )\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mt-2 flex flex-col justify-between space-y-4 px-0.5\">\n {isLoading ? (\n <>\n {[1, 2].map((i) => (\n <div\n key={`skeleton-${i}`}\n className=\"items-center rounded bg-gray-100 p-3\"\n >\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"flex flex-row items-center space-x-2\">\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col space-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n <Skeleton className=\"h-6 w-6\" />\n </div>\n </div>\n ))}\n </>\n ) : (\n paymentMethodList.map((paymentMethod, index) => (\n <div\n key={paymentMethod.id}\n className={cn(\n \"flex min-h-[48px] w-full flex-row items-center justify-between space-x-2 px-2\",\n {\n \"items-center border-b border-gray-300 p-3\":\n paymentMethodList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={paymentMethod.details.logo_url}\n alt={\n paymentMethod.details.card_type ??\n t(\"payment_method\")\n }\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <div className=\"flex items-center text-sm font-medium text-gray-900\">\n {`${paymentMethod.details.card_type ?? \"Card\"} •••• ${paymentMethod.details.last_four ?? \"****\"}`}\n </div>\n <div className=\"text-sm text-gray-500\">\n {`${t(\"card_expires\")} ${paymentMethod.details.exp_month}/${paymentMethod.details.exp_year}`}\n </div>\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.default && (\n <p className=\"mt-1 w-fit rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() =>\n onDeletePaymentMethod?.(paymentMethod)\n }\n deleteLabel={t(\"delete\")}\n onEdit={() => onEditPaymentMethod?.(paymentMethod)}\n editLabel={t(\"edit\")}\n />\n )}\n </div>\n </div>\n ))\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"mt-3 text-left text-sm text-gray-900\"\n onClick={onAddPaymentMethodClick}\n >\n {addPaymentMethodLabel}\n </button>\n )}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\nexport interface BillingAddress {\n name?: string | null;\n address1?: string | null;\n address2?: string | null;\n city?: string | null;\n state?: string | null;\n zip?: string | null;\n country_code?: string | null;\n}\n\ninterface ViewPaymentMethodDialogProps {\n isOpen: boolean;\n paymentMethod: fluidPay.CustomerPaymentMethod | null;\n billingAddress?: BillingAddress | null;\n onClose: () => void;\n onEdit?: () => void;\n}\n\nexport default function ViewPaymentMethodDialog({\n isOpen,\n paymentMethod,\n billingAddress,\n onClose,\n onEdit,\n}: ViewPaymentMethodDialogProps): JSX.Element | null {\n const { t } = useProfileUI();\n\n if (!paymentMethod) return null;\n\n const { details } = paymentMethod;\n const cardBrand = details.card_type ?? \"Card\";\n const lastFour = details.last_four ?? \"****\";\n const expMonth = details.exp_month;\n const expYear = details.exp_year;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-w-sm rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium\">\n {t(\"edit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div>\n <div className=\"rounded-lg bg-gray-50 p-4\">\n <div className=\"flex items-center space-x-3\">\n {details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={details.logo_url}\n alt={cardBrand}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-gray-900\">\n {cardBrand} •••• {lastFour}\n </span>\n {expMonth != null && expYear != null && (\n <span className=\"text-sm text-gray-500\">\n {t(\"card_expires\")} {expMonth}/{expYear}\n </span>\n )}\n </div>\n </div>\n {paymentMethod.default && (\n <span className=\"mt-2 inline-block rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </span>\n )}\n </div>\n </div>\n\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-gray-900\">\n {t(\"billing_address\")}\n </h3>\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto p-0 text-sm text-gray-600 underline hover:bg-transparent\"\n onClick={onEdit}\n >\n {t(\"edit\")}\n </Button>\n )}\n </div>\n <div className=\"rounded-lg bg-gray-50 p-4\">\n {billingAddress ? (\n <div className=\"space-y-1 text-sm text-gray-900\">\n {billingAddress.name && <p>{billingAddress.name}</p>}\n <p>{billingAddress.address1}</p>\n {billingAddress.address2 && <p>{billingAddress.address2}</p>}\n <p>\n {billingAddress.city}, {billingAddress.state}{\" \"}\n {billingAddress.zip}\n </p>\n <p>{billingAddress.country_code}</p>\n </div>\n ) : (\n <p className=\"text-sm text-gray-500 italic\">\n {t(\"no_billing_address\")}\n </p>\n )}\n </div>\n </div>\n </div>\n\n <DialogFooter>\n <DialogClose asChild>\n <Button\n className=\"rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={onClose}\n >\n {t(\"close\")}\n </Button>\n </DialogClose>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, type JSX } from \"react\";\nimport { 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-api-client\";\nimport { useProfileUI, useCountryStates } from \"@fluid-app/profile-core\";\nimport type { BillingAddress } from \"./view-payment-method-dialog\";\n\nconst editPaymentMethodFormSchema = z.object({\n billing_address: z.object({\n name: z.string().min(1, \"Name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n zip: z.string().min(1, \"Zip code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n }),\n set_as_default: z.boolean(),\n});\n\nexport type EditPaymentMethodFormData = z.infer<\n typeof editPaymentMethodFormSchema\n>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\ninterface EditPaymentMethodDialogProps {\n isOpen: boolean;\n paymentMethod: fluidPay.CustomerPaymentMethod | null;\n billingAddress?: BillingAddress | null;\n onClose: () => void;\n onSubmit: (data: EditPaymentMethodFormData) => void;\n isSubmitting: boolean;\n error?: string;\n countries?: CountryOption[];\n}\n\nexport default function EditPaymentMethodDialog({\n isOpen,\n paymentMethod,\n billingAddress,\n onClose,\n onSubmit,\n isSubmitting,\n error,\n countries = [],\n}: EditPaymentMethodDialogProps): JSX.Element | null {\n const { t } = useProfileUI();\n\n const { control, handleSubmit, reset, setValue } =\n 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-api-client\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport ConfirmActionDialog from \"./confirm-action-dialog\";\nimport PaymentMethodDropdown from \"./payment-method-dropdown\";\nimport ViewPaymentMethodDialog, {\n type BillingAddress,\n} from \"./view-payment-method-dialog\";\nimport EditPaymentMethodDialog, {\n type EditPaymentMethodFormData,\n} from \"./edit-payment-method-dialog\";\n\nexport interface CreditCardDialogRenderProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface PaymentMethodsProps {\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n isLoading?: boolean;\n onDeletePaymentMethod: (paymentMethodId: number) => Promise<void> | void;\n isDeletingPaymentMethod?: boolean;\n onUpdatePaymentMethod: (\n paymentMethodId: number,\n data: EditPaymentMethodFormData,\n ) => Promise<void> | void;\n isUpdatingPaymentMethod?: boolean;\n getBillingAddress?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => BillingAddress | null | undefined;\n countries?: CountryOption[];\n renderCreditCardDialog?: (props: CreditCardDialogRenderProps) => ReactNode;\n}\n\nexport default function PaymentMethods({\n paymentMethods,\n isLoading = false,\n onDeletePaymentMethod,\n isDeletingPaymentMethod = false,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod = false,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n}: PaymentMethodsProps): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const [openDeleteDialog, setOpenDeleteDialog] = useState(false);\n const [deleteCardError, setDeleteCardError] = useState<string | undefined>(\n undefined,\n );\n const [selectedCreditCard, setSelectedCreditCard] = useState<\n fluidPay.CustomerPaymentMethod | undefined\n >(undefined);\n const [isViewOpen, setIsViewOpen] = useState(false);\n const [isEditOpen, setIsEditOpen] = useState(false);\n const [selectedPaymentMethod, setSelectedPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n const [editError, setEditError] = useState<string | undefined>(undefined);\n\n const { t } = useProfileUI();\n\n const defaultPaymentMethod =\n paymentMethods.find((method) => method.default) ?? null;\n\n const handleDeleteCard = async (cardId: number | null) => {\n if (!cardId) return;\n try {\n await onDeletePaymentMethod(cardId);\n setSelectedCreditCard(undefined);\n setDeleteCardError(undefined);\n setOpenDeleteDialog(false);\n } catch {\n setDeleteCardError(\"Unable to delete payment method. Please try again.\");\n }\n };\n\n const handleDeletePaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => {\n setSelectedCreditCard(paymentMethod);\n requestAnimationFrame(() => {\n setOpenDeleteDialog(true);\n });\n };\n\n const handleViewPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => {\n setSelectedPaymentMethod(paymentMethod);\n requestAnimationFrame(() => {\n setIsViewOpen(true);\n });\n };\n\n const handleCloseViewDialog = () => {\n setIsViewOpen(false);\n setSelectedPaymentMethod(null);\n };\n\n const handleOpenEditFromView = () => {\n setIsViewOpen(false);\n setEditError(undefined);\n requestAnimationFrame(() => {\n setIsEditOpen(true);\n });\n };\n\n const handleCloseEditDialog = () => {\n setIsEditOpen(false);\n setSelectedPaymentMethod(null);\n setEditError(undefined);\n };\n\n const handleEditSubmit = async (data: EditPaymentMethodFormData) => {\n if (!selectedPaymentMethod) return;\n try {\n await onUpdatePaymentMethod(selectedPaymentMethod.id, data);\n handleCloseEditDialog();\n fluidToast({\n title: t(\"default_payment_method_updated\"),\n type: \"success\",\n });\n } catch (error) {\n console.error(\"Error updating payment method:\", error);\n fluidToast({\n title: t(\"failed_to_set_default_payment_method\"),\n type: \"error\",\n description: parseApiErrors(error),\n });\n if (error instanceof Error) {\n setEditError(error.message);\n } else {\n setEditError(\"An unexpected error occurred. Please try again.\");\n }\n }\n };\n\n const handleOpenDialog = () => {\n setIsOpen(true);\n };\n\n const handleCloseDialog = () => {\n setIsOpen(false);\n };\n\n const selectedBillingAddress = selectedPaymentMethod\n ? (getBillingAddress?.(selectedPaymentMethod) ?? null)\n : null;\n\n return (\n <>\n <PaymentMethodDropdown\n title={t(\"payment_methods\")}\n displayPaymentMethod={defaultPaymentMethod}\n paymentMethodList={paymentMethods}\n onAddPaymentMethodClick={handleOpenDialog}\n onEditPaymentMethod={handleViewPaymentMethod}\n onDeletePaymentMethod={handleDeletePaymentMethod}\n addPaymentMethodLabel={`+ ${t(\"add_payment_method\")}`}\n isLoading={isLoading}\n />\n\n {renderCreditCardDialog?.({\n isOpen,\n onClose: handleCloseDialog,\n })}\n\n <ConfirmActionDialog\n title={t(\"delete_credit_card\")}\n description={t(\"delete_credit_card_message\")}\n actionText={t(\"delete\")}\n onAction={() => handleDeleteCard(selectedCreditCard?.id ?? null)}\n openDialog={openDeleteDialog}\n setOpenDialog={setOpenDeleteDialog}\n errorMsg={deleteCardError}\n isLoading={isDeletingPaymentMethod}\n />\n\n <ViewPaymentMethodDialog\n isOpen={isViewOpen}\n paymentMethod={selectedPaymentMethod}\n billingAddress={selectedBillingAddress}\n onClose={handleCloseViewDialog}\n onEdit={handleOpenEditFromView}\n />\n\n <EditPaymentMethodDialog\n isOpen={isEditOpen}\n paymentMethod={selectedPaymentMethod}\n billingAddress={selectedBillingAddress}\n onClose={handleCloseEditDialog}\n onSubmit={handleEditSubmit}\n isSubmitting={isUpdatingPaymentMethod}\n error={editError}\n countries={countries}\n />\n </>\n );\n}\n","import type { JSX, ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport CustomerInfo, { type CustomerInfoProps } from \"./customer-info\";\nimport CustomerPointsLedger from \"./customer-points-ledger\";\nimport Addresses, { type AddressDialogRenderProps } from \"./addresses\";\nimport PaymentMethods, {\n type CreditCardDialogRenderProps,\n} from \"./payment-methods\";\nimport type { EditPaymentMethodFormData } from \"./edit-payment-method-dialog\";\nimport type { BillingAddress } from \"./view-payment-method-dialog\";\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface ProfileProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: CustomerInfoProps[\"onUpdateCustomer\"];\n isUpdatingCustomer?: boolean;\n\n rewardsPointsEnabled?: boolean;\n pointsLedger?: PointsLedger[];\n isLoadingPointsLedger?: boolean;\n\n addresses: fluidPay.CustomerAddress[];\n isLoadingAddresses?: boolean;\n onDeleteAddress: (addressId: number) => Promise<void> | void;\n isDeletingAddress?: boolean;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n isLoadingPaymentMethods?: boolean;\n onDeletePaymentMethod: (paymentMethodId: number) => Promise<void> | void;\n isDeletingPaymentMethod?: boolean;\n onUpdatePaymentMethod: (\n paymentMethodId: number,\n data: EditPaymentMethodFormData,\n ) => Promise<void> | void;\n isUpdatingPaymentMethod?: boolean;\n getBillingAddress?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => BillingAddress | null | undefined;\n countries?: CountryOption[];\n renderCreditCardDialog?: (props: CreditCardDialogRenderProps) => ReactNode;\n}\n\nexport default function Profile({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdatingCustomer,\n rewardsPointsEnabled = false,\n pointsLedger,\n isLoadingPointsLedger,\n addresses,\n isLoadingAddresses,\n onDeleteAddress,\n isDeletingAddress,\n renderAddressDialog,\n paymentMethods,\n isLoadingPaymentMethods,\n onDeletePaymentMethod,\n isDeletingPaymentMethod,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n}: ProfileProps): JSX.Element {\n return (\n <>\n <CustomerInfo\n customerAccount={customerAccount}\n languages={languages}\n onUpdateCustomer={onUpdateCustomer}\n isUpdating={isUpdatingCustomer}\n />\n {rewardsPointsEnabled && (\n <CustomerPointsLedger\n pointsLedger={pointsLedger ?? []}\n isLoading={isLoadingPointsLedger}\n />\n )}\n <Addresses\n addresses={addresses}\n isLoading={isLoadingAddresses}\n onDeleteAddress={onDeleteAddress}\n isDeletingAddress={isDeletingAddress}\n renderAddressDialog={renderAddressDialog}\n />\n <PaymentMethods\n paymentMethods={paymentMethods}\n isLoading={isLoadingPaymentMethods}\n onDeletePaymentMethod={onDeletePaymentMethod}\n isDeletingPaymentMethod={isDeletingPaymentMethod}\n onUpdatePaymentMethod={onUpdatePaymentMethod}\n isUpdatingPaymentMethod={isUpdatingPaymentMethod}\n getBillingAddress={getBillingAddress}\n countries={countries}\n renderCreditCardDialog={renderCreditCardDialog}\n />\n </>\n );\n}\n","\"use client\";\n\nimport type { Control, FieldPath, FieldValues } from \"react-hook-form\";\nimport { useController } from \"react-hook-form\";\nimport { Input, cn } from \"@fluid-app/ui-primitives\";\n\ninterface FormTextFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n control: Control<TFieldValues>;\n name: TName;\n placeholder?: string;\n containerClassName?: string;\n type?: React.HTMLInputTypeAttribute;\n disabled?: boolean;\n inputMode?: React.HTMLAttributes<HTMLInputElement>[\"inputMode\"];\n}\n\nexport function FormTextField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n placeholder,\n containerClassName,\n type,\n disabled,\n inputMode,\n}: FormTextFieldProps<TFieldValues, TName>) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n <Input\n {...field}\n value={field.value ?? \"\"}\n id={name}\n type={type}\n disabled={disabled}\n inputMode={inputMode}\n placeholder={placeholder}\n aria-invalid={!!error}\n />\n {error?.message && (\n <p className=\"text-sm text-red-500\">{error.message}</p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { Control, FieldPath, FieldValues } from \"react-hook-form\";\nimport { Controller } from \"react-hook-form\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n} from \"@fluid-app/ui-primitives\";\n\ntype NameValue = { name: string; value: string | number };\n\ninterface FormSelectFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n control: Control<TFieldValues>;\n name: TName;\n placeholder?: string;\n options?: NameValue[];\n containerClassName?: string;\n disabled?: boolean;\n}\n\nexport function FormSelectField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n placeholder = \"Select\",\n options,\n containerClassName,\n disabled,\n}: FormSelectFieldProps<TFieldValues, TName>) {\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n <Controller\n control={control}\n name={name}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <Select\n value={value?.toString() ?? \"\"}\n onValueChange={onChange}\n disabled={disabled}\n >\n <SelectTrigger\n aria-invalid={!!error}\n className={cn(\n \"w-full\",\n error && \"border-red-500 ring-1 ring-red-500\",\n )}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options && options.length > 0 ? (\n options.map((opt) => (\n <SelectItem\n key={opt.value.toString()}\n value={opt.value.toString()}\n >\n {opt.name}\n </SelectItem>\n ))\n ) : (\n <SelectItem value=\"__empty\" disabled>\n No available options\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n {error?.message && (\n <p className=\"text-sm text-red-500\">{error.message}</p>\n )}\n </>\n )}\n />\n </div>\n );\n}\n","import { type JSX, type ReactNode, useEffect } from \"react\";\nimport { 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-api-client\";\nimport { useCountryStates } from \"@fluid-app/fluid-pay-core\";\n\nconst addressFormSchema = z.object({\n first_name: z.string().min(1, \"First name is required\"),\n last_name: z.string().min(1, \"Last name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n postal_code: z.string().min(1, \"Postal code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n default: z.boolean(),\n});\n\nexport type AddressFormData = z.infer<typeof addressFormSchema>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface AddressAutocompleteRenderProps {\n control: Control<AddressFormData>;\n setValue: UseFormSetValue<AddressFormData>;\n countryCode: string;\n}\n\ninterface AddressFormDialogProps {\n isOpen: boolean;\n onClose: () => void;\n selectedAddress: fluidPay.CustomerAddress | null;\n onSubmit: (data: fluidPay.CreateAddressBody) => void;\n isSubmitting: boolean;\n countries?: CountryOption[];\n error?: string;\n renderAddressAutocomplete?: (\n props: AddressAutocompleteRenderProps,\n ) => ReactNode;\n t: (key: string) => string;\n}\n\nexport default function AddressFormDialog({\n isOpen,\n onClose,\n selectedAddress,\n onSubmit,\n isSubmitting,\n countries = [],\n error,\n renderAddressAutocomplete,\n t,\n}: AddressFormDialogProps): JSX.Element {\n const { control, handleSubmit, reset, setValue } =\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\");\n } else {\n reset({\n first_name: \"\",\n last_name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country_code: \"US\",\n default: false,\n });\n handleCountryChange(\"US\");\n }\n }\n }, [selectedAddress, isOpen, reset, handleCountryChange]);\n\n useEffect(() => {\n handleCountryChange(selectedCountryCode);\n }, [selectedCountryCode, handleCountryChange]);\n\n const handleFormSubmit = handleSubmit((data) => {\n onSubmit({\n address: {\n first_name: data.first_name,\n last_name: data.last_name,\n address1: data.address1,\n address2: data.address2 ?? null,\n city: data.city,\n state: data.state,\n postal_code: data.postal_code,\n country_code: data.country_code,\n default: data.default,\n },\n });\n });\n\n const isEditMode = selectedAddress !== null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-md overflow-y-auto rounded md:max-w-xl\">\n <DialogHeader>\n <DialogTitle className=\"text-lg font-medium\">\n {isEditMode ? t(\"edit_address\") : t(\"add_an_address\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-3 pt-2\">\n <FormSelectField\n control={control}\n name=\"country_code\"\n placeholder={t(\"country\")}\n options={countrySelectOptions}\n disabled={isSubmitting}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"first_name\"\n placeholder={t(\"first_name\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormTextField\n control={control}\n name=\"last_name\"\n placeholder={t(\"last_name\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n </div>\n {renderAddressAutocomplete ? (\n renderAddressAutocomplete({\n control,\n setValue,\n countryCode: selectedCountryCode,\n })\n ) : (\n <FormTextField\n control={control}\n name=\"address1\"\n placeholder={t(\"address_line_1\")}\n disabled={isSubmitting}\n />\n )}\n <FormTextField\n control={control}\n name=\"address2\"\n placeholder={t(\"address_line_2\")}\n disabled={isSubmitting}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"city\"\n placeholder={t(\"city\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormSelectField\n control={control}\n name=\"state\"\n placeholder={\n config?.regionLabel ? t(config.regionLabel) : t(\"select_state\")\n }\n options={stateSelectOptions}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormTextField\n control={control}\n name=\"postal_code\"\n placeholder={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default_address\"\n checked={isDefault}\n onChange={() => setValue(\"default\", !isDefault)}\n disabled={isSubmitting}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default_address\" className=\"text-sm\">\n {t(\"set_as_default_address\")}\n </label>\n </div>\n\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isSubmitting}\n className=\"rounded bg-gray-900 px-5 py-2.5 text-white hover:bg-gray-800\"\n >\n {isSubmitting ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save_address\")\n )}\n </Button>\n </div>\n\n {error && <div className=\"mt-2 text-sm text-red-500\">{error}</div>}\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, useRef, useState, useCallback } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\n\nexport type VgsFieldState = {\n isFocused: boolean;\n isValid: boolean;\n isEmpty: boolean;\n};\n\nexport type VgsFormState = {\n [key: string]: VgsFieldState;\n};\n\ninterface VGSCollectForm {\n setRouteId: (routeId: string) => void;\n field: (selector: string, config: Record<string, unknown>) => void;\n submit: (\n path: string,\n options: { headers?: Record<string, string> },\n successCallback: (\n status: number,\n response: fluidPay.VgsCollectSubmitResponse,\n ) => void,\n errorCallback: (errors: Record<string, string[]>) => void,\n ) => void;\n unmount: () => void;\n}\n\ninterface VGSCollectLibrary {\n create: (\n vaultId: string,\n environment: string,\n stateCallback: (state: Record<string, Partial<VgsFieldState>>) => void,\n ) => VGSCollectForm;\n}\n\nconst getVGSCollect = (): VGSCollectLibrary | null => {\n if (typeof window !== \"undefined\") {\n return (\n (window as unknown as { VGSCollect?: VGSCollectLibrary }).VGSCollect ||\n null\n );\n }\n return null;\n};\n\nconst DEFAULT_FIELD_STATE: VgsFormState = {\n card_number: { isFocused: false, isValid: false, isEmpty: true },\n card_exp: { isFocused: false, isValid: false, isEmpty: true },\n card_cvc: { isFocused: false, isValid: false, isEmpty: true },\n card_holder: { isFocused: false, isValid: false, isEmpty: true },\n};\n\nexport function useVgsCollect() {\n const [isFormReady, setIsFormReady] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isScriptLoaded, setIsScriptLoaded] = useState(false);\n\n const [vgsFieldState, setVgsFieldState] =\n useState<VgsFormState>(DEFAULT_FIELD_STATE);\n\n const formRef = useRef<VGSCollectForm | null>(null);\n const onSuccessRef = useRef<\n ((response: fluidPay.VgsCollectSubmitResponse) => void) | null\n >(null);\n const onErrorRef = useRef<((error: string) => void) | null>(null);\n\n // Load VGS Collect script\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const vgsCollect = getVGSCollect();\n if (vgsCollect) {\n const timeoutId = window.setTimeout(() => {\n setIsScriptLoaded(true);\n }, 0);\n return () => window.clearTimeout(timeoutId);\n }\n\n if (isScriptLoaded) return;\n\n const script = document.createElement(\"script\");\n script.src =\n \"https://js.verygoodvault.com/vgs-collect/3.3.0/vgs-collect.js\";\n script.async = true;\n script.onload = () => setIsScriptLoaded(true);\n script.onerror = () => onErrorRef.current?.(\"Failed to load payment form\");\n document.head.appendChild(script);\n }, [isScriptLoaded]);\n\n const updateFieldState = useCallback(\n (state: Record<string, Partial<VgsFieldState>>) => {\n if (!state) return;\n\n setVgsFieldState((prev) => {\n const newState: VgsFormState = { ...prev };\n let hasChanges = false;\n\n Object.keys(state).forEach((key) => {\n const field = state[key];\n if (!field) return;\n\n const next: VgsFieldState = {\n isFocused: !!field.isFocused,\n isValid: !!field.isValid,\n isEmpty: !!field.isEmpty,\n };\n\n if (\n !newState[key] ||\n JSON.stringify(newState[key]) !== JSON.stringify(next)\n ) {\n newState[key] = next;\n hasChanges = true;\n }\n });\n\n return hasChanges ? newState : prev;\n });\n },\n [],\n );\n\n const resetVgs = useCallback(() => {\n if (formRef.current) {\n try {\n formRef.current.unmount();\n } catch (e) {\n console.warn(\"VGS unmount error\", e);\n }\n formRef.current = null;\n }\n\n setIsFormReady(false);\n setVgsFieldState({ ...DEFAULT_FIELD_STATE });\n }, []);\n\n const initializeForm = useCallback(\n async (credentials: fluidPay.VaultResponse) => {\n if (!isScriptLoaded) return;\n\n const VGSCollect = getVGSCollect();\n if (!VGSCollect) {\n onErrorRef.current?.(\"Payment script not loaded\");\n return;\n }\n\n try {\n setIsLoading(true);\n\n const vgsEnvironment =\n credentials.vault.environment === \"sandbox\" ? \"sandbox\" : \"live-eu-1\";\n\n const form = VGSCollect.create(\n credentials.vault.vault_id,\n vgsEnvironment,\n (state) => updateFieldState(state),\n );\n\n if (credentials.vault.route_id) {\n form.setRouteId(credentials.vault.route_id);\n }\n\n formRef.current = form;\n\n // Wait for DOM elements\n let retries = 0;\n const maxRetries = 20;\n const retryDelay = 200;\n\n const waitForDom = async (): Promise<boolean> => {\n const allExist = [\n \"vgs-card-number\",\n \"vgs-expiration-date\",\n \"vgs-cvc\",\n \"vgs-card-holder\",\n ].every((id) => {\n const el = document.getElementById(id);\n return el && el.isConnected;\n });\n\n if (allExist) return true;\n if (retries >= maxRetries) return false;\n\n retries++;\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n return waitForDom();\n };\n\n const domReady = await waitForDom();\n if (!domReady) {\n throw new Error(\"Payment form elements not ready\");\n }\n\n const css = {\n fontSize: \"14px\",\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n color: \"#1f2937\",\n paddingTop: \"0px\",\n paddingBottom: \"0px\",\n paddingLeft: \"0px\",\n paddingRight: \"0px\",\n boxSizing: \"border-box\",\n lineHeight: \"38px\",\n height: \"100%\",\n width: \"100%\",\n \"&::placeholder\": { color: \"#9ca3af\", opacity: 1 },\n \"&:focus\": { outline: \"none\" },\n };\n\n form.field(\"#vgs-card-number\", {\n type: \"card-number\",\n name: \"card_number\",\n placeholder: \"0000 0000 0000 0000\",\n showCardIcon: true,\n css: { ...css, paddingRight: \"40px\" },\n autoComplete: \"cc-number\",\n validations: [\"required\", \"validCardNumber\"],\n });\n\n form.field(\"#vgs-expiration-date\", {\n type: \"card-expiration-date\",\n name: \"card_exp\",\n yearLength: 2,\n placeholder: \"MM / YY\",\n css,\n autoComplete: \"cc-exp\",\n validations: [\"required\", \"validCardExpirationDate\"],\n });\n\n form.field(\"#vgs-cvc\", {\n type: \"card-security-code\",\n name: \"card_cvc\",\n placeholder: \"123\",\n css,\n autoComplete: \"cc-csc\",\n validations: [\"required\", \"validCardSecurityCode\"],\n });\n\n form.field(\"#vgs-card-holder\", {\n type: \"text\",\n name: \"card_holder\",\n placeholder: \"Full Name\",\n css,\n autoComplete: \"cc-name\",\n validations: [\"required\"],\n });\n\n setIsFormReady(true);\n } catch (error) {\n console.error(\"Failed to initialize VGS:\", error);\n onErrorRef.current?.(\"Failed to initialize payment form\");\n } finally {\n setIsLoading(false);\n }\n },\n [isScriptLoaded, updateFieldState],\n );\n\n const submitCard = useCallback(() => {\n if (!formRef.current) {\n onErrorRef.current?.(\"Form not initialized\");\n return;\n }\n\n formRef.current.submit(\n `/post`,\n {},\n (status: number, response: fluidPay.VgsCollectSubmitResponse) => {\n if (status >= 200 && status < 400) {\n onSuccessRef.current?.(response);\n } else {\n onErrorRef.current?.(\"Payment failed\");\n }\n },\n (errors: Record<string, string[]>) => {\n const allErrors = Object.values(errors)\n .flat()\n .filter(\n (msg) =>\n typeof msg === \"string\" &&\n msg.trim().length > 0 &&\n msg !== \"Required\",\n );\n\n const uniqueErrors = Array.from(new Set(allErrors));\n\n let errorMsg = \"Please verify your payment details.\";\n if (uniqueErrors.length > 0) {\n errorMsg = uniqueErrors.join(\", \");\n } else {\n const rawErrors = Object.values(errors).flat();\n if (rawErrors.length > 0) {\n errorMsg = \"Please fill in all required fields.\";\n }\n }\n\n onErrorRef.current?.(errorMsg);\n },\n );\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (formRef.current) {\n try {\n formRef.current.unmount();\n } catch (e) {\n console.warn(\"VGS unmount error\", e);\n }\n formRef.current = null;\n }\n };\n }, []);\n\n return {\n isFormReady,\n isLoading,\n isScriptLoaded,\n initializeForm,\n submitCard,\n vgsFieldState,\n resetVgs,\n onSuccessRef,\n onErrorRef,\n };\n}\n","import {\n type JSX,\n type ReactNode,\n useEffect,\n useState,\n useCallback,\n} from \"react\";\nimport { 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, FetchClient } from \"@fluid-app/fluid-pay-api-client\";\nimport { vaultApi } from \"@fluid-app/fluid-pay-api-client\";\nimport { useCountryStates } from \"@fluid-app/fluid-pay-core\";\nimport {\n useVgsCollect,\n type VgsFieldState,\n type VgsFormState,\n} from \"../hooks/use-vgs-collect\";\n\nconst billingAddressSchema = z.object({\n name: z.string().min(1, \"Name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n zip: z.string().min(1, \"Zip code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n set_as_default: z.boolean(),\n});\n\ntype BillingAddressFormData = z.infer<typeof billingAddressSchema>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface BillingAddressAutocompleteRenderProps {\n control: Control<BillingAddressFormData>;\n setValue: UseFormSetValue<BillingAddressFormData>;\n countryCode: string;\n}\n\ninterface CreditCardFormDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (data: fluidPay.AddCreditCardData) => void;\n isSubmitting: boolean;\n countries?: CountryOption[];\n error?: string;\n jwt: string;\n client: FetchClient;\n renderAddressAutocomplete?: (\n props: BillingAddressAutocompleteRenderProps,\n ) => ReactNode;\n t: (key: string) => string;\n}\n\nfunction VgsInputWrapper({\n id,\n fieldState,\n className,\n}: {\n id: string;\n fieldState?: VgsFieldState;\n className?: string;\n}) {\n const isInvalid =\n fieldState?.isValid === false &&\n !fieldState?.isFocused &&\n !fieldState?.isEmpty;\n\n const isFocused = fieldState?.isFocused;\n\n return (\n <div className=\"w-full\">\n <div\n id={id}\n className={cn(\n \"relative flex h-10 w-full items-center rounded-md border border-gray-300 bg-white px-3 shadow-sm transition-all duration-200 ease-in-out\",\n \"[&_iframe]:block! [&_iframe]:h-full! [&_iframe]:w-full!\",\n isFocused && \"border-blue-600 ring-1 ring-blue-600\",\n isInvalid && \"border-red-500 ring-1 ring-red-500\",\n className,\n )}\n />\n </div>\n );\n}\n\nfunction VgsCardForm({\n isLoading,\n isFormReady,\n vgsFieldState,\n networkError,\n t,\n}: {\n isLoading: boolean;\n isFormReady: boolean;\n vgsFieldState: VgsFormState;\n networkError?: string;\n t: (key: string) => string;\n}) {\n const showSpinner = isLoading || !isFormReady;\n\n return (\n <div className=\"space-y-4\" aria-label=\"Credit card form\">\n <VgsInputWrapper\n id=\"vgs-card-number\"\n fieldState={vgsFieldState[\"card_number\"]}\n />\n\n <div className=\"flex gap-3\">\n <div className=\"flex-1\">\n <VgsInputWrapper\n id=\"vgs-expiration-date\"\n fieldState={vgsFieldState[\"card_exp\"]}\n />\n </div>\n <div className=\"flex-1\">\n <VgsInputWrapper\n id=\"vgs-cvc\"\n fieldState={vgsFieldState[\"card_cvc\"]}\n />\n </div>\n </div>\n\n <VgsInputWrapper\n id=\"vgs-card-holder\"\n fieldState={vgsFieldState[\"card_holder\"]}\n />\n\n {networkError && networkError.trim().length > 0 && (\n <div className=\"rounded-md bg-red-50 p-3 text-sm text-red-600\">\n {networkError}\n </div>\n )}\n </div>\n );\n}\n\nexport default function CreditCardFormDialog({\n isOpen,\n onClose,\n onSubmit,\n isSubmitting,\n countries = [],\n error,\n jwt,\n client,\n renderAddressAutocomplete,\n t,\n}: CreditCardFormDialogProps): JSX.Element {\n const [cardError, setCardError] = useState<string | undefined>(undefined);\n const [isVgsSubmitting, setIsVgsSubmitting] = useState(false);\n\n const {\n isFormReady,\n isLoading: isVgsLoading,\n isScriptLoaded,\n initializeForm,\n submitCard,\n vgsFieldState,\n resetVgs,\n onSuccessRef,\n onErrorRef,\n } = useVgsCollect();\n\n const { control, handleSubmit, reset, setValue } =\n 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 || !jwt) return;\n\n let cancelled = false;\n\n const init = async () => {\n try {\n const credentials =\n await vaultApi.fetchVaultCredentialsForPaymentAccount(client, jwt);\n if (!cancelled) {\n await initializeForm(credentials);\n }\n } catch (err) {\n console.error(\"Failed to fetch vault credentials:\", err);\n if (!cancelled) {\n setCardError(\"Failed to initialize payment form\");\n }\n }\n };\n\n init();\n\n return () => {\n cancelled = true;\n };\n }, [isOpen, isScriptLoaded, jwt, client, initializeForm]);\n\n // Wire up VGS callbacks\n const handleVgsSuccess = useCallback(\n (response: fluidPay.VgsCollectSubmitResponse) => {\n const expValue = response?.card_exp;\n if (!expValue) {\n setCardError(\"Missing expiration date from payment form\");\n setIsVgsSubmitting(false);\n return;\n }\n\n const cleanExp = expValue.replace(/\\s+/g, \"\");\n const [expMonth, expYearShort] = cleanExp.split(\"/\");\n\n if (!expMonth || !expYearShort) {\n setCardError(\"Invalid expiration date format\");\n setIsVgsSubmitting(false);\n return;\n }\n\n const expYear =\n expYearShort.length === 2 ? `20${expYearShort}` : expYearShort;\n\n const cardholderName = response?.card_holder?.trim();\n if (!cardholderName) {\n setCardError(\"Cardholder name is required\");\n setIsVgsSubmitting(false);\n return;\n }\n\n // Read the current form values synchronously via handleSubmit\n handleSubmit((formData) => {\n const creditCardData: fluidPay.AddCreditCardData = {\n type: \"credit_card\",\n country_code: formData.country_code,\n default_payment_method: formData.set_as_default,\n payment_method: {\n token: response.card_number,\n cvv_token: response.card_cvc,\n exp_month: expMonth,\n exp_year: expYear,\n card_holder: cardholderName,\n billing_zip: formData.zip,\n },\n billing_address: {\n name: formData.name,\n address1: formData.address1,\n address2: formData.address2 ?? undefined,\n city: formData.city,\n state: formData.state,\n zip: formData.zip,\n country_code: formData.country_code,\n },\n };\n\n onSubmit(creditCardData);\n setIsVgsSubmitting(false);\n })();\n },\n [handleSubmit, onSubmit],\n );\n\n const handleVgsError = useCallback((err: string) => {\n setCardError(err);\n setIsVgsSubmitting(false);\n }, []);\n\n useEffect(() => {\n onSuccessRef.current = handleVgsSuccess;\n onErrorRef.current = handleVgsError;\n }, [handleVgsSuccess, handleVgsError, onSuccessRef, onErrorRef]);\n\n const handleClose = () => {\n resetVgs();\n reset();\n setCardError(undefined);\n setIsVgsSubmitting(false);\n onClose();\n };\n\n const handleFormSubmit = handleSubmit(() => {\n setIsVgsSubmitting(true);\n setCardError(undefined);\n submitCard();\n });\n\n const isBusy = isSubmitting || isVgsSubmitting;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-md overflow-y-auto rounded p-0 md:max-w-xl\">\n <div className=\"relative p-6\">\n {(isVgsLoading || !isFormReady) && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center rounded bg-white/80 backdrop-blur-[1px]\">\n <div className=\"flex items-center justify-center\">\n <div className=\"mr-3 h-5 w-5 animate-spin rounded-full border-2 border-t-2 border-blue-600 border-t-transparent\" />\n <p className=\"text-sm font-medium text-gray-600\">\n {t(\"securing\")}\n </p>\n </div>\n </div>\n )}\n <DialogHeader>\n <DialogTitle className=\"text-lg font-medium\">\n {t(\"add_credit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4 pt-6\">\n <VgsCardForm\n isLoading={isVgsLoading}\n isFormReady={isFormReady}\n vgsFieldState={vgsFieldState}\n networkError={cardError ?? error}\n t={t}\n />\n\n <div className=\"space-y-3 pt-2\">\n <h3 className=\"text-sm font-medium text-gray-500\">\n {t(\"billing_address\")}\n </h3>\n <FormSelectField\n control={control}\n name=\"country_code\"\n placeholder={t(\"country\")}\n options={countrySelectOptions}\n disabled={isBusy}\n />\n <FormTextField\n control={control}\n name=\"name\"\n placeholder={t(\"name\")}\n disabled={isBusy}\n />\n {renderAddressAutocomplete ? (\n renderAddressAutocomplete({\n control,\n setValue,\n countryCode: billingCountry,\n })\n ) : (\n <FormTextField\n control={control}\n name=\"address1\"\n placeholder={t(\"address_line_1\")}\n disabled={isBusy}\n />\n )}\n <FormTextField\n control={control}\n name=\"address2\"\n placeholder={t(\"address_line_2\")}\n disabled={isBusy}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"city\"\n placeholder={t(\"city\")}\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n <FormSelectField\n control={control}\n name=\"state\"\n placeholder={\n config?.regionLabel\n ? t(config.regionLabel)\n : t(\"select_state\")\n }\n options={stateSelectOptions}\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n <FormTextField\n control={control}\n name=\"zip\"\n placeholder={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n </div>\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default_cc\"\n checked={setAsDefault}\n onChange={() => setValue(\"set_as_default\", !setAsDefault)}\n disabled={isBusy}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default_cc\" className=\"text-sm\">\n {t(\"set_as_default_payment_method\")}\n </label>\n </div>\n\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isBusy}\n className=\"rounded bg-gray-900 px-5 py-2.5 text-white hover:bg-gray-800\"\n >\n {isBusy ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save_card\")\n )}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo } from \"react\";\nimport { useController } from \"react-hook-form\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { ProfileUIProvider } from \"@fluid-app/profile-core\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n Profile,\n AddressFormDialog,\n CreditCardFormDialog,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n BillingAddressAutocompleteRenderProps,\n} from \"@fluid-app/profile-ui\";\nimport {\n customersApi,\n addressesApi,\n paymentMethodsApi,\n} from \"@fluid-app/fluid-pay-api-client\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-api-client\";\nimport { useFluidAuth } from \"../hooks/use-fluid-auth\";\nimport {\n useFluidPayClient,\n useSdkClient,\n API_VERSION,\n} from \"../account/use-account-clients\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nconst translations: Record<string, string> = {\n edit_profile: \"Edit Profile\",\n first_name: \"First Name\",\n last_name: \"Last Name\",\n phone_number: \"Phone Number\",\n language: \"Language\",\n first_name_is_required: \"First name is required\",\n last_name_is_required: \"Last name is required\",\n language_is_required: \"Language is required\",\n saving: \"Saving...\",\n save_changes: \"Save Changes\",\n select_an_option: \"Select an option\",\n points_history: \"Points History\",\n points_available: \"Points Available\",\n points_awarded: \"Points Awarded\",\n points_redeemed: \"Points Redeemed\",\n transaction: \"Transaction\",\n no_points_history_found: \"No points history found\",\n shipping_addresses: \"Shipping Addresses\",\n add_an_address: \"Add an Address\",\n delete_address: \"Delete Address\",\n delete_address_message:\n \"Are you sure you want to delete this address? This action cannot be undone.\",\n delete: \"Delete\",\n add_address: \"Add Address\",\n edit_address: \"Edit Address\",\n set_as_default_address: \"Set as default address\",\n save_address: \"Save Address\",\n card_number: \"Card Number\",\n expiration_date: \"Expiration (MM / YY)\",\n cvc: \"CVC\",\n cardholder_name: \"Cardholder Name\",\n add_credit_card: \"Add Credit Card\",\n save_card: \"Save Card\",\n securing: \"Loading secure form...\",\n payment_methods: \"Payment Methods\",\n add_payment_method: \"Add Payment Method\",\n delete_credit_card: \"Delete Credit Card\",\n delete_credit_card_message:\n \"Are you sure you want to delete this payment method? This action cannot be undone.\",\n edit_card: \"Card Details\",\n billing_address: \"Billing Address\",\n country: \"Country\",\n name: \"Name\",\n address_line_1: \"Address Line 1\",\n address_line_2: \"Address Line 2\",\n city: \"City\",\n state: \"State\",\n province: \"Province\",\n zip_code: \"Zip Code\",\n postal_code: \"Postal Code\",\n select_state: \"Select state\",\n set_as_default_payment_method: \"Set as default payment method\",\n cancel: \"Cancel\",\n save: \"Save\",\n close: \"Close\",\n edit: \"Edit\",\n default: \"Default\",\n card_expires: \"Expires\",\n no_billing_address: \"No billing address on file\",\n default_payment_method_updated: \"Payment method updated\",\n failed_to_set_default_payment_method: \"Failed to update payment method\",\n};\n\nfunction t(key: string): string {\n if (translations[key]) return translations[key];\n return key\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\ninterface RawPointsLedgerEntry {\n id: number;\n amount: number;\n customer_id: number;\n created_at: string;\n metadata?: {\n transaction_type?: string | null;\n source?: {\n name: string;\n email?: string;\n reason?: string;\n user_id?: number;\n } | null;\n } | null;\n total_balance?: number;\n}\n\nfunction adaptPointsLedger(entry: RawPointsLedgerEntry): PointsLedger {\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: entry.customer_id,\n metadata: {\n transaction_type: entry.metadata?.transaction_type ?? undefined,\n source: entry.metadata?.source ?? undefined,\n },\n total_balance: entry.total_balance ?? 0,\n updated_at: entry.created_at,\n };\n}\n\nexport function ProfileContentScreen({\n onToast,\n countryIso,\n}: ProfileContentScreenProps): React.JSX.Element {\n const { token, user } = useFluidAuth();\n const client = useFluidPayClient();\n const sdkClient = useSdkClient();\n const queryClient = useQueryClient();\n const jwt = token ?? \"\";\n const userId = user?.id;\n\n // -- Data fetching --\n\n const {\n data: accountData,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useQuery({\n queryKey: [\"fluidPayAccount\", userId],\n queryFn: () => customersApi.fetchCustomerAccount(client, jwt),\n enabled: !!jwt,\n });\n\n const { data: addressesData, isLoading: isLoadingAddresses } = useQuery({\n queryKey: [\"fluidPayAddresses\", userId],\n queryFn: () => addressesApi.fetchCustomerAddresses(client, jwt),\n enabled: !!jwt,\n });\n\n const { data: paymentMethodsData, isLoading: isLoadingPaymentMethods } =\n useQuery({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n queryFn: () =>\n paymentMethodsApi.fetchCustomerPaymentMethods(client, jwt, countryIso),\n enabled: !!jwt,\n });\n\n const { data: countriesData } = useQuery({\n queryKey: [\"sdk-countries\"],\n queryFn: () =>\n sdkClient.get<Array<{ iso: string; name: string }>>(\"/countries\"),\n initialData: [],\n });\n\n const customerId = accountData?.customer?.id;\n\n const { data: pointsLedgerData, isLoading: isLoadingPointsLedger } = useQuery(\n {\n queryKey: [\"customer-points-ledger\", customerId],\n queryFn: () =>\n sdkClient.get<{ points_ledgers: RawPointsLedgerEntry[] }>(\n `${API_VERSION}/customers/${customerId}/points_ledgers`,\n ),\n enabled: !!customerId,\n },\n );\n\n // -- Mutations --\n\n const updateCustomerMutation = useMutation({\n mutationFn: (data: UserFormData) => {\n const languageIso =\n adaptedLanguages?.find((l) => l.name === data.language)?.iso ?? \"en\";\n return customersApi.updateCustomer(client, jwt, {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n language_iso: languageIso,\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAccount\", userId],\n });\n onToast(\"Profile updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update profile\", \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) =>\n addressesApi.deleteCustomerAddress(client, jwt, addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n paymentMethodsApi.deleteCustomerPaymentMethod(\n client,\n jwt,\n paymentMethodId,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n paymentMethodsApi.updatePaymentMethod(client, jwt, paymentMethodId, {\n set_as_default: data.set_as_default,\n billing_address: data.billing_address,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n },\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) =>\n addressesApi.createCustomerAddress(client, jwt, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\n onToast(\"Address created\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to create address\", \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) => addressesApi.updateCustomerAddress(client, jwt, addressId, body),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayAddresses\", userId],\n });\n onToast(\"Address updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update address\", \"error\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: fluidPay.AddCreditCardData) =>\n paymentMethodsApi.addCreditCardToCustomer(client, jwt, data),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: [\"fluidPayPaymentMethods\", userId, countryIso],\n });\n onToast(\"Payment method added\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to add payment method\", \"error\");\n },\n });\n\n // -- Derived data --\n\n const addresses = addressesData?.addresses ?? [];\n const paymentMethods = paymentMethodsData?.payment_methods ?? [];\n\n const adaptedPointsLedger: PointsLedger[] =\n pointsLedgerData?.points_ledgers?.map(adaptPointsLedger) ?? [];\n\n // MVP: Only English is supported. When the API exposes a languages endpoint, fetch dynamically.\n const adaptedLanguages: Language[] = [{ id: 0, name: \"English\", iso: \"en\" }];\n\n const countryOptions = useMemo(\n () =>\n [...countriesData]\n .map((c) => ({ iso: c.iso, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n\n // -- Loading state --\n\n if (!token) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"rounded-lg border p-4 text-center\">Login Required</div>\n </div>\n );\n }\n\n if (isAccountError && !isLoadingAccount) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"text-muted-foreground text-center text-sm\">\n Unable to load account data. Please try again later.\n </div>\n </div>\n );\n }\n\n if (isLoadingAccount || !accountData) {\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-16 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <ProfileUIProvider t={t}>\n <Profile\n customerAccount={accountData}\n languages={adaptedLanguages}\n onUpdateCustomer={async (data) => {\n await updateCustomerMutation.mutateAsync(data);\n }}\n isUpdatingCustomer={updateCustomerMutation.isPending}\n // MVP: matches admin behavior; a merchant-level flag would be better\n rewardsPointsEnabled={adaptedPointsLedger.length > 0}\n pointsLedger={adaptedPointsLedger}\n isLoadingPointsLedger={isLoadingPointsLedger}\n addresses={addresses}\n isLoadingAddresses={isLoadingAddresses}\n onDeleteAddress={async (addressId) => {\n await deleteAddressMutation.mutateAsync(addressId);\n }}\n isDeletingAddress={deleteAddressMutation.isPending}\n paymentMethods={paymentMethods}\n isLoadingPaymentMethods={isLoadingPaymentMethods}\n onDeletePaymentMethod={async (paymentMethodId) => {\n await deletePaymentMethodMutation.mutateAsync(paymentMethodId);\n }}\n isDeletingPaymentMethod={deletePaymentMethodMutation.isPending}\n onUpdatePaymentMethod={async (paymentMethodId, data) => {\n await updatePaymentMethodMutation.mutateAsync({\n paymentMethodId,\n data,\n });\n }}\n isUpdatingPaymentMethod={updatePaymentMethodMutation.isPending}\n getBillingAddress={(pm) => pm.billing_address ?? null}\n countries={countryOptions}\n renderAddressDialog={({ isOpen, onClose, selectedAddress }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={selectedAddress}\n t={t}\n onSubmit={async (formData) => {\n if (selectedAddress) {\n await updateAddressMutation.mutateAsync({\n addressId: selectedAddress.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n onClose();\n }}\n isSubmitting={\n createAddressMutation.isPending ||\n updateAddressMutation.isPending\n }\n countries={countryOptions}\n renderAddressAutocomplete={({\n control,\n setValue: _setValue,\n }: {\n control: Parameters<\n NonNullable<\n Parameters<\n typeof AddressFormDialog\n >[0][\"renderAddressAutocomplete\"]\n >\n >[0][\"control\"];\n setValue: Parameters<\n NonNullable<\n Parameters<\n typeof AddressFormDialog\n >[0][\"renderAddressAutocomplete\"]\n >\n >[0][\"setValue\"];\n }) => <PlainAddressInput control={control} name=\"address1\" />}\n />\n )}\n renderCreditCardDialog={({ isOpen, onClose }) => (\n <CreditCardFormDialog\n isOpen={isOpen}\n onClose={onClose}\n t={t}\n onSubmit={async (data) => {\n await addCreditCardMutation.mutateAsync(data);\n onClose();\n }}\n isSubmitting={addCreditCardMutation.isPending}\n countries={countryOptions}\n jwt={jwt}\n client={client}\n renderAddressAutocomplete={({\n control,\n setValue: _setValue,\n }: BillingAddressAutocompleteRenderProps) => (\n <PlainAddressInput control={control} name=\"address1\" />\n )}\n />\n )}\n />\n </ProfileUIProvider>\n </div>\n );\n}\n\n/**\n * Plain text input fallback for address autocomplete.\n * The SDK doesn't have Google Places integration.\n */\nfunction PlainAddressInput({\n control,\n name,\n}: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n control: any;\n name: string;\n}): React.JSX.Element {\n const { field } = useController({ control, name: name as string });\n return (\n <input\n type=\"text\"\n value={(field.value as string) ?? \"\"}\n placeholder=\"Address Line 1\"\n className=\"border-input bg-background ring-offset-background placeholder:text-muted-foreground focus-visible:ring-ring flex h-10 w-full rounded-md border px-3 py-2 text-sm file:border-0 file:bg-transparent file:text-sm file:font-medium focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50\"\n onChange={field.onChange}\n />\n );\n}\n","import { type ComponentProps, useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n if (type === \"error\" || type === \"warning\") {\n console.warn(\"[Profile]\", message);\n } else {\n console.info(\"[Profile]\", message);\n }\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Profile</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div {...divProps}>\n <ProfileContentScreen onToast={effectiveToast} countryIso={countryIso} />\n </div>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|