@fluid-app/portal-sdk 0.1.203 → 0.1.204
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/{ProfileScreen-BMNq0NEB.cjs → ProfileScreen-C4hRAZlK.cjs} +1 -1
- package/dist/{ProfileScreen-D-pTegtY.mjs → ProfileScreen-Dz6yvZj8.mjs} +7 -7
- package/dist/ProfileScreen-Dz6yvZj8.mjs.map +1 -0
- package/dist/{ProfileScreen-D5OxmzhM.cjs → ProfileScreen-EtnwUHbd.cjs} +7 -7
- package/dist/ProfileScreen-EtnwUHbd.cjs.map +1 -0
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -7
- package/dist/ProfileScreen-D-pTegtY.mjs.map +0 -1
- package/dist/ProfileScreen-D5OxmzhM.cjs.map +0 -1
|
@@ -39,6 +39,6 @@ require("./TableWidget-DUnz9hrD.cjs");
|
|
|
39
39
|
require("./ToDoWidget-B2qEGt7v.cjs");
|
|
40
40
|
require("./VideoWidget-sEVQcp9o.cjs");
|
|
41
41
|
require("./ScreenHeaderContext-BXgWydjB.cjs");
|
|
42
|
-
const require_ProfileScreen = require("./ProfileScreen-
|
|
42
|
+
const require_ProfileScreen = require("./ProfileScreen-EtnwUHbd.cjs");
|
|
43
43
|
exports.ProfileScreen = require_ProfileScreen.ProfileScreen;
|
|
44
44
|
exports.profileScreenPropertySchema = require_ProfileScreen.profileScreenPropertySchema;
|
|
@@ -916,7 +916,7 @@ function AddressDropdown({ title, displayAddress, addressList, onAddAddressClick
|
|
|
916
916
|
/* @__PURE__ */ jsxs("div", {
|
|
917
917
|
className: "flex flex-row items-center justify-between",
|
|
918
918
|
children: [/* @__PURE__ */ jsx("div", {
|
|
919
|
-
className: "mt-4 mb-1 text-sm
|
|
919
|
+
className: "text-muted-foreground mt-4 mb-1 text-sm",
|
|
920
920
|
children: title
|
|
921
921
|
}), /* @__PURE__ */ jsx(AccordionTrigger, { className: "m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline" })]
|
|
922
922
|
}),
|
|
@@ -928,14 +928,14 @@ function AddressDropdown({ title, displayAddress, addressList, onAddAddressClick
|
|
|
928
928
|
className: "mb-2 flex w-full cursor-pointer flex-col",
|
|
929
929
|
onClick: () => setAddressesValue(accordionItemValue),
|
|
930
930
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
931
|
-
className: "flex items-center text-sm font-medium
|
|
931
|
+
className: "text-foreground flex items-center text-sm font-medium",
|
|
932
932
|
children: [
|
|
933
933
|
formatAddressName(displayAddress),
|
|
934
934
|
", ",
|
|
935
935
|
displayAddress.address1
|
|
936
936
|
]
|
|
937
937
|
}), /* @__PURE__ */ jsxs("div", {
|
|
938
|
-
className: "text-
|
|
938
|
+
className: "text-muted-foreground text-sm",
|
|
939
939
|
children: [
|
|
940
940
|
displayAddress.city,
|
|
941
941
|
", ",
|
|
@@ -954,7 +954,7 @@ function AddressDropdown({ title, displayAddress, addressList, onAddAddressClick
|
|
|
954
954
|
children: [/* @__PURE__ */ jsx("div", {
|
|
955
955
|
className: "flex flex-col",
|
|
956
956
|
children: /* @__PURE__ */ jsxs("div", {
|
|
957
|
-
className: "text-
|
|
957
|
+
className: "text-foreground text-sm",
|
|
958
958
|
children: [
|
|
959
959
|
formatAddressName(address),
|
|
960
960
|
" ",
|
|
@@ -982,7 +982,7 @@ function AddressDropdown({ title, displayAddress, addressList, onAddAddressClick
|
|
|
982
982
|
})]
|
|
983
983
|
})]
|
|
984
984
|
}, address.id)) : /* @__PURE__ */ jsx("div", {
|
|
985
|
-
className: "text-
|
|
985
|
+
className: "text-muted-foreground text-sm",
|
|
986
986
|
children: t("no_saved_addresses_found")
|
|
987
987
|
})
|
|
988
988
|
})
|
|
@@ -990,7 +990,7 @@ function AddressDropdown({ title, displayAddress, addressList, onAddAddressClick
|
|
|
990
990
|
]
|
|
991
991
|
})
|
|
992
992
|
}), showAddButton && /* @__PURE__ */ jsx("button", {
|
|
993
|
-
className: "mt-3 text-left text-sm
|
|
993
|
+
className: "text-foreground mt-3 text-left text-sm",
|
|
994
994
|
onClick: onAddAddressClick,
|
|
995
995
|
children: addAddressLabel
|
|
996
996
|
})]
|
|
@@ -3042,4 +3042,4 @@ const profileScreenPropertySchema = {
|
|
|
3042
3042
|
//#endregion
|
|
3043
3043
|
export { ProfileScreen_exports as n, profileScreenPropertySchema as r, ProfileScreen as t };
|
|
3044
3044
|
|
|
3045
|
-
//# sourceMappingURL=ProfileScreen-
|
|
3045
|
+
//# sourceMappingURL=ProfileScreen-Dz6yvZj8.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfileScreen-Dz6yvZj8.mjs","names":["FormTextField","FormSelectField","FormTextField","FormSelectField","FormSelectField","FormTextField"],"sources":["../../../profile/core/src/context.ts","../../../profile/core/src/provider.tsx","../../../fluid-pay/core/src/context.ts","../../../fluid-pay/core/src/provider.tsx","../../../fluid-pay/core/src/utils/country-config.ts","../../../fluid-pay/core/src/hooks/use-country-states.ts","../../../profile/ui/src/components/ellipses-dropdown.tsx","../../../profile/ui/src/components/confirm-action-dialog.tsx","../../../profile/ui/src/components/customer-points-ledger.tsx","../../../profile/ui/src/components/form-fields.tsx","../../../profile/ui/src/components/user-info-dialog.tsx","../../../profile/ui/src/components/customer-info.tsx","../../../profile/ui/src/components/address-dropdown.tsx","../../../profile/ui/src/components/addresses.tsx","../../../profile/ui/src/components/payment-method-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 { createContext, useContext } from \"react\";\n\nexport type TranslationFn = (key: string) => string;\n\nexport interface ProfileUIContextValue {\n t: TranslationFn;\n}\n\nexport const ProfileUIContext = createContext<ProfileUIContextValue | null>(\n null,\n);\n\nexport function useProfileUI(): ProfileUIContextValue {\n const context = useContext(ProfileUIContext);\n if (!context) {\n throw new Error(\"useProfileUI must be used within a ProfileUIProvider\");\n }\n return context;\n}\n","import type { JSX, ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { ProfileUIContext, type TranslationFn } from \"./context\";\n\nexport interface ProfileUIProviderProps {\n t: TranslationFn;\n children: ReactNode;\n}\n\nexport function ProfileUIProvider({\n t,\n children,\n}: ProfileUIProviderProps): JSX.Element {\n const value = useMemo(() => ({ t }), [t]);\n return (\n <ProfileUIContext.Provider value={value}>\n {children}\n </ProfileUIContext.Provider>\n );\n}\n","import { createContext, useContext } from \"react\";\nimport type { FluidPayApi } from \"./api-interface\";\n\nconst FluidPayApiContext = createContext<FluidPayApi | null>(null);\n\nexport const FluidPayApiProvider = FluidPayApiContext.Provider;\n\nexport function useFluidPayApi(): FluidPayApi {\n const api = useContext(FluidPayApiContext);\n if (!api) {\n throw new Error(\n \"useFluidPayApi must be used within a FluidPayCoreProvider\",\n );\n }\n return api;\n}\n","import type { JSX } from \"react\";\nimport type { FluidPayApi } from \"./api-interface\";\nimport { FluidPayApiProvider } from \"./context\";\n\nexport interface FluidPayCoreProviderProps {\n api: FluidPayApi;\n children: React.ReactNode;\n}\n\nexport function FluidPayCoreProvider({\n api,\n children,\n}: FluidPayCoreProviderProps): JSX.Element {\n return <FluidPayApiProvider value={api}>{children}</FluidPayApiProvider>;\n}\n","export interface State {\n name: string;\n isoCode: string;\n}\n\nexport interface RegionConfig {\n regionLabel: string;\n postalLabel: string;\n}\n\nexport const US_STATES: State[] = [\n { name: \"Alabama\", isoCode: \"AL\" },\n { name: \"Alaska\", isoCode: \"AK\" },\n { name: \"Arizona\", isoCode: \"AZ\" },\n { name: \"Arkansas\", isoCode: \"AR\" },\n { name: \"California\", isoCode: \"CA\" },\n { name: \"Colorado\", isoCode: \"CO\" },\n { name: \"Connecticut\", isoCode: \"CT\" },\n { name: \"Delaware\", isoCode: \"DE\" },\n { name: \"Florida\", isoCode: \"FL\" },\n { name: \"Georgia\", isoCode: \"GA\" },\n { name: \"Hawaii\", isoCode: \"HI\" },\n { name: \"Idaho\", isoCode: \"ID\" },\n { name: \"Illinois\", isoCode: \"IL\" },\n { name: \"Indiana\", isoCode: \"IN\" },\n { name: \"Iowa\", isoCode: \"IA\" },\n { name: \"Kansas\", isoCode: \"KS\" },\n { name: \"Kentucky\", isoCode: \"KY\" },\n { name: \"Louisiana\", isoCode: \"LA\" },\n { name: \"Maine\", isoCode: \"ME\" },\n { name: \"Maryland\", isoCode: \"MD\" },\n { name: \"Massachusetts\", isoCode: \"MA\" },\n { name: \"Michigan\", isoCode: \"MI\" },\n { name: \"Minnesota\", isoCode: \"MN\" },\n { name: \"Mississippi\", isoCode: \"MS\" },\n { name: \"Missouri\", isoCode: \"MO\" },\n { name: \"Montana\", isoCode: \"MT\" },\n { name: \"Nebraska\", isoCode: \"NE\" },\n { name: \"Nevada\", isoCode: \"NV\" },\n { name: \"New Hampshire\", isoCode: \"NH\" },\n { name: \"New Jersey\", isoCode: \"NJ\" },\n { name: \"New Mexico\", isoCode: \"NM\" },\n { name: \"New York\", isoCode: \"NY\" },\n { name: \"North Carolina\", isoCode: \"NC\" },\n { name: \"North Dakota\", isoCode: \"ND\" },\n { name: \"Ohio\", isoCode: \"OH\" },\n { name: \"Oklahoma\", isoCode: \"OK\" },\n { name: \"Oregon\", isoCode: \"OR\" },\n { name: \"Pennsylvania\", isoCode: \"PA\" },\n { name: \"Rhode Island\", isoCode: \"RI\" },\n { name: \"South Carolina\", isoCode: \"SC\" },\n { name: \"South Dakota\", isoCode: \"SD\" },\n { name: \"Tennessee\", isoCode: \"TN\" },\n { name: \"Texas\", isoCode: \"TX\" },\n { name: \"Utah\", isoCode: \"UT\" },\n { name: \"Vermont\", isoCode: \"VT\" },\n { name: \"Virginia\", isoCode: \"VA\" },\n { name: \"Washington\", isoCode: \"WA\" },\n { name: \"West Virginia\", isoCode: \"WV\" },\n { name: \"Wisconsin\", isoCode: \"WI\" },\n { name: \"Wyoming\", isoCode: \"WY\" },\n { name: \"District of Columbia\", isoCode: \"DC\" },\n];\n\nexport const COUNTRY_CONFIGS: Record<string, RegionConfig> = {\n US: { regionLabel: \"State\", postalLabel: \"ZIP Code\" },\n JP: { regionLabel: \"Prefecture\", postalLabel: \"Postal Code\" },\n};\n\nconst DEFAULT_REGION_CONFIG: RegionConfig = {\n regionLabel: \"Province\",\n postalLabel: \"Postal Code\",\n};\n\nexport function getRegionConfig(countryCode: string): RegionConfig {\n return COUNTRY_CONFIGS[countryCode] ?? DEFAULT_REGION_CONFIG;\n}\n\nexport const DEFAULT_ADDRESS_FIELDS = [\n { field: \"first_name\", label: \"First Name\", required: true },\n { field: \"last_name\", label: \"Last Name\", required: true },\n { field: \"address1\", label: \"Address\", required: true },\n { field: \"address2\", label: \"Apartment, suite, etc.\", required: false },\n { field: \"city\", label: \"City\", required: true },\n { field: \"state\", label: \"State\", required: true },\n { field: \"postal_code\", label: \"Postal Code\", required: true },\n { field: \"country_code\", label: \"Country\", required: true },\n];\n","import { useCallback, useState } from \"react\";\nimport {\n US_STATES,\n getRegionConfig,\n type State,\n} from \"../utils/country-config\";\n\nexport default function useCountryStates() {\n const [selectedCountry, setSelectedCountry] = useState<string>(\"US\");\n const [stateOptions, setStateOptions] = useState<State[]>(US_STATES);\n\n const handleCountryChange = useCallback(\n (\n selectedCountryCode: string,\n fetchStates?: (countryCode: string) => Promise<State[]>,\n ) => {\n setSelectedCountry(selectedCountryCode);\n if (selectedCountryCode === \"US\") {\n setStateOptions(US_STATES);\n } else if (fetchStates) {\n fetchStates(selectedCountryCode)\n .then((states) => setStateOptions(states))\n .catch((error) => {\n console.error(\"Failed to fetch states:\", error);\n setStateOptions([]);\n });\n } else {\n setStateOptions([]);\n }\n },\n [],\n );\n\n const config = getRegionConfig(selectedCountry);\n\n return { handleCountryChange, stateOptions, config, selectedCountry };\n}\n","import type { JSX } from \"react\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n Button,\n} from \"@fluid-app/ui-primitives\";\n\nexport default function EllipsesDropdown({\n onDelete,\n onEdit,\n editLabel = \"Edit\",\n deleteLabel = \"Delete\",\n disabled = false,\n}: {\n onDelete?: () => void;\n onEdit?: () => void;\n editLabel?: string;\n deleteLabel?: string;\n disabled?: boolean;\n}): JSX.Element {\n if (disabled) {\n return (\n <Button\n variant=\"ghost\"\n disabled\n className=\"cursor-not-allowed opacity-50\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 128 512\"\n className=\"h-4 w-1 fill-gray-400\"\n >\n <path d=\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\" />\n </svg>\n </Button>\n );\n }\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 128 512\"\n className=\"h-4 w-1 fill-gray-400\"\n >\n <path d=\"M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z\" />\n </svg>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"min-w-20 space-y-1 text-sm text-gray-900\">\n {onEdit && (\n <>\n <DropdownMenuItem\n className=\"flex cursor-pointer flex-row items-center justify-between space-x-2 rounded px-2 hover:bg-gray-50\"\n onClick={(e) => {\n e.stopPropagation();\n onEdit();\n }}\n >\n <span>{editLabel}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 512 512\"\n className=\"h-2.5 w-2.5 fill-current\"\n >\n <path d=\"M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z\" />\n </svg>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n className=\"flex cursor-pointer flex-row items-center justify-between space-x-2 rounded px-2 text-red-500 hover:bg-red-50\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete?.();\n }}\n >\n <span>{deleteLabel}</span>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 448 512\"\n className=\"h-2.5 w-2.5 fill-red-500\"\n >\n <path d=\"M135.2 17.7C140.6 6.8 151.7 0 163.8 0L284.2 0c12.1 0 23.2 6.8 28.6 17.7L320 32l80 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L48 96C30.3 96 16 81.7 16 64S30.3 32 48 32l80 0 7.2-14.3zM32 128l384 0 0 320c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-320z\" />\n </svg>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","import type { JSX } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\ntype ConfirmActionDialogProps = {\n title: string;\n description: string;\n onAction: () => void;\n openDialog: boolean;\n setOpenDialog: (open: boolean) => void;\n errorMsg?: string;\n isLoading?: boolean;\n actionText?: string;\n};\n\nexport default function ConfirmActionDialog({\n title,\n description,\n onAction,\n openDialog,\n setOpenDialog,\n errorMsg,\n isLoading,\n actionText = \"Delete\",\n}: ConfirmActionDialogProps): JSX.Element {\n const { t } = useProfileUI();\n\n return (\n <Dialog open={openDialog} onOpenChange={setOpenDialog}>\n <DialogContent className=\"max-w-sm rounded md:w-90\">\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {title}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p className=\"text-left text-sm text-gray-500\">{description}</p>\n </div>\n\n {errorMsg && <p className=\"text-sm text-red-500\">{errorMsg}</p>}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between space-x-2\">\n <DialogClose asChild>\n <Button\n className=\"min-w-[70px] rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={() => setOpenDialog(false)}\n >\n {t(\"cancel\")}\n </Button>\n </DialogClose>\n <Button\n type=\"button\"\n className=\"min-w-[70px] rounded bg-red-600 p-3 text-white hover:bg-red-700\"\n onClick={onAction}\n disabled={isLoading}\n >\n {isLoading ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n actionText\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport {\n useProfileUI,\n type TranslationFn,\n type PointsLedger,\n} from \"@fluid-app/profile-core\";\n\nfunction formatTransactionType(ledger: PointsLedger, t: TranslationFn): string {\n const transactionType = ledger.metadata.transaction_type;\n\n if (!transactionType) {\n if (ledger.metadata.source) {\n return ledger.amount > 0 ? t(\"points_awarded\") : t(\"points_redeemed\");\n }\n return t(\"transaction\");\n }\n\n const translationKey = transactionType.toLowerCase().replace(/ /g, \"_\");\n const translated = t(translationKey);\n\n if (translated !== translationKey) {\n return translated;\n }\n\n return transactionType\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction formatPoints(amount: number): string {\n const prefix = amount >= 0 ? \"+\" : \"\";\n return `${prefix}${amount}`;\n}\n\nfunction formatDateTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(undefined, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nexport interface CustomerPointsLedgerProps {\n pointsLedger: PointsLedger[];\n isLoading?: boolean;\n}\n\nexport default function CustomerPointsLedger({\n pointsLedger,\n isLoading = false,\n}: CustomerPointsLedgerProps): JSX.Element {\n const [accordionValue, setAccordionValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n const availablePoints = pointsLedger[0]?.total_balance ?? 0;\n\n return (\n <div className=\"mb-6 border-b border-gray-300 pb-4\">\n <Accordion\n type=\"single\"\n collapsible\n value={accordionValue}\n onValueChange={setAccordionValue}\n className=\"w-full\"\n >\n <AccordionItem value=\"points-history\" className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"mt-4 mb-1 text-sm text-gray-400\">\n {t(\"points_history\")}\n </div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {isLoading && <Skeleton className=\"h-6 w-full\" />}\n\n {!isLoading && !accordionValue && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setAccordionValue(\"points-history\")}\n >\n <div className=\"text-sm font-semibold text-gray-900\">\n {availablePoints.toLocaleString()}{\" \"}\n <span className=\"font-normal text-gray-500\">\n {t(\"points_available\").toLowerCase()}\n </span>\n </div>\n </div>\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mb-3 flex w-full flex-col\">\n <div className=\"text-sm font-semibold text-gray-900\">\n {availablePoints.toLocaleString()}{\" \"}\n <span className=\"font-normal text-gray-500\">\n {t(\"points_available\").toLowerCase()}\n </span>\n </div>\n </div>\n\n <div className=\"flex flex-col space-y-0\">\n {pointsLedger.length > 0 ? (\n pointsLedger.map((ledger) => (\n <div\n key={ledger.id}\n className=\"relative flex flex-row items-start justify-between py-3\"\n >\n <div className=\"absolute top-3 left-0\">\n <div className=\"mt-1.5 h-2 w-2 flex-shrink-0 rounded-full border border-gray-300\" />\n <div className=\"mr-1 h-10 border-r border-gray-200\" />\n </div>\n <div className=\"ml-6 flex flex-row items-start space-x-3\">\n <div className=\"flex flex-col\">\n <div className=\"text-sm font-medium text-gray-900\">\n {formatTransactionType(ledger, t)}\n </div>\n <div className=\"text-sm text-gray-500\">\n {formatDateTime(ledger.created_at)}\n </div>\n </div>\n </div>\n <div\n className={cn(\n \"text-sm font-medium\",\n ledger.amount >= 0 ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {formatPoints(ledger.amount)}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-sm text-gray-500\">\n {t(\"no_points_history_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n </div>\n );\n}\n","import {\n useController,\n type Control,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\";\nimport {\n Input,\n Label,\n Select,\n SelectTrigger,\n SelectContent,\n SelectItem,\n SelectValue,\n cn,\n} from \"@fluid-app/ui-primitives\";\n\nexport type NameValue = { name: string; value: string | number };\n\nexport function FormTextField<T extends FieldValues>({\n control,\n name,\n label,\n containerClassName,\n ...props\n}: {\n control: Control<T>;\n name: FieldPath<T>;\n label?: string;\n containerClassName?: string;\n} & Omit<React.ComponentProps<\"input\">, \"name\">) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n {label && (\n <Label htmlFor={name} className=\"mb-1.5 block text-sm font-medium\">\n {label}\n </Label>\n )}\n <Input\n {...field}\n {...props}\n id={name}\n value={field.value ?? \"\"}\n className={cn(error && \"ring-1 ring-red-500\", props.className)}\n />\n {error && <p className=\"text-sm text-red-500\">{error.message}</p>}\n </div>\n );\n}\n\nexport function FormSelectField<T extends FieldValues>({\n control,\n name,\n label,\n options,\n placeholder,\n containerClassName,\n onChange,\n}: {\n control: Control<T>;\n name: FieldPath<T>;\n label?: string;\n options?: NameValue[];\n placeholder?: string;\n containerClassName?: string;\n onChange?: (value: string) => void;\n}) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n {label && (\n <Label htmlFor={name} className=\"block text-sm font-medium\">\n {label}\n </Label>\n )}\n <Select\n value={field.value?.toString() ?? \"\"}\n onValueChange={(val) => {\n field.onChange(val);\n onChange?.(val);\n }}\n >\n <SelectTrigger className={cn(error && \"ring-1 ring-red-500\")}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options?.map((opt) => (\n <SelectItem\n key={`${opt.name}-${opt.value}`}\n value={opt.value.toString()}\n >\n {opt.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {error && <p className=\"text-sm text-red-500\">{error.message}</p>}\n </div>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport type { Control } from \"react-hook-form\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n Input,\n} from \"@fluid-app/ui-primitives\";\nimport { Info } from \"lucide-react\";\nimport { FormTextField, FormSelectField, type NameValue } from \"./form-fields\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\nexport type UserFormData = {\n first_name: string;\n last_name: string;\n phone_number?: string;\n language: string;\n};\n\nexport default function UserInfoDialog({\n control,\n isOpen,\n onSubmit,\n handleClose,\n languageOptions,\n errorMsg,\n isSubmitting,\n email,\n onChangeEmail,\n isChangingEmail,\n pendingEmail,\n}: {\n control: Control<UserFormData>;\n isOpen: boolean;\n onSubmit: () => void;\n handleClose: () => void;\n languageOptions?: NameValue[];\n errorMsg: string | undefined;\n isSubmitting: boolean;\n email?: string;\n onChangeEmail?: (newEmail: string) => Promise<void> | void;\n isChangingEmail?: boolean;\n pendingEmail?: string;\n}): JSX.Element {\n const { t } = useProfileUI();\n const [isEditingEmail, setIsEditingEmail] = useState(false);\n const [newEmail, setNewEmail] = useState(\"\");\n const [emailError, setEmailError] = useState<string | undefined>(undefined);\n\n const handleEmailSubmit = async () => {\n setEmailError(undefined);\n const trimmed = newEmail.trim();\n if (!trimmed) {\n setEmailError(\"Please enter a new email address\");\n return;\n }\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(trimmed)) {\n setEmailError(\"Please enter a valid email address\");\n return;\n }\n if (email && trimmed.toLowerCase() === email.toLowerCase()) {\n setEmailError(\"New email must be different from your current email\");\n return;\n }\n try {\n await onChangeEmail?.(trimmed);\n setIsEditingEmail(false);\n setNewEmail(\"\");\n } catch (err) {\n setEmailError(\n err instanceof Error ? err.message : \"Failed to initiate email change\",\n );\n }\n };\n\n const handleCancelEmailEdit = () => {\n setIsEditingEmail(false);\n setNewEmail(\"\");\n setEmailError(undefined);\n };\n\n const handleDialogClose = () => {\n handleCancelEmailEdit();\n handleClose();\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleDialogClose()}>\n <DialogContent className=\"max-w-sm rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium text-gray-900\">\n {t(\"edit_profile\")}\n </DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <FormTextField\n control={control}\n name=\"first_name\"\n label={t(\"first_name\")}\n />\n <FormTextField\n control={control}\n name=\"last_name\"\n label={t(\"last_name\")}\n />\n <FormTextField\n control={control}\n name=\"phone_number\"\n label={t(\"phone_number\")}\n type=\"tel\"\n />\n <FormSelectField\n control={control}\n name=\"language\"\n label={t(\"language\")}\n options={languageOptions}\n placeholder={t(\"select_an_option\")}\n />\n </div>\n {email && (\n <div className=\"space-y-2\">\n <label className=\"text-foreground text-sm font-medium\">\n {t(\"email\") || \"Email\"}\n </label>\n {isEditingEmail ? (\n <div className=\"space-y-2\">\n <Input\n type=\"email\"\n placeholder=\"Enter your new email...\"\n value={newEmail}\n onChange={(e) => {\n setNewEmail(e.target.value);\n setEmailError(undefined);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleEmailSubmit();\n }\n if (e.key === \"Escape\") {\n handleCancelEmailEdit();\n }\n }}\n aria-invalid={!!emailError || undefined}\n autoFocus\n />\n {emailError && (\n <p className=\"text-xs text-red-500\">{emailError}</p>\n )}\n <div className=\"bg-muted flex items-start gap-2.5 rounded-md px-3 py-2.5\">\n <Info className=\"text-primary mt-0.5 h-4 w-4 shrink-0\" />\n <p className=\"text-muted-foreground text-xs\">\n We'll send a verification link to your new email. Click\n it to complete the change.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={handleCancelEmailEdit}\n className=\"cursor-pointer\"\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={handleEmailSubmit}\n disabled={!newEmail.trim() || isChangingEmail}\n className=\"cursor-pointer\"\n >\n {isChangingEmail && (\n <div className=\"mr-2 h-3.5 w-3.5 animate-spin rounded-full border-2 border-current/30 border-t-current\" />\n )}\n {isChangingEmail ? \"Sending...\" : \"Send verification\"}\n </Button>\n </div>\n </div>\n ) : pendingEmail ? (\n <div className=\"space-y-2\">\n <div className=\"bg-muted text-muted-foreground min-w-0 rounded-md px-3 py-2 text-sm\">\n {email}\n </div>\n <div className=\"bg-muted flex items-start gap-2.5 rounded-md px-3 py-2.5\">\n <Info className=\"text-primary mt-0.5 h-4 w-4 shrink-0\" />\n <p className=\"text-muted-foreground text-xs\">\n Changing to{\" \"}\n <span className=\"text-foreground font-medium\">\n {pendingEmail}\n </span>\n . Check your new email inbox and click the verification link\n to complete the change.\n </p>\n </div>\n </div>\n ) : (\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-muted text-muted-foreground min-w-0 flex-1 rounded-md px-3 py-2 text-sm\">\n {email}\n </div>\n {onChangeEmail && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setIsEditingEmail(true)}\n className=\"shrink-0 cursor-pointer\"\n >\n Change\n </Button>\n )}\n </div>\n )}\n </div>\n )}\n {errorMsg && <p className=\"text-sm text-red-500\">{errorMsg}</p>}\n <DialogFooter className=\"flex flex-row items-center justify-end\">\n <div className=\"flex-1 text-right\">\n <Button type=\"button\" onClick={onSubmit} className=\"cursor-pointer\">\n {isSubmitting && (\n <div className=\"mr-2 h-4 w-4 animate-spin rounded-full border-2 border-current/30 border-t-current\" />\n )}\n {isSubmitting ? t(\"saving\") : t(\"save_changes\")}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo, useState, type JSX } from \"react\";\nimport { z } from \"zod\";\nimport { Avatar, AvatarFallback, useZodForm } from \"@fluid-app/ui-primitives\";\nimport { Info, Pencil } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { NameValue } from \"./form-fields\";\nimport { useProfileUI, type Language } from \"@fluid-app/profile-core\";\nimport UserInfoDialog, { type UserFormData } from \"./user-info-dialog\";\n\nfunction createUserInfoSchema(messages: {\n firstNameRequired: string;\n lastNameRequired: string;\n languageRequired: string;\n}) {\n return z.object({\n first_name: z.string().min(1, { message: messages.firstNameRequired }),\n last_name: z.string().min(1, { message: messages.lastNameRequired }),\n phone_number: z.string().optional(),\n language: z.string().min(1, { message: messages.languageRequired }),\n });\n}\n\nexport interface PendingEmailChange {\n newEmail: string;\n newEmailConfirmed: boolean;\n expiresAt: string;\n}\n\nexport interface CustomerInfoProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: (data: UserFormData) => Promise<void> | void;\n isUpdating?: boolean;\n onChangeEmail?: (newEmail: string) => Promise<void> | void;\n isChangingEmail?: boolean;\n pendingEmailChange?: PendingEmailChange;\n onCancelEmailChange?: () => void;\n pendingEmail?: string;\n}\n\nexport default function CustomerInfo({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdating = false,\n onChangeEmail,\n isChangingEmail = false,\n pendingEmailChange,\n onCancelEmailChange,\n pendingEmail,\n}: CustomerInfoProps): JSX.Element {\n const [isEditDialogOpen, setIsEditDialogOpen] = useState(false);\n const [updateError, setUpdateError] = useState<string | undefined>(undefined);\n\n const { t } = useProfileUI();\n\n const { first_name, full_name } = customerAccount.customer;\n const derivedLastName = full_name.startsWith(first_name)\n ? full_name.slice(first_name.length).trim()\n : \"\";\n const userInitial = first_name\n ? first_name.charAt(0).toUpperCase()\n : (customerAccount.customer.email?.charAt(0).toUpperCase() ?? \"\");\n const customerLanguage = languages?.find(\n (language) =>\n language.iso === customerAccount.fluid_pay_account.language_iso,\n )?.name;\n\n const languageOptions: NameValue[] | undefined = languages?.map(\n (language) => ({\n name: language.name,\n value: language.name,\n }),\n );\n\n const schema = useMemo(\n () =>\n createUserInfoSchema({\n firstNameRequired: t(\"first_name_is_required\"),\n lastNameRequired: t(\"last_name_is_required\"),\n languageRequired: t(\"language_is_required\"),\n }),\n [t],\n );\n\n const { control, handleSubmit, reset } = useZodForm<UserFormData>(schema, {\n defaultValues: {\n first_name: customerAccount.customer.first_name || \"\",\n last_name: derivedLastName,\n phone_number: customerAccount.customer.phone || \"\",\n language: customerLanguage || \"English\",\n },\n });\n\n const handleOpenEditDialog = () => {\n reset({\n first_name: customerAccount.customer.first_name || \"\",\n last_name: derivedLastName,\n phone_number: customerAccount.customer.phone || \"\",\n language: customerLanguage || \"English\",\n });\n setIsEditDialogOpen(true);\n };\n\n const handleCloseEditDialog = () => {\n setIsEditDialogOpen(false);\n setUpdateError(undefined);\n };\n\n const onSubmitUserInfo = handleSubmit(async (data: UserFormData) => {\n try {\n await onUpdateCustomer(data);\n setIsEditDialogOpen(false);\n } catch (error) {\n console.error(\"Error updating profile:\", error);\n setUpdateError(\n \"Error updating profile. Please verify your information and try again.\",\n );\n }\n });\n\n return (\n <>\n <div className=\"mb-6 flex flex-row items-center justify-between space-x-2 border-b border-gray-300 pb-4\">\n <div className=\"flex flex-row items-center space-x-2\">\n <Avatar>\n <AvatarFallback>{userInitial}</AvatarFallback>\n </Avatar>\n <div className=\"flex flex-col\">\n {first_name ? (\n <>\n <p className=\"text-sm font-medium\">\n {customerAccount.customer.full_name}\n </p>\n <p className=\"text-sm text-gray-500\">\n {customerAccount.customer.email}\n </p>\n </>\n ) : (\n <p className=\"text-sm font-medium\">\n {customerAccount.customer.email}\n </p>\n )}\n </div>\n </div>\n <button\n className=\"cursor-pointer rounded-md border border-gray-300 p-1 hover:bg-gray-50 disabled:opacity-50\"\n onClick={handleOpenEditDialog}\n >\n <Pencil className=\"h-2.5 w-2.5 text-gray-400\" />\n </button>\n </div>\n\n {pendingEmailChange && (\n <div className=\"bg-muted mb-6 flex items-start gap-2.5 rounded-md px-3 py-3\">\n <Info className=\"text-primary mt-0.5 h-4 w-4 shrink-0\" />\n <div className=\"flex-1 space-y-2\">\n <p className=\"text-foreground text-sm font-medium\">\n Email change pending\n </p>\n <p className=\"text-muted-foreground text-xs\">\n Your email is being changed to{\" \"}\n <span className=\"text-foreground font-medium\">\n {pendingEmailChange.newEmail}\n </span>\n .{\" \"}\n {pendingEmailChange.newEmailConfirmed\n ? \"Your new email has been verified.\"\n : \"Check your new inbox and click the verification link to complete the change.\"}{\" \"}\n {(() => {\n const diff =\n new Date(pendingEmailChange.expiresAt).getTime() - Date.now();\n if (diff <= 0) return \"This request has expired.\";\n const days = Math.ceil(diff / (1000 * 60 * 60 * 24));\n return `This request expires in ${days === 1 ? \"1 day\" : `${days} days`}.`;\n })()}\n </p>\n {onCancelEmailChange && (\n <button\n type=\"button\"\n onClick={onCancelEmailChange}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 cursor-pointer rounded-md px-3 py-1.5 text-xs font-medium\"\n >\n Cancel change\n </button>\n )}\n </div>\n </div>\n )}\n\n <UserInfoDialog\n control={control}\n isOpen={isEditDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={handleCloseEditDialog}\n languageOptions={languageOptions}\n errorMsg={updateError}\n isSubmitting={isUpdating}\n email={customerAccount.customer.email}\n onChangeEmail={onChangeEmail}\n isChangingEmail={isChangingEmail}\n pendingEmail={pendingEmail}\n />\n </>\n );\n}\n","import { useState } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\n\nfunction formatAddressName(address: fluidPay.CustomerAddress): string {\n return address.name ?? \"\";\n}\n\ninterface AddressDropdownProps {\n title: string;\n displayAddress: fluidPay.CustomerAddress | null;\n addressList: fluidPay.CustomerAddress[];\n onAddAddressClick: () => void;\n onEditAddress?: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress?: (address: fluidPay.CustomerAddress) => void;\n accordionItemValue: string;\n addAddressLabel: string;\n showAddButton?: boolean;\n borderStyle?: string;\n className?: string;\n showActions?: boolean;\n isLoading?: boolean;\n}\n\nexport default function AddressDropdown({\n title,\n displayAddress,\n addressList,\n onAddAddressClick,\n onEditAddress,\n onDeleteAddress,\n accordionItemValue,\n addAddressLabel,\n showAddButton = true,\n borderStyle = \"border-b border-gray-300 pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: AddressDropdownProps) {\n const [addressesValue, setAddressesValue] = useState<string>(\"\");\n const { t } = useProfileUI();\n\n return (\n <div className={`${borderStyle} ${className}`}>\n <Accordion\n type=\"single\"\n collapsible\n value={addressesValue}\n onValueChange={setAddressesValue}\n className=\"w-full\"\n >\n <AccordionItem value={accordionItemValue} className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"text-muted-foreground mt-4 mb-1 text-sm\">\n {title}\n </div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {isLoading && (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-2/3\" />\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n )}\n\n {!isLoading && !addressesValue && displayAddress && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setAddressesValue(accordionItemValue)}\n >\n <div className=\"text-foreground flex items-center text-sm font-medium\">\n {formatAddressName(displayAddress)}, {displayAddress.address1}\n </div>\n <div className=\"text-muted-foreground text-sm\">\n {displayAddress.city}, {displayAddress.state}{\" \"}\n {displayAddress.postal_code}\n </div>\n </div>\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mt-2 flex flex-col justify-between space-y-4 px-0.5\">\n {addressList.length > 0 ? (\n addressList.map((address, index) => (\n <div\n key={address.id}\n className={cn(\n \"flex min-h-[48px] w-full flex-row items-center justify-between space-x-2 px-2\",\n {\n \"items-center border-b border-gray-300 p-3\":\n addressList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-col\">\n <div className=\"text-foreground text-sm\">\n {formatAddressName(address)} <br />\n {address.address1} <br />\n {address.city}, {address.state} {address.postal_code}\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {address.default && (\n <p className=\"mt-1 w-fit rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() => onDeleteAddress?.(address)}\n onEdit={() => onEditAddress?.(address)}\n editLabel={t(\"edit\")}\n deleteLabel={t(\"delete\")}\n />\n )}\n </div>\n </div>\n ))\n ) : (\n <div className=\"text-muted-foreground text-sm\">\n {t(\"no_saved_addresses_found\")}\n </div>\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"text-foreground mt-3 text-left text-sm\"\n onClick={onAddAddressClick}\n >\n {addAddressLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useState, type JSX, type ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport ConfirmActionDialog from \"./confirm-action-dialog\";\nimport AddressDropdown from \"./address-dropdown\";\n\nexport interface AddressDialogRenderProps {\n isOpen: boolean;\n onClose: () => void;\n selectedAddress: fluidPay.CustomerAddress | null;\n}\n\nexport interface AddressesProps {\n addresses: fluidPay.CustomerAddress[];\n isLoading?: boolean;\n onCreateAddress?: () => void;\n onDeleteAddress: (addressId: number) => Promise<void> | void;\n isDeletingAddress?: boolean;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n}\n\nexport default function Addresses({\n addresses,\n isLoading = false,\n onCreateAddress,\n onDeleteAddress,\n isDeletingAddress = false,\n renderAddressDialog,\n}: AddressesProps): JSX.Element {\n const [openAddressDialog, setOpenAddressDialog] = useState(false);\n const [openDeleteDialog, setOpenDeleteDialog] = useState(false);\n const [selectedAddress, setSelectedAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [deleteAddressError, setDeleteAddressError] = useState<\n string | undefined\n >(undefined);\n\n const { t } = useProfileUI();\n\n const defaultAddress =\n addresses.find((addr) => addr.default) ?? addresses[0] ?? null;\n\n const handleDeleteClick = (address: fluidPay.CustomerAddress) => {\n setSelectedAddress(address);\n setDeleteAddressError(undefined);\n requestAnimationFrame(() => {\n setOpenDeleteDialog(true);\n });\n };\n\n const handleEditClick = (address: fluidPay.CustomerAddress) => {\n setSelectedAddress(address);\n requestAnimationFrame(() => {\n setOpenAddressDialog(true);\n });\n };\n\n const handleDeleteAddress = async () => {\n if (!selectedAddress) return;\n try {\n await onDeleteAddress(selectedAddress.id);\n setDeleteAddressError(undefined);\n setOpenDeleteDialog(false);\n setSelectedAddress(null);\n } catch {\n setDeleteAddressError(\n \"We were unable to delete this address. Please try again.\",\n );\n }\n };\n\n const handleAddClick = () => {\n setSelectedAddress(null);\n if (onCreateAddress) {\n onCreateAddress();\n }\n setOpenAddressDialog(true);\n };\n\n const handleCloseAddressDialog = () => {\n setOpenAddressDialog(false);\n setSelectedAddress(null);\n };\n\n return (\n <>\n <AddressDropdown\n title={t(\"shipping_addresses\")}\n displayAddress={defaultAddress}\n addressList={addresses}\n onAddAddressClick={handleAddClick}\n onEditAddress={handleEditClick}\n onDeleteAddress={handleDeleteClick}\n accordionItemValue=\"addresses\"\n addAddressLabel={`+ ${t(\"add_an_address\")}`}\n showAddButton={true}\n borderStyle=\"border-b border-gray-300 pb-4 mb-6\"\n showActions={true}\n isLoading={isLoading}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n onAction={handleDeleteAddress}\n actionText={t(\"delete\")}\n openDialog={openDeleteDialog}\n setOpenDialog={setOpenDeleteDialog}\n errorMsg={deleteAddressError}\n isLoading={isDeletingAddress}\n />\n\n {renderAddressDialog?.({\n isOpen: openAddressDialog,\n onClose: handleCloseAddressDialog,\n selectedAddress,\n })}\n </>\n );\n}\n","import { useState } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\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\nconst PAYMENT_ICON_BASE = \"https://assets.fluid.app/images/payment_icons\";\nconst GENERIC_PAYMENT_ICON = `${PAYMENT_ICON_BASE}/generic.svg`;\n\nfunction brandIconUrl(brand: string | null | undefined): string {\n if (!brand) return GENERIC_PAYMENT_ICON;\n const slug = brand.toLowerCase().replace(/\\s+/g, \"_\");\n return `${PAYMENT_ICON_BASE}/${slug}.svg`;\n}\n\nfunction PaymentIcon({\n logoUrl,\n brand,\n alt,\n}: {\n logoUrl?: string;\n brand: string | null | undefined;\n alt: string;\n}) {\n const computedSrc = logoUrl || brandIconUrl(brand);\n const [hasError, setHasError] = useState(false);\n const src = hasError ? GENERIC_PAYMENT_ICON : computedSrc;\n return (\n <img\n src={src}\n alt={alt}\n width={40}\n height={24}\n className=\"object-contain\"\n onError={() => setHasError(true)}\n />\n );\n}\n\nfunction getCardDisplayName(\n paymentMethod: fluidPay.CustomerPaymentMethod,\n): string {\n const lastFour = paymentMethod.details.last_four;\n if (lastFour != null || paymentMethod.payment_type === \"Credit Card\") {\n const brand = paymentMethod.details.card_type || \"Card\";\n return `${brand} •••• ${lastFour || \"••••\"}`;\n }\n return paymentMethod.payment_type;\n}\n\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-border pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n}: PaymentMethodDropdownProps) {\n const [paymentsValue, setPaymentsValue] = useState<string>(\"\");\n\n const renderPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => (\n <div className=\"flex flex-row items-center space-x-2\">\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={paymentMethod.details.logo_url}\n brand={paymentMethod.details.card_type}\n alt={paymentMethod.details.card_type ?? \"Payment Method\"}\n />\n </div>\n <div className=\"flex flex-col\">\n <div className=\"text-foreground flex items-center text-sm font-medium capitalize\">\n {getCardDisplayName(paymentMethod)}\n </div>\n {getCardExpiry(paymentMethod) && (\n <div className=\"text-muted-foreground text-sm\">\n {getCardExpiry(paymentMethod)}\n </div>\n )}\n </div>\n </div>\n );\n\n return (\n <div className={`${borderStyle} ${className}`}>\n <Accordion\n type=\"single\"\n collapsible\n value={paymentsValue}\n onValueChange={setPaymentsValue}\n className=\"w-full\"\n >\n <AccordionItem value={accordionItemValue} className=\"border-b-0\">\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"text-muted-foreground mt-4 mb-1 text-sm\">\n {title}\n </div>\n <AccordionTrigger className=\"m-0 ml-2 flex h-auto min-h-0 w-auto py-0 hover:no-underline\" />\n </div>\n\n {!paymentsValue && isLoading ? (\n <div className=\"mb-2 flex w-full flex-row items-center space-x-2\">\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col space-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n ) : (\n !paymentsValue &&\n displayPaymentMethod && (\n <div\n className=\"mb-2 flex w-full cursor-pointer flex-col\"\n onClick={() => setPaymentsValue(accordionItemValue)}\n >\n {renderPaymentMethod(displayPaymentMethod)}\n </div>\n )\n )}\n\n <AccordionContent className=\"max-h-[400px] overflow-y-auto pt-2\">\n <div className=\"mt-2 flex flex-col justify-between space-y-4 px-0.5\">\n {isLoading ? (\n <>\n {[1, 2].map((i) => (\n <div\n key={`skeleton-${i}`}\n className=\"bg-muted items-center rounded p-3\"\n >\n <div className=\"flex flex-row items-center justify-between\">\n <div className=\"flex flex-row items-center space-x-2\">\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col space-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n <Skeleton className=\"h-6 w-6\" />\n </div>\n </div>\n ))}\n </>\n ) : (\n paymentMethodList.map((paymentMethod, index) => (\n <div\n key={paymentMethod.id}\n className={cn(\n \"flex min-h-[48px] w-full flex-row items-center justify-between space-x-2 px-2\",\n {\n \"border-border items-center border-b p-3\":\n paymentMethodList.length - 1 !== index,\n },\n )}\n >\n <div className=\"flex flex-row items-center space-x-2\">\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={paymentMethod.details.logo_url}\n brand={paymentMethod.details.card_type}\n alt={\n paymentMethod.details.card_type ?? \"Payment Method\"\n }\n />\n </div>\n <div className=\"flex flex-col\">\n <div className=\"text-foreground flex items-center text-sm font-medium capitalize\">\n {getCardDisplayName(paymentMethod)}\n </div>\n {getCardExpiry(paymentMethod) && (\n <div className=\"text-muted-foreground text-sm\">\n {getCardExpiry(paymentMethod)}\n </div>\n )}\n </div>\n </div>\n <div className=\"flex flex-row items-center space-x-2\">\n {paymentMethod.default && (\n <p className=\"bg-secondary text-secondary-foreground mt-1 w-fit rounded px-2 py-0.5 text-xs font-medium\">\n Default\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() =>\n onDeletePaymentMethod?.(paymentMethod)\n }\n deleteLabel=\"Delete\"\n onEdit={() => onEditPaymentMethod?.(paymentMethod)}\n editLabel=\"Edit\"\n />\n )}\n </div>\n </div>\n ))\n )}\n </div>\n </AccordionContent>\n </AccordionItem>\n </Accordion>\n\n {showAddButton && (\n <button\n className=\"text-foreground mt-3 text-left text-sm\"\n onClick={onAddPaymentMethodClick}\n >\n {addPaymentMethodLabel}\n </button>\n )}\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n DialogClose,\n Button,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\n\nexport interface BillingAddress {\n name?: string | null;\n address1?: string | null;\n address2?: string | null;\n city?: string | null;\n state?: string | null;\n zip?: string | null;\n country_code?: string | null;\n}\n\ninterface ViewPaymentMethodDialogProps {\n isOpen: boolean;\n paymentMethod: fluidPay.CustomerPaymentMethod | null;\n billingAddress?: BillingAddress | null;\n onClose: () => void;\n onEdit?: () => void;\n}\n\nexport default function ViewPaymentMethodDialog({\n isOpen,\n paymentMethod,\n billingAddress,\n onClose,\n onEdit,\n}: ViewPaymentMethodDialogProps): JSX.Element | null {\n const { t } = useProfileUI();\n\n if (!paymentMethod) return null;\n\n const { details } = paymentMethod;\n const cardBrand = details.card_type ?? \"Card\";\n const lastFour = details.last_four ?? \"****\";\n const expMonth = details.exp_month;\n const expYear = details.exp_year;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-w-sm rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium\">\n {t(\"edit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div>\n <div className=\"rounded-lg bg-gray-50 p-4\">\n <div className=\"flex items-center space-x-3\">\n {details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={details.logo_url}\n alt={cardBrand}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-gray-900\">\n {cardBrand} •••• {lastFour}\n </span>\n {expMonth != null && expYear != null && (\n <span className=\"text-sm text-gray-500\">\n {t(\"card_expires\")} {expMonth}/{expYear}\n </span>\n )}\n </div>\n </div>\n {paymentMethod.default && (\n <span className=\"mt-2 inline-block rounded bg-gray-500 px-2 py-0.5 text-xs font-medium text-white\">\n {t(\"default\")}\n </span>\n )}\n </div>\n </div>\n\n <div>\n <div className=\"mb-2 flex items-center justify-between\">\n <h3 className=\"text-sm font-medium text-gray-900\">\n {t(\"billing_address\")}\n </h3>\n {onEdit && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto p-0 text-sm text-gray-600 underline hover:bg-transparent\"\n onClick={onEdit}\n >\n {t(\"edit\")}\n </Button>\n )}\n </div>\n <div className=\"rounded-lg bg-gray-50 p-4\">\n {billingAddress ? (\n <div className=\"space-y-1 text-sm text-gray-900\">\n {billingAddress.name && <p>{billingAddress.name}</p>}\n <p>{billingAddress.address1}</p>\n {billingAddress.address2 && <p>{billingAddress.address2}</p>}\n <p>\n {billingAddress.city}, {billingAddress.state}{\" \"}\n {billingAddress.zip}\n </p>\n <p>{billingAddress.country_code}</p>\n </div>\n ) : (\n <p className=\"text-sm text-gray-500 italic\">\n {t(\"no_billing_address\")}\n </p>\n )}\n </div>\n </div>\n </div>\n\n <DialogFooter>\n <DialogClose asChild>\n <Button\n className=\"rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={onClose}\n >\n {t(\"close\")}\n </Button>\n </DialogClose>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, type JSX } from \"react\";\nimport { useWatch } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n Button,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField, FormSelectField } from \"./form-fields\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useProfileUI, useCountryStates } from \"@fluid-app/profile-core\";\nimport type { BillingAddress } from \"./view-payment-method-dialog\";\n\nconst editPaymentMethodFormSchema = z.object({\n billing_address: z.object({\n name: z.string().min(1, \"Name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n zip: z.string().min(1, \"Zip code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n }),\n set_as_default: z.boolean(),\n});\n\nexport type EditPaymentMethodFormData = z.infer<\n typeof editPaymentMethodFormSchema\n>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\ninterface EditPaymentMethodDialogProps {\n isOpen: boolean;\n paymentMethod: fluidPay.CustomerPaymentMethod | null;\n billingAddress?: BillingAddress | null;\n onClose: () => void;\n onSubmit: (data: EditPaymentMethodFormData) => void;\n isSubmitting: boolean;\n error?: string;\n countries?: CountryOption[];\n}\n\nexport default function EditPaymentMethodDialog({\n isOpen,\n paymentMethod,\n billingAddress,\n onClose,\n onSubmit,\n isSubmitting,\n error,\n countries = [],\n}: EditPaymentMethodDialogProps): JSX.Element | null {\n const { t } = useProfileUI();\n\n const { control, handleSubmit, reset, setValue } =\n useZodForm<EditPaymentMethodFormData>(editPaymentMethodFormSchema, {\n defaultValues: {\n billing_address: {\n name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n zip: \"\",\n country_code: \"US\",\n },\n set_as_default: false,\n },\n });\n\n const billingCountry = useWatch({\n control,\n name: \"billing_address.country_code\",\n });\n const setAsDefault = useWatch({ control, name: \"set_as_default\" });\n\n const { stateOptions, config, handleCountryChange } = useCountryStates();\n\n const countryOptions = [...countries]\n .map((country) => ({\n name: country.name,\n value: country.iso,\n }))\n .sort((a, b) => {\n if (a.value === billingCountry) return -1;\n if (b.value === billingCountry) return 1;\n return a.name.localeCompare(b.name);\n });\n\n const stateSelectOptions = stateOptions.map((state) => ({\n name: state.name,\n value: state.isoCode,\n }));\n\n useEffect(() => {\n if (paymentMethod && isOpen) {\n reset({\n billing_address: {\n name: billingAddress?.name ?? \"\",\n address1: billingAddress?.address1 ?? \"\",\n address2: billingAddress?.address2 ?? \"\",\n city: billingAddress?.city ?? \"\",\n state: billingAddress?.state ?? \"\",\n zip: billingAddress?.zip ?? \"\",\n country_code: billingAddress?.country_code ?? \"US\",\n },\n set_as_default: paymentMethod.default,\n });\n }\n }, [paymentMethod, billingAddress, isOpen, reset]);\n\n const handleCountrySelect = (countryCode: string) => {\n handleCountryChange(countryCode);\n setValue(\"billing_address.country_code\", countryCode, {\n shouldValidate: true,\n });\n };\n\n const handleFormSubmit = handleSubmit((data) => {\n onSubmit(data);\n });\n\n if (!paymentMethod) return null;\n\n const { details } = paymentMethod;\n const cardBrand = details.card_type ?? \"Card\";\n const lastFour = details.last_four ?? \"****\";\n const expMonth = details.exp_month;\n const expYear = details.exp_year;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-sm overflow-y-auto rounded md:max-w-lg\">\n <DialogHeader>\n <DialogTitle className=\"text-md font-medium\">\n {t(\"edit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div className=\"rounded-lg bg-gray-50 p-4\">\n <div className=\"flex items-center space-x-3\">\n {details.logo_url && (\n <div className=\"h-6 w-10 flex-shrink-0\">\n <img\n src={details.logo_url}\n alt={cardBrand}\n width={40}\n height={24}\n className=\"object-contain\"\n />\n </div>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-gray-900\">\n {cardBrand} •••• {lastFour}\n </span>\n {expMonth != null && expYear != null && (\n <span className=\"text-sm text-gray-500\">\n {t(\"card_expires\")} {expMonth}/{expYear}\n </span>\n )}\n </div>\n </div>\n </div>\n\n <div>\n <h3 className=\"mb-1 text-sm font-medium text-gray-900\">\n {t(\"billing_address\")}\n </h3>\n <div className=\"space-y-0\">\n <FormSelectField\n control={control}\n name=\"billing_address.country_code\"\n label={t(\"country\")}\n options={countryOptions}\n placeholder={t(\"select_an_option\")}\n onChange={(val) => {\n handleCountrySelect(val);\n }}\n />\n <FormTextField\n control={control}\n name=\"billing_address.name\"\n label={t(\"name\")}\n />\n <FormTextField\n control={control}\n name=\"billing_address.address1\"\n label={t(\"address_line_1\")}\n />\n <FormTextField\n control={control}\n name=\"billing_address.address2\"\n label={t(\"address_line_2\")}\n />\n <div className=\"sm:flex sm:gap-2\">\n <FormTextField\n control={control}\n name=\"billing_address.city\"\n label={t(\"city\")}\n containerClassName=\"flex-1\"\n />\n <FormSelectField\n control={control}\n name=\"billing_address.state\"\n label={\n config?.regionLabel ? t(config.regionLabel) : t(\"state\")\n }\n options={stateSelectOptions}\n placeholder={t(\"select_state\")}\n containerClassName=\"flex-1\"\n />\n <FormTextField\n control={control}\n name=\"billing_address.zip\"\n label={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n />\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"mt-2 flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default\"\n checked={setAsDefault}\n onChange={() => setValue(\"set_as_default\", !setAsDefault)}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default\" className=\"text-sm\">\n {t(\"set_as_default_payment_method\")}\n </label>\n </div>\n\n {error && <div className=\"text-sm text-red-500\">{error}</div>}\n\n <DialogFooter className=\"flex flex-row items-center justify-between\">\n <div className=\"flex-2\">\n <Button\n type=\"button\"\n className=\"rounded bg-gray-50 p-3 text-gray-900 ring-1 ring-gray-300 hover:bg-gray-100\"\n onClick={onClose}\n disabled={isSubmitting}\n >\n {t(\"cancel\")}\n </Button>\n </div>\n <div className=\"flex-1 text-right\">\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isSubmitting}\n className=\"rounded bg-gray-900 p-3 text-white hover:bg-gray-800\"\n >\n {isSubmitting ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useState, type JSX, type ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport ConfirmActionDialog from \"./confirm-action-dialog\";\nimport PaymentMethodDropdown from \"./payment-method-dropdown\";\nimport ViewPaymentMethodDialog, {\n type BillingAddress,\n} from \"./view-payment-method-dialog\";\nimport EditPaymentMethodDialog, {\n type EditPaymentMethodFormData,\n} from \"./edit-payment-method-dialog\";\n\nexport interface CreditCardDialogRenderProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface PaymentMethodsProps {\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n isLoading?: boolean;\n onDeletePaymentMethod: (paymentMethodId: number) => Promise<void> | void;\n isDeletingPaymentMethod?: boolean;\n onUpdatePaymentMethod: (\n paymentMethodId: number,\n data: EditPaymentMethodFormData,\n ) => Promise<void> | void;\n isUpdatingPaymentMethod?: boolean;\n getBillingAddress?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => BillingAddress | null | undefined;\n countries?: CountryOption[];\n renderCreditCardDialog?: (props: CreditCardDialogRenderProps) => ReactNode;\n}\n\nexport default function PaymentMethods({\n paymentMethods,\n isLoading = false,\n onDeletePaymentMethod,\n isDeletingPaymentMethod = false,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod = false,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n}: PaymentMethodsProps): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const [openDeleteDialog, setOpenDeleteDialog] = useState(false);\n const [deleteCardError, setDeleteCardError] = useState<string | undefined>(\n undefined,\n );\n const [selectedCreditCard, setSelectedCreditCard] = useState<\n fluidPay.CustomerPaymentMethod | undefined\n >(undefined);\n const [isViewOpen, setIsViewOpen] = useState(false);\n const [isEditOpen, setIsEditOpen] = useState(false);\n const [selectedPaymentMethod, setSelectedPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n const [editError, setEditError] = useState<string | undefined>(undefined);\n\n const { t } = useProfileUI();\n\n const defaultPaymentMethod =\n paymentMethods.find((method) => method.default) ??\n paymentMethods[0] ??\n null;\n\n const handleDeleteCard = async (cardId: number | null) => {\n if (!cardId) return;\n try {\n await onDeletePaymentMethod(cardId);\n setSelectedCreditCard(undefined);\n setDeleteCardError(undefined);\n setOpenDeleteDialog(false);\n } catch {\n setDeleteCardError(\"Unable to delete payment method. Please try again.\");\n }\n };\n\n const handleDeletePaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => {\n setSelectedCreditCard(paymentMethod);\n requestAnimationFrame(() => {\n setOpenDeleteDialog(true);\n });\n };\n\n const handleViewPaymentMethod = (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => {\n setSelectedPaymentMethod(paymentMethod);\n requestAnimationFrame(() => {\n setIsViewOpen(true);\n });\n };\n\n const handleCloseViewDialog = () => {\n setIsViewOpen(false);\n setSelectedPaymentMethod(null);\n };\n\n const handleOpenEditFromView = () => {\n setIsViewOpen(false);\n setEditError(undefined);\n requestAnimationFrame(() => {\n setIsEditOpen(true);\n });\n };\n\n const handleCloseEditDialog = () => {\n setIsEditOpen(false);\n setSelectedPaymentMethod(null);\n setEditError(undefined);\n };\n\n const handleEditSubmit = async (data: EditPaymentMethodFormData) => {\n if (!selectedPaymentMethod) return;\n try {\n await onUpdatePaymentMethod(selectedPaymentMethod.id, data);\n handleCloseEditDialog();\n fluidToast({\n title: t(\"default_payment_method_updated\"),\n type: \"success\",\n });\n } catch (error) {\n console.error(\"Error updating payment method:\", error);\n fluidToast({\n title: t(\"failed_to_set_default_payment_method\"),\n type: \"error\",\n description: parseApiErrors(error),\n });\n if (error instanceof Error) {\n setEditError(error.message);\n } else {\n setEditError(\"An unexpected error occurred. Please try again.\");\n }\n }\n };\n\n const handleOpenDialog = () => {\n setIsOpen(true);\n };\n\n const handleCloseDialog = () => {\n setIsOpen(false);\n };\n\n const selectedBillingAddress = selectedPaymentMethod\n ? (getBillingAddress?.(selectedPaymentMethod) ?? null)\n : null;\n\n return (\n <>\n <PaymentMethodDropdown\n title={t(\"payment_methods\")}\n displayPaymentMethod={defaultPaymentMethod}\n paymentMethodList={paymentMethods}\n onAddPaymentMethodClick={handleOpenDialog}\n onEditPaymentMethod={handleViewPaymentMethod}\n onDeletePaymentMethod={handleDeletePaymentMethod}\n addPaymentMethodLabel={`+ ${t(\"add_payment_method\")}`}\n isLoading={isLoading}\n />\n\n {renderCreditCardDialog?.({\n isOpen,\n onClose: handleCloseDialog,\n })}\n\n <ConfirmActionDialog\n title={t(\"delete_credit_card\")}\n description={t(\"delete_credit_card_message\")}\n actionText={t(\"delete\")}\n onAction={() => handleDeleteCard(selectedCreditCard?.id ?? null)}\n openDialog={openDeleteDialog}\n setOpenDialog={setOpenDeleteDialog}\n errorMsg={deleteCardError}\n isLoading={isDeletingPaymentMethod}\n />\n\n <ViewPaymentMethodDialog\n isOpen={isViewOpen}\n paymentMethod={selectedPaymentMethod}\n billingAddress={selectedBillingAddress}\n onClose={handleCloseViewDialog}\n onEdit={handleOpenEditFromView}\n />\n\n <EditPaymentMethodDialog\n isOpen={isEditOpen}\n paymentMethod={selectedPaymentMethod}\n billingAddress={selectedBillingAddress}\n onClose={handleCloseEditDialog}\n onSubmit={handleEditSubmit}\n isSubmitting={isUpdatingPaymentMethod}\n error={editError}\n countries={countries}\n />\n </>\n );\n}\n","import type { JSX, ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport CustomerInfo, {\n type CustomerInfoProps,\n type PendingEmailChange,\n} from \"./customer-info\";\nimport CustomerPointsLedger from \"./customer-points-ledger\";\nimport Addresses, { type AddressDialogRenderProps } from \"./addresses\";\nimport PaymentMethods, {\n type CreditCardDialogRenderProps,\n} from \"./payment-methods\";\nimport type { EditPaymentMethodFormData } from \"./edit-payment-method-dialog\";\nimport type { BillingAddress } from \"./view-payment-method-dialog\";\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface ProfileProps {\n customerAccount: fluidPay.CustomerAccount;\n languages?: Language[];\n onUpdateCustomer: CustomerInfoProps[\"onUpdateCustomer\"];\n isUpdatingCustomer?: boolean;\n onChangeEmail?: (newEmail: string) => Promise<void> | void;\n isChangingEmail?: boolean;\n pendingEmailChange?: PendingEmailChange;\n onCancelEmailChange?: () => void;\n pendingEmail?: string;\n rewardsPointsEnabled?: boolean;\n pointsLedger?: PointsLedger[];\n isLoadingPointsLedger?: boolean;\n\n addresses: fluidPay.CustomerAddress[];\n isLoadingAddresses?: boolean;\n onDeleteAddress: (addressId: number) => Promise<void> | void;\n isDeletingAddress?: boolean;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n isLoadingPaymentMethods?: boolean;\n onDeletePaymentMethod: (paymentMethodId: number) => Promise<void> | void;\n isDeletingPaymentMethod?: boolean;\n onUpdatePaymentMethod: (\n paymentMethodId: number,\n data: EditPaymentMethodFormData,\n ) => Promise<void> | void;\n isUpdatingPaymentMethod?: boolean;\n getBillingAddress?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => BillingAddress | null | undefined;\n countries?: CountryOption[];\n renderCreditCardDialog?: (props: CreditCardDialogRenderProps) => ReactNode;\n}\n\nexport default function Profile({\n customerAccount,\n languages,\n onUpdateCustomer,\n isUpdatingCustomer,\n onChangeEmail,\n isChangingEmail,\n pendingEmailChange,\n onCancelEmailChange,\n pendingEmail,\n rewardsPointsEnabled = false,\n pointsLedger,\n isLoadingPointsLedger,\n addresses,\n isLoadingAddresses,\n onDeleteAddress,\n isDeletingAddress,\n renderAddressDialog,\n paymentMethods,\n isLoadingPaymentMethods,\n onDeletePaymentMethod,\n isDeletingPaymentMethod,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n}: ProfileProps): JSX.Element {\n return (\n <>\n <CustomerInfo\n customerAccount={customerAccount}\n languages={languages}\n onUpdateCustomer={onUpdateCustomer}\n isUpdating={isUpdatingCustomer}\n onChangeEmail={onChangeEmail}\n isChangingEmail={isChangingEmail}\n pendingEmailChange={pendingEmailChange}\n onCancelEmailChange={onCancelEmailChange}\n pendingEmail={pendingEmail}\n />\n {rewardsPointsEnabled && (\n <CustomerPointsLedger\n pointsLedger={pointsLedger ?? []}\n isLoading={isLoadingPointsLedger}\n />\n )}\n <div id=\"profile-addresses\">\n <Addresses\n addresses={addresses}\n isLoading={isLoadingAddresses}\n onDeleteAddress={onDeleteAddress}\n isDeletingAddress={isDeletingAddress}\n renderAddressDialog={renderAddressDialog}\n />\n </div>\n <div id=\"profile-payment-methods\">\n <PaymentMethods\n paymentMethods={paymentMethods}\n isLoading={isLoadingPaymentMethods}\n onDeletePaymentMethod={onDeletePaymentMethod}\n isDeletingPaymentMethod={isDeletingPaymentMethod}\n onUpdatePaymentMethod={onUpdatePaymentMethod}\n isUpdatingPaymentMethod={isUpdatingPaymentMethod}\n getBillingAddress={getBillingAddress}\n countries={countries}\n renderCreditCardDialog={renderCreditCardDialog}\n />\n </div>\n </>\n );\n}\n","\"use client\";\n\nimport type { Control, FieldPath, FieldValues } from \"react-hook-form\";\nimport { useController } from \"react-hook-form\";\nimport { Input, cn } from \"@fluid-app/ui-primitives\";\n\ninterface FormTextFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n control: Control<TFieldValues>;\n name: TName;\n placeholder?: string;\n containerClassName?: string;\n type?: React.HTMLInputTypeAttribute;\n disabled?: boolean;\n inputMode?: React.HTMLAttributes<HTMLInputElement>[\"inputMode\"];\n}\n\nexport function FormTextField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n placeholder,\n containerClassName,\n type,\n disabled,\n inputMode,\n}: FormTextFieldProps<TFieldValues, TName>) {\n const {\n field,\n fieldState: { error },\n } = useController({ name, control });\n\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n <Input\n {...field}\n value={field.value ?? \"\"}\n id={name}\n type={type}\n disabled={disabled}\n inputMode={inputMode}\n placeholder={placeholder}\n aria-invalid={!!error}\n />\n {error?.message && (\n <p className=\"text-sm text-red-500\">{error.message}</p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { Control, FieldPath, FieldValues } from \"react-hook-form\";\nimport { Controller } from \"react-hook-form\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n cn,\n} from \"@fluid-app/ui-primitives\";\n\ntype NameValue = { name: string; value: string | number };\n\ninterface FormSelectFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> {\n control: Control<TFieldValues>;\n name: TName;\n placeholder?: string;\n options?: NameValue[];\n containerClassName?: string;\n disabled?: boolean;\n}\n\nexport function FormSelectField<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n control,\n name,\n placeholder = \"Select\",\n options,\n containerClassName,\n disabled,\n}: FormSelectFieldProps<TFieldValues, TName>) {\n return (\n <div className={cn(\"space-y-1\", containerClassName)}>\n <Controller\n control={control}\n name={name}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <>\n <Select\n value={value?.toString() ?? \"\"}\n onValueChange={onChange}\n disabled={disabled}\n >\n <SelectTrigger\n aria-invalid={!!error}\n className={cn(\n \"w-full\",\n error && \"border-red-500 ring-1 ring-red-500\",\n )}\n >\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent>\n {options && options.length > 0 ? (\n options.map((opt) => (\n <SelectItem\n key={opt.value.toString()}\n value={opt.value.toString()}\n >\n {opt.name}\n </SelectItem>\n ))\n ) : (\n <SelectItem value=\"__empty\" disabled>\n No available options\n </SelectItem>\n )}\n </SelectContent>\n </Select>\n {error?.message && (\n <p className=\"text-sm text-red-500\">{error.message}</p>\n )}\n </>\n )}\n />\n </div>\n );\n}\n","import { type JSX, type ReactNode, useEffect } from \"react\";\nimport { useWatch, type Control, type UseFormSetValue } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField } from \"./form-fields/FormTextField\";\nimport { FormSelectField } from \"./form-fields/FormSelectField\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useCountryStates, type State } from \"@fluid-app/fluid-pay-core\";\n\nconst addressFormSchema = z.object({\n first_name: z.string().min(1, \"First name is required\"),\n last_name: z.string().min(1, \"Last name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n postal_code: z.string().min(1, \"Postal code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n default: z.boolean(),\n});\n\nexport type AddressFormData = z.infer<typeof addressFormSchema>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface AddressAutocompleteRenderProps {\n control: Control<AddressFormData>;\n setValue: UseFormSetValue<AddressFormData>;\n countryCode: string;\n}\n\ninterface AddressFormDialogProps {\n isOpen: boolean;\n onClose: () => void;\n selectedAddress: fluidPay.CustomerAddress | null;\n onSubmit: (data: fluidPay.CreateAddressBody) => void;\n isSubmitting: boolean;\n countries?: CountryOption[];\n error?: string;\n renderAddressAutocomplete?: (\n props: AddressAutocompleteRenderProps,\n ) => ReactNode;\n fetchStates?: (countryCode: string) => Promise<State[]>;\n t: (key: string) => string;\n}\n\nexport default function AddressFormDialog({\n isOpen,\n onClose,\n selectedAddress,\n onSubmit,\n isSubmitting,\n countries = [],\n error,\n renderAddressAutocomplete,\n fetchStates,\n t,\n}: AddressFormDialogProps): JSX.Element {\n const { control, handleSubmit, reset, setValue } =\n useZodForm<AddressFormData>(addressFormSchema, {\n defaultValues: {\n first_name: \"\",\n last_name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country_code: \"US\",\n default: false,\n },\n });\n\n const selectedCountryCode = useWatch({ control, name: \"country_code\" });\n const isDefault = useWatch({ control, name: \"default\" });\n\n const { stateOptions, config, handleCountryChange } = useCountryStates();\n\n const countrySelectOptions = [...countries]\n .map((country) => ({\n name: country.name,\n value: country.iso,\n }))\n .sort((a, b) => {\n if (a.value === selectedCountryCode) return -1;\n if (b.value === selectedCountryCode) return 1;\n return a.name.localeCompare(b.name);\n });\n\n const stateSelectOptions = stateOptions.map((state) => ({\n name: state.name,\n value: state.isoCode,\n }));\n\n useEffect(() => {\n if (isOpen) {\n if (selectedAddress) {\n const nameParts = (selectedAddress.name ?? \"\").split(\" \");\n const firstName = nameParts[0] ?? \"\";\n const lastName = nameParts.slice(1).join(\" \");\n reset({\n first_name: firstName,\n last_name: lastName,\n address1: selectedAddress.address1,\n address2: selectedAddress.address2 ?? \"\",\n city: selectedAddress.city,\n state: selectedAddress.state,\n postal_code: selectedAddress.postal_code,\n country_code: selectedAddress.country_code ?? \"US\",\n default: selectedAddress.default,\n });\n handleCountryChange(selectedAddress.country_code ?? \"US\", fetchStates);\n } else {\n reset({\n first_name: \"\",\n last_name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n postal_code: \"\",\n country_code: \"US\",\n default: false,\n });\n handleCountryChange(\"US\", fetchStates);\n }\n }\n }, [selectedAddress, isOpen, reset, handleCountryChange, fetchStates]);\n\n useEffect(() => {\n handleCountryChange(selectedCountryCode, fetchStates);\n }, [selectedCountryCode, handleCountryChange, fetchStates]);\n\n const handleFormSubmit = handleSubmit((data) => {\n onSubmit({\n address: {\n first_name: data.first_name,\n last_name: data.last_name,\n address1: data.address1,\n address2: data.address2 ?? null,\n city: data.city,\n state: data.state,\n postal_code: data.postal_code,\n country_code: data.country_code,\n default: data.default,\n },\n });\n });\n\n const isEditMode = selectedAddress !== null;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-md overflow-y-auto rounded md:max-w-xl\">\n <DialogHeader>\n <DialogTitle className=\"text-lg font-medium\">\n {isEditMode ? t(\"edit_address\") : t(\"add_an_address\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-3 pt-2\">\n <FormSelectField\n control={control}\n name=\"country_code\"\n placeholder={t(\"country\")}\n options={countrySelectOptions}\n disabled={isSubmitting}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"first_name\"\n placeholder={t(\"first_name\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormTextField\n control={control}\n name=\"last_name\"\n placeholder={t(\"last_name\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n </div>\n {renderAddressAutocomplete ? (\n renderAddressAutocomplete({\n control,\n setValue,\n countryCode: selectedCountryCode,\n })\n ) : (\n <FormTextField\n control={control}\n name=\"address1\"\n placeholder={t(\"address_line_1\")}\n disabled={isSubmitting}\n />\n )}\n <FormTextField\n control={control}\n name=\"address2\"\n placeholder={t(\"address_line_2\")}\n disabled={isSubmitting}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"city\"\n placeholder={t(\"city\")}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormSelectField\n control={control}\n name=\"state\"\n placeholder={\n config?.regionLabel ? t(config.regionLabel) : t(\"select_state\")\n }\n options={stateSelectOptions}\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n <FormTextField\n control={control}\n name=\"postal_code\"\n placeholder={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n disabled={isSubmitting}\n />\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default_address\"\n checked={isDefault}\n onChange={() => setValue(\"default\", !isDefault)}\n disabled={isSubmitting}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default_address\" className=\"text-sm\">\n {t(\"set_as_default_address\")}\n </label>\n </div>\n\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isSubmitting}\n className=\"rounded bg-gray-900 px-5 py-2.5 text-white hover:bg-gray-800\"\n >\n {isSubmitting ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save_address\")\n )}\n </Button>\n </div>\n\n {error && <div className=\"mt-2 text-sm text-red-500\">{error}</div>}\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, useRef, useState, useCallback } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\n\nexport type VgsFieldState = {\n isFocused: boolean;\n isValid: boolean;\n isEmpty: boolean;\n};\n\nexport type VgsFormState = {\n [key: string]: VgsFieldState;\n};\n\ninterface VGSCollectForm {\n setRouteId: (routeId: string) => void;\n field: (selector: string, config: Record<string, unknown>) => void;\n submit: (\n path: string,\n options: { headers?: Record<string, string> },\n successCallback: (\n status: number,\n response: fluidPay.VgsCollectSubmitResponse,\n ) => void,\n errorCallback: (errors: Record<string, string[]>) => void,\n ) => void;\n unmount: () => void;\n}\n\ninterface VGSCollectLibrary {\n create: (\n vaultId: string,\n environment: string,\n stateCallback: (state: Record<string, Partial<VgsFieldState>>) => void,\n ) => VGSCollectForm;\n}\n\nconst getVGSCollect = (): VGSCollectLibrary | null => {\n if (typeof window !== \"undefined\") {\n return (\n (window as unknown as { VGSCollect?: VGSCollectLibrary }).VGSCollect ||\n null\n );\n }\n return null;\n};\n\nconst DEFAULT_FIELD_STATE: VgsFormState = {\n card_number: { isFocused: false, isValid: false, isEmpty: true },\n card_exp: { isFocused: false, isValid: false, isEmpty: true },\n card_cvc: { isFocused: false, isValid: false, isEmpty: true },\n card_holder: { isFocused: false, isValid: false, isEmpty: true },\n};\n\nexport function useVgsCollect() {\n const [isFormReady, setIsFormReady] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [isScriptLoaded, setIsScriptLoaded] = useState(false);\n\n const [vgsFieldState, setVgsFieldState] =\n useState<VgsFormState>(DEFAULT_FIELD_STATE);\n\n const formRef = useRef<VGSCollectForm | null>(null);\n const onSuccessRef = useRef<\n ((response: fluidPay.VgsCollectSubmitResponse) => void) | null\n >(null);\n const onErrorRef = useRef<((error: string) => void) | null>(null);\n\n // Load VGS Collect script\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const vgsCollect = getVGSCollect();\n if (vgsCollect) {\n const timeoutId = window.setTimeout(() => {\n setIsScriptLoaded(true);\n }, 0);\n return () => window.clearTimeout(timeoutId);\n }\n\n if (isScriptLoaded) return;\n\n const script = document.createElement(\"script\");\n script.src =\n \"https://js.verygoodvault.com/vgs-collect/3.3.0/vgs-collect.js\";\n script.async = true;\n script.onload = () => setIsScriptLoaded(true);\n script.onerror = () => onErrorRef.current?.(\"Failed to load payment form\");\n document.head.appendChild(script);\n }, [isScriptLoaded]);\n\n const updateFieldState = useCallback(\n (state: Record<string, Partial<VgsFieldState>>) => {\n if (!state) return;\n\n setVgsFieldState((prev) => {\n const newState: VgsFormState = { ...prev };\n let hasChanges = false;\n\n Object.keys(state).forEach((key) => {\n const field = state[key];\n if (!field) return;\n\n const next: VgsFieldState = {\n isFocused: !!field.isFocused,\n isValid: !!field.isValid,\n isEmpty: !!field.isEmpty,\n };\n\n if (\n !newState[key] ||\n JSON.stringify(newState[key]) !== JSON.stringify(next)\n ) {\n newState[key] = next;\n hasChanges = true;\n }\n });\n\n return hasChanges ? newState : prev;\n });\n },\n [],\n );\n\n const resetVgs = useCallback(() => {\n if (formRef.current) {\n try {\n formRef.current.unmount();\n } catch (e) {\n console.warn(\"VGS unmount error\", e);\n }\n formRef.current = null;\n }\n\n setIsFormReady(false);\n setVgsFieldState({ ...DEFAULT_FIELD_STATE });\n }, []);\n\n const initializeForm = useCallback(\n async (credentials: fluidPay.VaultResponse) => {\n if (!isScriptLoaded) return;\n\n const VGSCollect = getVGSCollect();\n if (!VGSCollect) {\n onErrorRef.current?.(\"Payment script not loaded\");\n return;\n }\n\n try {\n setIsLoading(true);\n\n const vgsEnvironment =\n credentials.vault.environment === \"sandbox\" ? \"sandbox\" : \"live-eu-1\";\n\n const form = VGSCollect.create(\n credentials.vault.vault_id,\n vgsEnvironment,\n (state) => updateFieldState(state),\n );\n\n if (credentials.vault.route_id) {\n form.setRouteId(credentials.vault.route_id);\n }\n\n formRef.current = form;\n\n // Wait for DOM elements\n let retries = 0;\n const maxRetries = 20;\n const retryDelay = 200;\n\n const waitForDom = async (): Promise<boolean> => {\n const allExist = [\n \"vgs-card-number\",\n \"vgs-expiration-date\",\n \"vgs-cvc\",\n \"vgs-card-holder\",\n ].every((id) => {\n const el = document.getElementById(id);\n return el && el.isConnected;\n });\n\n if (allExist) return true;\n if (retries >= maxRetries) return false;\n\n retries++;\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n return waitForDom();\n };\n\n const domReady = await waitForDom();\n if (!domReady) {\n throw new Error(\"Payment form elements not ready\");\n }\n\n const css = {\n fontSize: \"14px\",\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n color: \"#1f2937\",\n paddingTop: \"0px\",\n paddingBottom: \"0px\",\n paddingLeft: \"0px\",\n paddingRight: \"0px\",\n boxSizing: \"border-box\",\n lineHeight: \"38px\",\n height: \"100%\",\n width: \"100%\",\n \"&::placeholder\": { color: \"#9ca3af\", opacity: 1 },\n \"&:focus\": { outline: \"none\" },\n };\n\n form.field(\"#vgs-card-number\", {\n type: \"card-number\",\n name: \"card_number\",\n placeholder: \"0000 0000 0000 0000\",\n showCardIcon: true,\n css: { ...css, paddingRight: \"40px\" },\n autoComplete: \"cc-number\",\n validations: [\"required\", \"validCardNumber\"],\n });\n\n form.field(\"#vgs-expiration-date\", {\n type: \"card-expiration-date\",\n name: \"card_exp\",\n yearLength: 2,\n placeholder: \"MM / YY\",\n css,\n autoComplete: \"cc-exp\",\n validations: [\"required\", \"validCardExpirationDate\"],\n });\n\n form.field(\"#vgs-cvc\", {\n type: \"card-security-code\",\n name: \"card_cvc\",\n placeholder: \"123\",\n css,\n autoComplete: \"cc-csc\",\n validations: [\"required\", \"validCardSecurityCode\"],\n });\n\n form.field(\"#vgs-card-holder\", {\n type: \"text\",\n name: \"card_holder\",\n placeholder: \"Full Name\",\n css,\n autoComplete: \"cc-name\",\n validations: [\"required\"],\n });\n\n setIsFormReady(true);\n } catch (error) {\n console.error(\"Failed to initialize VGS:\", error);\n onErrorRef.current?.(\"Failed to initialize payment form\");\n } finally {\n setIsLoading(false);\n }\n },\n [isScriptLoaded, updateFieldState],\n );\n\n const submitCard = useCallback(() => {\n if (!formRef.current) {\n onErrorRef.current?.(\"Form not initialized\");\n return;\n }\n\n formRef.current.submit(\n `/post`,\n {},\n (status: number, response: fluidPay.VgsCollectSubmitResponse) => {\n if (status >= 200 && status < 400) {\n onSuccessRef.current?.(response);\n } else {\n onErrorRef.current?.(\"Payment failed\");\n }\n },\n (errors: Record<string, string[]>) => {\n const allErrors = Object.values(errors)\n .flat()\n .filter(\n (msg) =>\n typeof msg === \"string\" &&\n msg.trim().length > 0 &&\n msg !== \"Required\",\n );\n\n const uniqueErrors = Array.from(new Set(allErrors));\n\n let errorMsg = \"Please verify your payment details.\";\n if (uniqueErrors.length > 0) {\n errorMsg = uniqueErrors.join(\", \");\n } else {\n const rawErrors = Object.values(errors).flat();\n if (rawErrors.length > 0) {\n errorMsg = \"Please fill in all required fields.\";\n }\n }\n\n onErrorRef.current?.(errorMsg);\n },\n );\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (formRef.current) {\n try {\n formRef.current.unmount();\n } catch (e) {\n console.warn(\"VGS unmount error\", e);\n }\n formRef.current = null;\n }\n };\n }, []);\n\n return {\n isFormReady,\n isLoading,\n isScriptLoaded,\n initializeForm,\n submitCard,\n vgsFieldState,\n resetVgs,\n onSuccessRef,\n onErrorRef,\n };\n}\n","import {\n type JSX,\n type ReactNode,\n useEffect,\n useState,\n useCallback,\n} from \"react\";\nimport { useWatch, type Control, type UseFormSetValue } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n Button,\n cn,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { FormTextField } from \"./form-fields/FormTextField\";\nimport { FormSelectField } from \"./form-fields/FormSelectField\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useFluidPayApi, useCountryStates } from \"@fluid-app/fluid-pay-core\";\nimport {\n useVgsCollect,\n type VgsFieldState,\n type VgsFormState,\n} from \"../hooks/use-vgs-collect\";\n\nconst billingAddressSchema = z.object({\n name: z.string().min(1, \"Name is required\"),\n address1: z.string().min(1, \"Address line 1 is required\"),\n address2: z.string().optional().nullable(),\n city: z.string().min(1, \"City is required\"),\n state: z.string().min(1, \"State is required\"),\n zip: z.string().min(1, \"Zip code is required\"),\n country_code: z.string().min(1, \"Country is required\"),\n set_as_default: z.boolean(),\n});\n\ntype BillingAddressFormData = z.infer<typeof billingAddressSchema>;\n\ninterface CountryOption {\n iso: string;\n name: string;\n}\n\nexport interface BillingAddressAutocompleteRenderProps {\n control: Control<BillingAddressFormData>;\n setValue: UseFormSetValue<BillingAddressFormData>;\n countryCode: string;\n}\n\ninterface CreditCardFormDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onSubmit: (data: fluidPay.AddCreditCardData) => void;\n isSubmitting: boolean;\n countries?: CountryOption[];\n error?: string;\n jwt: string;\n renderAddressAutocomplete?: (\n props: BillingAddressAutocompleteRenderProps,\n ) => ReactNode;\n t: (key: string) => string;\n}\n\nfunction VgsInputWrapper({\n id,\n fieldState,\n className,\n}: {\n id: string;\n fieldState?: VgsFieldState;\n className?: string;\n}) {\n const isInvalid =\n fieldState?.isValid === false &&\n !fieldState?.isFocused &&\n !fieldState?.isEmpty;\n\n const isFocused = fieldState?.isFocused;\n\n return (\n <div className=\"w-full\">\n <div\n id={id}\n className={cn(\n \"relative flex h-10 w-full items-center rounded-md border border-gray-300 bg-white px-3 shadow-sm transition-all duration-200 ease-in-out\",\n \"[&_iframe]:block! [&_iframe]:h-full! [&_iframe]:w-full!\",\n isFocused && \"border-blue-600 ring-1 ring-blue-600\",\n isInvalid && \"border-red-500 ring-1 ring-red-500\",\n className,\n )}\n />\n </div>\n );\n}\n\nfunction VgsCardForm({\n isLoading,\n isFormReady,\n vgsFieldState,\n networkError,\n t,\n}: {\n isLoading: boolean;\n isFormReady: boolean;\n vgsFieldState: VgsFormState;\n networkError?: string;\n t: (key: string) => string;\n}) {\n const showSpinner = isLoading || !isFormReady;\n\n return (\n <div className=\"space-y-4\" aria-label=\"Credit card form\">\n <VgsInputWrapper\n id=\"vgs-card-number\"\n fieldState={vgsFieldState[\"card_number\"]}\n />\n\n <div className=\"flex gap-3\">\n <div className=\"flex-1\">\n <VgsInputWrapper\n id=\"vgs-expiration-date\"\n fieldState={vgsFieldState[\"card_exp\"]}\n />\n </div>\n <div className=\"flex-1\">\n <VgsInputWrapper\n id=\"vgs-cvc\"\n fieldState={vgsFieldState[\"card_cvc\"]}\n />\n </div>\n </div>\n\n <VgsInputWrapper\n id=\"vgs-card-holder\"\n fieldState={vgsFieldState[\"card_holder\"]}\n />\n\n {networkError && networkError.trim().length > 0 && (\n <div className=\"rounded-md bg-red-50 p-3 text-sm text-red-600\">\n {networkError}\n </div>\n )}\n </div>\n );\n}\n\nexport default function CreditCardFormDialog({\n isOpen,\n onClose,\n onSubmit,\n isSubmitting,\n countries = [],\n error,\n jwt,\n renderAddressAutocomplete,\n t,\n}: CreditCardFormDialogProps): JSX.Element {\n const api = useFluidPayApi();\n const [cardError, setCardError] = useState<string | undefined>(undefined);\n const [isVgsSubmitting, setIsVgsSubmitting] = useState(false);\n\n const {\n isFormReady,\n isLoading: isVgsLoading,\n isScriptLoaded,\n initializeForm,\n submitCard,\n vgsFieldState,\n resetVgs,\n onSuccessRef,\n onErrorRef,\n } = useVgsCollect();\n\n const { control, handleSubmit, reset, setValue } =\n useZodForm<BillingAddressFormData>(billingAddressSchema, {\n defaultValues: {\n name: \"\",\n address1: \"\",\n address2: \"\",\n city: \"\",\n state: \"\",\n zip: \"\",\n country_code: \"US\",\n set_as_default: false,\n },\n });\n\n const billingCountry = useWatch({ control, name: \"country_code\" });\n const setAsDefault = useWatch({ control, name: \"set_as_default\" });\n\n const { stateOptions, config, handleCountryChange } = useCountryStates();\n\n const countrySelectOptions = [...countries]\n .map((country) => ({\n name: country.name,\n value: country.iso,\n }))\n .sort((a, b) => {\n if (a.value === billingCountry) return -1;\n if (b.value === billingCountry) return 1;\n return a.name.localeCompare(b.name);\n });\n\n const stateSelectOptions = stateOptions.map((state) => ({\n name: state.name,\n value: state.isoCode,\n }));\n\n useEffect(() => {\n handleCountryChange(billingCountry);\n }, [billingCountry, handleCountryChange]);\n\n // Initialize VGS when dialog opens\n useEffect(() => {\n if (!isOpen || !isScriptLoaded) return;\n\n let cancelled = false;\n\n const init = async () => {\n try {\n const credentials = await api.vault.fetchCredentials(jwt);\n if (!cancelled) {\n await initializeForm(credentials);\n }\n } catch (err) {\n console.error(\"Failed to fetch vault credentials:\", err);\n if (!cancelled) {\n setCardError(\"Failed to initialize payment form\");\n }\n }\n };\n\n init();\n\n return () => {\n cancelled = true;\n };\n }, [isOpen, isScriptLoaded, jwt, api, initializeForm]);\n\n // Wire up VGS callbacks\n const handleVgsSuccess = useCallback(\n (response: fluidPay.VgsCollectSubmitResponse) => {\n const expValue = response?.card_exp;\n if (!expValue) {\n setCardError(\"Missing expiration date from payment form\");\n setIsVgsSubmitting(false);\n return;\n }\n\n const cleanExp = expValue.replace(/\\s+/g, \"\");\n const [expMonth, expYearShort] = cleanExp.split(\"/\");\n\n if (!expMonth || !expYearShort) {\n setCardError(\"Invalid expiration date format\");\n setIsVgsSubmitting(false);\n return;\n }\n\n const expYear =\n expYearShort.length === 2 ? `20${expYearShort}` : expYearShort;\n\n const cardholderName = response?.card_holder?.trim();\n if (!cardholderName) {\n setCardError(\"Cardholder name is required\");\n setIsVgsSubmitting(false);\n return;\n }\n\n // Read the current form values synchronously via handleSubmit\n handleSubmit((formData) => {\n const creditCardData: fluidPay.AddCreditCardData = {\n type: \"credit_card\",\n country_code: formData.country_code,\n default_payment_method: formData.set_as_default,\n payment_method: {\n token: response.card_number,\n cvv_token: response.card_cvc,\n exp_month: expMonth,\n exp_year: expYear,\n card_holder: cardholderName,\n billing_zip: formData.zip,\n },\n billing_address: {\n name: formData.name,\n address1: formData.address1,\n address2: formData.address2 ?? undefined,\n city: formData.city,\n state: formData.state,\n zip: formData.zip,\n country_code: formData.country_code,\n },\n };\n\n onSubmit(creditCardData);\n setIsVgsSubmitting(false);\n })();\n },\n [handleSubmit, onSubmit],\n );\n\n const handleVgsError = useCallback((err: string) => {\n setCardError(err);\n setIsVgsSubmitting(false);\n }, []);\n\n useEffect(() => {\n onSuccessRef.current = handleVgsSuccess;\n onErrorRef.current = handleVgsError;\n }, [handleVgsSuccess, handleVgsError, onSuccessRef, onErrorRef]);\n\n const handleClose = () => {\n resetVgs();\n reset();\n setCardError(undefined);\n setIsVgsSubmitting(false);\n onClose();\n };\n\n const handleFormSubmit = handleSubmit(() => {\n setIsVgsSubmitting(true);\n setCardError(undefined);\n submitCard();\n });\n\n const isBusy = isSubmitting || isVgsSubmitting;\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => !open && handleClose()}>\n <DialogContent className=\"max-h-[90vh] max-w-md overflow-y-auto rounded p-0 md:max-w-xl\">\n <div className=\"relative p-6\">\n {(isVgsLoading || !isFormReady) && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center rounded bg-white/80 backdrop-blur-[1px]\">\n <div className=\"flex items-center justify-center\">\n <div className=\"mr-3 h-5 w-5 animate-spin rounded-full border-2 border-t-2 border-blue-600 border-t-transparent\" />\n <p className=\"text-sm font-medium text-gray-600\">\n {t(\"securing\")}\n </p>\n </div>\n </div>\n )}\n <DialogHeader>\n <DialogTitle className=\"text-lg font-medium\">\n {t(\"add_credit_card\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4 pt-6\">\n <VgsCardForm\n isLoading={isVgsLoading}\n isFormReady={isFormReady}\n vgsFieldState={vgsFieldState}\n networkError={cardError ?? error}\n t={t}\n />\n\n <div className=\"space-y-3 pt-2\">\n <h3 className=\"text-sm font-medium text-gray-500\">\n {t(\"billing_address\")}\n </h3>\n <FormSelectField\n control={control}\n name=\"country_code\"\n placeholder={t(\"country\")}\n options={countrySelectOptions}\n disabled={isBusy}\n />\n <FormTextField\n control={control}\n name=\"name\"\n placeholder={t(\"name\")}\n disabled={isBusy}\n />\n {renderAddressAutocomplete ? (\n renderAddressAutocomplete({\n control,\n setValue,\n countryCode: billingCountry,\n })\n ) : (\n <FormTextField\n control={control}\n name=\"address1\"\n placeholder={t(\"address_line_1\")}\n disabled={isBusy}\n />\n )}\n <FormTextField\n control={control}\n name=\"address2\"\n placeholder={t(\"address_line_2\")}\n disabled={isBusy}\n />\n <div className=\"flex gap-3\">\n <FormTextField\n control={control}\n name=\"city\"\n placeholder={t(\"city\")}\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n <FormSelectField\n control={control}\n name=\"state\"\n placeholder={\n config?.regionLabel\n ? t(config.regionLabel)\n : t(\"select_state\")\n }\n options={stateSelectOptions}\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n <FormTextField\n control={control}\n name=\"zip\"\n placeholder={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\n containerClassName=\"flex-1\"\n disabled={isBusy}\n />\n </div>\n </div>\n </div>\n\n <div className=\"mt-4 flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <input\n type=\"checkbox\"\n id=\"set_as_default_cc\"\n checked={setAsDefault}\n onChange={() => setValue(\"set_as_default\", !setAsDefault)}\n disabled={isBusy}\n className=\"h-4 w-4\"\n />\n <label htmlFor=\"set_as_default_cc\" className=\"text-sm\">\n {t(\"set_as_default_payment_method\")}\n </label>\n </div>\n\n <Button\n type=\"submit\"\n onClick={handleFormSubmit}\n disabled={isBusy}\n className=\"rounded bg-gray-900 px-5 py-2.5 text-white hover:bg-gray-800\"\n >\n {isBusy ? (\n <div className=\"h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-white border-t-transparent\" />\n ) : (\n t(\"save_card\")\n )}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useCallback, 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 FluidPayCoreProvider,\n type FluidPayApi,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport type { PayApi } from \"@fluid-app/portal-core/pay-api\";\nimport type {\n PayAddress,\n PayPaymentMethod,\n} from \"@fluid-app/portal-core/pay-types\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { useAccountApi } from \"@fluid-app/portal-core/account-api-context\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { useLanguagesApi } from \"@fluid-app/store-core/languages-api-context\";\nimport { accountKeys, payKeys } from \"../account/query-keys\";\nimport { useAccount } from \"../hooks/use-account\";\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\nfunction adaptPointsLedger(\n entry: import(\"@fluid-app/portal-core/pay-types\").PointsLedgerEntry,\n): PointsLedger {\n const meta = entry.metadata as {\n transaction_type?: string | null;\n source?: {\n name: string;\n email?: string;\n reason?: string;\n user_id?: number;\n } | null;\n } | null;\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: 0,\n metadata: {\n transaction_type: meta?.transaction_type ?? undefined,\n source: meta?.source ?? undefined,\n },\n total_balance: entry.total_balance,\n updated_at: entry.created_at,\n };\n}\n\n// ---------------------------------------------------------------------------\n// PayApi → fluidPay type mappers (bridge for Profile UI)\n// ---------------------------------------------------------------------------\n\nfunction mapAccountToCustomerAccount(\n raw: AccountRep,\n): fluidPay.CustomerAccount {\n return {\n fluid_pay_account: {\n id: raw.id,\n email: raw.email,\n address_count: 0,\n payment_methods_count: 0,\n language_iso: null,\n },\n customer: {\n id: raw.id,\n active: true,\n active_subscriptions_count: 0,\n display_total_spent: \"0\",\n email: raw.email,\n first_name: raw.first_name,\n full_name: `${raw.first_name} ${raw.last_name}`.trim(),\n inactive_subscriptions_count: 0,\n is_rep: raw.member_type === \"rep\",\n phone: raw.phone,\n orders_count: 0,\n },\n };\n}\n\nfunction composeAddressName(\n firstName: string,\n lastName: string,\n): string | null {\n const combined = `${firstName} ${lastName}`.trim();\n return combined.length > 0 ? combined : null;\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\nfunction mapToFluidPayPaymentMethod(\n raw: PayPaymentMethod,\n): fluidPay.CustomerPaymentMethod {\n return {\n id: raw.id,\n created_at: raw.created_at ?? \"\",\n default: raw.default,\n details: {\n card_type: raw.brand,\n card_brand: raw.brand,\n last_four: raw.last_four,\n exp_month: raw.exp_month ?? undefined,\n exp_year: raw.exp_year ?? undefined,\n },\n billing_address: raw.billing_address\n ? {\n name: raw.billing_address.name,\n address1: raw.billing_address.street1,\n address2: raw.billing_address.street2,\n city: raw.billing_address.city,\n state: raw.billing_address.state,\n zip: raw.billing_address.zip,\n country_code: raw.billing_address.country,\n }\n : null,\n payment_type: raw.type,\n source: \"\",\n updated_at: raw.updated_at ?? \"\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// FluidPayApi shim for CreditCardFormDialog vault access\n// ---------------------------------------------------------------------------\n\nconst notImplemented = () => {\n throw new Error(\"Not available in portal-tenant context\");\n};\n\nfunction createFluidPayShim(payApi: PayApi): FluidPayApi {\n return {\n customers: { fetchAccount: notImplemented, update: notImplemented },\n addresses: {\n fetchAll: notImplemented,\n create: notImplemented,\n update: notImplemented,\n delete: notImplemented,\n },\n paymentMethods: {\n fetchAll: notImplemented,\n addCreditCard: notImplemented,\n delete: notImplemented,\n updateDefault: notImplemented,\n update: notImplemented,\n },\n vault: {\n fetchCredentials: async () => {\n const response = await payApi.fetchVaultCredentials();\n return {\n vault: {\n vault_id: response.vault.vault_id,\n environment: response.vault.environment,\n route_id: response.vault.route_id ?? \"\",\n requires_3ds: false,\n },\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies fluidPay.VaultResponse;\n },\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Screen component\n// ---------------------------------------------------------------------------\n\nexport function ProfileContentScreen({\n onToast,\n countryIso: _countryIso,\n}: ProfileContentScreenProps): React.JSX.Element {\n const payApi = usePayApi();\n const accountApi = useAccountApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(() => createFluidPayShim(payApi), [payApi]);\n\n // -- Data fetching --\n\n // Share the same cache entry as the app-wide useAccount() hook (used in\n // AppShell, PageRouter, etc.) rather than writing a different shape under\n // the same query key, which caused `customer` to be undefined here.\n const {\n data: accountRep,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useAccount();\n const accountData = useMemo(\n () => (accountRep ? mapAccountToCustomerAccount(accountRep) : undefined),\n [accountRep],\n );\n\n const { data: addressesData, isLoading: isLoadingAddresses } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: true,\n });\n\n const { data: paymentMethodsData, isLoading: isLoadingPaymentMethods } =\n useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n enabled: true,\n });\n\n const countriesAdapter = useCountriesApi();\n const languagesAdapter = useLanguagesApi();\n\n const { data: countriesData } = useQuery({\n queryKey: [\"bff-store-countries\"],\n queryFn: () => countriesAdapter.listCountries(),\n enabled: true,\n });\n\n const { data: languagesData } = useQuery({\n queryKey: [\"bff-store-languages\"],\n queryFn: () => languagesAdapter.listLanguages(),\n enabled: true,\n });\n\n const {\n data: pointsLedgerData,\n isLoading: isLoadingPointsLedger,\n isError: isPointsLedgerError,\n } = useQuery({\n queryKey: payKeys.pointsLedgers.list(),\n queryFn: () => payApi.fetchPointsLedgers(),\n enabled: true,\n // BFF returns 403 when reward points are not enabled for the company.\n // Don't retry on 403 so the UI simply hides the points section.\n retry: (failureCount, error) => {\n if (\n error instanceof Error &&\n \"status\" in error &&\n (error as { status: number }).status === 403\n ) {\n return false;\n }\n return failureCount < 1;\n },\n });\n\n // Points are enabled if the fetch succeeded (non-403)\n const rewardPointsEnabled = !isPointsLedgerError && pointsLedgerData != null;\n\n // -- Mutations --\n\n const updateCustomerMutation = useMutation({\n mutationFn: async (data: UserFormData) => {\n await accountApi.updateAccount({\n account: {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(\"Profile updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update profile\", \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n },\n onError: () => {\n onToast(\"Failed to delete address\", \"error\");\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(\"Failed to delete payment method\", \"error\");\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(\"Failed to update payment method\", \"error\");\n },\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) =>\n payApi.createAddress({\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Address created\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to create address\", \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Address updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update address\", \"error\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: fluidPay.AddCreditCardData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n default: data.default_payment_method,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onToast(\"Payment method added\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to add payment method\", \"error\");\n },\n });\n\n // -- Derived data --\n\n const addresses = addressesData ?? [];\n const paymentMethods = paymentMethodsData ?? [];\n\n const adaptedPointsLedger: PointsLedger[] =\n pointsLedgerData?.points_ledgers?.map(adaptPointsLedger) ?? [];\n\n const adaptedLanguages: Language[] = (languagesData?.languages ?? []).map(\n (l, i) => ({ id: i, name: l.name, iso: l.code }),\n );\n\n const countries = countriesData?.countries;\n\n const countryOptions = useMemo(\n () =>\n [...(countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countries]);\n\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n // -- Loading state --\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 <FluidPayCoreProvider api={fluidPayShim}>\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 // TODO: wire onChangeEmail to PATCH /v202506/users/:id/change_email\n // once portal self-service email change is designed\n // onChangeEmail={...}\n // pendingEmail={pendingEmail}\n rewardsPointsEnabled={rewardPointsEnabled}\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={(paymentMethod) =>\n paymentMethod.billing_address ?? null\n }\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 fetchStates={fetchStatesFromCountries}\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=\"\"\n renderAddressAutocomplete={({\n control,\n setValue: _setValue,\n }: BillingAddressAutocompleteRenderProps) => (\n <PlainAddressInput control={control} name=\"address1\" />\n )}\n />\n )}\n />\n </ProfileUIProvider>\n </FluidPayCoreProvider>\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 fluidToast,\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 fluidToast({ title: message, type });\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n 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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"}
|