@fluid-app/portal-sdk 0.1.254 → 0.1.255

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/dist/{AddressAutocompleteInput-Dy5sL54V.mjs → AddressAutocompleteInput-Dg-75n-K.mjs} +9 -12
  2. package/dist/AddressAutocompleteInput-Dg-75n-K.mjs.map +1 -0
  3. package/dist/{AddressAutocompleteInput-eO2ZMNvX.cjs → AddressAutocompleteInput-W2jWPYoJ.cjs} +26 -11
  4. package/dist/AddressAutocompleteInput-W2jWPYoJ.cjs.map +1 -0
  5. package/dist/{ProfileScreen-CfTHeXRn.mjs → ProfileScreen-D42NNNqT.mjs} +2 -2
  6. package/dist/{ProfileScreen-DxO1rvGl.mjs → ProfileScreen-Dvq3SfmI.mjs} +2 -2
  7. package/dist/{ProfileScreen-DxO1rvGl.mjs.map → ProfileScreen-Dvq3SfmI.mjs.map} +1 -1
  8. package/dist/{ProfileScreen-CFXyi6hi.cjs → ProfileScreen-LL3z9-cx.cjs} +2 -2
  9. package/dist/{ProfileScreen-CFXyi6hi.cjs.map → ProfileScreen-LL3z9-cx.cjs.map} +1 -1
  10. package/dist/{ProfileScreen-CS-4fa9g.cjs → ProfileScreen-dU8ZM8eY.cjs} +2 -2
  11. package/dist/{SubscriptionsScreen-ByoOMsky.cjs → SubscriptionsScreen-Bm8Ncl1e.cjs} +624 -166
  12. package/dist/SubscriptionsScreen-Bm8Ncl1e.cjs.map +1 -0
  13. package/dist/{SubscriptionsScreen-Y4UgpC1Y.mjs → SubscriptionsScreen-CsNE6gik.mjs} +627 -169
  14. package/dist/SubscriptionsScreen-CsNE6gik.mjs.map +1 -0
  15. package/dist/{SubscriptionsScreen-GCZYPM8-.cjs → SubscriptionsScreen-ztgglvXe.cjs} +2 -2
  16. package/dist/index.cjs +7 -7
  17. package/dist/index.mjs +7 -7
  18. package/package.json +15 -15
  19. package/dist/AddressAutocompleteInput-Dy5sL54V.mjs.map +0 -1
  20. package/dist/AddressAutocompleteInput-eO2ZMNvX.cjs.map +0 -1
  21. package/dist/SubscriptionsScreen-ByoOMsky.cjs.map +0 -1
  22. package/dist/SubscriptionsScreen-Y4UgpC1Y.mjs.map +0 -1
@@ -594,7 +594,7 @@ function FormSelectField$1({ control, name, label, options, placeholder, contain
594
594
  onChange?.(val);
595
595
  },
596
596
  children: [/* @__PURE__ */ jsx(SelectTrigger, {
597
- className: cn(error && "ring-destructive ring-1"),
597
+ className: cn("w-full", error && "ring-destructive ring-1"),
598
598
  children: /* @__PURE__ */ jsx(SelectValue, { placeholder })
599
599
  }), /* @__PURE__ */ jsx(SelectContent, { children: options?.map((opt) => /* @__PURE__ */ jsx(SelectItem, {
600
600
  value: opt.value.toString(),
@@ -1542,10 +1542,10 @@ function EditPaymentMethodDialog({ isOpen, paymentMethod, billingAddress, onClos
1542
1542
  })]
1543
1543
  })
1544
1544
  }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
1545
- className: "text-foreground mb-1 text-sm font-medium",
1545
+ className: "text-foreground mb-3 text-sm font-medium",
1546
1546
  children: t("billing_address")
1547
1547
  }), /* @__PURE__ */ jsxs("div", {
1548
- className: "space-y-0",
1548
+ className: "space-y-3",
1549
1549
  children: [
1550
1550
  /* @__PURE__ */ jsx(FormSelectField$1, {
1551
1551
  control,
@@ -1573,27 +1573,24 @@ function EditPaymentMethodDialog({ isOpen, paymentMethod, billingAddress, onClos
1573
1573
  label: t("address_line_2")
1574
1574
  }),
1575
1575
  /* @__PURE__ */ jsxs("div", {
1576
- className: "sm:flex sm:gap-2",
1576
+ className: "grid grid-cols-1 gap-3 sm:grid-cols-3",
1577
1577
  children: [
1578
1578
  /* @__PURE__ */ jsx(FormTextField$1, {
1579
1579
  control,
1580
1580
  name: "billing_address.city",
1581
- label: t("city"),
1582
- containerClassName: "flex-1"
1581
+ label: t("city")
1583
1582
  }),
1584
1583
  /* @__PURE__ */ jsx(FormSelectField$1, {
1585
1584
  control,
1586
1585
  name: "billing_address.state",
1587
1586
  label: config?.regionLabel ? t(config.regionLabel) : t("state"),
1588
1587
  options: stateSelectOptions,
1589
- placeholder: t("select_state"),
1590
- containerClassName: "flex-1"
1588
+ placeholder: t("select_state")
1591
1589
  }),
1592
1590
  /* @__PURE__ */ jsx(FormTextField$1, {
1593
1591
  control,
1594
1592
  name: "billing_address.zip",
1595
- label: config?.postalLabel ? t(config.postalLabel) : t("zip_code"),
1596
- containerClassName: "flex-1"
1593
+ label: config?.postalLabel ? t(config.postalLabel) : t("zip_code")
1597
1594
  })
1598
1595
  ]
1599
1596
  })
@@ -3044,6 +3041,6 @@ function AddressAutocompleteInput({ control, setValue, countryIso, addressLineFi
3044
3041
  });
3045
3042
  }
3046
3043
  //#endregion
3047
- export { AddressFormDialog as a, MySiteProfileSocialSection as c, Profile as d, PaymentIcon as f, ProfileUIProvider as g, FluidPayCoreProvider as h, CreditCardFormDialog as i, mySiteProfileSchema as l, getCardExpiry as m, createFluidPayApiAdapter as n, MySiteProfileSaveButton as o, getCardDisplayName as p, mapToFluidPayPaymentMethod as r, MySiteProfileSection as s, AddressAutocompleteInput as t, socialFields as u };
3044
+ export { EllipsesDropdown as _, AddressFormDialog as a, MySiteProfileSocialSection as c, Profile as d, EditPaymentMethodDialog as f, ConfirmActionDialog as g, getCardExpiry as h, CreditCardFormDialog as i, mySiteProfileSchema as l, getCardDisplayName as m, createFluidPayApiAdapter as n, MySiteProfileSaveButton as o, PaymentIcon as p, mapToFluidPayPaymentMethod as r, MySiteProfileSection as s, AddressAutocompleteInput as t, socialFields as u, FluidPayCoreProvider as v, ProfileUIProvider as y };
3048
3045
 
3049
- //# sourceMappingURL=AddressAutocompleteInput-Dy5sL54V.mjs.map
3046
+ //# sourceMappingURL=AddressAutocompleteInput-Dg-75n-K.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddressAutocompleteInput-Dg-75n-K.mjs","names":["FormTextField","FormSelectField","FormTextField","FormSelectField","FormSelectField","FormTextField","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/animated-expand.tsx","../../../profile/ui/src/components/customer-points-ledger.tsx","../../../profile/ui/src/components/form-fields.tsx","../../../profile/ui/src/components/user-info-dialog.tsx","../../../profile/ui/src/components/customer-info.tsx","../../../profile/ui/src/components/address-dropdown.tsx","../../../profile/ui/src/components/addresses.tsx","../../../profile/ui/src/components/payment-method-card-internals.tsx","../../../profile/ui/src/components/payment-method-dropdown.tsx","../../../profile/ui/src/components/view-payment-method-dialog.tsx","../../../profile/ui/src/components/edit-payment-method-dialog.tsx","../../../profile/ui/src/components/payment-methods.tsx","../../../profile/ui/src/components/profile.tsx","../../../profile/ui/src/components/my-site-profile-section.tsx","../../../fluid-pay/ui/src/components/form-fields/FormTextField.tsx","../../../fluid-pay/ui/src/components/form-fields/FormSelectField.tsx","../../../fluid-pay/ui/src/components/AddressFormDialog.tsx","../../../fluid-pay/ui/src/hooks/use-vgs-collect.ts","../../../fluid-pay/ui/src/components/CreditCardFormDialog.tsx","../src/adapters/fluid-pay-api-adapter.ts","../../../platform/address-autocomplete/src/components/AddressAutocompleteInput.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 onMakeDefault,\n editLabel = \"Edit\",\n deleteLabel = \"Delete\",\n makeDefaultLabel = \"Make Default\",\n disabled = false,\n}: {\n onDelete?: () => void;\n onEdit?: () => void;\n onMakeDefault?: () => void;\n editLabel?: string;\n deleteLabel?: string;\n makeDefaultLabel?: string;\n disabled?: boolean;\n}): JSX.Element {\n if (disabled) {\n return (\n <Button variant=\"ghost\" disabled>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 128 512\"\n className=\"fill-muted-foreground h-4 w-1\"\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=\"fill-muted-foreground h-4 w-1\"\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=\"text-foreground min-w-28 space-y-1 text-sm\">\n {onEdit && (\n <>\n <DropdownMenuItem\n className=\"hover:bg-muted flex cursor-pointer flex-row items-center gap-x-2 rounded px-2\"\n onClick={(e) => {\n e.stopPropagation();\n onEdit();\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"h-3.5 w-3.5 flex-shrink-0\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m16.862 4.487 1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L10.582 16.07a4.5 4.5 0 0 1-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 0 1 1.13-1.897l8.932-8.931Zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0 1 15.75 21H5.25A2.25 2.25 0 0 1 3 18.75V8.25A2.25 2.25 0 0 1 5.25 6H10\"\n />\n </svg>\n <span>{editLabel}</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n {onMakeDefault && (\n <>\n <DropdownMenuItem\n className=\"hover:bg-muted flex cursor-pointer flex-row items-center gap-x-2 rounded px-2\"\n onClick={(e) => {\n e.stopPropagation();\n onMakeDefault();\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"h-3.5 w-3.5 flex-shrink-0\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m4.5 12.75 6 6 9-13.5\"\n />\n </svg>\n <span>{makeDefaultLabel}</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n )}\n <DropdownMenuItem\n className=\"text-destructive hover:bg-destructive/10 flex cursor-pointer flex-row items-center gap-x-2 rounded px-2\"\n onClick={(e) => {\n e.stopPropagation();\n onDelete?.();\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth={1.5}\n stroke=\"currentColor\"\n className=\"h-3.5 w-3.5 flex-shrink-0\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0\"\n />\n </svg>\n <span>{deleteLabel}</span>\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 md:w-90\">\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"w-full text-left\">{title}</DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p className=\"text-muted-foreground text-left text-sm\">\n {description}\n </p>\n </div>\n\n {errorMsg && <p className=\"text-destructive text-sm\">{errorMsg}</p>}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between space-x-2\">\n <DialogClose asChild>\n <Button\n variant=\"secondary\"\n className=\"min-w-[70px]\"\n onClick={() => setOpenDialog(false)}\n >\n {t(\"cancel\")}\n </Button>\n </DialogClose>\n <Button\n type=\"button\"\n variant=\"destructive\"\n className=\"min-w-[70px]\"\n onClick={onAction}\n disabled={isLoading}\n >\n {isLoading ? (\n <div className=\"border-primary-foreground h-5 w-5 animate-spin rounded-full border-4 border-t-4 border-t-transparent\" />\n ) : (\n actionText\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, useState, type JSX, type ReactNode } from \"react\";\n\nconst DEFAULT_DURATION_MS = 500;\n\nfunction useReducedMotion(): boolean {\n const [reduced, setReduced] = useState(() =>\n typeof window !== \"undefined\" && window.matchMedia\n ? window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n : false,\n );\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return;\n const mql = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const onChange = (e: MediaQueryListEvent) => setReduced(e.matches);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n return reduced;\n}\n\nexport interface AnimatedExpandProps {\n open: boolean;\n durationMs?: number;\n children: ReactNode;\n}\n\nexport function AnimatedExpand({\n open,\n durationMs = DEFAULT_DURATION_MS,\n children,\n}: AnimatedExpandProps): JSX.Element {\n const reducedMotion = useReducedMotion();\n const effectiveDuration = reducedMotion ? 0 : durationMs;\n return (\n <div\n style={{\n display: \"grid\",\n gridTemplateRows: open ? \"1fr\" : \"0fr\",\n transition: `grid-template-rows ${effectiveDuration}ms cubic-bezier(0.4,0,0.2,1)`,\n }}\n >\n <div style={{ overflow: \"hidden\" }}>{children}</div>\n </div>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionItem,\n AccordionTrigger,\n Card,\n CardAction,\n CardContent,\n CardHeader,\n CardTitle,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport {\n useProfileUI,\n type TranslationFn,\n type PointsLedger,\n} from \"@fluid-app/profile-core\";\nimport { AnimatedExpand } from \"./animated-expand\";\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 const isExpanded = accordionValue === \"points-history\";\n\n return (\n <Accordion\n type=\"single\"\n collapsible\n value={accordionValue}\n onValueChange={setAccordionValue}\n >\n <AccordionItem value=\"points-history\" className=\"border-0\">\n <Card>\n <CardHeader>\n <CardTitle>{t(\"points_history\")}</CardTitle>\n {pointsLedger.length > 0 && (\n <CardAction>\n <AccordionTrigger className=\"[&>svg]:text-muted-foreground\" />\n </CardAction>\n )}\n </CardHeader>\n <CardContent className=\"flex flex-col gap-3\">\n {isLoading ? (\n <Skeleton className=\"h-6 w-full\" />\n ) : (\n <div className=\"text-foreground text-sm font-semibold\">\n {availablePoints.toLocaleString()}{\" \"}\n <span className=\"text-muted-foreground font-normal\">\n {t(\"points_available\").toLowerCase()}\n </span>\n </div>\n )}\n\n {/* Skip the animated wrapper when there are no entries — the\n trigger is hidden in that case, so isExpanded stays false and\n would clip the children. */}\n {pointsLedger.length > 0 && (\n <AnimatedExpand open={isExpanded}>\n <div className=\"flex flex-col\">\n {pointsLedger.map((ledger, index) => {\n const isLast = index === pointsLedger.length - 1;\n return (\n <div\n key={ledger.id}\n className=\"flex flex-row items-stretch gap-3\"\n >\n {/* Timeline column: line spans full row + 12px overshoot, dot sits on it */}\n <div className=\"relative flex w-2 flex-col items-center\">\n {!isLast && (\n <div className=\"bg-muted-foreground absolute top-3 -bottom-3 left-1/2 w-px -translate-x-1/2\" />\n )}\n <div className=\"border-muted-foreground bg-card relative mt-3 h-2 w-2 shrink-0 rounded-full border\" />\n </div>\n <div className=\"flex flex-1 flex-row items-start justify-between py-1.5\">\n <div className=\"flex flex-col\">\n <div className=\"text-foreground text-sm font-medium\">\n {formatTransactionType(ledger, t)}\n </div>\n <div className=\"text-muted-foreground text-sm\">\n {formatDateTime(ledger.created_at)}\n </div>\n </div>\n <div\n className={cn(\n \"text-sm font-medium\",\n ledger.amount >= 0\n ? \"text-primary\"\n : \"text-destructive\",\n )}\n >\n {formatPoints(ledger.amount)}\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </AnimatedExpand>\n )}\n\n {!isLoading && pointsLedger.length === 0 && (\n <div className=\"text-muted-foreground text-sm\">\n {t(\"no_points_history_found\")}\n </div>\n )}\n </CardContent>\n </Card>\n </AccordionItem>\n </Accordion>\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-destructive ring-1\", props.className)}\n />\n {error && <p className=\"text-destructive text-sm\">{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\n className={cn(\"w-full\", error && \"ring-destructive ring-1\")}\n >\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-destructive text-sm\">{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 md:max-w-lg\">\n <DialogHeader>\n <DialogTitle>{t(\"edit_profile\")}</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-destructive text-xs\">{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&apos;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 >\n Cancel\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={handleEmailSubmit}\n disabled={!newEmail.trim() || isChangingEmail}\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\"\n >\n Change\n </Button>\n )}\n </div>\n )}\n </div>\n )}\n {errorMsg && <p className=\"text-destructive text-sm\">{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}>\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 {\n Avatar,\n AvatarFallback,\n Button,\n Card,\n CardAction,\n CardContent,\n CardHeader,\n CardTitle,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { Info } 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 <Card>\n <CardHeader>\n <CardTitle>Personal Information</CardTitle>\n <CardAction>\n <Button variant=\"link\" size=\"sm\" onClick={handleOpenEditDialog}>\n Edit\n </Button>\n </CardAction>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-row items-center space-x-2\">\n <Avatar className=\"border-border border\">\n <AvatarFallback>{userInitial}</AvatarFallback>\n </Avatar>\n <div className=\"flex flex-col\">\n {customerAccount.customer.full_name.trim() && (\n <p className=\"text-sm font-medium\">\n {customerAccount.customer.full_name}\n </p>\n )}\n <p className=\"text-muted-foreground text-sm\">\n {customerAccount.customer.email}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\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 onMakeDefaultAddress?: (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 /** Controlled accordion value — pass accordionItemValue to force-expand */\n value?: string;\n /** Controlled accordion setter */\n onValueChange?: (value: string) => void;\n /** Hide the internal accordion trigger (e.g. when parent owns the trigger) */\n hideTrigger?: boolean;\n}\n\nexport default function AddressDropdown({\n title,\n displayAddress,\n addressList,\n onAddAddressClick,\n onEditAddress,\n onDeleteAddress,\n onMakeDefaultAddress,\n accordionItemValue,\n addAddressLabel,\n showAddButton = true,\n borderStyle = \"border-b border-border pb-4 mb-6\",\n className = \"\",\n showActions = true,\n isLoading = false,\n value,\n onValueChange,\n hideTrigger = false,\n}: AddressDropdownProps) {\n const [internalValue, setInternalValue] = useState<string>(\"\");\n const addressesValue = value ?? internalValue;\n const setAddressesValue = onValueChange ?? setInternalValue;\n const { t } = useProfileUI();\n\n const addressListContent = (\n <div className=\"flex flex-col justify-between space-y-4 px-0.5\">\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 ) : addressList.length > 0 ? (\n addressList.map((address, index) => (\n <div\n key={address.id}\n className={cn(\n \"flex w-full flex-row items-start justify-between space-x-2 px-2\",\n {\n \"border-border border-b p-3\": 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=\"bg-secondary text-secondary-foreground w-fit rounded px-2 py-0.5 text-xs font-medium\">\n {t(\"default\")}\n </p>\n )}\n {showActions && (\n <EllipsesDropdown\n onDelete={() => onDeleteAddress?.(address)}\n onEdit={() => onEditAddress?.(address)}\n onMakeDefault={\n !address.default && onMakeDefaultAddress\n ? () => onMakeDefaultAddress(address)\n : undefined\n }\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 );\n\n if (hideTrigger) {\n return (\n <div className={`${borderStyle} ${className}`}>\n {addressListContent}\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\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 {title && (\n <div className=\"text-muted-foreground mt-4 mb-1 text-sm\">\n {title}\n </div>\n )}\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 && !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 {addressListContent}\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 {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n Button,\n Card,\n CardAction,\n CardContent,\n CardHeader,\n CardTitle,\n} from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport { AnimatedExpand } from \"./animated-expand\";\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 onMakeDefaultAddress?: (addressId: number) => Promise<void> | void;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n}\n\nexport default function Addresses({\n addresses,\n isLoading = false,\n onCreateAddress,\n onDeleteAddress,\n isDeletingAddress = false,\n onMakeDefaultAddress,\n renderAddressDialog,\n}: AddressesProps): JSX.Element {\n const [accordionValue, setAccordionValue] = useState<string>(\"\");\n\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 const [openAddressDialog, setOpenAddressDialog] = useState(false);\n\n const { t } = useProfileUI();\n\n const defaultAddress =\n addresses.find((addr) => addr.default) ?? addresses[0] ?? null;\n const extraAddresses = defaultAddress\n ? addresses.filter((a) => a.id !== defaultAddress.id)\n : addresses;\n\n const isExpanded = accordionValue === \"addresses\";\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 (error) {\n console.error(\"Failed to delete address:\", error);\n const parsed = parseApiErrors(error);\n setDeleteAddressError(\n parsed ||\n (error instanceof Error\n ? error.message\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 <Accordion\n type=\"single\"\n collapsible\n value={accordionValue}\n onValueChange={setAccordionValue}\n >\n <AccordionItem value=\"addresses\" className=\"border-0\">\n <Card>\n <CardHeader>\n <CardTitle>Shipping Addresses</CardTitle>\n {extraAddresses.length > 0 && (\n <CardAction>\n <AccordionTrigger className=\"[&>svg]:text-muted-foreground\" />\n </CardAction>\n )}\n </CardHeader>\n <CardContent className=\"flex flex-col gap-3\">\n {defaultAddress && (\n <AddressDropdown\n title=\"\"\n displayAddress={defaultAddress}\n addressList={[defaultAddress]}\n onAddAddressClick={handleAddClick}\n onEditAddress={handleEditClick}\n onDeleteAddress={handleDeleteClick}\n onMakeDefaultAddress={\n onMakeDefaultAddress\n ? (addr) => onMakeDefaultAddress(addr.id)\n : undefined\n }\n accordionItemValue=\"addresses-preview\"\n addAddressLabel=\"\"\n showAddButton={false}\n borderStyle=\"\"\n showActions={true}\n isLoading={isLoading}\n hideTrigger={true}\n value=\"addresses-preview\"\n />\n )}\n\n {extraAddresses.length > 0 && (\n <AnimatedExpand open={isExpanded}>\n <AddressDropdown\n title=\"\"\n displayAddress={null}\n addressList={extraAddresses}\n onAddAddressClick={handleAddClick}\n onEditAddress={handleEditClick}\n onDeleteAddress={handleDeleteClick}\n onMakeDefaultAddress={\n onMakeDefaultAddress\n ? (addr) => onMakeDefaultAddress(addr.id)\n : undefined\n }\n accordionItemValue=\"addresses-inner\"\n addAddressLabel=\"\"\n showAddButton={false}\n borderStyle=\"\"\n showActions={true}\n isLoading={isLoading}\n hideTrigger={true}\n value=\"addresses-inner\"\n />\n </AnimatedExpand>\n )}\n\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n className=\"text-foreground mt-3 h-auto w-fit justify-start p-0 text-left\"\n onClick={handleAddClick}\n >\n + {t(\"add_an_address\")}\n </Button>\n </CardContent>\n </Card>\n </AccordionItem>\n </Accordion>\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n onAction={handleDeleteAddress}\n actionText={t(\"delete\")}\n openDialog={openDeleteDialog}\n setOpenDialog={setOpenDeleteDialog}\n errorMsg={deleteAddressError}\n isLoading={isDeletingAddress}\n />\n\n {renderAddressDialog?.({\n isOpen: openAddressDialog,\n onClose: handleCloseAddressDialog,\n selectedAddress,\n })}\n </>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\n\nconst PAYMENT_ICON_BASE = \"https://assets.fluid.app/images/payment_icons\";\nconst GENERIC_PAYMENT_ICON = `${PAYMENT_ICON_BASE}/generic.svg`;\n\nexport function brandIconUrl(brand: string | null | undefined): string {\n if (!brand) return GENERIC_PAYMENT_ICON;\n const slug = brand.toLowerCase().replace(/\\s+/g, \"_\");\n return `${PAYMENT_ICON_BASE}/${slug}.svg`;\n}\n\nexport function PaymentIcon({\n logoUrl,\n brand,\n alt,\n}: {\n logoUrl?: string;\n brand: string | null | undefined;\n alt: string;\n}): JSX.Element {\n const computedSrc = logoUrl || brandIconUrl(brand);\n const [hasError, setHasError] = useState(false);\n const src = hasError ? GENERIC_PAYMENT_ICON : computedSrc;\n return (\n <img\n src={src}\n alt={alt}\n width={40}\n height={24}\n className=\"object-contain\"\n onError={() => setHasError(true)}\n />\n );\n}\n\nexport function getCardDisplayName(\n paymentMethod: fluidPay.CustomerPaymentMethod,\n): string {\n const lastFour = paymentMethod.details.last_four;\n if (lastFour != null || paymentMethod.payment_type === \"Credit Card\") {\n const brand = paymentMethod.details.card_type || \"Card\";\n return `${brand} •••• ${lastFour || \"••••\"}`;\n }\n return paymentMethod.payment_type;\n}\n\nexport function getCardExpiry(\n paymentMethod: fluidPay.CustomerPaymentMethod,\n): string {\n const { exp_month, exp_year } = paymentMethod.details;\n if (exp_month != null && exp_year != null) {\n return `Expires ${exp_month}/${exp_year}`;\n }\n return \"\";\n}\n","import { useState } from \"react\";\nimport {\n cn,\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n Skeleton,\n} from \"@fluid-app/ui-primitives\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport EllipsesDropdown from \"./ellipses-dropdown\";\nimport {\n PaymentIcon,\n getCardDisplayName,\n getCardExpiry,\n} from \"./payment-method-card-internals\";\n\ninterface PaymentMethodDropdownProps {\n title: string;\n displayPaymentMethod: fluidPay.CustomerPaymentMethod | null;\n paymentMethodList: fluidPay.CustomerPaymentMethod[];\n onAddPaymentMethodClick: () => void;\n onEditPaymentMethod?: (paymentMethod: fluidPay.CustomerPaymentMethod) => void;\n onDeletePaymentMethod?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n onMakeDefaultPaymentMethod?: (\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 /** Controlled accordion value — pass accordionItemValue to force-expand */\n value?: string;\n /** Controlled accordion setter */\n onValueChange?: (value: string) => void;\n /** Hide the internal accordion trigger (e.g. when parent owns the trigger) */\n hideTrigger?: boolean;\n}\n\nexport default function PaymentMethodDropdown({\n title,\n displayPaymentMethod,\n paymentMethodList,\n onAddPaymentMethodClick,\n onEditPaymentMethod,\n onDeletePaymentMethod,\n onMakeDefaultPaymentMethod,\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 value,\n onValueChange,\n hideTrigger = false,\n}: PaymentMethodDropdownProps) {\n const [internalValue, setInternalValue] = useState<string>(\"\");\n const paymentsValue = value ?? internalValue;\n const setPaymentsValue = onValueChange ?? setInternalValue;\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 const paymentMethodListContent = (\n <div className=\"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={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 <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={() => onDeletePaymentMethod?.(paymentMethod)}\n deleteLabel=\"Delete\"\n onEdit={() => onEditPaymentMethod?.(paymentMethod)}\n editLabel=\"Edit\"\n onMakeDefault={\n !paymentMethod.default && onMakeDefaultPaymentMethod\n ? () => onMakeDefaultPaymentMethod(paymentMethod)\n : undefined\n }\n />\n )}\n </div>\n </div>\n ))\n )}\n </div>\n );\n\n if (hideTrigger) {\n return (\n <div className={`${borderStyle} ${className}`}>\n {paymentMethodListContent}\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\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 {title && (\n <div className=\"text-muted-foreground mt-4 mb-1 text-sm\">\n {title}\n </div>\n )}\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 {paymentMethodListContent}\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 md:max-w-lg\">\n <DialogHeader>\n <DialogTitle>{t(\"edit_card\")}</DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div>\n <div className=\"bg-muted rounded-lg 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-foreground text-sm font-medium\">\n {cardBrand} •••• {lastFour}\n </span>\n {expMonth != null && expYear != null && (\n <span className=\"text-muted-foreground text-sm\">\n {t(\"card_expires\")} {expMonth}/{expYear}\n </span>\n )}\n </div>\n </div>\n {paymentMethod.default && (\n <span className=\"bg-secondary text-secondary-foreground mt-2 inline-block rounded px-2 py-0.5 text-xs font-medium\">\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-foreground text-sm font-medium\">\n {t(\"billing_address\")}\n </h3>\n {onEdit && (\n <Button variant=\"link\" size=\"sm\" onClick={onEdit}>\n {t(\"edit\")}\n </Button>\n )}\n </div>\n <div className=\"bg-muted rounded-lg p-4\">\n {billingAddress ? (\n <div className=\"text-foreground space-y-1 text-sm\">\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-muted-foreground text-sm italic\">\n {t(\"no_billing_address\")}\n </p>\n )}\n </div>\n </div>\n </div>\n\n <DialogFooter>\n <DialogClose asChild>\n <Button variant=\"secondary\" onClick={onClose}>\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 md:max-w-lg\">\n <DialogHeader>\n <DialogTitle>{t(\"edit_card\")}</DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div className=\"bg-muted rounded-lg 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-foreground text-sm font-medium\">\n {cardBrand} •••• {lastFour}\n </span>\n {expMonth != null && expYear != null && (\n <span className=\"text-muted-foreground text-sm\">\n {t(\"card_expires\")} {expMonth}/{expYear}\n </span>\n )}\n </div>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-foreground mb-3 text-sm font-medium\">\n {t(\"billing_address\")}\n </h3>\n <div className=\"space-y-3\">\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=\"grid grid-cols-1 gap-3 sm:grid-cols-3\">\n <FormTextField\n control={control}\n name=\"billing_address.city\"\n label={t(\"city\")}\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 />\n <FormTextField\n control={control}\n name=\"billing_address.zip\"\n label={\n config?.postalLabel ? t(config.postalLabel) : t(\"zip_code\")\n }\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-destructive text-sm\">{error}</div>}\n\n <DialogFooter className=\"flex flex-row items-center justify-between\">\n <div className=\"flex-2\">\n <Button\n type=\"button\"\n variant=\"secondary\"\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=\"button\"\n onClick={handleFormSubmit}\n disabled={isSubmitting}\n >\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 { useState, type JSX, type ReactNode } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport {\n Accordion,\n AccordionItem,\n AccordionTrigger,\n Button,\n Card,\n CardAction,\n CardContent,\n CardHeader,\n CardTitle,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { parseApiErrors } from \"@fluid-app/api-client-core\";\nimport { useProfileUI } from \"@fluid-app/profile-core\";\nimport { AnimatedExpand } from \"./animated-expand\";\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 onMakeDefaultPaymentMethod?: (\n paymentMethodId: number,\n ) => Promise<void> | void;\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 onMakeDefaultPaymentMethod,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod = false,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n}: PaymentMethodsProps): JSX.Element {\n const [accordionValue, setAccordionValue] = useState<string>(\"\");\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 const extraPaymentMethods = defaultPaymentMethod\n ? paymentMethods.filter((m) => m.id !== defaultPaymentMethod.id)\n : paymentMethods;\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 (error) {\n console.error(\"Failed to delete payment method:\", error);\n const parsed = parseApiErrors(error);\n setDeleteCardError(\n parsed ||\n (error instanceof Error\n ? error.message\n : \"Unable to delete payment method. Please try again.\"),\n );\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 selectedBillingAddress = selectedPaymentMethod\n ? (getBillingAddress?.(selectedPaymentMethod) ?? null)\n : null;\n\n const isExpanded = accordionValue === \"paymentMethods\";\n\n return (\n <>\n <Accordion\n type=\"single\"\n collapsible\n value={accordionValue}\n onValueChange={setAccordionValue}\n >\n <AccordionItem value=\"paymentMethods\" className=\"border-0\">\n <Card>\n <CardHeader>\n <CardTitle>Payment Methods</CardTitle>\n {extraPaymentMethods.length > 0 && (\n <CardAction>\n <AccordionTrigger className=\"[&>svg]:text-muted-foreground\" />\n </CardAction>\n )}\n </CardHeader>\n <CardContent className=\"flex flex-col gap-3\">\n {defaultPaymentMethod && (\n <PaymentMethodDropdown\n title=\"\"\n displayPaymentMethod={defaultPaymentMethod}\n paymentMethodList={[defaultPaymentMethod]}\n onAddPaymentMethodClick={() => setIsOpen(true)}\n onEditPaymentMethod={handleViewPaymentMethod}\n onDeletePaymentMethod={handleDeletePaymentMethod}\n onMakeDefaultPaymentMethod={\n onMakeDefaultPaymentMethod\n ? (pm) => onMakeDefaultPaymentMethod(pm.id)\n : undefined\n }\n accordionItemValue=\"paymentMethods-preview\"\n addPaymentMethodLabel=\"\"\n showAddButton={false}\n isLoading={isLoading}\n borderStyle=\"\"\n hideTrigger={true}\n value=\"paymentMethods-preview\"\n />\n )}\n\n {extraPaymentMethods.length > 0 && (\n <AnimatedExpand open={isExpanded}>\n <PaymentMethodDropdown\n title=\"\"\n displayPaymentMethod={null}\n paymentMethodList={extraPaymentMethods}\n onAddPaymentMethodClick={() => setIsOpen(true)}\n onEditPaymentMethod={handleViewPaymentMethod}\n onDeletePaymentMethod={handleDeletePaymentMethod}\n onMakeDefaultPaymentMethod={\n onMakeDefaultPaymentMethod\n ? (pm) => onMakeDefaultPaymentMethod(pm.id)\n : undefined\n }\n accordionItemValue=\"paymentMethods-inner\"\n addPaymentMethodLabel=\"\"\n showAddButton={false}\n isLoading={isLoading}\n borderStyle=\"\"\n hideTrigger={true}\n value=\"paymentMethods-inner\"\n />\n </AnimatedExpand>\n )}\n\n <Button\n type=\"button\"\n variant=\"link\"\n size=\"sm\"\n className=\"text-foreground mt-3 h-auto w-fit justify-start p-0 text-left\"\n onClick={() => setIsOpen(true)}\n >\n + {t(\"add_payment_method\")}\n </Button>\n </CardContent>\n </Card>\n </AccordionItem>\n </Accordion>\n\n {renderCreditCardDialog?.({\n isOpen,\n onClose: () => setIsOpen(false),\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 onMakeDefaultAddress?: (addressId: number) => Promise<void> | void;\n renderAddressDialog?: (props: AddressDialogRenderProps) => ReactNode;\n\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n isLoadingPaymentMethods?: boolean;\n onDeletePaymentMethod: (paymentMethodId: number) => Promise<void> | void;\n isDeletingPaymentMethod?: boolean;\n onMakeDefaultPaymentMethod?: (\n paymentMethodId: number,\n ) => Promise<void> | void;\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 children?: ReactNode;\n footer?: 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 onMakeDefaultAddress,\n renderAddressDialog,\n paymentMethods,\n isLoadingPaymentMethods,\n onDeletePaymentMethod,\n isDeletingPaymentMethod,\n onMakeDefaultPaymentMethod,\n onUpdatePaymentMethod,\n isUpdatingPaymentMethod,\n getBillingAddress,\n countries,\n renderCreditCardDialog,\n children,\n footer,\n}: ProfileProps): JSX.Element {\n return (\n <div className=\"space-y-6\">\n {children}\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 <Addresses\n addresses={addresses}\n isLoading={isLoadingAddresses}\n onDeleteAddress={onDeleteAddress}\n isDeletingAddress={isDeletingAddress}\n onMakeDefaultAddress={onMakeDefaultAddress}\n renderAddressDialog={renderAddressDialog}\n />\n <PaymentMethods\n paymentMethods={paymentMethods}\n isLoading={isLoadingPaymentMethods}\n onDeletePaymentMethod={onDeletePaymentMethod}\n isDeletingPaymentMethod={isDeletingPaymentMethod}\n onMakeDefaultPaymentMethod={onMakeDefaultPaymentMethod}\n onUpdatePaymentMethod={onUpdatePaymentMethod}\n isUpdatingPaymentMethod={isUpdatingPaymentMethod}\n getBillingAddress={getBillingAddress}\n countries={countries}\n renderCreditCardDialog={renderCreditCardDialog}\n />\n {footer}\n </div>\n );\n}\n","import type React from \"react\";\nimport { useController, type Control } from \"react-hook-form\";\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Label,\n Textarea,\n cn,\n} from \"@fluid-app/ui-primitives\";\nimport { z } from \"zod\";\nimport { FormTextField } from \"./form-fields\";\n\nfunction normalizeUrl(value: string): string {\n const trimmed = value.trim();\n if (!trimmed) return \"\";\n if (/^https?:\\/\\//i.test(trimmed)) return trimmed;\n return `https://${trimmed}`;\n}\n\nconst urlField = z\n .string()\n .transform(normalizeUrl)\n .pipe(z.string().url().or(z.literal(\"\")));\n\nexport const mySiteProfileSchema = z.object({\n bio: z.string().optional(),\n linkedin: urlField,\n facebook: urlField,\n twitter: urlField,\n instagram: urlField,\n youtube: urlField,\n pinterest: urlField,\n tiktok: urlField,\n whatsapp: z.string().optional(),\n wechat: z.string().optional(),\n});\n\nexport type MySiteProfileFormData = z.infer<typeof mySiteProfileSchema>;\n\nexport const socialFields = [\n {\n name: \"linkedin\",\n label: \"LinkedIn\",\n placeholder: \"linkedin.com/in/username\",\n },\n { name: \"facebook\", label: \"Facebook\", placeholder: \"facebook.com/username\" },\n { name: \"twitter\", label: \"X (Twitter)\", placeholder: \"x.com/username\" },\n {\n name: \"instagram\",\n label: \"Instagram\",\n placeholder: \"instagram.com/username\",\n },\n { name: \"youtube\", label: \"YouTube\", placeholder: \"youtube.com/@channel\" },\n {\n name: \"pinterest\",\n label: \"Pinterest\",\n placeholder: \"pinterest.com/username\",\n },\n { name: \"tiktok\", label: \"TikTok\", placeholder: \"tiktok.com/@username\" },\n { name: \"whatsapp\", label: \"WhatsApp\", placeholder: \"Phone number or link\" },\n { name: \"wechat\", label: \"WeChat\", placeholder: \"WeChat ID\" },\n] as const satisfies readonly {\n name: keyof Omit<MySiteProfileFormData, \"bio\">;\n label: string;\n placeholder: string;\n}[];\n\nexport interface MySiteProfileSectionProps {\n avatarUrl?: string | null;\n initial?: string;\n control: Control<MySiteProfileFormData>;\n}\n\nfunction BioField({ control }: { control: Control<MySiteProfileFormData> }) {\n const {\n field,\n fieldState: { error },\n } = useController({ name: \"bio\", control });\n return (\n <div className=\"space-y-1\">\n <Label htmlFor=\"mysite-bio\" className=\"block text-sm font-medium\">\n Bio\n </Label>\n <Textarea\n id=\"mysite-bio\"\n rows={4}\n placeholder=\"Tell people a little about yourself...\"\n className={cn(error && \"ring-destructive ring-1\")}\n {...field}\n value={field.value ?? \"\"}\n />\n {error && <p className=\"text-destructive text-sm\">{error.message}</p>}\n </div>\n );\n}\n\nexport function MySiteProfileSection({\n avatarUrl,\n initial,\n control,\n}: MySiteProfileSectionProps): React.JSX.Element {\n return (\n <Card>\n <CardHeader>\n <CardTitle>About Me</CardTitle>\n </CardHeader>\n <CardContent className=\"flex flex-col gap-6 lg:flex-row lg:gap-10\">\n <div className=\"bg-muted relative h-[120px] w-[120px] shrink-0 self-center overflow-hidden rounded-full lg:self-auto\">\n {avatarUrl ? (\n <img\n src={avatarUrl}\n alt=\"Profile\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"bg-background text-foreground flex h-full w-full items-center justify-center text-xl font-semibold\">\n {initial ?? \"U\"}\n </div>\n )}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <BioField control={control} />\n </div>\n </CardContent>\n </Card>\n );\n}\n\nexport interface MySiteProfileSocialSectionProps {\n control: Control<MySiteProfileFormData>;\n}\n\nexport function MySiteProfileSocialSection({\n control,\n}: MySiteProfileSocialSectionProps): React.JSX.Element {\n return (\n <Card>\n <CardHeader>\n <CardTitle>Social Media Links</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-4\">\n {socialFields.map((field) => (\n <FormTextField\n key={field.name}\n control={control}\n name={field.name}\n label={field.label}\n placeholder={field.placeholder}\n />\n ))}\n </div>\n </CardContent>\n </Card>\n );\n}\n\nexport interface MySiteProfileSaveButtonProps {\n isDirty: boolean;\n isPending: boolean;\n onSubmit: () => void;\n}\n\nexport function MySiteProfileSaveButton({\n isDirty,\n isPending,\n onSubmit,\n}: MySiteProfileSaveButtonProps): React.JSX.Element {\n return (\n <div className=\"flex justify-end pb-6\">\n <Button\n type=\"button\"\n onClick={onSubmit}\n disabled={!isDirty || isPending}\n className=\"w-full sm:w-auto\"\n >\n {isPending && (\n <div className=\"mr-2 h-4 w-4 animate-spin rounded-full border-2 border-current/30 border-t-current\" />\n )}\n {isPending ? \"Saving...\" : \"Save\"}\n </Button>\n </div>\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-destructive text-sm\">{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 aria-invalid={!!error} className=\"w-full\">\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-destructive text-sm\">{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 >\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_address\")}\n </Button>\n </div>\n\n {error && <div className=\"text-destructive mt-2 text-sm\">{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 const [scriptLoadError, setScriptLoadError] = useState<string | undefined>(\n undefined,\n );\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 // Surface load failures both to a registered consumer (if any) and to\n // state, so a consumer mounting after the failure still sees it.\n script.onerror = () => {\n const message = \"Failed to load payment form\";\n setScriptLoadError(message);\n onErrorRef.current?.(message);\n };\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 // Resolve theme tokens from the wrapper element. The theme engine\n // applies `data-theme` on a subtree element (not <html>), so CSS\n // variables aren't visible on document.documentElement — only on a\n // node inside the themed subtree. Cross-origin iframe contents\n // can't see parent CSS variables, so we resolve concrete values\n // here and pass them to VGS.\n //\n // The `vgs-card-number` element is guaranteed to exist at this\n // point: the `waitForDom` check above blocks until all four VGS\n // wrapper elements are mounted. The hardcoded fallback colors only\n // activate if the CSS variables themselves are unset.\n const themedNode = document.getElementById(\"vgs-card-number\");\n const probeStyle = themedNode ? getComputedStyle(themedNode) : null;\n const foregroundColor =\n probeStyle?.getPropertyValue(\"--color-foreground\").trim() ||\n \"#0a0a0a\";\n const mutedForegroundColor =\n probeStyle?.getPropertyValue(\"--color-muted-foreground\").trim() ||\n \"#737373\";\n\n // Wrapper is `h-9 py-1` (Input primitive). Content area = 36 - 2 (border) - 8 (py-1) = 26px.\n const css = {\n fontSize: \"14px\",\n fontFamily:\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n color: foregroundColor,\n background: \"transparent\",\n paddingTop: \"0px\",\n paddingBottom: \"0px\",\n paddingLeft: \"0px\",\n paddingRight: \"0px\",\n boxSizing: \"border-box\",\n lineHeight: \"26px\",\n height: \"100%\",\n width: \"100%\",\n \"&::placeholder\": { color: mutedForegroundColor, 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 scriptLoadError,\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 label,\n fieldState,\n className,\n}: {\n id: string;\n label: string;\n fieldState?: VgsFieldState;\n className?: string;\n}) {\n const isInvalid =\n fieldState?.isValid === false &&\n !fieldState?.isFocused &&\n !fieldState?.isEmpty;\n const isFocused = !!fieldState?.isFocused;\n\n // `aria-invalid` is only meaningful on form-control roles. The wrapper is a\n // styling host for a cross-origin VGS iframe (the actual form control), so\n // we use `data-invalid` for visual state and `role=\"group\"` + `aria-label`\n // to give the iframe an accessible name through its parent.\n return (\n <div\n id={id}\n role=\"group\"\n aria-label={label}\n data-invalid={isInvalid ? \"\" : undefined}\n className={cn(\n // Mirrors the Input primitive's className from @fluid-app/ui-primitives\n // because VGS renders a cross-origin iframe inside this wrapper.\n \"border-input selection:bg-primary selection:text-primary-foreground file:text-foreground placeholder:text-muted-foreground h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"data-[invalid]:border-destructive data-[invalid]:ring-destructive/20\",\n // Iframe must fill the wrapper.\n \"[&_iframe]:block! [&_iframe]:h-full! [&_iframe]:w-full! [&_iframe]:border-0!\",\n // Cross-origin iframe focus doesn't trigger :focus-visible on the\n // wrapper, so mirror Input primitive's focus state from VGS-reported state.\n isFocused && \"border-ring ring-ring/50 ring-[3px]\",\n isFocused && isInvalid && \"border-destructive ring-destructive/20\",\n className,\n )}\n />\n );\n}\n\nfunction VgsCardForm({\n vgsFieldState,\n networkError,\n}: {\n vgsFieldState: VgsFormState;\n networkError?: string;\n}) {\n return (\n <div className=\"space-y-4\" aria-label=\"Credit card form\">\n <VgsInputWrapper\n id=\"vgs-card-number\"\n label=\"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 label=\"Expiration date\"\n fieldState={vgsFieldState[\"card_exp\"]}\n />\n </div>\n <div className=\"flex-1\">\n <VgsInputWrapper\n id=\"vgs-cvc\"\n label=\"CVC\"\n fieldState={vgsFieldState[\"card_cvc\"]}\n />\n </div>\n </div>\n\n <VgsInputWrapper\n id=\"vgs-card-holder\"\n label=\"Cardholder name\"\n fieldState={vgsFieldState[\"card_holder\"]}\n />\n\n {networkError && networkError.trim().length > 0 && (\n <div className=\"bg-destructive/10 text-destructive rounded-md p-3 text-sm\">\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 scriptLoadError,\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. If the\n // billing form has gone invalid between the user clicking Save and VGS\n // returning, surface that and clear the spinner — otherwise the dialog\n // would stay stuck in the submitting state with no feedback.\n handleSubmit(\n (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 setCardError(\"Please fix the errors in the billing address.\");\n setIsVgsSubmitting(false);\n },\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 p-0 md:max-w-xl\">\n <div className=\"relative p-6\">\n {(isVgsLoading || !isFormReady) && !scriptLoadError && (\n <div className=\"bg-background/80 absolute inset-0 z-10 flex items-center justify-center rounded backdrop-blur-[1px]\">\n <div className=\"flex items-center justify-center\">\n <div className=\"border-primary mr-3 h-5 w-5 animate-spin rounded-full border-2 border-t-2 border-t-transparent\" />\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"securing\")}\n </p>\n </div>\n </div>\n )}\n <DialogHeader>\n <DialogTitle>{t(\"add_credit_card\")}</DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4 pt-6\">\n <VgsCardForm\n vgsFieldState={vgsFieldState}\n networkError={cardError ?? scriptLoadError ?? error}\n />\n\n <div className=\"space-y-3 pt-2\">\n <h3 className=\"text-muted-foreground text-sm font-medium\">\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 type=\"button\" onClick={handleFormSubmit} disabled={isBusy}>\n {isBusy && (\n <div className=\"mr-2 h-4 w-4 animate-spin rounded-full border-2 border-current/30 border-t-current\" />\n )}\n {isBusy ? t(\"saving\") : t(\"save_card\")}\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n","import { type FluidPayApi, type fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { PayApi } from \"@fluid-app/portal-core/pay-api\";\nimport type { PayPaymentMethod } from \"@fluid-app/portal-core/pay-types\";\n\n/**\n * Maps a portal-tenant PayPaymentMethod to the fluidPay shape consumed by\n * profile-ui components (PaymentMethodDropdown, CreditCardFormDialog, etc.).\n * Co-located with the adapter because both speak the portal-tenant ↔ fluid-pay\n * boundary.\n */\nexport function mapToFluidPayPaymentMethod(\n raw: PayPaymentMethod,\n): fluidPay.CustomerPaymentMethod {\n return {\n id: raw.id,\n created_at: raw.created_at ?? \"\",\n default: raw.default,\n details: {\n card_type: raw.brand,\n card_brand: raw.brand,\n last_four: raw.last_four,\n exp_month: raw.exp_month ?? undefined,\n exp_year: raw.exp_year ?? undefined,\n },\n billing_address: raw.billing_address\n ? {\n name: raw.billing_address.name,\n address1: raw.billing_address.street1,\n address2: raw.billing_address.street2,\n city: raw.billing_address.city,\n state: raw.billing_address.state,\n zip: raw.billing_address.zip,\n country_code: raw.billing_address.country,\n }\n : null,\n payment_type: raw.type,\n source: \"\",\n updated_at: raw.updated_at ?? \"\",\n };\n}\n\nconst notImplemented = () => {\n throw new Error(\"Not available in portal-tenant context\");\n};\n\n/**\n * Adapts the portal-tenant PayApi to the FluidPayApi shape required by\n * FluidPayCoreProvider. Only `vault.fetchCredentials` is implemented —\n * the rest of the FluidPayApi surface is not used by the profile-ui\n * components that consume this provider in the portal context.\n */\nexport function createFluidPayApiAdapter(payApi: PayApi): FluidPayApi {\n return {\n customers: { fetchAccount: notImplemented, update: notImplemented },\n addresses: {\n fetchAll: notImplemented,\n create: notImplemented,\n update: notImplemented,\n delete: notImplemented,\n },\n paymentMethods: {\n fetchAll: notImplemented,\n addCreditCard: notImplemented,\n delete: notImplemented,\n updateDefault: notImplemented,\n update: notImplemented,\n },\n vault: {\n fetchCredentials: async () => {\n const response = await payApi.fetchVaultCredentials();\n return {\n vault: {\n vault_id: response.vault.vault_id,\n environment: response.vault.environment,\n route_id: response.vault.route_id ?? \"\",\n requires_3ds: false,\n },\n meta: {\n request_id: response.meta?.request_id ?? \"\",\n timestamp: response.meta?.timestamp ?? \"\",\n },\n } satisfies fluidPay.VaultResponse;\n },\n },\n };\n}\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEvent,\n type JSX,\n} from \"react\";\nimport {\n useController,\n type Control,\n type FieldValues,\n type Path,\n type PathValue,\n type UseFormSetValue,\n} from \"react-hook-form\";\nimport { Input } from \"@fluid-app/ui-primitives\";\nimport { useAddressAutocompleteApi } from \"../api-context\";\nimport type { AddressDetails, AddressSuggestion } from \"../api\";\n\nexport interface AddressAutocompleteInputProps<T extends FieldValues> {\n readonly control: Control<T>;\n readonly setValue: UseFormSetValue<T>;\n readonly countryIso: string;\n readonly addressLineField: Path<T>;\n readonly cityField: Path<T>;\n readonly stateField: Path<T>;\n readonly postalCodeField: Path<T>;\n readonly placeholder?: string;\n readonly disabled?: boolean;\n}\n\nconst SET_OPTS = {\n shouldValidate: true,\n shouldDirty: true,\n shouldTouch: true,\n} as const;\n\nconst DEBOUNCE_MS = 250;\n\nexport function AddressAutocompleteInput<T extends FieldValues>({\n control,\n setValue,\n countryIso,\n addressLineField,\n cityField,\n stateField,\n postalCodeField,\n placeholder = \"Start typing your address...\",\n disabled,\n}: AddressAutocompleteInputProps<T>): JSX.Element {\n const api = useAddressAutocompleteApi();\n const { field } = useController({ name: addressLineField, control });\n const [suggestions, setSuggestions] = useState<readonly AddressSuggestion[]>(\n [],\n );\n const [isOpen, setIsOpen] = useState(false);\n const [needsCountry, setNeedsCountry] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n // Monotonically increasing request ID. We only apply a fetch result when its\n // ID still matches the latest issued one — guards against stale responses\n // arriving out of order under network jitter.\n const requestIdRef = useRef(0);\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isCountrySelected = useMemo(\n () => Boolean(countryIso && countryIso.trim() !== \"\"),\n [countryIso],\n );\n\n useEffect(() => {\n function onClickOutside(e: MouseEvent) {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n setNeedsCountry(false);\n }\n }\n document.addEventListener(\"mousedown\", onClickOutside);\n return () => document.removeEventListener(\"mousedown\", onClickOutside);\n }, []);\n\n useEffect(\n () => () => {\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n }\n },\n [],\n );\n\n const populate = useCallback(\n (s: AddressDetails) => {\n setValue(\n addressLineField,\n s.streetLine as PathValue<T, Path<T>>,\n SET_OPTS,\n );\n setValue(cityField, s.city as PathValue<T, Path<T>>, SET_OPTS);\n setValue(stateField, s.state as PathValue<T, Path<T>>, SET_OPTS);\n setValue(\n postalCodeField,\n s.postalCode as PathValue<T, Path<T>>,\n SET_OPTS,\n );\n },\n [addressLineField, cityField, postalCodeField, setValue, stateField],\n );\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value;\n field.onChange(value);\n\n // Cancel any pending fetch from a prior keystroke.\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n\n if (value.length < 1) {\n setIsOpen(false);\n setNeedsCountry(false);\n setSuggestions([]);\n return;\n }\n if (!isCountrySelected) {\n setNeedsCountry(true);\n setIsOpen(true);\n return;\n }\n setNeedsCountry(false);\n\n const requestId = ++requestIdRef.current;\n debounceTimerRef.current = setTimeout(() => {\n debounceTimerRef.current = null;\n void api.fetchSuggestions({ query: value, countryIso }).then((next) => {\n // Drop stale responses — a newer keystroke has already issued a\n // request, and applying this would clobber its result.\n if (requestId !== requestIdRef.current) return;\n setSuggestions(next);\n setIsOpen(true);\n });\n }, DEBOUNCE_MS);\n },\n [api, countryIso, field, isCountrySelected],\n );\n\n const handleClick = useCallback(\n async (suggestion: AddressSuggestion) => {\n // Cancel any debounced fetch still pending from a recent keystroke and\n // advance the request ID so any in-flight response is dropped — without\n // this, the timer could fire after a selection and re-open the dropdown.\n if (debounceTimerRef.current !== null) {\n clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = null;\n }\n const clickId = ++requestIdRef.current;\n\n if (!suggestion.needsDetailLookup) {\n populate({\n streetLine: suggestion.streetLine ?? suggestion.text,\n city: suggestion.city ?? \"\",\n state: suggestion.state ?? \"\",\n postalCode: suggestion.postalCode ?? \"\",\n });\n setIsOpen(false);\n return;\n }\n const { details, drilldownSuggestions } = await api.fetchDetails({\n suggestion,\n countryIso,\n });\n // Drop the result if the user typed during the network round-trip — a\n // newer keystroke has superseded this click and applying its result\n // would clobber what the user has since entered.\n if (clickId !== requestIdRef.current) return;\n if (details) {\n populate(details);\n setIsOpen(false);\n return;\n }\n setSuggestions(drilldownSuggestions);\n setIsOpen(true);\n },\n [api, countryIso, populate],\n );\n\n return (\n <div ref={containerRef} className=\"relative\">\n <Input\n type=\"text\"\n ref={field.ref}\n value={(field.value as string) ?? \"\"}\n onChange={handleChange}\n onBlur={field.onBlur}\n placeholder={placeholder}\n disabled={disabled}\n />\n {isOpen && needsCountry && (\n <div className=\"bg-muted text-foreground absolute z-50 mt-1 w-full rounded-md px-3 py-2 text-sm shadow-lg\">\n Please select a country first to enable address suggestions\n </div>\n )}\n {isOpen && !needsCountry && suggestions.length > 0 && (\n <div className=\"bg-background text-foreground border-border absolute z-50 mt-1 max-h-60 w-full overflow-y-auto rounded-md border shadow-lg\">\n {suggestions.map((s) => (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => {\n void handleClick(s).catch((err) => {\n // handleClick is async because of fetchDetails — the current\n // Smarty adapter and NULL_API swallow errors, so this is\n // belt-and-suspenders for future adapters that might throw.\n console.error(\"Address autocomplete click failed:\", err);\n });\n }}\n className=\"hover:bg-accent block w-full cursor-pointer px-3 py-2 text-left text-sm\"\n >\n {s.text}\n {s.needsDetailLookup ? \" →\" : \"\"}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}