@fluid-app/portal-sdk 0.1.470 → 0.1.471

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.
@@ -66,5 +66,5 @@ import "./ScreenHeaderContext-ChDdmXwG.mjs";
66
66
  import "./use-portal-card-add-3ds-flow-DjeKiZvQ.mjs";
67
67
  import "./display-jC56KxIJ.mjs";
68
68
  import "./Combobox-ccokyVjG.mjs";
69
- import { n as profileScreenPropertySchema, t as ProfileScreen } from "./ProfileScreen-3ki8yPFt.mjs";
69
+ import { n as profileScreenPropertySchema, t as ProfileScreen } from "./ProfileScreen-TbmOka5D.mjs";
70
70
  export { ProfileScreen, profileScreenPropertySchema };
@@ -26,6 +26,11 @@ function deriveLastName(firstName, fullName) {
26
26
  return fullName.startsWith(prefix) ? fullName.slice(prefix.length) : "";
27
27
  }
28
28
  //#endregion
29
+ //#region src/screens/profile/derive-card-holder-name.ts
30
+ function deriveCardHolderName(method) {
31
+ return method.billing_address?.name?.trim() || method.details.card_holder?.trim() || "";
32
+ }
33
+ //#endregion
29
34
  //#region src/screens/profile/ProfileLayout.tsx
30
35
  function ProfileLayout(props) {
31
36
  const { t } = require_use_portal_card_add_3ds_flow.useProfileTranslation();
@@ -387,7 +392,7 @@ function PaymentCardVisual({ method, onClick }) {
387
392
  const expMonth = String(method.details.exp_month ?? "").padStart(2, "0");
388
393
  const expYear = String(method.details.exp_year ?? "").slice(-2);
389
394
  const exp = expMonth && expYear ? `${expMonth}/${expYear}` : "";
390
- const holder = method.details.card_holder || method.billing_address?.name || "";
395
+ const holder = deriveCardHolderName(method);
391
396
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
392
397
  type: "button",
393
398
  onClick,
@@ -1421,4 +1426,4 @@ Object.defineProperty(exports, "profileScreenPropertySchema", {
1421
1426
  }
1422
1427
  });
1423
1428
 
1424
- //# sourceMappingURL=ProfileScreen-G3cmyl0b.cjs.map
1429
+ //# sourceMappingURL=ProfileScreen-CpI9XiZQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileScreen-CpI9XiZQ.cjs","names":["useProfileTranslation","Sparkles","Pencil","User","Mail","Phone","Quote","Link2","Copy","ResponsiveDialog","LogOut","titleCaseFromSnake","brandIconUrl","GENERIC_PAYMENT_ICON_URL","maskCardNumber","Plus","MapPin","EllipsesDropdown","Linkedin","Facebook","Twitter","Instagram","Youtube","Globe","isThreeDsRequiredCreate","canAccessRepSurfaces","useProfileTranslation","useSidebar","useActiveLocale","usePayApi","useAccountApi","createFluidPayApiAdapter","usePortalMySiteProfile","usePortalUpdateSettings","useAccount","payKeys","mapToFluidPayPaymentMethod","useCountriesApi","useLanguagesApi","storeKeys","useStore","accountKeys","usePortalCardAdd3DSFlow","getBrowserInfo","useZodForm","z","FluidPayCoreProvider","UserInfoDialog","AddressFormDialog","ConfirmActionDialog","CreditCardFormDialog","EditPaymentMethodDialog","ResponsiveDialog","Label","Input","DialogFooter","Button","useFluidContext","ProfileTranslationBridge","useProfileTranslation","ScreenHeaderBreadcrumbs","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage"],"sources":["../src/screens/profile/derive-last-name.ts","../src/screens/profile/derive-card-holder-name.ts","../src/screens/profile/ProfileLayout.tsx","../src/screens/profile-card-add-success.ts","../src/screens/ProfileContentScreen.tsx","../src/screens/ProfileScreen.tsx"],"sourcesContent":["export function deriveLastName(firstName: string, fullName: string): string {\n if (!firstName) return \"\";\n const prefix = `${firstName} `;\n return fullName.startsWith(prefix) ? fullName.slice(prefix.length) : \"\";\n}\n","import type { fluidPay } from \"@fluid-app/fluid-pay-core\";\n\n// The edit dialog can only change billing_address.name; card_holder has no\n// update API.\nexport function deriveCardHolderName(\n method: fluidPay.CustomerPaymentMethod,\n): string {\n return (\n method.billing_address?.name?.trim() ||\n method.details.card_holder?.trim() ||\n \"\"\n );\n}\n","import { type JSX, type ReactNode, useState, type ComponentType } from \"react\";\nimport {\n ResponsiveDialog,\n type ResponsiveDialogPresentation,\n} from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport {\n Sparkles,\n Pencil,\n Plus,\n Copy,\n Link2,\n MapPin,\n User,\n Mail,\n Phone,\n Quote,\n Linkedin,\n Facebook,\n Twitter,\n Instagram,\n Youtube,\n Globe,\n LogOut,\n} from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { PointsLedger } from \"@fluid-app/profile-core\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\nimport {\n brandIconUrl,\n GENERIC_PAYMENT_ICON_URL,\n} from \"@fluid-app/payments-display/brands\";\nimport { maskCardNumber } from \"@fluid-app/payments-display/display\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { titleCaseFromSnake } from \"@fluid-app/portal-core/format/title-case\";\nimport { deriveCardHolderName } from \"./derive-card-holder-name\";\n\ninterface ProfileLayoutProps {\n account: AccountRep;\n pointsBalance: number | undefined;\n pointsLedger?: PointsLedger[];\n pointsLabel: { singular: string; plural: string };\n rewardsEnabled?: boolean;\n addresses: fluidPay.CustomerAddress[];\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n mySiteDisplayUrl: string;\n socialLinks: Partial<Record<SocialKey, string>>;\n onEditPersonalInfo: () => void;\n onAddAddress: () => void;\n onEditAddress: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress: (address: fluidPay.CustomerAddress) => void;\n onAddPaymentMethod: () => void;\n onEditPaymentMethod: (method: fluidPay.CustomerPaymentMethod) => void;\n onCopyMySiteLink: () => void;\n onEditMySiteLink?: () => void;\n onConnectSocial: (key: SocialKey) => void;\n onSignOut?: () => void;\n presentation?: ResponsiveDialogPresentation;\n}\n\nexport function ProfileLayout(props: ProfileLayoutProps): JSX.Element {\n const { t } = useProfileTranslation();\n const {\n account,\n pointsBalance,\n pointsLedger,\n pointsLabel,\n rewardsEnabled,\n addresses,\n paymentMethods,\n mySiteDisplayUrl,\n socialLinks,\n onEditPersonalInfo,\n onAddAddress,\n onEditAddress,\n onDeleteAddress,\n onAddPaymentMethod,\n onEditPaymentMethod,\n onCopyMySiteLink,\n onEditMySiteLink,\n onConnectSocial,\n onSignOut,\n presentation = \"dialog\",\n } = props;\n\n const fullName =\n `${account.first_name ?? \"\"} ${account.last_name ?? \"\"}`.trim();\n const heroFirstName = (account.first_name || \"\").trim().split(\" \")[0] || \"\";\n const heroDisplay =\n heroFirstName || account.email?.split(\"@\")[0] || t(\"account_fallback\");\n const connectedSocialCount = Object.values(socialLinks).filter(\n (v) => typeof v === \"string\" && v.length > 0,\n ).length;\n const [isPointsHistoryOpen, setIsPointsHistoryOpen] = useState(false);\n const POINTS_PREVIEW_COUNT = 4;\n const ledger = pointsLedger ?? [];\n const ledgerPreview = ledger.slice(0, POINTS_PREVIEW_COUNT);\n const hasMoreLedger = ledger.length > POINTS_PREVIEW_COUNT;\n // Configured points label: capitalized plural for headings, count-aware form\n // (singular at 1) for \"N <label>\" amounts.\n const pointsLabelPluralCap = capitalize(pointsLabel.plural);\n const pointsCountLabel = (n: number): string =>\n n === 1 ? pointsLabel.singular : pointsLabel.plural;\n const sortedAddresses = [...addresses].sort(\n (a, b) => Number(b.default ?? false) - Number(a.default ?? false),\n );\n\n return (\n <div className=\"relative\">\n <div className=\"relative mx-auto max-w-4xl px-5 pt-8 pb-20 md:px-8\">\n {/* Hero */}\n <section className=\"flex items-center gap-3.5\">\n <div className=\"relative size-12 shrink-0 overflow-hidden rounded-full ring-1 ring-black/5 md:size-13\">\n {account.avatar_url ? (\n <img\n src={account.avatar_url}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"bg-primary text-primary-foreground flex h-full w-full items-center justify-center text-lg font-semibold\">\n {heroDisplay.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-foreground truncate text-xl font-bold tracking-tight md:text-2xl\">\n {heroDisplay}\n </h1>\n <p className=\"text-muted-foreground mt-0.5 truncate text-sm\">\n {account.email}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {rewardsEnabled && (\n <div className=\"ring-border text-foreground inline-flex items-center gap-1.5 rounded-md bg-transparent px-2.5 py-1 text-xs font-semibold ring-1\">\n <Sparkles className=\"text-primary size-3\" strokeWidth={2.25} />\n {(pointsBalance ?? 0).toLocaleString()}{\" \"}\n {pointsCountLabel(pointsBalance ?? 0)}\n </div>\n )}\n </div>\n </section>\n\n {/* Personal information */}\n <SectionHeader\n title={t(\"personal_information\")}\n action={\n <PillButton\n onClick={onEditPersonalInfo}\n icon={Pencil}\n label={t(\"edit\")}\n />\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <FieldRow\n icon={User}\n label={t(\"name\")}\n value={fullName || account.first_name || \"\"}\n />\n <FieldRow\n icon={Mail}\n label={t(\"email\")}\n value={account.email ?? \"\"}\n />\n <FieldRow\n icon={Phone}\n label={t(\"phone\")}\n value={account.phone ?? \"\"}\n placeholder={t(\"add_phone_number\")}\n />\n <FieldRow\n icon={Quote}\n label={t(\"bio\")}\n value={account.bio ?? \"\"}\n placeholder={t(\"add_a_short_bio\")}\n multiline\n isLast\n />\n </div>\n\n {/* Payment methods */}\n <SectionHeader title={t(\"payment_methods\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-3\">\n {paymentMethods.map((method) => (\n <PaymentCardVisual\n key={method.id}\n method={method}\n onClick={() => onEditPaymentMethod(method)}\n />\n ))}\n <AddPaymentTile onClick={onAddPaymentMethod} />\n </div>\n\n {/* Points history */}\n {rewardsEnabled && (\n <>\n <SectionHeader\n title={t(\"points_history\", { label: pointsLabelPluralCap })}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"pts_available\", {\n count: String((pointsBalance ?? 0).toLocaleString()),\n label: pointsCountLabel(pointsBalance ?? 0),\n })}\n </span>\n }\n />\n {ledger.length > 0 ? (\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {ledgerPreview.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={!hasMoreLedger && i === ledgerPreview.length - 1}\n pointsLabelPlural={pointsLabelPluralCap}\n />\n ))}\n {hasMoreLedger && (\n <button\n type=\"button\"\n onClick={() => setIsPointsHistoryOpen(true)}\n className=\"text-foreground hover:bg-muted flex w-full items-center justify-center gap-1 px-4 py-3 text-xs font-bold transition-colors\"\n >\n {t(\"see_all_transactions\", { count: ledger.length })}\n </button>\n )}\n </div>\n ) : (\n <div className=\"ring-dashed ring-border mt-2.5 flex flex-col items-center justify-center gap-1 rounded-2xl bg-transparent px-4 py-8 text-center ring-1\">\n <Sparkles\n className=\"text-muted-foreground/75 size-5\"\n strokeWidth={1.75}\n />\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"no_points_yet\", { label: pointsLabel.plural })}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"earn_points_hint\", { label: pointsLabel.plural })}\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Your MySite link */}\n <SectionHeader\n title={t(\"your_mysite_link\")}\n action={\n onEditMySiteLink ? (\n <PillButton\n onClick={onEditMySiteLink}\n icon={Pencil}\n label={t(\"edit_link\")}\n />\n ) : undefined\n }\n />\n <div className=\"ring-border mt-2.5 flex items-center gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"bg-muted text-foreground flex size-11 shrink-0 items-center justify-center rounded-full\">\n <Link2 className=\"size-[18px]\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {t(\"public_link\")}\n </div>\n <div className=\"text-foreground mt-0.5 truncate font-mono text-sm font-semibold\">\n {mySiteDisplayUrl || t(\"set_your_mysite_link\")}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onCopyMySiteLink}\n disabled={!mySiteDisplayUrl}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Copy className=\"size-3\" strokeWidth={2.25} />\n {t(\"copy\")}\n </button>\n </div>\n\n {/* Shipping addresses */}\n <SectionHeader title={t(\"shipping_addresses\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n {sortedAddresses.map((address) => (\n <AddressCard\n key={address.id}\n address={address}\n onEdit={() => onEditAddress(address)}\n onDelete={\n address.default ? undefined : () => onDeleteAddress(address)\n }\n presentation={presentation}\n />\n ))}\n <AddAddressTile onClick={onAddAddress} />\n </div>\n\n {/* Social media */}\n <SectionHeader\n title={t(\"social_media\")}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"connected_count\", { count: connectedSocialCount })}\n </span>\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {SOCIAL_ENTRIES.map((entry, i) => (\n <SocialRow\n key={entry.key}\n entry={entry}\n handle={socialLinks[entry.key] ?? \"\"}\n isLast={i === SOCIAL_ENTRIES.length - 1}\n onConnect={() => onConnectSocial(entry.key)}\n />\n ))}\n </div>\n\n <ResponsiveDialog\n open={isPointsHistoryOpen}\n onOpenChange={setIsPointsHistoryOpen}\n title={t(\"points_history\", { label: pointsLabelPluralCap })}\n presentation={presentation}\n >\n <div className=\"ring-border overflow-hidden rounded-2xl bg-transparent ring-1\">\n {ledger.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={i === ledger.length - 1}\n pointsLabelPlural={pointsLabelPluralCap}\n />\n ))}\n </div>\n </ResponsiveDialog>\n\n {onSignOut && (\n <div className=\"ring-border mt-8 flex flex-wrap items-center justify-between gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"flex items-center gap-3\">\n <div className=\"bg-destructive/10 flex size-9 items-center justify-center rounded-md\">\n <LogOut\n className=\"text-destructive size-4\"\n strokeWidth={2.25}\n />\n </div>\n <div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"sign_out\")}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"sign_out_description\")}\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"bg-destructive/15 text-destructive hover:bg-destructive/25 rounded-md px-4 py-2 text-xs font-bold transition-colors\"\n >\n {t(\"sign_out\")}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction SectionHeader({\n title,\n action,\n}: {\n title: string;\n action?: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"mt-8 flex items-end justify-between\">\n <h2 className=\"text-foreground text-base font-bold tracking-tight\">\n {title}\n </h2>\n {action ?? null}\n </div>\n );\n}\n\nfunction PillButton({\n onClick,\n icon: Icon,\n label,\n disabled,\n}: {\n onClick: () => void;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n disabled?: boolean;\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Icon className=\"size-3\" strokeWidth={2.25} />\n {label}\n </button>\n );\n}\n\nfunction PointsLedgerRow({\n entry,\n isLast,\n pointsLabelPlural,\n}: {\n entry: PointsLedger;\n isLast: boolean;\n pointsLabelPlural: string;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const isCredit = entry.amount >= 0;\n const sign = isCredit ? \"+\" : \"−\";\n const magnitude = Math.abs(entry.amount).toLocaleString();\n const amountColor = isCredit ? \"text-emerald-600\" : \"text-destructive\";\n const sourceName = entry.metadata?.source?.name?.trim();\n const transactionType = entry.metadata?.transaction_type;\n const label =\n sourceName ||\n (transactionType\n ? titleCaseFromSnake(transactionType)\n : isCredit\n ? t(\"points_awarded\", { label: pointsLabelPlural })\n : t(\"points_redeemed\", { label: pointsLabelPlural }));\n const dateLabel = formatLedgerDate(entry.created_at);\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Sparkles\n className={`size-4 ${isCredit ? \"text-primary\" : \"text-muted-foreground\"}`}\n strokeWidth={2}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground truncate text-sm font-medium\">\n {label}\n </div>\n <div className=\"text-muted-foreground text-xs\">{dateLabel}</div>\n </div>\n <div\n className={`shrink-0 font-mono text-sm font-bold tabular-nums ${amountColor}`}\n >\n {sign}\n {magnitude}\n </div>\n </div>\n );\n}\n\n/** Capitalize the first letter for display in headings / titles. */\nfunction capitalize(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction formatLedgerDate(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nfunction FieldRow({\n icon: Icon,\n label,\n value,\n placeholder,\n isLast,\n multiline,\n}: {\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n value: string;\n placeholder?: string;\n isLast?: boolean;\n multiline?: boolean;\n}): JSX.Element {\n const display = value || placeholder || \"\";\n const isPlaceholder = !value && Boolean(placeholder);\n const valueClasses = multiline ? \"whitespace-pre-line\" : \"truncate\";\n return (\n <div\n className={`flex gap-3 px-4 py-3.5 ${multiline ? \"items-start\" : \"items-center\"} ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-muted-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {label}\n </div>\n <div\n className={`mt-0.5 ${valueClasses} text-sm font-medium ${isPlaceholder ? \"text-muted-foreground/55\" : \"text-foreground\"}`}\n >\n {display}\n </div>\n </div>\n </div>\n );\n}\n\nfunction PaymentCardVisual({\n method,\n onClick,\n}: {\n method: fluidPay.CustomerPaymentMethod;\n onClick: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const brand = (method.details.card_brand || \"\").toLowerCase();\n // Ordered, de-duplicated fallback chain: the server-provided logo, then the\n // brand-derived CDN icon, then the generic card icon. Each load failure\n // advances one step instead of collapsing straight to generic.\n const logoCandidates = [\n ...new Set(\n [\n method.details.logo_url,\n brandIconUrl(brand),\n GENERIC_PAYMENT_ICON_URL,\n ].filter((url): url is string => Boolean(url)),\n ),\n ];\n const [logoStep, setLogoStep] = useState(0);\n const logoSrc =\n logoCandidates[Math.min(logoStep, logoCandidates.length - 1)] ??\n GENERIC_PAYMENT_ICON_URL;\n const maskedNumber = maskCardNumber(method.details.last_four, brand);\n const expMonth = String(method.details.exp_month ?? \"\").padStart(2, \"0\");\n const expYear = String(method.details.exp_year ?? \"\").slice(-2);\n const exp = expMonth && expYear ? `${expMonth}/${expYear}` : \"\";\n const holder = deriveCardHolderName(method);\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group bg-foreground text-background ring-foreground/10 relative flex aspect-[1.586/1] flex-col justify-between overflow-hidden rounded-xl p-4 text-left shadow-sm ring-1 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg\"\n >\n <div\n aria-hidden\n className=\"absolute inset-0 bg-[repeating-linear-gradient(135deg,transparent_0px,transparent_22px,currentColor_22px,currentColor_24px)] opacity-[0.04]\"\n />\n <div className=\"relative\">\n <div className=\"flex items-start justify-between\">\n <img\n src={logoSrc}\n alt={brand}\n className=\"h-7 w-auto object-contain\"\n onError={() =>\n setLogoStep((step) =>\n Math.min(step + 1, logoCandidates.length - 1),\n )\n }\n />\n {method.default && (\n <span className=\"bg-background/10 text-background/80 rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"text-background mt-3 font-mono text-lg font-bold tracking-wider\">\n {maskedNumber}\n </div>\n </div>\n <div className=\"relative flex items-end justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"cardholder\")}\n </div>\n <div className=\"text-background truncate text-xs font-semibold\">\n {holder || \" \"}\n </div>\n </div>\n <div>\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"card_expires\")}\n </div>\n <div className=\"text-background font-mono text-xs font-semibold\">\n {exp}\n </div>\n </div>\n </div>\n </button>\n );\n}\n\nfunction AddPaymentTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex aspect-[1.586/1] flex-col items-center justify-center gap-1.5 rounded-xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-xs font-bold\">\n {t(\"add_payment_method\")}\n </div>\n <div className=\"text-muted-foreground/75 text-xs\">\n {t(\"accepted_cards\")}\n </div>\n </button>\n );\n}\n\nfunction AddressCard({\n address,\n onEdit,\n onDelete,\n presentation,\n}: {\n address: fluidPay.CustomerAddress;\n onEdit: () => void;\n onDelete?: () => void;\n presentation: ResponsiveDialogPresentation;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const label = address.name?.trim() || t(\"address\");\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n return (\n <div className=\"ring-border hover:bg-muted focus-within:ring-foreground/40 relative flex flex-col rounded-2xl bg-transparent ring-1 transition-all duration-200 focus-within:ring-2 hover:ring-2\">\n <button\n type=\"button\"\n onClick={onEdit}\n className=\"flex w-full flex-col rounded-2xl p-4 pr-12 text-left focus-visible:outline-none\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-muted flex size-8 items-center justify-center rounded-full\">\n <MapPin\n className=\"text-muted-foreground size-4\"\n strokeWidth={2}\n />\n </div>\n <div className=\"text-foreground text-sm font-bold\">{label}</div>\n </div>\n {address.default && (\n <span className=\"bg-primary text-primary-foreground rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"text-foreground mt-3 space-y-0.5 text-sm leading-snug\">\n {address.address1 && <div>{address.address1}</div>}\n {address.address2 && <div>{address.address2}</div>}\n {cityLine && <div>{cityLine}</div>}\n {address.country_code && (\n <div className=\"text-muted-foreground\">{address.country_code}</div>\n )}\n {address.phone && (\n <div className=\"text-muted-foreground\">{address.phone}</div>\n )}\n </div>\n </button>\n <div className=\"absolute top-2 right-2 z-10\">\n <EllipsesDropdown\n onEdit={onEdit}\n onDelete={onDelete}\n editLabel={t(\"edit\")}\n deleteLabel={t(\"delete\")}\n menuLabel={t(\"address\")}\n presentation={presentation}\n />\n </div>\n </div>\n );\n}\n\nfunction AddAddressTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex min-h-37 flex-col items-center justify-center gap-1.5 rounded-2xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"add_an_address\")}\n </div>\n </button>\n );\n}\n\ntype SocialKey =\n | \"linkedin\"\n | \"facebook\"\n | \"x\"\n | \"instagram\"\n | \"youtube\"\n | \"pinterest\"\n | \"tiktok\";\n\ninterface SocialEntry {\n key: SocialKey;\n label: string;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n placeholder: string;\n}\n\nconst SOCIAL_ENTRIES: readonly SocialEntry[] = [\n {\n key: \"linkedin\",\n label: \"LinkedIn\",\n icon: Linkedin,\n placeholder: \"linkedin.com/in/username\",\n },\n {\n key: \"facebook\",\n label: \"Facebook\",\n icon: Facebook,\n placeholder: \"facebook.com/username\",\n },\n { key: \"x\", label: \"X\", icon: Twitter, placeholder: \"x.com/username\" },\n {\n key: \"instagram\",\n label: \"Instagram\",\n icon: Instagram,\n placeholder: \"instagram.com/username\",\n },\n {\n key: \"youtube\",\n label: \"YouTube\",\n icon: Youtube,\n placeholder: \"youtube.com/@channel\",\n },\n {\n key: \"pinterest\",\n label: \"Pinterest\",\n icon: Globe,\n placeholder: \"pinterest.com/username\",\n },\n {\n key: \"tiktok\",\n label: \"TikTok\",\n icon: Globe,\n placeholder: \"tiktok.com/@username\",\n },\n] as const;\n\nfunction SocialRow({\n entry,\n handle,\n isLast,\n onConnect,\n}: {\n entry: SocialEntry;\n handle: string;\n isLast: boolean;\n onConnect: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const Icon = entry.icon;\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground text-sm font-bold\">{entry.label}</div>\n <div\n className={`truncate text-xs ${handle ? \"text-muted-foreground\" : \"text-muted-foreground/55\"}`}\n >\n {handle || entry.placeholder}\n </div>\n </div>\n <PillButton\n onClick={onConnect}\n icon={handle ? Pencil : Plus}\n label={handle ? t(\"edit\") : t(\"connect\")}\n />\n </div>\n );\n}\n\nexport type { SocialKey };\n","import { isThreeDsRequiredCreate } from \"@fluid-app/portal-core/pay-types\";\nimport type {\n CreatePaymentMethodResponse,\n ThreeDsRequiredCreateResult,\n} from \"@fluid-app/portal-core/pay-types\";\n\n/**\n * Build the create-payment-method onSuccess handler. On three_ds_required it\n * hands off to the 3DS flow and leaves the card dialog OPEN (begin() resolves\n * at modal-open, not flow-completion). On a created PM it runs the legacy\n * created path (invalidate + close + toast).\n */\nexport function buildProfileCardAddSuccess(deps: {\n begin: (created: ThreeDsRequiredCreateResult) => Promise<void>;\n onCreated: () => void;\n}) {\n return async (response: CreatePaymentMethodResponse) => {\n if (isThreeDsRequiredCreate(response)) {\n await deps.begin(response);\n return;\n }\n deps.onCreated();\n };\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { z } from \"zod\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n Button,\n DialogFooter,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { ResponsiveDialog } from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport { useSidebar } from \"@fluid-app/portal-react/shell/sidebar\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n AddressFormDialog,\n ConfirmActionDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n UserInfoDialog,\n socialFields,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n CreditCardFormSubmitData,\n} from \"@fluid-app/profile-ui\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport { getBrowserInfo } from \"@fluid-app/fluid-pay-core/utils/browser-info\";\nimport { TOKEN_PROVIDER_VGS } from \"@fluid-app/portal-core/pay-types\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { canAccessRepSurfaces } from \"@fluid-app/portal-core/member-permissions\";\nimport { useAccountApi } from \"@fluid-app/portal-core/account-api-context\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport {\n usePortalMySiteProfile,\n usePortalUpdateSettings,\n} from \"@fluid-app/mysite-ui/portal/hooks/use-mysite-portal\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { useLanguagesApi } from \"@fluid-app/store-core/languages-api-context\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { accountKeys, payKeys, storeKeys } from \"../account/query-keys\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { useStore } from \"../hooks/use-store\";\nimport { deriveLastName } from \"./profile/derive-last-name\";\nimport { ProfileLayout, type SocialKey } from \"./profile/ProfileLayout\";\nimport { usePortalCardAdd3DSFlow } from \"../hooks/use-portal-card-add-3ds-flow\";\nimport { buildProfileCardAddSuccess } from \"./profile-card-add-success\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nfunction mapAccountToCustomerAccount(\n raw: AccountRep,\n): fluidPay.CustomerAccount {\n return {\n fluid_pay_account: {\n id: raw.id,\n email: raw.email,\n address_count: 0,\n payment_methods_count: 0,\n language_iso: raw.language_iso,\n },\n customer: {\n id: raw.id,\n active: true,\n active_subscriptions_count: 0,\n display_total_spent: \"0\",\n email: raw.email,\n first_name: raw.first_name,\n full_name: `${raw.first_name} ${raw.last_name}`.trim(),\n inactive_subscriptions_count: 0,\n is_rep: canAccessRepSurfaces(raw),\n phone: raw.phone,\n orders_count: 0,\n },\n };\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n phone: raw.phone,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\ntype SocialFieldKey = (typeof socialFields)[number][\"name\"];\n\nconst SOCIAL_KEY_TO_FIELD: Record<SocialKey, SocialFieldKey | null> = {\n linkedin: \"linkedin\" as SocialFieldKey,\n facebook: \"facebook\" as SocialFieldKey,\n x: \"twitter\" as SocialFieldKey,\n instagram: \"instagram\" as SocialFieldKey,\n youtube: \"youtube\" as SocialFieldKey,\n pinterest: \"pinterest\" as SocialFieldKey,\n tiktok: \"tiktok\" as SocialFieldKey,\n};\n\nconst SOCIAL_LABELS: Record<SocialKey, string> = {\n linkedin: \"LinkedIn\",\n facebook: \"Facebook\",\n x: \"X\",\n instagram: \"Instagram\",\n youtube: \"YouTube\",\n pinterest: \"Pinterest\",\n tiktok: \"TikTok\",\n};\n\nconst SOCIAL_PLACEHOLDERS: Record<SocialKey, string> = {\n linkedin: \"linkedin.com/in/username\",\n facebook: \"facebook.com/username\",\n x: \"x.com/username\",\n instagram: \"instagram.com/username\",\n youtube: \"youtube.com/@channel\",\n pinterest: \"pinterest.com/username\",\n tiktok: \"tiktok.com/@username\",\n};\n\nexport function ProfileContentScreen({\n onToast,\n countryIso,\n}: ProfileContentScreenProps): React.JSX.Element {\n const { t } = useProfileTranslation();\n const { isMobile } = useSidebar();\n const dialogPresentation = isMobile ? \"bottom-sheet\" : \"dialog\";\n const { locale } = useActiveLocale();\n const payApi = usePayApi();\n const accountApi = useAccountApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const { data: mySiteProfile } = usePortalMySiteProfile();\n const updateMySiteSettingsMutation = usePortalUpdateSettings();\n\n const mySiteUrl = mySiteProfile?.mysite_url ?? \"\";\n const mySiteDisplayUrl = mySiteUrl\n ? mySiteUrl.replace(/^https?:\\/\\//, \"\")\n : \"\";\n const mySiteLastSlash = mySiteDisplayUrl.lastIndexOf(\"/\");\n const mySiteUrlPrefix =\n mySiteLastSlash >= 0 ? mySiteDisplayUrl.slice(0, mySiteLastSlash + 1) : \"\";\n const mySiteCurrentSlug =\n mySiteLastSlash >= 0\n ? mySiteDisplayUrl.slice(mySiteLastSlash + 1)\n : mySiteDisplayUrl;\n\n // Reuse the app-wide useAccount() cache entry shared with AppShell/PageRouter.\n const {\n data: accountRep,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useAccount();\n\n const accountData = useMemo(\n () => (accountRep ? mapAccountToCustomerAccount(accountRep) : undefined),\n [accountRep],\n );\n\n const { data: addressesData } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: true,\n });\n\n const { data: paymentMethodsData } = useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n enabled: true,\n });\n\n const countriesAdapter = useCountriesApi();\n const languagesAdapter = useLanguagesApi();\n\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(locale),\n queryFn: () => countriesAdapter.listCountries({ languageIso: locale }),\n enabled: true,\n });\n\n const { data: languagesData } = useQuery({\n queryKey: storeKeys.languages(),\n queryFn: () => languagesAdapter.listLanguages(),\n enabled: true,\n });\n\n const { data: pointsLedgerData, isError: isPointsLedgerError } = useQuery({\n queryKey: payKeys.pointsLedgers.list(),\n queryFn: () => payApi.fetchPointsLedgers(),\n enabled: true,\n retry: (failureCount, error) => {\n if (\n error instanceof Error &&\n \"status\" in error &&\n (error as { status: number }).status === 403\n ) {\n return false;\n }\n return failureCount < 1;\n },\n });\n\n const rewardPointsEnabled = !isPointsLedgerError && pointsLedgerData != null;\n\n // Per-company reward-points label (defaults point/points). Drives the\n // configured label across the profile points UI.\n const { data: store } = useStore();\n const pointsLabelSingular = store?.reward_points_label_singular || \"point\";\n const pointsLabelPlural = store?.reward_points_label_plural || \"points\";\n const pointsLabel = useMemo(\n () => ({ singular: pointsLabelSingular, plural: pointsLabelPlural }),\n [pointsLabelSingular, pointsLabelPlural],\n );\n\n const adaptedPointsLedger: PointsLedger[] = useMemo(() => {\n return (pointsLedgerData?.points_ledgers ?? []).map((entry) => {\n const meta = entry.metadata as {\n transaction_type?: string | null;\n source?: {\n name: string;\n email?: string;\n reason?: string;\n user_id?: number;\n } | null;\n } | null;\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: 0,\n metadata: {\n transaction_type: meta?.transaction_type ?? undefined,\n source: meta?.source ?? undefined,\n },\n total_balance: entry.total_balance,\n updated_at: entry.created_at,\n };\n });\n }, [pointsLedgerData]);\n\n const updateCustomerMutation = useMutation({\n mutationFn: async (data: UserFormData) => {\n await accountApi.updateAccount({\n account: {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n bio: data.bio,\n language_iso: data.language,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"profile_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_profile\"), \"error\");\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_delete_payment_method\"), \"error\");\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_update_payment_method\"), \"error\");\n },\n });\n\n const createAddressMutation = useMutation({\n // Detect a server-side dedupe (POST /api/pay/addresses returns the existing\n // record when an identical address already exists, ignoring `name`). Snapshot\n // the current id set before the request and compare against the returned id.\n mutationFn: async (body: fluidPay.CreateAddressBody) => {\n const existingIds = new Set((addressesData ?? []).map((a) => a.id));\n const address = await payApi.createAddress({\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n phone: body.address.phone,\n default: body.address.default,\n },\n });\n return { address, deduped: existingIds.has(address.id) };\n },\n onSuccess: ({ deduped }) => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n if (deduped) {\n onToast(t(\"address_already_exists\"), \"warning\");\n } else {\n onToast(t(\"address_created\"), \"success\");\n }\n },\n onError: () => {\n onToast(t(\"failed_to_create_address\"), \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n phone: body.address.phone,\n default: body.address.default,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_address\"), \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_deleted\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_delete_address\"), \"error\");\n },\n });\n\n // Orchestrates the bank-challenge step when card add returns three_ds_required.\n // begin() resolves the moment the challenge modal opens — so dialog close and\n // the success toast live ONLY here (onApproved) and on the created branch\n // (onCreated below), never on the three_ds_required branch.\n const cardAdd3DS = usePortalCardAdd3DSFlow({\n payApi,\n t: (key: string) => t(key as never),\n onApproved: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n setIsAddCardOpen(false);\n onToast(t(\"payment_method_added\"), \"success\");\n },\n onFailed: (message) => {\n setSaveCardError(message);\n },\n onCanceled: () => {},\n });\n\n const cardAddSuccess = buildProfileCardAddSuccess({\n begin: cardAdd3DS.begin,\n onCreated: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n setIsAddCardOpen(false);\n onToast(t(\"payment_method_added\"), \"success\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: CreditCardFormSubmitData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n token_provider: TOKEN_PROVIDER_VGS,\n exp_month: data.payment_method.exp_month,\n exp_year: data.payment_method.exp_year,\n cvv_token: data.payment_method.cvv_token,\n card_holder: data.payment_method.card_holder,\n default: data.set_as_default,\n ...(data.payment_method.bin ? { bin: data.payment_method.bin } : {}),\n ...(data.payment_method.last_four\n ? { last_four: data.payment_method.last_four }\n : {}),\n ...(data.payment_method.card_network\n ? { card_network: data.payment_method.card_network }\n : {}),\n },\n billing_address_id: data.billing_address_id,\n browser_info: getBrowserInfo(),\n }),\n onSuccess: cardAddSuccess,\n onError: () => {\n onToast(t(\"failed_to_add_payment_method\"), \"error\");\n },\n });\n\n const addresses = addressesData ?? [];\n const paymentMethods = paymentMethodsData ?? [];\n\n const adaptedLanguages: Language[] = (languagesData?.languages ?? []).map(\n (l, i) => ({ id: i, name: l.name, iso: l.code }),\n );\n\n const countries = countriesData?.countries;\n\n const countryOptions = useMemo(\n () =>\n [...(countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countries]);\n\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n // Dialog open state\n const [isInfoDialogOpen, setIsInfoDialogOpen] = useState(false);\n const [addressDialog, setAddressDialog] = useState<{\n open: boolean;\n selected: fluidPay.CustomerAddress | null;\n }>({ open: false, selected: null });\n const [deletingAddress, setDeletingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [isAddCardOpen, setIsAddCardOpen] = useState(false);\n const [saveCardError, setSaveCardError] = useState<string | null>(null);\n const [editPaymentMethod, setEditPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n\n // User-info form (for the existing dialog)\n const userInfoLanguage = useMemo(() => {\n return (\n adaptedLanguages.find(\n (l) => l.iso === accountData?.fluid_pay_account.language_iso,\n )?.iso ?? \"\"\n );\n }, [adaptedLanguages, accountData]);\n\n const derivedLastName = useMemo(() => {\n if (!accountData) return \"\";\n const { first_name, full_name } = accountData.customer;\n return deriveLastName(first_name, full_name);\n }, [accountData]);\n\n const userInfoSchema = useMemo(\n () =>\n z.object({\n first_name: z.string().min(1, t(\"first_name_is_required\")),\n last_name: z.string().min(1, t(\"last_name_is_required\")),\n phone_number: z.string().optional(),\n language: z.string().min(1, t(\"language_is_required\")),\n bio: z.string().optional(),\n }),\n [t],\n );\n\n const userInfoForm = useZodForm<UserFormData>(userInfoSchema, {\n defaultValues: {\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n },\n });\n\n const handleOpenInfoDialog = useCallback(() => {\n userInfoForm.reset({\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n });\n setIsInfoDialogOpen(true);\n }, [\n accountData,\n accountRep,\n derivedLastName,\n userInfoLanguage,\n userInfoForm,\n ]);\n\n const onSubmitUserInfo = userInfoForm.handleSubmit(async (data) => {\n try {\n await updateCustomerMutation.mutateAsync(data);\n setIsInfoDialogOpen(false);\n } catch {\n // toast surfaced via onError\n }\n });\n\n const socialLinks = useMemo<Partial<Record<SocialKey, string>>>(() => {\n const src: Partial<Record<SocialFieldKey, string>> =\n accountRep?.social_links ?? {};\n const result: Partial<Record<SocialKey, string>> = {};\n for (const [key, field] of Object.entries(SOCIAL_KEY_TO_FIELD) as [\n SocialKey,\n SocialFieldKey | null,\n ][]) {\n if (!field) continue;\n const v = src[field];\n if (typeof v === \"string\" && v.length > 0) {\n result[key] = v;\n }\n }\n return result;\n }, [accountRep]);\n\n const handleCopyMySiteLink = useCallback(async () => {\n if (!mySiteUrl) return;\n try {\n await navigator.clipboard.writeText(mySiteUrl);\n onToast(t(\"mysite_link_copied\"), \"success\");\n } catch {\n onToast(t(\"failed_to_copy_link\"), \"error\");\n }\n }, [mySiteUrl, onToast, t]);\n\n const [isEditMySiteLinkOpen, setIsEditMySiteLinkOpen] = useState(false);\n const [mySiteSlugDraft, setMySiteSlugDraft] = useState(\"\");\n\n const handleOpenEditMySiteLink = useCallback(() => {\n setMySiteSlugDraft(mySiteCurrentSlug);\n setIsEditMySiteLinkOpen(true);\n }, [mySiteCurrentSlug]);\n\n const handleSubmitMySiteLink = useCallback(async () => {\n const trimmed = mySiteSlugDraft.trim();\n if (!trimmed) {\n onToast(t(\"mysite_link_empty\"), \"error\");\n return;\n }\n if (trimmed === mySiteCurrentSlug) {\n setIsEditMySiteLinkOpen(false);\n return;\n }\n try {\n await updateMySiteSettingsMutation.mutateAsync({ slug: trimmed });\n onToast(t(\"mysite_link_updated\"), \"success\");\n setIsEditMySiteLinkOpen(false);\n } catch {\n onToast(t(\"failed_to_update_mysite_link\"), \"error\");\n }\n }, [\n mySiteSlugDraft,\n mySiteCurrentSlug,\n updateMySiteSettingsMutation,\n onToast,\n t,\n ]);\n\n const [editingSocial, setEditingSocial] = useState<SocialKey | null>(null);\n const [socialDraft, setSocialDraft] = useState(\"\");\n\n const handleConnectSocial = useCallback(\n (key: SocialKey) => {\n const field = SOCIAL_KEY_TO_FIELD[key];\n if (!field) {\n onToast(t(\"platform_not_editable\"), \"warning\");\n return;\n }\n const current = accountRep?.social_links?.[field] ?? \"\";\n setSocialDraft(current);\n setEditingSocial(key);\n },\n [accountRep, onToast, t],\n );\n\n const updateSocialMutation = useMutation({\n mutationFn: async ({\n field,\n value,\n }: {\n field: SocialFieldKey;\n value: string;\n }) => {\n const current = accountRep?.social_links ?? {};\n await accountApi.updateAccount({\n account: {\n social_links: { ...current, [field]: value },\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"social_link_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_social_link\"), \"error\");\n },\n });\n\n const handleSubmitSocial = useCallback(async () => {\n if (!editingSocial) return;\n const field = SOCIAL_KEY_TO_FIELD[editingSocial];\n if (!field) return;\n await updateSocialMutation.mutateAsync({\n field,\n value: socialDraft.trim(),\n });\n setEditingSocial(null);\n }, [editingSocial, socialDraft, updateSocialMutation]);\n\n if (isAccountError && !isLoadingAccount) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"text-muted-foreground text-center text-sm\">\n {t(\"unable_to_load_account\")}\n </div>\n </div>\n );\n }\n\n if (isLoadingAccount || !accountData || !accountRep) {\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-16 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n const pointsBalance = rewardPointsEnabled\n ? (pointsLedgerData?.points_ledgers?.[0]?.total_balance ?? 0)\n : undefined;\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileLayout\n account={accountRep}\n pointsBalance={pointsBalance}\n pointsLedger={adaptedPointsLedger}\n pointsLabel={pointsLabel}\n rewardsEnabled={rewardPointsEnabled}\n addresses={addresses}\n paymentMethods={paymentMethods}\n mySiteDisplayUrl={mySiteDisplayUrl}\n socialLinks={socialLinks}\n onEditPersonalInfo={handleOpenInfoDialog}\n onAddAddress={() => setAddressDialog({ open: true, selected: null })}\n onEditAddress={(address) =>\n setAddressDialog({ open: true, selected: address })\n }\n onDeleteAddress={(address) => setDeletingAddress(address)}\n onAddPaymentMethod={() => {\n setSaveCardError(null);\n setIsAddCardOpen(true);\n }}\n onEditPaymentMethod={(pm) => setEditPaymentMethod(pm)}\n onCopyMySiteLink={handleCopyMySiteLink}\n onEditMySiteLink={handleOpenEditMySiteLink}\n onConnectSocial={handleConnectSocial}\n presentation={dialogPresentation}\n />\n\n <UserInfoDialog\n control={userInfoForm.control}\n isOpen={isInfoDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={() => setIsInfoDialogOpen(false)}\n languageOptions={adaptedLanguages.map((l) => ({\n name: l.name,\n value: l.iso,\n }))}\n errorMsg={undefined}\n isSubmitting={updateCustomerMutation.isPending}\n email={accountRep.email ?? \"\"}\n presentation={dialogPresentation}\n />\n\n <AddressFormDialog\n isOpen={addressDialog.open}\n onClose={() => setAddressDialog({ open: false, selected: null })}\n selectedAddress={addressDialog.selected}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ?? countryIso\n }\n languageIso={locale}\n t={(key: string) => t(key as never)}\n onSubmit={async (formData) => {\n if (addressDialog.selected) {\n await updateAddressMutation.mutateAsync({\n addressId: addressDialog.selected.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n setAddressDialog({ open: false, selected: null });\n }}\n isSubmitting={\n createAddressMutation.isPending || updateAddressMutation.isPending\n }\n onDelete={\n addressDialog.selected && !addressDialog.selected.default\n ? async () => {\n if (!addressDialog.selected) return;\n try {\n await deleteAddressMutation.mutateAsync(\n addressDialog.selected.id,\n );\n setAddressDialog({ open: false, selected: null });\n } catch {\n // toast surfaced via onError\n }\n }\n : undefined\n }\n isDeleting={deleteAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n presentation={dialogPresentation}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n openDialog={deletingAddress !== null}\n setOpenDialog={(open) => {\n if (!open) setDeletingAddress(null);\n }}\n onAction={async () => {\n if (!deletingAddress) return;\n try {\n await deleteAddressMutation.mutateAsync(deletingAddress.id);\n setDeletingAddress(null);\n } catch {\n // toast surfaced via onError\n }\n }}\n isLoading={deleteAddressMutation.isPending}\n actionText={t(\"delete\")}\n presentation={dialogPresentation}\n />\n\n <CreditCardFormDialog\n isOpen={isAddCardOpen}\n onClose={() => {\n // Don't let the card dialog close while a 3DS challenge is in flight —\n // the bank-verification modal renders behind it and would be stranded.\n if (cardAdd3DS.isActive) return;\n setSaveCardError(null);\n setIsAddCardOpen(false);\n }}\n error={saveCardError ?? undefined}\n t={(key: string) => t(key as never)}\n onSubmit={async (data) => {\n setSaveCardError(null);\n try {\n // Closure happens in cardAddSuccess (created PM) / the 3DS\n // onApproved branch — NOT here, since a three_ds_required response\n // resolves successfully while the bank check is still pending.\n await addCreditCardMutation.mutateAsync(data);\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={addCreditCardMutation.isPending}\n jwt=\"\"\n savedAddresses={addresses}\n defaultBillingAddressId={addresses.find((a) => a.default)?.id}\n presentation={dialogPresentation}\n renderAddressFormDialog={({ isOpen, onClose, onAddressCreated }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={null}\n onSubmit={async (data) => {\n try {\n const { address } =\n await createAddressMutation.mutateAsync(data);\n onAddressCreated(mapToFluidPayAddress(address));\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={createAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n languageIso={locale}\n t={(key: string) => t(key as never)}\n presentation={dialogPresentation}\n />\n )}\n />\n\n {cardAdd3DS.modal}\n\n {editPaymentMethod && (\n <EditPaymentMethodDialog\n isOpen\n onClose={() => setEditPaymentMethod(null)}\n paymentMethod={editPaymentMethod}\n billingAddress={editPaymentMethod.billing_address}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n onSubmit={(data) => {\n updatePaymentMethodMutation.mutate(\n { paymentMethodId: editPaymentMethod.id, data },\n { onSuccess: () => setEditPaymentMethod(null) },\n );\n }}\n isSubmitting={updatePaymentMethodMutation.isPending}\n onDelete={() => {\n deletePaymentMethodMutation.mutate(editPaymentMethod.id, {\n onSuccess: () => setEditPaymentMethod(null),\n });\n }}\n isDeleting={deletePaymentMethodMutation.isPending}\n presentation={dialogPresentation}\n />\n )}\n\n <ResponsiveDialog\n open={isEditMySiteLinkOpen}\n onOpenChange={(open) => {\n if (!open && updateMySiteSettingsMutation.isPending) return;\n setIsEditMySiteLinkOpen(open);\n }}\n title={t(\"edit_link\")}\n presentation={dialogPresentation}\n >\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"mysite-slug\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"your_mysite_link\")}\n </Label>\n <div className=\"ring-border focus-within:ring-foreground/40 flex items-center gap-1 rounded-md bg-transparent px-3 py-2 ring-1 transition-all focus-within:ring-2\">\n {mySiteUrlPrefix && (\n <span className=\"text-muted-foreground shrink-0 text-sm\">\n {mySiteUrlPrefix}\n </span>\n )}\n <Input\n id=\"mysite-slug\"\n value={mySiteSlugDraft}\n onChange={(e) => setMySiteSlugDraft(e.target.value)}\n onKeyDown={(e) => {\n if (\n e.key === \"Enter\" &&\n !updateMySiteSettingsMutation.isPending\n ) {\n e.preventDefault();\n void handleSubmitMySiteLink();\n }\n }}\n className=\"h-auto min-w-0 flex-1 border-0 p-0 shadow-none focus-visible:ring-0\"\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsEditMySiteLinkOpen(false)}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitMySiteLink();\n }}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {updateMySiteSettingsMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n\n <ResponsiveDialog\n open={editingSocial !== null}\n onOpenChange={(open) => !open && setEditingSocial(null)}\n title={\n editingSocial\n ? t(\"edit_platform_link\", {\n platform: SOCIAL_LABELS[editingSocial] ?? \"\",\n })\n : t(\"edit_social_link\")\n }\n presentation={dialogPresentation}\n >\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"social-handle\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"url\")}\n </Label>\n <Input\n id=\"social-handle\"\n value={socialDraft}\n onChange={(e) => setSocialDraft(e.target.value)}\n placeholder={\n editingSocial ? SOCIAL_PLACEHOLDERS[editingSocial] : \"\"\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void handleSubmitSocial();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setEditingSocial(null)}\n disabled={updateSocialMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitSocial();\n }}\n disabled={updateSocialMutation.isPending}\n >\n {updateSocialMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n </FluidPayCoreProvider>\n );\n}\n","import type { ComponentProps } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n return (\n <ProfileTranslationBridge>\n <ProfileScreenContent\n onToast={effectiveToast}\n countryIso={countryIso}\n divProps={divProps}\n />\n </ProfileTranslationBridge>\n );\n}\n\nfunction ProfileScreenContent({\n onToast,\n countryIso,\n divProps,\n}: {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n divProps: ComponentProps<\"div\">;\n}): React.JSX.Element {\n const { t } = useProfileTranslation();\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div {...divProps}>\n <ProfileContentScreen onToast={onToast} countryIso={countryIso} />\n </div>\n </>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
@@ -68,6 +68,6 @@ require("./use-portal-card-add-3ds-flow-CRiGY6e0.cjs");
68
68
  require("./display-CpqGM4w8.cjs");
69
69
  require("./Combobox-BUJUGSPs.cjs");
70
70
  require("./prop-types-D0nh9rso.cjs");
71
- const require_ProfileScreen = require("./ProfileScreen-G3cmyl0b.cjs");
71
+ const require_ProfileScreen = require("./ProfileScreen-CpI9XiZQ.cjs");
72
72
  exports.ProfileScreen = require_ProfileScreen.ProfileScreen;
73
73
  exports.profileScreenPropertySchema = require_ProfileScreen.profileScreenPropertySchema;
@@ -25,6 +25,11 @@ function deriveLastName(firstName, fullName) {
25
25
  return fullName.startsWith(prefix) ? fullName.slice(prefix.length) : "";
26
26
  }
27
27
  //#endregion
28
+ //#region src/screens/profile/derive-card-holder-name.ts
29
+ function deriveCardHolderName(method) {
30
+ return method.billing_address?.name?.trim() || method.details.card_holder?.trim() || "";
31
+ }
32
+ //#endregion
28
33
  //#region src/screens/profile/ProfileLayout.tsx
29
34
  function ProfileLayout(props) {
30
35
  const { t } = useProfileTranslation();
@@ -386,7 +391,7 @@ function PaymentCardVisual({ method, onClick }) {
386
391
  const expMonth = String(method.details.exp_month ?? "").padStart(2, "0");
387
392
  const expYear = String(method.details.exp_year ?? "").slice(-2);
388
393
  const exp = expMonth && expYear ? `${expMonth}/${expYear}` : "";
389
- const holder = method.details.card_holder || method.billing_address?.name || "";
394
+ const holder = deriveCardHolderName(method);
390
395
  return /* @__PURE__ */ jsxs("button", {
391
396
  type: "button",
392
397
  onClick,
@@ -1409,4 +1414,4 @@ const profileScreenPropertySchema = {
1409
1414
  //#endregion
1410
1415
  export { profileScreenPropertySchema as n, ProfileScreen as t };
1411
1416
 
1412
- //# sourceMappingURL=ProfileScreen-3ki8yPFt.mjs.map
1417
+ //# sourceMappingURL=ProfileScreen-TbmOka5D.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileScreen-TbmOka5D.mjs","names":[],"sources":["../src/screens/profile/derive-last-name.ts","../src/screens/profile/derive-card-holder-name.ts","../src/screens/profile/ProfileLayout.tsx","../src/screens/profile-card-add-success.ts","../src/screens/ProfileContentScreen.tsx","../src/screens/ProfileScreen.tsx"],"sourcesContent":["export function deriveLastName(firstName: string, fullName: string): string {\n if (!firstName) return \"\";\n const prefix = `${firstName} `;\n return fullName.startsWith(prefix) ? fullName.slice(prefix.length) : \"\";\n}\n","import type { fluidPay } from \"@fluid-app/fluid-pay-core\";\n\n// The edit dialog can only change billing_address.name; card_holder has no\n// update API.\nexport function deriveCardHolderName(\n method: fluidPay.CustomerPaymentMethod,\n): string {\n return (\n method.billing_address?.name?.trim() ||\n method.details.card_holder?.trim() ||\n \"\"\n );\n}\n","import { type JSX, type ReactNode, useState, type ComponentType } from \"react\";\nimport {\n ResponsiveDialog,\n type ResponsiveDialogPresentation,\n} from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport {\n Sparkles,\n Pencil,\n Plus,\n Copy,\n Link2,\n MapPin,\n User,\n Mail,\n Phone,\n Quote,\n Linkedin,\n Facebook,\n Twitter,\n Instagram,\n Youtube,\n Globe,\n LogOut,\n} from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { PointsLedger } from \"@fluid-app/profile-core\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\nimport {\n brandIconUrl,\n GENERIC_PAYMENT_ICON_URL,\n} from \"@fluid-app/payments-display/brands\";\nimport { maskCardNumber } from \"@fluid-app/payments-display/display\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { titleCaseFromSnake } from \"@fluid-app/portal-core/format/title-case\";\nimport { deriveCardHolderName } from \"./derive-card-holder-name\";\n\ninterface ProfileLayoutProps {\n account: AccountRep;\n pointsBalance: number | undefined;\n pointsLedger?: PointsLedger[];\n pointsLabel: { singular: string; plural: string };\n rewardsEnabled?: boolean;\n addresses: fluidPay.CustomerAddress[];\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n mySiteDisplayUrl: string;\n socialLinks: Partial<Record<SocialKey, string>>;\n onEditPersonalInfo: () => void;\n onAddAddress: () => void;\n onEditAddress: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress: (address: fluidPay.CustomerAddress) => void;\n onAddPaymentMethod: () => void;\n onEditPaymentMethod: (method: fluidPay.CustomerPaymentMethod) => void;\n onCopyMySiteLink: () => void;\n onEditMySiteLink?: () => void;\n onConnectSocial: (key: SocialKey) => void;\n onSignOut?: () => void;\n presentation?: ResponsiveDialogPresentation;\n}\n\nexport function ProfileLayout(props: ProfileLayoutProps): JSX.Element {\n const { t } = useProfileTranslation();\n const {\n account,\n pointsBalance,\n pointsLedger,\n pointsLabel,\n rewardsEnabled,\n addresses,\n paymentMethods,\n mySiteDisplayUrl,\n socialLinks,\n onEditPersonalInfo,\n onAddAddress,\n onEditAddress,\n onDeleteAddress,\n onAddPaymentMethod,\n onEditPaymentMethod,\n onCopyMySiteLink,\n onEditMySiteLink,\n onConnectSocial,\n onSignOut,\n presentation = \"dialog\",\n } = props;\n\n const fullName =\n `${account.first_name ?? \"\"} ${account.last_name ?? \"\"}`.trim();\n const heroFirstName = (account.first_name || \"\").trim().split(\" \")[0] || \"\";\n const heroDisplay =\n heroFirstName || account.email?.split(\"@\")[0] || t(\"account_fallback\");\n const connectedSocialCount = Object.values(socialLinks).filter(\n (v) => typeof v === \"string\" && v.length > 0,\n ).length;\n const [isPointsHistoryOpen, setIsPointsHistoryOpen] = useState(false);\n const POINTS_PREVIEW_COUNT = 4;\n const ledger = pointsLedger ?? [];\n const ledgerPreview = ledger.slice(0, POINTS_PREVIEW_COUNT);\n const hasMoreLedger = ledger.length > POINTS_PREVIEW_COUNT;\n // Configured points label: capitalized plural for headings, count-aware form\n // (singular at 1) for \"N <label>\" amounts.\n const pointsLabelPluralCap = capitalize(pointsLabel.plural);\n const pointsCountLabel = (n: number): string =>\n n === 1 ? pointsLabel.singular : pointsLabel.plural;\n const sortedAddresses = [...addresses].sort(\n (a, b) => Number(b.default ?? false) - Number(a.default ?? false),\n );\n\n return (\n <div className=\"relative\">\n <div className=\"relative mx-auto max-w-4xl px-5 pt-8 pb-20 md:px-8\">\n {/* Hero */}\n <section className=\"flex items-center gap-3.5\">\n <div className=\"relative size-12 shrink-0 overflow-hidden rounded-full ring-1 ring-black/5 md:size-13\">\n {account.avatar_url ? (\n <img\n src={account.avatar_url}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"bg-primary text-primary-foreground flex h-full w-full items-center justify-center text-lg font-semibold\">\n {heroDisplay.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-foreground truncate text-xl font-bold tracking-tight md:text-2xl\">\n {heroDisplay}\n </h1>\n <p className=\"text-muted-foreground mt-0.5 truncate text-sm\">\n {account.email}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {rewardsEnabled && (\n <div className=\"ring-border text-foreground inline-flex items-center gap-1.5 rounded-md bg-transparent px-2.5 py-1 text-xs font-semibold ring-1\">\n <Sparkles className=\"text-primary size-3\" strokeWidth={2.25} />\n {(pointsBalance ?? 0).toLocaleString()}{\" \"}\n {pointsCountLabel(pointsBalance ?? 0)}\n </div>\n )}\n </div>\n </section>\n\n {/* Personal information */}\n <SectionHeader\n title={t(\"personal_information\")}\n action={\n <PillButton\n onClick={onEditPersonalInfo}\n icon={Pencil}\n label={t(\"edit\")}\n />\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <FieldRow\n icon={User}\n label={t(\"name\")}\n value={fullName || account.first_name || \"\"}\n />\n <FieldRow\n icon={Mail}\n label={t(\"email\")}\n value={account.email ?? \"\"}\n />\n <FieldRow\n icon={Phone}\n label={t(\"phone\")}\n value={account.phone ?? \"\"}\n placeholder={t(\"add_phone_number\")}\n />\n <FieldRow\n icon={Quote}\n label={t(\"bio\")}\n value={account.bio ?? \"\"}\n placeholder={t(\"add_a_short_bio\")}\n multiline\n isLast\n />\n </div>\n\n {/* Payment methods */}\n <SectionHeader title={t(\"payment_methods\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-3\">\n {paymentMethods.map((method) => (\n <PaymentCardVisual\n key={method.id}\n method={method}\n onClick={() => onEditPaymentMethod(method)}\n />\n ))}\n <AddPaymentTile onClick={onAddPaymentMethod} />\n </div>\n\n {/* Points history */}\n {rewardsEnabled && (\n <>\n <SectionHeader\n title={t(\"points_history\", { label: pointsLabelPluralCap })}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"pts_available\", {\n count: String((pointsBalance ?? 0).toLocaleString()),\n label: pointsCountLabel(pointsBalance ?? 0),\n })}\n </span>\n }\n />\n {ledger.length > 0 ? (\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {ledgerPreview.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={!hasMoreLedger && i === ledgerPreview.length - 1}\n pointsLabelPlural={pointsLabelPluralCap}\n />\n ))}\n {hasMoreLedger && (\n <button\n type=\"button\"\n onClick={() => setIsPointsHistoryOpen(true)}\n className=\"text-foreground hover:bg-muted flex w-full items-center justify-center gap-1 px-4 py-3 text-xs font-bold transition-colors\"\n >\n {t(\"see_all_transactions\", { count: ledger.length })}\n </button>\n )}\n </div>\n ) : (\n <div className=\"ring-dashed ring-border mt-2.5 flex flex-col items-center justify-center gap-1 rounded-2xl bg-transparent px-4 py-8 text-center ring-1\">\n <Sparkles\n className=\"text-muted-foreground/75 size-5\"\n strokeWidth={1.75}\n />\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"no_points_yet\", { label: pointsLabel.plural })}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"earn_points_hint\", { label: pointsLabel.plural })}\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Your MySite link */}\n <SectionHeader\n title={t(\"your_mysite_link\")}\n action={\n onEditMySiteLink ? (\n <PillButton\n onClick={onEditMySiteLink}\n icon={Pencil}\n label={t(\"edit_link\")}\n />\n ) : undefined\n }\n />\n <div className=\"ring-border mt-2.5 flex items-center gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"bg-muted text-foreground flex size-11 shrink-0 items-center justify-center rounded-full\">\n <Link2 className=\"size-[18px]\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {t(\"public_link\")}\n </div>\n <div className=\"text-foreground mt-0.5 truncate font-mono text-sm font-semibold\">\n {mySiteDisplayUrl || t(\"set_your_mysite_link\")}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onCopyMySiteLink}\n disabled={!mySiteDisplayUrl}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Copy className=\"size-3\" strokeWidth={2.25} />\n {t(\"copy\")}\n </button>\n </div>\n\n {/* Shipping addresses */}\n <SectionHeader title={t(\"shipping_addresses\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n {sortedAddresses.map((address) => (\n <AddressCard\n key={address.id}\n address={address}\n onEdit={() => onEditAddress(address)}\n onDelete={\n address.default ? undefined : () => onDeleteAddress(address)\n }\n presentation={presentation}\n />\n ))}\n <AddAddressTile onClick={onAddAddress} />\n </div>\n\n {/* Social media */}\n <SectionHeader\n title={t(\"social_media\")}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"connected_count\", { count: connectedSocialCount })}\n </span>\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {SOCIAL_ENTRIES.map((entry, i) => (\n <SocialRow\n key={entry.key}\n entry={entry}\n handle={socialLinks[entry.key] ?? \"\"}\n isLast={i === SOCIAL_ENTRIES.length - 1}\n onConnect={() => onConnectSocial(entry.key)}\n />\n ))}\n </div>\n\n <ResponsiveDialog\n open={isPointsHistoryOpen}\n onOpenChange={setIsPointsHistoryOpen}\n title={t(\"points_history\", { label: pointsLabelPluralCap })}\n presentation={presentation}\n >\n <div className=\"ring-border overflow-hidden rounded-2xl bg-transparent ring-1\">\n {ledger.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={i === ledger.length - 1}\n pointsLabelPlural={pointsLabelPluralCap}\n />\n ))}\n </div>\n </ResponsiveDialog>\n\n {onSignOut && (\n <div className=\"ring-border mt-8 flex flex-wrap items-center justify-between gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"flex items-center gap-3\">\n <div className=\"bg-destructive/10 flex size-9 items-center justify-center rounded-md\">\n <LogOut\n className=\"text-destructive size-4\"\n strokeWidth={2.25}\n />\n </div>\n <div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"sign_out\")}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"sign_out_description\")}\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"bg-destructive/15 text-destructive hover:bg-destructive/25 rounded-md px-4 py-2 text-xs font-bold transition-colors\"\n >\n {t(\"sign_out\")}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction SectionHeader({\n title,\n action,\n}: {\n title: string;\n action?: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"mt-8 flex items-end justify-between\">\n <h2 className=\"text-foreground text-base font-bold tracking-tight\">\n {title}\n </h2>\n {action ?? null}\n </div>\n );\n}\n\nfunction PillButton({\n onClick,\n icon: Icon,\n label,\n disabled,\n}: {\n onClick: () => void;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n disabled?: boolean;\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Icon className=\"size-3\" strokeWidth={2.25} />\n {label}\n </button>\n );\n}\n\nfunction PointsLedgerRow({\n entry,\n isLast,\n pointsLabelPlural,\n}: {\n entry: PointsLedger;\n isLast: boolean;\n pointsLabelPlural: string;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const isCredit = entry.amount >= 0;\n const sign = isCredit ? \"+\" : \"−\";\n const magnitude = Math.abs(entry.amount).toLocaleString();\n const amountColor = isCredit ? \"text-emerald-600\" : \"text-destructive\";\n const sourceName = entry.metadata?.source?.name?.trim();\n const transactionType = entry.metadata?.transaction_type;\n const label =\n sourceName ||\n (transactionType\n ? titleCaseFromSnake(transactionType)\n : isCredit\n ? t(\"points_awarded\", { label: pointsLabelPlural })\n : t(\"points_redeemed\", { label: pointsLabelPlural }));\n const dateLabel = formatLedgerDate(entry.created_at);\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Sparkles\n className={`size-4 ${isCredit ? \"text-primary\" : \"text-muted-foreground\"}`}\n strokeWidth={2}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground truncate text-sm font-medium\">\n {label}\n </div>\n <div className=\"text-muted-foreground text-xs\">{dateLabel}</div>\n </div>\n <div\n className={`shrink-0 font-mono text-sm font-bold tabular-nums ${amountColor}`}\n >\n {sign}\n {magnitude}\n </div>\n </div>\n );\n}\n\n/** Capitalize the first letter for display in headings / titles. */\nfunction capitalize(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction formatLedgerDate(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nfunction FieldRow({\n icon: Icon,\n label,\n value,\n placeholder,\n isLast,\n multiline,\n}: {\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n value: string;\n placeholder?: string;\n isLast?: boolean;\n multiline?: boolean;\n}): JSX.Element {\n const display = value || placeholder || \"\";\n const isPlaceholder = !value && Boolean(placeholder);\n const valueClasses = multiline ? \"whitespace-pre-line\" : \"truncate\";\n return (\n <div\n className={`flex gap-3 px-4 py-3.5 ${multiline ? \"items-start\" : \"items-center\"} ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-muted-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {label}\n </div>\n <div\n className={`mt-0.5 ${valueClasses} text-sm font-medium ${isPlaceholder ? \"text-muted-foreground/55\" : \"text-foreground\"}`}\n >\n {display}\n </div>\n </div>\n </div>\n );\n}\n\nfunction PaymentCardVisual({\n method,\n onClick,\n}: {\n method: fluidPay.CustomerPaymentMethod;\n onClick: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const brand = (method.details.card_brand || \"\").toLowerCase();\n // Ordered, de-duplicated fallback chain: the server-provided logo, then the\n // brand-derived CDN icon, then the generic card icon. Each load failure\n // advances one step instead of collapsing straight to generic.\n const logoCandidates = [\n ...new Set(\n [\n method.details.logo_url,\n brandIconUrl(brand),\n GENERIC_PAYMENT_ICON_URL,\n ].filter((url): url is string => Boolean(url)),\n ),\n ];\n const [logoStep, setLogoStep] = useState(0);\n const logoSrc =\n logoCandidates[Math.min(logoStep, logoCandidates.length - 1)] ??\n GENERIC_PAYMENT_ICON_URL;\n const maskedNumber = maskCardNumber(method.details.last_four, brand);\n const expMonth = String(method.details.exp_month ?? \"\").padStart(2, \"0\");\n const expYear = String(method.details.exp_year ?? \"\").slice(-2);\n const exp = expMonth && expYear ? `${expMonth}/${expYear}` : \"\";\n const holder = deriveCardHolderName(method);\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group bg-foreground text-background ring-foreground/10 relative flex aspect-[1.586/1] flex-col justify-between overflow-hidden rounded-xl p-4 text-left shadow-sm ring-1 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg\"\n >\n <div\n aria-hidden\n className=\"absolute inset-0 bg-[repeating-linear-gradient(135deg,transparent_0px,transparent_22px,currentColor_22px,currentColor_24px)] opacity-[0.04]\"\n />\n <div className=\"relative\">\n <div className=\"flex items-start justify-between\">\n <img\n src={logoSrc}\n alt={brand}\n className=\"h-7 w-auto object-contain\"\n onError={() =>\n setLogoStep((step) =>\n Math.min(step + 1, logoCandidates.length - 1),\n )\n }\n />\n {method.default && (\n <span className=\"bg-background/10 text-background/80 rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"text-background mt-3 font-mono text-lg font-bold tracking-wider\">\n {maskedNumber}\n </div>\n </div>\n <div className=\"relative flex items-end justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"cardholder\")}\n </div>\n <div className=\"text-background truncate text-xs font-semibold\">\n {holder || \" \"}\n </div>\n </div>\n <div>\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"card_expires\")}\n </div>\n <div className=\"text-background font-mono text-xs font-semibold\">\n {exp}\n </div>\n </div>\n </div>\n </button>\n );\n}\n\nfunction AddPaymentTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex aspect-[1.586/1] flex-col items-center justify-center gap-1.5 rounded-xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-xs font-bold\">\n {t(\"add_payment_method\")}\n </div>\n <div className=\"text-muted-foreground/75 text-xs\">\n {t(\"accepted_cards\")}\n </div>\n </button>\n );\n}\n\nfunction AddressCard({\n address,\n onEdit,\n onDelete,\n presentation,\n}: {\n address: fluidPay.CustomerAddress;\n onEdit: () => void;\n onDelete?: () => void;\n presentation: ResponsiveDialogPresentation;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const label = address.name?.trim() || t(\"address\");\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n return (\n <div className=\"ring-border hover:bg-muted focus-within:ring-foreground/40 relative flex flex-col rounded-2xl bg-transparent ring-1 transition-all duration-200 focus-within:ring-2 hover:ring-2\">\n <button\n type=\"button\"\n onClick={onEdit}\n className=\"flex w-full flex-col rounded-2xl p-4 pr-12 text-left focus-visible:outline-none\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-muted flex size-8 items-center justify-center rounded-full\">\n <MapPin\n className=\"text-muted-foreground size-4\"\n strokeWidth={2}\n />\n </div>\n <div className=\"text-foreground text-sm font-bold\">{label}</div>\n </div>\n {address.default && (\n <span className=\"bg-primary text-primary-foreground rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"text-foreground mt-3 space-y-0.5 text-sm leading-snug\">\n {address.address1 && <div>{address.address1}</div>}\n {address.address2 && <div>{address.address2}</div>}\n {cityLine && <div>{cityLine}</div>}\n {address.country_code && (\n <div className=\"text-muted-foreground\">{address.country_code}</div>\n )}\n {address.phone && (\n <div className=\"text-muted-foreground\">{address.phone}</div>\n )}\n </div>\n </button>\n <div className=\"absolute top-2 right-2 z-10\">\n <EllipsesDropdown\n onEdit={onEdit}\n onDelete={onDelete}\n editLabel={t(\"edit\")}\n deleteLabel={t(\"delete\")}\n menuLabel={t(\"address\")}\n presentation={presentation}\n />\n </div>\n </div>\n );\n}\n\nfunction AddAddressTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex min-h-37 flex-col items-center justify-center gap-1.5 rounded-2xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"add_an_address\")}\n </div>\n </button>\n );\n}\n\ntype SocialKey =\n | \"linkedin\"\n | \"facebook\"\n | \"x\"\n | \"instagram\"\n | \"youtube\"\n | \"pinterest\"\n | \"tiktok\";\n\ninterface SocialEntry {\n key: SocialKey;\n label: string;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n placeholder: string;\n}\n\nconst SOCIAL_ENTRIES: readonly SocialEntry[] = [\n {\n key: \"linkedin\",\n label: \"LinkedIn\",\n icon: Linkedin,\n placeholder: \"linkedin.com/in/username\",\n },\n {\n key: \"facebook\",\n label: \"Facebook\",\n icon: Facebook,\n placeholder: \"facebook.com/username\",\n },\n { key: \"x\", label: \"X\", icon: Twitter, placeholder: \"x.com/username\" },\n {\n key: \"instagram\",\n label: \"Instagram\",\n icon: Instagram,\n placeholder: \"instagram.com/username\",\n },\n {\n key: \"youtube\",\n label: \"YouTube\",\n icon: Youtube,\n placeholder: \"youtube.com/@channel\",\n },\n {\n key: \"pinterest\",\n label: \"Pinterest\",\n icon: Globe,\n placeholder: \"pinterest.com/username\",\n },\n {\n key: \"tiktok\",\n label: \"TikTok\",\n icon: Globe,\n placeholder: \"tiktok.com/@username\",\n },\n] as const;\n\nfunction SocialRow({\n entry,\n handle,\n isLast,\n onConnect,\n}: {\n entry: SocialEntry;\n handle: string;\n isLast: boolean;\n onConnect: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const Icon = entry.icon;\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground text-sm font-bold\">{entry.label}</div>\n <div\n className={`truncate text-xs ${handle ? \"text-muted-foreground\" : \"text-muted-foreground/55\"}`}\n >\n {handle || entry.placeholder}\n </div>\n </div>\n <PillButton\n onClick={onConnect}\n icon={handle ? Pencil : Plus}\n label={handle ? t(\"edit\") : t(\"connect\")}\n />\n </div>\n );\n}\n\nexport type { SocialKey };\n","import { isThreeDsRequiredCreate } from \"@fluid-app/portal-core/pay-types\";\nimport type {\n CreatePaymentMethodResponse,\n ThreeDsRequiredCreateResult,\n} from \"@fluid-app/portal-core/pay-types\";\n\n/**\n * Build the create-payment-method onSuccess handler. On three_ds_required it\n * hands off to the 3DS flow and leaves the card dialog OPEN (begin() resolves\n * at modal-open, not flow-completion). On a created PM it runs the legacy\n * created path (invalidate + close + toast).\n */\nexport function buildProfileCardAddSuccess(deps: {\n begin: (created: ThreeDsRequiredCreateResult) => Promise<void>;\n onCreated: () => void;\n}) {\n return async (response: CreatePaymentMethodResponse) => {\n if (isThreeDsRequiredCreate(response)) {\n await deps.begin(response);\n return;\n }\n deps.onCreated();\n };\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { z } from \"zod\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n Button,\n DialogFooter,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { ResponsiveDialog } from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport { useSidebar } from \"@fluid-app/portal-react/shell/sidebar\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n AddressFormDialog,\n ConfirmActionDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n UserInfoDialog,\n socialFields,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n CreditCardFormSubmitData,\n} from \"@fluid-app/profile-ui\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport { getBrowserInfo } from \"@fluid-app/fluid-pay-core/utils/browser-info\";\nimport { TOKEN_PROVIDER_VGS } from \"@fluid-app/portal-core/pay-types\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { canAccessRepSurfaces } from \"@fluid-app/portal-core/member-permissions\";\nimport { useAccountApi } from \"@fluid-app/portal-core/account-api-context\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport {\n usePortalMySiteProfile,\n usePortalUpdateSettings,\n} from \"@fluid-app/mysite-ui/portal/hooks/use-mysite-portal\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { useLanguagesApi } from \"@fluid-app/store-core/languages-api-context\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { accountKeys, payKeys, storeKeys } from \"../account/query-keys\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { useStore } from \"../hooks/use-store\";\nimport { deriveLastName } from \"./profile/derive-last-name\";\nimport { ProfileLayout, type SocialKey } from \"./profile/ProfileLayout\";\nimport { usePortalCardAdd3DSFlow } from \"../hooks/use-portal-card-add-3ds-flow\";\nimport { buildProfileCardAddSuccess } from \"./profile-card-add-success\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nfunction mapAccountToCustomerAccount(\n raw: AccountRep,\n): fluidPay.CustomerAccount {\n return {\n fluid_pay_account: {\n id: raw.id,\n email: raw.email,\n address_count: 0,\n payment_methods_count: 0,\n language_iso: raw.language_iso,\n },\n customer: {\n id: raw.id,\n active: true,\n active_subscriptions_count: 0,\n display_total_spent: \"0\",\n email: raw.email,\n first_name: raw.first_name,\n full_name: `${raw.first_name} ${raw.last_name}`.trim(),\n inactive_subscriptions_count: 0,\n is_rep: canAccessRepSurfaces(raw),\n phone: raw.phone,\n orders_count: 0,\n },\n };\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n phone: raw.phone,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\ntype SocialFieldKey = (typeof socialFields)[number][\"name\"];\n\nconst SOCIAL_KEY_TO_FIELD: Record<SocialKey, SocialFieldKey | null> = {\n linkedin: \"linkedin\" as SocialFieldKey,\n facebook: \"facebook\" as SocialFieldKey,\n x: \"twitter\" as SocialFieldKey,\n instagram: \"instagram\" as SocialFieldKey,\n youtube: \"youtube\" as SocialFieldKey,\n pinterest: \"pinterest\" as SocialFieldKey,\n tiktok: \"tiktok\" as SocialFieldKey,\n};\n\nconst SOCIAL_LABELS: Record<SocialKey, string> = {\n linkedin: \"LinkedIn\",\n facebook: \"Facebook\",\n x: \"X\",\n instagram: \"Instagram\",\n youtube: \"YouTube\",\n pinterest: \"Pinterest\",\n tiktok: \"TikTok\",\n};\n\nconst SOCIAL_PLACEHOLDERS: Record<SocialKey, string> = {\n linkedin: \"linkedin.com/in/username\",\n facebook: \"facebook.com/username\",\n x: \"x.com/username\",\n instagram: \"instagram.com/username\",\n youtube: \"youtube.com/@channel\",\n pinterest: \"pinterest.com/username\",\n tiktok: \"tiktok.com/@username\",\n};\n\nexport function ProfileContentScreen({\n onToast,\n countryIso,\n}: ProfileContentScreenProps): React.JSX.Element {\n const { t } = useProfileTranslation();\n const { isMobile } = useSidebar();\n const dialogPresentation = isMobile ? \"bottom-sheet\" : \"dialog\";\n const { locale } = useActiveLocale();\n const payApi = usePayApi();\n const accountApi = useAccountApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const { data: mySiteProfile } = usePortalMySiteProfile();\n const updateMySiteSettingsMutation = usePortalUpdateSettings();\n\n const mySiteUrl = mySiteProfile?.mysite_url ?? \"\";\n const mySiteDisplayUrl = mySiteUrl\n ? mySiteUrl.replace(/^https?:\\/\\//, \"\")\n : \"\";\n const mySiteLastSlash = mySiteDisplayUrl.lastIndexOf(\"/\");\n const mySiteUrlPrefix =\n mySiteLastSlash >= 0 ? mySiteDisplayUrl.slice(0, mySiteLastSlash + 1) : \"\";\n const mySiteCurrentSlug =\n mySiteLastSlash >= 0\n ? mySiteDisplayUrl.slice(mySiteLastSlash + 1)\n : mySiteDisplayUrl;\n\n // Reuse the app-wide useAccount() cache entry shared with AppShell/PageRouter.\n const {\n data: accountRep,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useAccount();\n\n const accountData = useMemo(\n () => (accountRep ? mapAccountToCustomerAccount(accountRep) : undefined),\n [accountRep],\n );\n\n const { data: addressesData } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: true,\n });\n\n const { data: paymentMethodsData } = useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n enabled: true,\n });\n\n const countriesAdapter = useCountriesApi();\n const languagesAdapter = useLanguagesApi();\n\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(locale),\n queryFn: () => countriesAdapter.listCountries({ languageIso: locale }),\n enabled: true,\n });\n\n const { data: languagesData } = useQuery({\n queryKey: storeKeys.languages(),\n queryFn: () => languagesAdapter.listLanguages(),\n enabled: true,\n });\n\n const { data: pointsLedgerData, isError: isPointsLedgerError } = useQuery({\n queryKey: payKeys.pointsLedgers.list(),\n queryFn: () => payApi.fetchPointsLedgers(),\n enabled: true,\n retry: (failureCount, error) => {\n if (\n error instanceof Error &&\n \"status\" in error &&\n (error as { status: number }).status === 403\n ) {\n return false;\n }\n return failureCount < 1;\n },\n });\n\n const rewardPointsEnabled = !isPointsLedgerError && pointsLedgerData != null;\n\n // Per-company reward-points label (defaults point/points). Drives the\n // configured label across the profile points UI.\n const { data: store } = useStore();\n const pointsLabelSingular = store?.reward_points_label_singular || \"point\";\n const pointsLabelPlural = store?.reward_points_label_plural || \"points\";\n const pointsLabel = useMemo(\n () => ({ singular: pointsLabelSingular, plural: pointsLabelPlural }),\n [pointsLabelSingular, pointsLabelPlural],\n );\n\n const adaptedPointsLedger: PointsLedger[] = useMemo(() => {\n return (pointsLedgerData?.points_ledgers ?? []).map((entry) => {\n const meta = entry.metadata as {\n transaction_type?: string | null;\n source?: {\n name: string;\n email?: string;\n reason?: string;\n user_id?: number;\n } | null;\n } | null;\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: 0,\n metadata: {\n transaction_type: meta?.transaction_type ?? undefined,\n source: meta?.source ?? undefined,\n },\n total_balance: entry.total_balance,\n updated_at: entry.created_at,\n };\n });\n }, [pointsLedgerData]);\n\n const updateCustomerMutation = useMutation({\n mutationFn: async (data: UserFormData) => {\n await accountApi.updateAccount({\n account: {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n bio: data.bio,\n language_iso: data.language,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"profile_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_profile\"), \"error\");\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_delete_payment_method\"), \"error\");\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_update_payment_method\"), \"error\");\n },\n });\n\n const createAddressMutation = useMutation({\n // Detect a server-side dedupe (POST /api/pay/addresses returns the existing\n // record when an identical address already exists, ignoring `name`). Snapshot\n // the current id set before the request and compare against the returned id.\n mutationFn: async (body: fluidPay.CreateAddressBody) => {\n const existingIds = new Set((addressesData ?? []).map((a) => a.id));\n const address = await payApi.createAddress({\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n phone: body.address.phone,\n default: body.address.default,\n },\n });\n return { address, deduped: existingIds.has(address.id) };\n },\n onSuccess: ({ deduped }) => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n if (deduped) {\n onToast(t(\"address_already_exists\"), \"warning\");\n } else {\n onToast(t(\"address_created\"), \"success\");\n }\n },\n onError: () => {\n onToast(t(\"failed_to_create_address\"), \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n phone: body.address.phone,\n default: body.address.default,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_address\"), \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_deleted\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_delete_address\"), \"error\");\n },\n });\n\n // Orchestrates the bank-challenge step when card add returns three_ds_required.\n // begin() resolves the moment the challenge modal opens — so dialog close and\n // the success toast live ONLY here (onApproved) and on the created branch\n // (onCreated below), never on the three_ds_required branch.\n const cardAdd3DS = usePortalCardAdd3DSFlow({\n payApi,\n t: (key: string) => t(key as never),\n onApproved: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n setIsAddCardOpen(false);\n onToast(t(\"payment_method_added\"), \"success\");\n },\n onFailed: (message) => {\n setSaveCardError(message);\n },\n onCanceled: () => {},\n });\n\n const cardAddSuccess = buildProfileCardAddSuccess({\n begin: cardAdd3DS.begin,\n onCreated: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n setIsAddCardOpen(false);\n onToast(t(\"payment_method_added\"), \"success\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: CreditCardFormSubmitData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n token_provider: TOKEN_PROVIDER_VGS,\n exp_month: data.payment_method.exp_month,\n exp_year: data.payment_method.exp_year,\n cvv_token: data.payment_method.cvv_token,\n card_holder: data.payment_method.card_holder,\n default: data.set_as_default,\n ...(data.payment_method.bin ? { bin: data.payment_method.bin } : {}),\n ...(data.payment_method.last_four\n ? { last_four: data.payment_method.last_four }\n : {}),\n ...(data.payment_method.card_network\n ? { card_network: data.payment_method.card_network }\n : {}),\n },\n billing_address_id: data.billing_address_id,\n browser_info: getBrowserInfo(),\n }),\n onSuccess: cardAddSuccess,\n onError: () => {\n onToast(t(\"failed_to_add_payment_method\"), \"error\");\n },\n });\n\n const addresses = addressesData ?? [];\n const paymentMethods = paymentMethodsData ?? [];\n\n const adaptedLanguages: Language[] = (languagesData?.languages ?? []).map(\n (l, i) => ({ id: i, name: l.name, iso: l.code }),\n );\n\n const countries = countriesData?.countries;\n\n const countryOptions = useMemo(\n () =>\n [...(countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countries]);\n\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n // Dialog open state\n const [isInfoDialogOpen, setIsInfoDialogOpen] = useState(false);\n const [addressDialog, setAddressDialog] = useState<{\n open: boolean;\n selected: fluidPay.CustomerAddress | null;\n }>({ open: false, selected: null });\n const [deletingAddress, setDeletingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [isAddCardOpen, setIsAddCardOpen] = useState(false);\n const [saveCardError, setSaveCardError] = useState<string | null>(null);\n const [editPaymentMethod, setEditPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n\n // User-info form (for the existing dialog)\n const userInfoLanguage = useMemo(() => {\n return (\n adaptedLanguages.find(\n (l) => l.iso === accountData?.fluid_pay_account.language_iso,\n )?.iso ?? \"\"\n );\n }, [adaptedLanguages, accountData]);\n\n const derivedLastName = useMemo(() => {\n if (!accountData) return \"\";\n const { first_name, full_name } = accountData.customer;\n return deriveLastName(first_name, full_name);\n }, [accountData]);\n\n const userInfoSchema = useMemo(\n () =>\n z.object({\n first_name: z.string().min(1, t(\"first_name_is_required\")),\n last_name: z.string().min(1, t(\"last_name_is_required\")),\n phone_number: z.string().optional(),\n language: z.string().min(1, t(\"language_is_required\")),\n bio: z.string().optional(),\n }),\n [t],\n );\n\n const userInfoForm = useZodForm<UserFormData>(userInfoSchema, {\n defaultValues: {\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n },\n });\n\n const handleOpenInfoDialog = useCallback(() => {\n userInfoForm.reset({\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n });\n setIsInfoDialogOpen(true);\n }, [\n accountData,\n accountRep,\n derivedLastName,\n userInfoLanguage,\n userInfoForm,\n ]);\n\n const onSubmitUserInfo = userInfoForm.handleSubmit(async (data) => {\n try {\n await updateCustomerMutation.mutateAsync(data);\n setIsInfoDialogOpen(false);\n } catch {\n // toast surfaced via onError\n }\n });\n\n const socialLinks = useMemo<Partial<Record<SocialKey, string>>>(() => {\n const src: Partial<Record<SocialFieldKey, string>> =\n accountRep?.social_links ?? {};\n const result: Partial<Record<SocialKey, string>> = {};\n for (const [key, field] of Object.entries(SOCIAL_KEY_TO_FIELD) as [\n SocialKey,\n SocialFieldKey | null,\n ][]) {\n if (!field) continue;\n const v = src[field];\n if (typeof v === \"string\" && v.length > 0) {\n result[key] = v;\n }\n }\n return result;\n }, [accountRep]);\n\n const handleCopyMySiteLink = useCallback(async () => {\n if (!mySiteUrl) return;\n try {\n await navigator.clipboard.writeText(mySiteUrl);\n onToast(t(\"mysite_link_copied\"), \"success\");\n } catch {\n onToast(t(\"failed_to_copy_link\"), \"error\");\n }\n }, [mySiteUrl, onToast, t]);\n\n const [isEditMySiteLinkOpen, setIsEditMySiteLinkOpen] = useState(false);\n const [mySiteSlugDraft, setMySiteSlugDraft] = useState(\"\");\n\n const handleOpenEditMySiteLink = useCallback(() => {\n setMySiteSlugDraft(mySiteCurrentSlug);\n setIsEditMySiteLinkOpen(true);\n }, [mySiteCurrentSlug]);\n\n const handleSubmitMySiteLink = useCallback(async () => {\n const trimmed = mySiteSlugDraft.trim();\n if (!trimmed) {\n onToast(t(\"mysite_link_empty\"), \"error\");\n return;\n }\n if (trimmed === mySiteCurrentSlug) {\n setIsEditMySiteLinkOpen(false);\n return;\n }\n try {\n await updateMySiteSettingsMutation.mutateAsync({ slug: trimmed });\n onToast(t(\"mysite_link_updated\"), \"success\");\n setIsEditMySiteLinkOpen(false);\n } catch {\n onToast(t(\"failed_to_update_mysite_link\"), \"error\");\n }\n }, [\n mySiteSlugDraft,\n mySiteCurrentSlug,\n updateMySiteSettingsMutation,\n onToast,\n t,\n ]);\n\n const [editingSocial, setEditingSocial] = useState<SocialKey | null>(null);\n const [socialDraft, setSocialDraft] = useState(\"\");\n\n const handleConnectSocial = useCallback(\n (key: SocialKey) => {\n const field = SOCIAL_KEY_TO_FIELD[key];\n if (!field) {\n onToast(t(\"platform_not_editable\"), \"warning\");\n return;\n }\n const current = accountRep?.social_links?.[field] ?? \"\";\n setSocialDraft(current);\n setEditingSocial(key);\n },\n [accountRep, onToast, t],\n );\n\n const updateSocialMutation = useMutation({\n mutationFn: async ({\n field,\n value,\n }: {\n field: SocialFieldKey;\n value: string;\n }) => {\n const current = accountRep?.social_links ?? {};\n await accountApi.updateAccount({\n account: {\n social_links: { ...current, [field]: value },\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"social_link_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_social_link\"), \"error\");\n },\n });\n\n const handleSubmitSocial = useCallback(async () => {\n if (!editingSocial) return;\n const field = SOCIAL_KEY_TO_FIELD[editingSocial];\n if (!field) return;\n await updateSocialMutation.mutateAsync({\n field,\n value: socialDraft.trim(),\n });\n setEditingSocial(null);\n }, [editingSocial, socialDraft, updateSocialMutation]);\n\n if (isAccountError && !isLoadingAccount) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"text-muted-foreground text-center text-sm\">\n {t(\"unable_to_load_account\")}\n </div>\n </div>\n );\n }\n\n if (isLoadingAccount || !accountData || !accountRep) {\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-16 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n const pointsBalance = rewardPointsEnabled\n ? (pointsLedgerData?.points_ledgers?.[0]?.total_balance ?? 0)\n : undefined;\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileLayout\n account={accountRep}\n pointsBalance={pointsBalance}\n pointsLedger={adaptedPointsLedger}\n pointsLabel={pointsLabel}\n rewardsEnabled={rewardPointsEnabled}\n addresses={addresses}\n paymentMethods={paymentMethods}\n mySiteDisplayUrl={mySiteDisplayUrl}\n socialLinks={socialLinks}\n onEditPersonalInfo={handleOpenInfoDialog}\n onAddAddress={() => setAddressDialog({ open: true, selected: null })}\n onEditAddress={(address) =>\n setAddressDialog({ open: true, selected: address })\n }\n onDeleteAddress={(address) => setDeletingAddress(address)}\n onAddPaymentMethod={() => {\n setSaveCardError(null);\n setIsAddCardOpen(true);\n }}\n onEditPaymentMethod={(pm) => setEditPaymentMethod(pm)}\n onCopyMySiteLink={handleCopyMySiteLink}\n onEditMySiteLink={handleOpenEditMySiteLink}\n onConnectSocial={handleConnectSocial}\n presentation={dialogPresentation}\n />\n\n <UserInfoDialog\n control={userInfoForm.control}\n isOpen={isInfoDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={() => setIsInfoDialogOpen(false)}\n languageOptions={adaptedLanguages.map((l) => ({\n name: l.name,\n value: l.iso,\n }))}\n errorMsg={undefined}\n isSubmitting={updateCustomerMutation.isPending}\n email={accountRep.email ?? \"\"}\n presentation={dialogPresentation}\n />\n\n <AddressFormDialog\n isOpen={addressDialog.open}\n onClose={() => setAddressDialog({ open: false, selected: null })}\n selectedAddress={addressDialog.selected}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ?? countryIso\n }\n languageIso={locale}\n t={(key: string) => t(key as never)}\n onSubmit={async (formData) => {\n if (addressDialog.selected) {\n await updateAddressMutation.mutateAsync({\n addressId: addressDialog.selected.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n setAddressDialog({ open: false, selected: null });\n }}\n isSubmitting={\n createAddressMutation.isPending || updateAddressMutation.isPending\n }\n onDelete={\n addressDialog.selected && !addressDialog.selected.default\n ? async () => {\n if (!addressDialog.selected) return;\n try {\n await deleteAddressMutation.mutateAsync(\n addressDialog.selected.id,\n );\n setAddressDialog({ open: false, selected: null });\n } catch {\n // toast surfaced via onError\n }\n }\n : undefined\n }\n isDeleting={deleteAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n presentation={dialogPresentation}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n openDialog={deletingAddress !== null}\n setOpenDialog={(open) => {\n if (!open) setDeletingAddress(null);\n }}\n onAction={async () => {\n if (!deletingAddress) return;\n try {\n await deleteAddressMutation.mutateAsync(deletingAddress.id);\n setDeletingAddress(null);\n } catch {\n // toast surfaced via onError\n }\n }}\n isLoading={deleteAddressMutation.isPending}\n actionText={t(\"delete\")}\n presentation={dialogPresentation}\n />\n\n <CreditCardFormDialog\n isOpen={isAddCardOpen}\n onClose={() => {\n // Don't let the card dialog close while a 3DS challenge is in flight —\n // the bank-verification modal renders behind it and would be stranded.\n if (cardAdd3DS.isActive) return;\n setSaveCardError(null);\n setIsAddCardOpen(false);\n }}\n error={saveCardError ?? undefined}\n t={(key: string) => t(key as never)}\n onSubmit={async (data) => {\n setSaveCardError(null);\n try {\n // Closure happens in cardAddSuccess (created PM) / the 3DS\n // onApproved branch — NOT here, since a three_ds_required response\n // resolves successfully while the bank check is still pending.\n await addCreditCardMutation.mutateAsync(data);\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={addCreditCardMutation.isPending}\n jwt=\"\"\n savedAddresses={addresses}\n defaultBillingAddressId={addresses.find((a) => a.default)?.id}\n presentation={dialogPresentation}\n renderAddressFormDialog={({ isOpen, onClose, onAddressCreated }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={null}\n onSubmit={async (data) => {\n try {\n const { address } =\n await createAddressMutation.mutateAsync(data);\n onAddressCreated(mapToFluidPayAddress(address));\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={createAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n languageIso={locale}\n t={(key: string) => t(key as never)}\n presentation={dialogPresentation}\n />\n )}\n />\n\n {cardAdd3DS.modal}\n\n {editPaymentMethod && (\n <EditPaymentMethodDialog\n isOpen\n onClose={() => setEditPaymentMethod(null)}\n paymentMethod={editPaymentMethod}\n billingAddress={editPaymentMethod.billing_address}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n onSubmit={(data) => {\n updatePaymentMethodMutation.mutate(\n { paymentMethodId: editPaymentMethod.id, data },\n { onSuccess: () => setEditPaymentMethod(null) },\n );\n }}\n isSubmitting={updatePaymentMethodMutation.isPending}\n onDelete={() => {\n deletePaymentMethodMutation.mutate(editPaymentMethod.id, {\n onSuccess: () => setEditPaymentMethod(null),\n });\n }}\n isDeleting={deletePaymentMethodMutation.isPending}\n presentation={dialogPresentation}\n />\n )}\n\n <ResponsiveDialog\n open={isEditMySiteLinkOpen}\n onOpenChange={(open) => {\n if (!open && updateMySiteSettingsMutation.isPending) return;\n setIsEditMySiteLinkOpen(open);\n }}\n title={t(\"edit_link\")}\n presentation={dialogPresentation}\n >\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"mysite-slug\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"your_mysite_link\")}\n </Label>\n <div className=\"ring-border focus-within:ring-foreground/40 flex items-center gap-1 rounded-md bg-transparent px-3 py-2 ring-1 transition-all focus-within:ring-2\">\n {mySiteUrlPrefix && (\n <span className=\"text-muted-foreground shrink-0 text-sm\">\n {mySiteUrlPrefix}\n </span>\n )}\n <Input\n id=\"mysite-slug\"\n value={mySiteSlugDraft}\n onChange={(e) => setMySiteSlugDraft(e.target.value)}\n onKeyDown={(e) => {\n if (\n e.key === \"Enter\" &&\n !updateMySiteSettingsMutation.isPending\n ) {\n e.preventDefault();\n void handleSubmitMySiteLink();\n }\n }}\n className=\"h-auto min-w-0 flex-1 border-0 p-0 shadow-none focus-visible:ring-0\"\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsEditMySiteLinkOpen(false)}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitMySiteLink();\n }}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {updateMySiteSettingsMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n\n <ResponsiveDialog\n open={editingSocial !== null}\n onOpenChange={(open) => !open && setEditingSocial(null)}\n title={\n editingSocial\n ? t(\"edit_platform_link\", {\n platform: SOCIAL_LABELS[editingSocial] ?? \"\",\n })\n : t(\"edit_social_link\")\n }\n presentation={dialogPresentation}\n >\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"social-handle\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"url\")}\n </Label>\n <Input\n id=\"social-handle\"\n value={socialDraft}\n onChange={(e) => setSocialDraft(e.target.value)}\n placeholder={\n editingSocial ? SOCIAL_PLACEHOLDERS[editingSocial] : \"\"\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void handleSubmitSocial();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setEditingSocial(null)}\n disabled={updateSocialMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitSocial();\n }}\n disabled={updateSocialMutation.isPending}\n >\n {updateSocialMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n </FluidPayCoreProvider>\n );\n}\n","import type { ComponentProps } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n return (\n <ProfileTranslationBridge>\n <ProfileScreenContent\n onToast={effectiveToast}\n countryIso={countryIso}\n divProps={divProps}\n />\n </ProfileTranslationBridge>\n );\n}\n\nfunction ProfileScreenContent({\n onToast,\n countryIso,\n divProps,\n}: {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n divProps: ComponentProps<\"div\">;\n}): React.JSX.Element {\n const { t } = useProfileTranslation();\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div {...divProps}>\n <ProfileContentScreen onToast={onToast} countryIso={countryIso} />\n </div>\n </>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -79,7 +79,7 @@ require("./use-portal-card-add-3ds-flow-CRiGY6e0.cjs");
79
79
  require("./display-CpqGM4w8.cjs");
80
80
  require("./Combobox-BUJUGSPs.cjs");
81
81
  require("./prop-types-D0nh9rso.cjs");
82
- const require_ProfileScreen = require("./ProfileScreen-G3cmyl0b.cjs");
82
+ const require_ProfileScreen = require("./ProfileScreen-CpI9XiZQ.cjs");
83
83
  const require_SubscriptionsScreen = require("./SubscriptionsScreen-BiNmEFLP.cjs");
84
84
  require("./dist-DA_5SZ0Z.cjs");
85
85
  require("./es-Dvu4Bdkz.cjs");
@@ -2080,7 +2080,7 @@ function resolveMemberTypePage(registry, memberTypeSlug, currentSlug, baseSlug)
2080
2080
  }
2081
2081
  //#endregion
2082
2082
  //#region src/shell/system-screen-map.ts
2083
- const ProfileScreen$1 = (0, react.lazy)(() => Promise.resolve().then(() => require("./ProfileScreen-ouDvR1F7.cjs")).then((m) => ({ default: m.ProfileScreen })));
2083
+ const ProfileScreen$1 = (0, react.lazy)(() => Promise.resolve().then(() => require("./ProfileScreen-DUEVFZqo.cjs")).then((m) => ({ default: m.ProfileScreen })));
2084
2084
  const OrdersScreen$1 = (0, react.lazy)(() => Promise.resolve().then(() => require("./OrdersScreen-BdtVN1wl.cjs")).then((m) => ({ default: m.OrdersScreen })));
2085
2085
  const SubscriptionsScreen$1 = (0, react.lazy)(() => Promise.resolve().then(() => require("./SubscriptionsScreen-cuw6yk56.cjs")).then((m) => ({ default: m.SubscriptionsScreen })));
2086
2086
  const MessagingScreen$1 = (0, react.lazy)(() => Promise.resolve().then(() => require("./MessagingScreen-BJ7NTczB.cjs")).then((m) => ({ default: m.MessagingScreen })));
@@ -4588,7 +4588,7 @@ const CORE_PAGE_IDS = {
4588
4588
  //#endregion
4589
4589
  //#region src/screens/index.ts
4590
4590
  const screenPropertySchemas = {
4591
- ProfileScreen: () => Promise.resolve().then(() => require("./ProfileScreen-ouDvR1F7.cjs")).then((m) => m.profileScreenPropertySchema),
4591
+ ProfileScreen: () => Promise.resolve().then(() => require("./ProfileScreen-DUEVFZqo.cjs")).then((m) => m.profileScreenPropertySchema),
4592
4592
  MessagingScreen: () => Promise.resolve().then(() => require("./MessagingScreen-BJ7NTczB.cjs")).then((m) => m.messagingScreenPropertySchema),
4593
4593
  ContactsScreen: () => Promise.resolve().then(() => require("./ContactsScreen-8aw8-n5n.cjs")).then((m) => m.contactsScreenPropertySchema),
4594
4594
  OrdersScreen: () => Promise.resolve().then(() => require("./OrdersScreen-BdtVN1wl.cjs")).then((m) => m.ordersScreenPropertySchema),
package/dist/index.mjs CHANGED
@@ -77,7 +77,7 @@ import { a as OPT_IN_SYSTEM_SCREEN_SLUGS, i as AppLink, o as findSystemSlugByPre
77
77
  import "./use-portal-card-add-3ds-flow-DjeKiZvQ.mjs";
78
78
  import "./display-jC56KxIJ.mjs";
79
79
  import "./Combobox-ccokyVjG.mjs";
80
- import { n as profileScreenPropertySchema, t as ProfileScreen } from "./ProfileScreen-3ki8yPFt.mjs";
80
+ import { n as profileScreenPropertySchema, t as ProfileScreen } from "./ProfileScreen-TbmOka5D.mjs";
81
81
  import "./dist-B5I6vTEt.mjs";
82
82
  import "./es-CkfVlhHT.mjs";
83
83
  import "./dist-qm2zK9Dp.mjs";
@@ -2077,7 +2077,7 @@ function resolveMemberTypePage(registry, memberTypeSlug, currentSlug, baseSlug)
2077
2077
  }
2078
2078
  //#endregion
2079
2079
  //#region src/shell/system-screen-map.ts
2080
- const ProfileScreen$1 = lazy(() => import("./ProfileScreen-DY5leCsw.mjs").then((m) => ({ default: m.ProfileScreen })));
2080
+ const ProfileScreen$1 = lazy(() => import("./ProfileScreen-CIjBpDIq.mjs").then((m) => ({ default: m.ProfileScreen })));
2081
2081
  const OrdersScreen$1 = lazy(() => import("./OrdersScreen-D2cymJtp.mjs").then((m) => ({ default: m.OrdersScreen })));
2082
2082
  const SubscriptionsScreen$1 = lazy(() => import("./SubscriptionsScreen-fv_xxA9j.mjs").then((m) => ({ default: m.SubscriptionsScreen })));
2083
2083
  const MessagingScreen$1 = lazy(() => import("./MessagingScreen-BBoYyLPj.mjs").then((m) => ({ default: m.MessagingScreen })));
@@ -4585,7 +4585,7 @@ const CORE_PAGE_IDS = {
4585
4585
  //#endregion
4586
4586
  //#region src/screens/index.ts
4587
4587
  const screenPropertySchemas = {
4588
- ProfileScreen: () => import("./ProfileScreen-DY5leCsw.mjs").then((m) => m.profileScreenPropertySchema),
4588
+ ProfileScreen: () => import("./ProfileScreen-CIjBpDIq.mjs").then((m) => m.profileScreenPropertySchema),
4589
4589
  MessagingScreen: () => import("./MessagingScreen-BBoYyLPj.mjs").then((m) => m.messagingScreenPropertySchema),
4590
4590
  ContactsScreen: () => import("./ContactsScreen-BbyP1jUW.mjs").then((n) => n.n).then((m) => m.contactsScreenPropertySchema),
4591
4591
  OrdersScreen: () => import("./OrdersScreen-D2cymJtp.mjs").then((m) => m.ordersScreenPropertySchema),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluid-app/portal-sdk",
3
- "version": "0.1.470",
3
+ "version": "0.1.471",
4
4
  "description": "SDK for building custom Fluid portals",
5
5
  "files": [
6
6
  "authoring",
@@ -82,47 +82,47 @@
82
82
  "tsdown": "^0.21.0",
83
83
  "typescript": "^5",
84
84
  "zod": "4.3.5",
85
- "@fluid-app/address-autocomplete": "0.1.0",
86
- "@fluid-app/address-fields": "0.1.0",
85
+ "@fluid-app/auth": "0.1.0",
87
86
  "@fluid-app/api-client-core": "0.1.0",
88
- "@fluid-app/company-switcher-ui": "0.1.0",
89
87
  "@fluid-app/cart-ui": "0.1.28",
90
- "@fluid-app/contacts-ui": "0.1.0",
91
88
  "@fluid-app/contacts-core": "0.1.0",
92
- "@fluid-app/auth": "0.1.0",
89
+ "@fluid-app/company-switcher-ui": "0.1.0",
90
+ "@fluid-app/address-autocomplete": "0.1.0",
91
+ "@fluid-app/contacts-ui": "0.1.0",
93
92
  "@fluid-app/file-picker-api-client": "0.1.0",
94
93
  "@fluid-app/file-picker-core": "0.1.0",
95
94
  "@fluid-app/fluid-pay-core": "0.1.0",
95
+ "@fluid-app/address-fields": "0.1.0",
96
96
  "@fluid-app/fluid-pay-ui": "0.1.0",
97
97
  "@fluid-app/i18n": "0.1.0",
98
+ "@fluid-app/messaging-api-client": "0.1.0",
98
99
  "@fluid-app/messaging-core": "0.1.0",
99
100
  "@fluid-app/messaging-ui": "0.1.0",
100
- "@fluid-app/messaging-api-client": "0.1.0",
101
101
  "@fluid-app/mysite-ui": "0.1.0",
102
+ "@fluid-app/orders-core": "0.1.0",
102
103
  "@fluid-app/mysite-core": "0.1.0",
103
104
  "@fluid-app/orders-ui": "0.1.0",
104
- "@fluid-app/orders-core": "0.1.0",
105
105
  "@fluid-app/payments-display": "0.1.0",
106
- "@fluid-app/portal-core": "0.1.23",
107
106
  "@fluid-app/portal-app-download-ui": "0.1.0",
108
- "@fluid-app/portal-tenant-api-client": "0.1.0",
107
+ "@fluid-app/portal-core": "0.1.23",
108
+ "@fluid-app/portal-react": "0.1.0",
109
109
  "@fluid-app/portal-tenant-contacts-api-client": "0.1.0",
110
+ "@fluid-app/portal-tenant-api-client": "0.1.0",
110
111
  "@fluid-app/portal-tenant-content-api-client": "0.1.0",
111
112
  "@fluid-app/portal-tenant-mysite-api-client": "0.1.0",
112
- "@fluid-app/portal-react": "0.1.0",
113
113
  "@fluid-app/portal-tenant-pay-api-client": "0.1.0",
114
- "@fluid-app/portal-tenant-store-api-client": "0.1.0",
115
114
  "@fluid-app/portal-widgets": "0.1.22",
115
+ "@fluid-app/portal-tenant-store-api-client": "0.1.0",
116
116
  "@fluid-app/products-api-client": "0.1.0",
117
+ "@fluid-app/products-core": "0.1.0",
117
118
  "@fluid-app/profile-core": "0.1.0",
118
119
  "@fluid-app/profile-ui": "0.1.0",
119
- "@fluid-app/products-core": "0.1.0",
120
120
  "@fluid-app/query-persister": "0.1.0",
121
121
  "@fluid-app/shareables-core": "0.1.0",
122
- "@fluid-app/shop-core": "0.1.0",
123
122
  "@fluid-app/shareables-ui": "0.1.0",
124
- "@fluid-app/shop-ui": "0.1.0",
123
+ "@fluid-app/shop-core": "0.1.0",
125
124
  "@fluid-app/store-core": "0.1.0",
125
+ "@fluid-app/shop-ui": "0.1.0",
126
126
  "@fluid-app/subscriptions-core": "0.1.0",
127
127
  "@fluid-app/subscriptions-ui": "0.1.0",
128
128
  "@fluid-app/typescript-config": "0.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProfileScreen-3ki8yPFt.mjs","names":[],"sources":["../src/screens/profile/derive-last-name.ts","../src/screens/profile/ProfileLayout.tsx","../src/screens/profile-card-add-success.ts","../src/screens/ProfileContentScreen.tsx","../src/screens/ProfileScreen.tsx"],"sourcesContent":["export function deriveLastName(firstName: string, fullName: string): string {\n if (!firstName) return \"\";\n const prefix = `${firstName} `;\n return fullName.startsWith(prefix) ? fullName.slice(prefix.length) : \"\";\n}\n","import { type JSX, type ReactNode, useState, type ComponentType } from \"react\";\nimport {\n ResponsiveDialog,\n type ResponsiveDialogPresentation,\n} from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport {\n Sparkles,\n Pencil,\n Plus,\n Copy,\n Link2,\n MapPin,\n User,\n Mail,\n Phone,\n Quote,\n Linkedin,\n Facebook,\n Twitter,\n Instagram,\n Youtube,\n Globe,\n LogOut,\n} from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { PointsLedger } from \"@fluid-app/profile-core\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\nimport {\n brandIconUrl,\n GENERIC_PAYMENT_ICON_URL,\n} from \"@fluid-app/payments-display/brands\";\nimport { maskCardNumber } from \"@fluid-app/payments-display/display\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { titleCaseFromSnake } from \"@fluid-app/portal-core/format/title-case\";\n\ninterface ProfileLayoutProps {\n account: AccountRep;\n pointsBalance: number | undefined;\n pointsLedger?: PointsLedger[];\n pointsLabel: { singular: string; plural: string };\n rewardsEnabled?: boolean;\n addresses: fluidPay.CustomerAddress[];\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n mySiteDisplayUrl: string;\n socialLinks: Partial<Record<SocialKey, string>>;\n onEditPersonalInfo: () => void;\n onAddAddress: () => void;\n onEditAddress: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress: (address: fluidPay.CustomerAddress) => void;\n onAddPaymentMethod: () => void;\n onEditPaymentMethod: (method: fluidPay.CustomerPaymentMethod) => void;\n onCopyMySiteLink: () => void;\n onEditMySiteLink?: () => void;\n onConnectSocial: (key: SocialKey) => void;\n onSignOut?: () => void;\n presentation?: ResponsiveDialogPresentation;\n}\n\nexport function ProfileLayout(props: ProfileLayoutProps): JSX.Element {\n const { t } = useProfileTranslation();\n const {\n account,\n pointsBalance,\n pointsLedger,\n pointsLabel,\n rewardsEnabled,\n addresses,\n paymentMethods,\n mySiteDisplayUrl,\n socialLinks,\n onEditPersonalInfo,\n onAddAddress,\n onEditAddress,\n onDeleteAddress,\n onAddPaymentMethod,\n onEditPaymentMethod,\n onCopyMySiteLink,\n onEditMySiteLink,\n onConnectSocial,\n onSignOut,\n presentation = \"dialog\",\n } = props;\n\n const fullName =\n `${account.first_name ?? \"\"} ${account.last_name ?? \"\"}`.trim();\n const heroFirstName = (account.first_name || \"\").trim().split(\" \")[0] || \"\";\n const heroDisplay =\n heroFirstName || account.email?.split(\"@\")[0] || t(\"account_fallback\");\n const connectedSocialCount = Object.values(socialLinks).filter(\n (v) => typeof v === \"string\" && v.length > 0,\n ).length;\n const [isPointsHistoryOpen, setIsPointsHistoryOpen] = useState(false);\n const POINTS_PREVIEW_COUNT = 4;\n const ledger = pointsLedger ?? [];\n const ledgerPreview = ledger.slice(0, POINTS_PREVIEW_COUNT);\n const hasMoreLedger = ledger.length > POINTS_PREVIEW_COUNT;\n // Configured points label: capitalized plural for headings, count-aware form\n // (singular at 1) for \"N <label>\" amounts.\n const pointsLabelPluralCap = capitalize(pointsLabel.plural);\n const pointsCountLabel = (n: number): string =>\n n === 1 ? pointsLabel.singular : pointsLabel.plural;\n const sortedAddresses = [...addresses].sort(\n (a, b) => Number(b.default ?? false) - Number(a.default ?? false),\n );\n\n return (\n <div className=\"relative\">\n <div className=\"relative mx-auto max-w-4xl px-5 pt-8 pb-20 md:px-8\">\n {/* Hero */}\n <section className=\"flex items-center gap-3.5\">\n <div className=\"relative size-12 shrink-0 overflow-hidden rounded-full ring-1 ring-black/5 md:size-13\">\n {account.avatar_url ? (\n <img\n src={account.avatar_url}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"bg-primary text-primary-foreground flex h-full w-full items-center justify-center text-lg font-semibold\">\n {heroDisplay.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-foreground truncate text-xl font-bold tracking-tight md:text-2xl\">\n {heroDisplay}\n </h1>\n <p className=\"text-muted-foreground mt-0.5 truncate text-sm\">\n {account.email}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {rewardsEnabled && (\n <div className=\"ring-border text-foreground inline-flex items-center gap-1.5 rounded-md bg-transparent px-2.5 py-1 text-xs font-semibold ring-1\">\n <Sparkles className=\"text-primary size-3\" strokeWidth={2.25} />\n {(pointsBalance ?? 0).toLocaleString()}{\" \"}\n {pointsCountLabel(pointsBalance ?? 0)}\n </div>\n )}\n </div>\n </section>\n\n {/* Personal information */}\n <SectionHeader\n title={t(\"personal_information\")}\n action={\n <PillButton\n onClick={onEditPersonalInfo}\n icon={Pencil}\n label={t(\"edit\")}\n />\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <FieldRow\n icon={User}\n label={t(\"name\")}\n value={fullName || account.first_name || \"\"}\n />\n <FieldRow\n icon={Mail}\n label={t(\"email\")}\n value={account.email ?? \"\"}\n />\n <FieldRow\n icon={Phone}\n label={t(\"phone\")}\n value={account.phone ?? \"\"}\n placeholder={t(\"add_phone_number\")}\n />\n <FieldRow\n icon={Quote}\n label={t(\"bio\")}\n value={account.bio ?? \"\"}\n placeholder={t(\"add_a_short_bio\")}\n multiline\n isLast\n />\n </div>\n\n {/* Payment methods */}\n <SectionHeader title={t(\"payment_methods\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-3\">\n {paymentMethods.map((method) => (\n <PaymentCardVisual\n key={method.id}\n method={method}\n onClick={() => onEditPaymentMethod(method)}\n />\n ))}\n <AddPaymentTile onClick={onAddPaymentMethod} />\n </div>\n\n {/* Points history */}\n {rewardsEnabled && (\n <>\n <SectionHeader\n title={t(\"points_history\", { label: pointsLabelPluralCap })}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"pts_available\", {\n count: String((pointsBalance ?? 0).toLocaleString()),\n label: pointsCountLabel(pointsBalance ?? 0),\n })}\n </span>\n }\n />\n {ledger.length > 0 ? (\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {ledgerPreview.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={!hasMoreLedger && i === ledgerPreview.length - 1}\n pointsLabelPlural={pointsLabelPluralCap}\n />\n ))}\n {hasMoreLedger && (\n <button\n type=\"button\"\n onClick={() => setIsPointsHistoryOpen(true)}\n className=\"text-foreground hover:bg-muted flex w-full items-center justify-center gap-1 px-4 py-3 text-xs font-bold transition-colors\"\n >\n {t(\"see_all_transactions\", { count: ledger.length })}\n </button>\n )}\n </div>\n ) : (\n <div className=\"ring-dashed ring-border mt-2.5 flex flex-col items-center justify-center gap-1 rounded-2xl bg-transparent px-4 py-8 text-center ring-1\">\n <Sparkles\n className=\"text-muted-foreground/75 size-5\"\n strokeWidth={1.75}\n />\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"no_points_yet\", { label: pointsLabel.plural })}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"earn_points_hint\", { label: pointsLabel.plural })}\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Your MySite link */}\n <SectionHeader\n title={t(\"your_mysite_link\")}\n action={\n onEditMySiteLink ? (\n <PillButton\n onClick={onEditMySiteLink}\n icon={Pencil}\n label={t(\"edit_link\")}\n />\n ) : undefined\n }\n />\n <div className=\"ring-border mt-2.5 flex items-center gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"bg-muted text-foreground flex size-11 shrink-0 items-center justify-center rounded-full\">\n <Link2 className=\"size-[18px]\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {t(\"public_link\")}\n </div>\n <div className=\"text-foreground mt-0.5 truncate font-mono text-sm font-semibold\">\n {mySiteDisplayUrl || t(\"set_your_mysite_link\")}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onCopyMySiteLink}\n disabled={!mySiteDisplayUrl}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Copy className=\"size-3\" strokeWidth={2.25} />\n {t(\"copy\")}\n </button>\n </div>\n\n {/* Shipping addresses */}\n <SectionHeader title={t(\"shipping_addresses\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n {sortedAddresses.map((address) => (\n <AddressCard\n key={address.id}\n address={address}\n onEdit={() => onEditAddress(address)}\n onDelete={\n address.default ? undefined : () => onDeleteAddress(address)\n }\n presentation={presentation}\n />\n ))}\n <AddAddressTile onClick={onAddAddress} />\n </div>\n\n {/* Social media */}\n <SectionHeader\n title={t(\"social_media\")}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"connected_count\", { count: connectedSocialCount })}\n </span>\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {SOCIAL_ENTRIES.map((entry, i) => (\n <SocialRow\n key={entry.key}\n entry={entry}\n handle={socialLinks[entry.key] ?? \"\"}\n isLast={i === SOCIAL_ENTRIES.length - 1}\n onConnect={() => onConnectSocial(entry.key)}\n />\n ))}\n </div>\n\n <ResponsiveDialog\n open={isPointsHistoryOpen}\n onOpenChange={setIsPointsHistoryOpen}\n title={t(\"points_history\", { label: pointsLabelPluralCap })}\n presentation={presentation}\n >\n <div className=\"ring-border overflow-hidden rounded-2xl bg-transparent ring-1\">\n {ledger.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={i === ledger.length - 1}\n pointsLabelPlural={pointsLabelPluralCap}\n />\n ))}\n </div>\n </ResponsiveDialog>\n\n {onSignOut && (\n <div className=\"ring-border mt-8 flex flex-wrap items-center justify-between gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"flex items-center gap-3\">\n <div className=\"bg-destructive/10 flex size-9 items-center justify-center rounded-md\">\n <LogOut\n className=\"text-destructive size-4\"\n strokeWidth={2.25}\n />\n </div>\n <div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"sign_out\")}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"sign_out_description\")}\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"bg-destructive/15 text-destructive hover:bg-destructive/25 rounded-md px-4 py-2 text-xs font-bold transition-colors\"\n >\n {t(\"sign_out\")}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction SectionHeader({\n title,\n action,\n}: {\n title: string;\n action?: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"mt-8 flex items-end justify-between\">\n <h2 className=\"text-foreground text-base font-bold tracking-tight\">\n {title}\n </h2>\n {action ?? null}\n </div>\n );\n}\n\nfunction PillButton({\n onClick,\n icon: Icon,\n label,\n disabled,\n}: {\n onClick: () => void;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n disabled?: boolean;\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Icon className=\"size-3\" strokeWidth={2.25} />\n {label}\n </button>\n );\n}\n\nfunction PointsLedgerRow({\n entry,\n isLast,\n pointsLabelPlural,\n}: {\n entry: PointsLedger;\n isLast: boolean;\n pointsLabelPlural: string;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const isCredit = entry.amount >= 0;\n const sign = isCredit ? \"+\" : \"−\";\n const magnitude = Math.abs(entry.amount).toLocaleString();\n const amountColor = isCredit ? \"text-emerald-600\" : \"text-destructive\";\n const sourceName = entry.metadata?.source?.name?.trim();\n const transactionType = entry.metadata?.transaction_type;\n const label =\n sourceName ||\n (transactionType\n ? titleCaseFromSnake(transactionType)\n : isCredit\n ? t(\"points_awarded\", { label: pointsLabelPlural })\n : t(\"points_redeemed\", { label: pointsLabelPlural }));\n const dateLabel = formatLedgerDate(entry.created_at);\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Sparkles\n className={`size-4 ${isCredit ? \"text-primary\" : \"text-muted-foreground\"}`}\n strokeWidth={2}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground truncate text-sm font-medium\">\n {label}\n </div>\n <div className=\"text-muted-foreground text-xs\">{dateLabel}</div>\n </div>\n <div\n className={`shrink-0 font-mono text-sm font-bold tabular-nums ${amountColor}`}\n >\n {sign}\n {magnitude}\n </div>\n </div>\n );\n}\n\n/** Capitalize the first letter for display in headings / titles. */\nfunction capitalize(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction formatLedgerDate(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nfunction FieldRow({\n icon: Icon,\n label,\n value,\n placeholder,\n isLast,\n multiline,\n}: {\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n value: string;\n placeholder?: string;\n isLast?: boolean;\n multiline?: boolean;\n}): JSX.Element {\n const display = value || placeholder || \"\";\n const isPlaceholder = !value && Boolean(placeholder);\n const valueClasses = multiline ? \"whitespace-pre-line\" : \"truncate\";\n return (\n <div\n className={`flex gap-3 px-4 py-3.5 ${multiline ? \"items-start\" : \"items-center\"} ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-muted-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {label}\n </div>\n <div\n className={`mt-0.5 ${valueClasses} text-sm font-medium ${isPlaceholder ? \"text-muted-foreground/55\" : \"text-foreground\"}`}\n >\n {display}\n </div>\n </div>\n </div>\n );\n}\n\nfunction PaymentCardVisual({\n method,\n onClick,\n}: {\n method: fluidPay.CustomerPaymentMethod;\n onClick: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const brand = (method.details.card_brand || \"\").toLowerCase();\n // Ordered, de-duplicated fallback chain: the server-provided logo, then the\n // brand-derived CDN icon, then the generic card icon. Each load failure\n // advances one step instead of collapsing straight to generic.\n const logoCandidates = [\n ...new Set(\n [\n method.details.logo_url,\n brandIconUrl(brand),\n GENERIC_PAYMENT_ICON_URL,\n ].filter((url): url is string => Boolean(url)),\n ),\n ];\n const [logoStep, setLogoStep] = useState(0);\n const logoSrc =\n logoCandidates[Math.min(logoStep, logoCandidates.length - 1)] ??\n GENERIC_PAYMENT_ICON_URL;\n const maskedNumber = maskCardNumber(method.details.last_four, brand);\n const expMonth = String(method.details.exp_month ?? \"\").padStart(2, \"0\");\n const expYear = String(method.details.exp_year ?? \"\").slice(-2);\n const exp = expMonth && expYear ? `${expMonth}/${expYear}` : \"\";\n const holder =\n method.details.card_holder || method.billing_address?.name || \"\";\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group bg-foreground text-background ring-foreground/10 relative flex aspect-[1.586/1] flex-col justify-between overflow-hidden rounded-xl p-4 text-left shadow-sm ring-1 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg\"\n >\n <div\n aria-hidden\n className=\"absolute inset-0 bg-[repeating-linear-gradient(135deg,transparent_0px,transparent_22px,currentColor_22px,currentColor_24px)] opacity-[0.04]\"\n />\n <div className=\"relative\">\n <div className=\"flex items-start justify-between\">\n <img\n src={logoSrc}\n alt={brand}\n className=\"h-7 w-auto object-contain\"\n onError={() =>\n setLogoStep((step) =>\n Math.min(step + 1, logoCandidates.length - 1),\n )\n }\n />\n {method.default && (\n <span className=\"bg-background/10 text-background/80 rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"text-background mt-3 font-mono text-lg font-bold tracking-wider\">\n {maskedNumber}\n </div>\n </div>\n <div className=\"relative flex items-end justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"cardholder\")}\n </div>\n <div className=\"text-background truncate text-xs font-semibold\">\n {holder || \" \"}\n </div>\n </div>\n <div>\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"card_expires\")}\n </div>\n <div className=\"text-background font-mono text-xs font-semibold\">\n {exp}\n </div>\n </div>\n </div>\n </button>\n );\n}\n\nfunction AddPaymentTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex aspect-[1.586/1] flex-col items-center justify-center gap-1.5 rounded-xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-xs font-bold\">\n {t(\"add_payment_method\")}\n </div>\n <div className=\"text-muted-foreground/75 text-xs\">\n {t(\"accepted_cards\")}\n </div>\n </button>\n );\n}\n\nfunction AddressCard({\n address,\n onEdit,\n onDelete,\n presentation,\n}: {\n address: fluidPay.CustomerAddress;\n onEdit: () => void;\n onDelete?: () => void;\n presentation: ResponsiveDialogPresentation;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const label = address.name?.trim() || t(\"address\");\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n return (\n <div className=\"ring-border hover:bg-muted focus-within:ring-foreground/40 relative flex flex-col rounded-2xl bg-transparent ring-1 transition-all duration-200 focus-within:ring-2 hover:ring-2\">\n <button\n type=\"button\"\n onClick={onEdit}\n className=\"flex w-full flex-col rounded-2xl p-4 pr-12 text-left focus-visible:outline-none\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-muted flex size-8 items-center justify-center rounded-full\">\n <MapPin\n className=\"text-muted-foreground size-4\"\n strokeWidth={2}\n />\n </div>\n <div className=\"text-foreground text-sm font-bold\">{label}</div>\n </div>\n {address.default && (\n <span className=\"bg-primary text-primary-foreground rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"text-foreground mt-3 space-y-0.5 text-sm leading-snug\">\n {address.address1 && <div>{address.address1}</div>}\n {address.address2 && <div>{address.address2}</div>}\n {cityLine && <div>{cityLine}</div>}\n {address.country_code && (\n <div className=\"text-muted-foreground\">{address.country_code}</div>\n )}\n {address.phone && (\n <div className=\"text-muted-foreground\">{address.phone}</div>\n )}\n </div>\n </button>\n <div className=\"absolute top-2 right-2 z-10\">\n <EllipsesDropdown\n onEdit={onEdit}\n onDelete={onDelete}\n editLabel={t(\"edit\")}\n deleteLabel={t(\"delete\")}\n menuLabel={t(\"address\")}\n presentation={presentation}\n />\n </div>\n </div>\n );\n}\n\nfunction AddAddressTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex min-h-37 flex-col items-center justify-center gap-1.5 rounded-2xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"add_an_address\")}\n </div>\n </button>\n );\n}\n\ntype SocialKey =\n | \"linkedin\"\n | \"facebook\"\n | \"x\"\n | \"instagram\"\n | \"youtube\"\n | \"pinterest\"\n | \"tiktok\";\n\ninterface SocialEntry {\n key: SocialKey;\n label: string;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n placeholder: string;\n}\n\nconst SOCIAL_ENTRIES: readonly SocialEntry[] = [\n {\n key: \"linkedin\",\n label: \"LinkedIn\",\n icon: Linkedin,\n placeholder: \"linkedin.com/in/username\",\n },\n {\n key: \"facebook\",\n label: \"Facebook\",\n icon: Facebook,\n placeholder: \"facebook.com/username\",\n },\n { key: \"x\", label: \"X\", icon: Twitter, placeholder: \"x.com/username\" },\n {\n key: \"instagram\",\n label: \"Instagram\",\n icon: Instagram,\n placeholder: \"instagram.com/username\",\n },\n {\n key: \"youtube\",\n label: \"YouTube\",\n icon: Youtube,\n placeholder: \"youtube.com/@channel\",\n },\n {\n key: \"pinterest\",\n label: \"Pinterest\",\n icon: Globe,\n placeholder: \"pinterest.com/username\",\n },\n {\n key: \"tiktok\",\n label: \"TikTok\",\n icon: Globe,\n placeholder: \"tiktok.com/@username\",\n },\n] as const;\n\nfunction SocialRow({\n entry,\n handle,\n isLast,\n onConnect,\n}: {\n entry: SocialEntry;\n handle: string;\n isLast: boolean;\n onConnect: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const Icon = entry.icon;\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground text-sm font-bold\">{entry.label}</div>\n <div\n className={`truncate text-xs ${handle ? \"text-muted-foreground\" : \"text-muted-foreground/55\"}`}\n >\n {handle || entry.placeholder}\n </div>\n </div>\n <PillButton\n onClick={onConnect}\n icon={handle ? Pencil : Plus}\n label={handle ? t(\"edit\") : t(\"connect\")}\n />\n </div>\n );\n}\n\nexport type { SocialKey };\n","import { isThreeDsRequiredCreate } from \"@fluid-app/portal-core/pay-types\";\nimport type {\n CreatePaymentMethodResponse,\n ThreeDsRequiredCreateResult,\n} from \"@fluid-app/portal-core/pay-types\";\n\n/**\n * Build the create-payment-method onSuccess handler. On three_ds_required it\n * hands off to the 3DS flow and leaves the card dialog OPEN (begin() resolves\n * at modal-open, not flow-completion). On a created PM it runs the legacy\n * created path (invalidate + close + toast).\n */\nexport function buildProfileCardAddSuccess(deps: {\n begin: (created: ThreeDsRequiredCreateResult) => Promise<void>;\n onCreated: () => void;\n}) {\n return async (response: CreatePaymentMethodResponse) => {\n if (isThreeDsRequiredCreate(response)) {\n await deps.begin(response);\n return;\n }\n deps.onCreated();\n };\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { z } from \"zod\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n Button,\n DialogFooter,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { ResponsiveDialog } from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport { useSidebar } from \"@fluid-app/portal-react/shell/sidebar\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n AddressFormDialog,\n ConfirmActionDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n UserInfoDialog,\n socialFields,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n CreditCardFormSubmitData,\n} from \"@fluid-app/profile-ui\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport { getBrowserInfo } from \"@fluid-app/fluid-pay-core/utils/browser-info\";\nimport { TOKEN_PROVIDER_VGS } from \"@fluid-app/portal-core/pay-types\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { canAccessRepSurfaces } from \"@fluid-app/portal-core/member-permissions\";\nimport { useAccountApi } from \"@fluid-app/portal-core/account-api-context\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport {\n usePortalMySiteProfile,\n usePortalUpdateSettings,\n} from \"@fluid-app/mysite-ui/portal/hooks/use-mysite-portal\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { useLanguagesApi } from \"@fluid-app/store-core/languages-api-context\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { accountKeys, payKeys, storeKeys } from \"../account/query-keys\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { useStore } from \"../hooks/use-store\";\nimport { deriveLastName } from \"./profile/derive-last-name\";\nimport { ProfileLayout, type SocialKey } from \"./profile/ProfileLayout\";\nimport { usePortalCardAdd3DSFlow } from \"../hooks/use-portal-card-add-3ds-flow\";\nimport { buildProfileCardAddSuccess } from \"./profile-card-add-success\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nfunction mapAccountToCustomerAccount(\n raw: AccountRep,\n): fluidPay.CustomerAccount {\n return {\n fluid_pay_account: {\n id: raw.id,\n email: raw.email,\n address_count: 0,\n payment_methods_count: 0,\n language_iso: raw.language_iso,\n },\n customer: {\n id: raw.id,\n active: true,\n active_subscriptions_count: 0,\n display_total_spent: \"0\",\n email: raw.email,\n first_name: raw.first_name,\n full_name: `${raw.first_name} ${raw.last_name}`.trim(),\n inactive_subscriptions_count: 0,\n is_rep: canAccessRepSurfaces(raw),\n phone: raw.phone,\n orders_count: 0,\n },\n };\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n phone: raw.phone,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\ntype SocialFieldKey = (typeof socialFields)[number][\"name\"];\n\nconst SOCIAL_KEY_TO_FIELD: Record<SocialKey, SocialFieldKey | null> = {\n linkedin: \"linkedin\" as SocialFieldKey,\n facebook: \"facebook\" as SocialFieldKey,\n x: \"twitter\" as SocialFieldKey,\n instagram: \"instagram\" as SocialFieldKey,\n youtube: \"youtube\" as SocialFieldKey,\n pinterest: \"pinterest\" as SocialFieldKey,\n tiktok: \"tiktok\" as SocialFieldKey,\n};\n\nconst SOCIAL_LABELS: Record<SocialKey, string> = {\n linkedin: \"LinkedIn\",\n facebook: \"Facebook\",\n x: \"X\",\n instagram: \"Instagram\",\n youtube: \"YouTube\",\n pinterest: \"Pinterest\",\n tiktok: \"TikTok\",\n};\n\nconst SOCIAL_PLACEHOLDERS: Record<SocialKey, string> = {\n linkedin: \"linkedin.com/in/username\",\n facebook: \"facebook.com/username\",\n x: \"x.com/username\",\n instagram: \"instagram.com/username\",\n youtube: \"youtube.com/@channel\",\n pinterest: \"pinterest.com/username\",\n tiktok: \"tiktok.com/@username\",\n};\n\nexport function ProfileContentScreen({\n onToast,\n countryIso,\n}: ProfileContentScreenProps): React.JSX.Element {\n const { t } = useProfileTranslation();\n const { isMobile } = useSidebar();\n const dialogPresentation = isMobile ? \"bottom-sheet\" : \"dialog\";\n const { locale } = useActiveLocale();\n const payApi = usePayApi();\n const accountApi = useAccountApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const { data: mySiteProfile } = usePortalMySiteProfile();\n const updateMySiteSettingsMutation = usePortalUpdateSettings();\n\n const mySiteUrl = mySiteProfile?.mysite_url ?? \"\";\n const mySiteDisplayUrl = mySiteUrl\n ? mySiteUrl.replace(/^https?:\\/\\//, \"\")\n : \"\";\n const mySiteLastSlash = mySiteDisplayUrl.lastIndexOf(\"/\");\n const mySiteUrlPrefix =\n mySiteLastSlash >= 0 ? mySiteDisplayUrl.slice(0, mySiteLastSlash + 1) : \"\";\n const mySiteCurrentSlug =\n mySiteLastSlash >= 0\n ? mySiteDisplayUrl.slice(mySiteLastSlash + 1)\n : mySiteDisplayUrl;\n\n // Reuse the app-wide useAccount() cache entry shared with AppShell/PageRouter.\n const {\n data: accountRep,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useAccount();\n\n const accountData = useMemo(\n () => (accountRep ? mapAccountToCustomerAccount(accountRep) : undefined),\n [accountRep],\n );\n\n const { data: addressesData } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: true,\n });\n\n const { data: paymentMethodsData } = useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n enabled: true,\n });\n\n const countriesAdapter = useCountriesApi();\n const languagesAdapter = useLanguagesApi();\n\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(locale),\n queryFn: () => countriesAdapter.listCountries({ languageIso: locale }),\n enabled: true,\n });\n\n const { data: languagesData } = useQuery({\n queryKey: storeKeys.languages(),\n queryFn: () => languagesAdapter.listLanguages(),\n enabled: true,\n });\n\n const { data: pointsLedgerData, isError: isPointsLedgerError } = useQuery({\n queryKey: payKeys.pointsLedgers.list(),\n queryFn: () => payApi.fetchPointsLedgers(),\n enabled: true,\n retry: (failureCount, error) => {\n if (\n error instanceof Error &&\n \"status\" in error &&\n (error as { status: number }).status === 403\n ) {\n return false;\n }\n return failureCount < 1;\n },\n });\n\n const rewardPointsEnabled = !isPointsLedgerError && pointsLedgerData != null;\n\n // Per-company reward-points label (defaults point/points). Drives the\n // configured label across the profile points UI.\n const { data: store } = useStore();\n const pointsLabelSingular = store?.reward_points_label_singular || \"point\";\n const pointsLabelPlural = store?.reward_points_label_plural || \"points\";\n const pointsLabel = useMemo(\n () => ({ singular: pointsLabelSingular, plural: pointsLabelPlural }),\n [pointsLabelSingular, pointsLabelPlural],\n );\n\n const adaptedPointsLedger: PointsLedger[] = useMemo(() => {\n return (pointsLedgerData?.points_ledgers ?? []).map((entry) => {\n const meta = entry.metadata as {\n transaction_type?: string | null;\n source?: {\n name: string;\n email?: string;\n reason?: string;\n user_id?: number;\n } | null;\n } | null;\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: 0,\n metadata: {\n transaction_type: meta?.transaction_type ?? undefined,\n source: meta?.source ?? undefined,\n },\n total_balance: entry.total_balance,\n updated_at: entry.created_at,\n };\n });\n }, [pointsLedgerData]);\n\n const updateCustomerMutation = useMutation({\n mutationFn: async (data: UserFormData) => {\n await accountApi.updateAccount({\n account: {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n bio: data.bio,\n language_iso: data.language,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"profile_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_profile\"), \"error\");\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_delete_payment_method\"), \"error\");\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_update_payment_method\"), \"error\");\n },\n });\n\n const createAddressMutation = useMutation({\n // Detect a server-side dedupe (POST /api/pay/addresses returns the existing\n // record when an identical address already exists, ignoring `name`). Snapshot\n // the current id set before the request and compare against the returned id.\n mutationFn: async (body: fluidPay.CreateAddressBody) => {\n const existingIds = new Set((addressesData ?? []).map((a) => a.id));\n const address = await payApi.createAddress({\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n phone: body.address.phone,\n default: body.address.default,\n },\n });\n return { address, deduped: existingIds.has(address.id) };\n },\n onSuccess: ({ deduped }) => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n if (deduped) {\n onToast(t(\"address_already_exists\"), \"warning\");\n } else {\n onToast(t(\"address_created\"), \"success\");\n }\n },\n onError: () => {\n onToast(t(\"failed_to_create_address\"), \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n phone: body.address.phone,\n default: body.address.default,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_address\"), \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_deleted\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_delete_address\"), \"error\");\n },\n });\n\n // Orchestrates the bank-challenge step when card add returns three_ds_required.\n // begin() resolves the moment the challenge modal opens — so dialog close and\n // the success toast live ONLY here (onApproved) and on the created branch\n // (onCreated below), never on the three_ds_required branch.\n const cardAdd3DS = usePortalCardAdd3DSFlow({\n payApi,\n t: (key: string) => t(key as never),\n onApproved: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n setIsAddCardOpen(false);\n onToast(t(\"payment_method_added\"), \"success\");\n },\n onFailed: (message) => {\n setSaveCardError(message);\n },\n onCanceled: () => {},\n });\n\n const cardAddSuccess = buildProfileCardAddSuccess({\n begin: cardAdd3DS.begin,\n onCreated: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n setIsAddCardOpen(false);\n onToast(t(\"payment_method_added\"), \"success\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: CreditCardFormSubmitData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n token_provider: TOKEN_PROVIDER_VGS,\n exp_month: data.payment_method.exp_month,\n exp_year: data.payment_method.exp_year,\n cvv_token: data.payment_method.cvv_token,\n card_holder: data.payment_method.card_holder,\n default: data.set_as_default,\n ...(data.payment_method.bin ? { bin: data.payment_method.bin } : {}),\n ...(data.payment_method.last_four\n ? { last_four: data.payment_method.last_four }\n : {}),\n ...(data.payment_method.card_network\n ? { card_network: data.payment_method.card_network }\n : {}),\n },\n billing_address_id: data.billing_address_id,\n browser_info: getBrowserInfo(),\n }),\n onSuccess: cardAddSuccess,\n onError: () => {\n onToast(t(\"failed_to_add_payment_method\"), \"error\");\n },\n });\n\n const addresses = addressesData ?? [];\n const paymentMethods = paymentMethodsData ?? [];\n\n const adaptedLanguages: Language[] = (languagesData?.languages ?? []).map(\n (l, i) => ({ id: i, name: l.name, iso: l.code }),\n );\n\n const countries = countriesData?.countries;\n\n const countryOptions = useMemo(\n () =>\n [...(countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countries]);\n\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n // Dialog open state\n const [isInfoDialogOpen, setIsInfoDialogOpen] = useState(false);\n const [addressDialog, setAddressDialog] = useState<{\n open: boolean;\n selected: fluidPay.CustomerAddress | null;\n }>({ open: false, selected: null });\n const [deletingAddress, setDeletingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [isAddCardOpen, setIsAddCardOpen] = useState(false);\n const [saveCardError, setSaveCardError] = useState<string | null>(null);\n const [editPaymentMethod, setEditPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n\n // User-info form (for the existing dialog)\n const userInfoLanguage = useMemo(() => {\n return (\n adaptedLanguages.find(\n (l) => l.iso === accountData?.fluid_pay_account.language_iso,\n )?.iso ?? \"\"\n );\n }, [adaptedLanguages, accountData]);\n\n const derivedLastName = useMemo(() => {\n if (!accountData) return \"\";\n const { first_name, full_name } = accountData.customer;\n return deriveLastName(first_name, full_name);\n }, [accountData]);\n\n const userInfoSchema = useMemo(\n () =>\n z.object({\n first_name: z.string().min(1, t(\"first_name_is_required\")),\n last_name: z.string().min(1, t(\"last_name_is_required\")),\n phone_number: z.string().optional(),\n language: z.string().min(1, t(\"language_is_required\")),\n bio: z.string().optional(),\n }),\n [t],\n );\n\n const userInfoForm = useZodForm<UserFormData>(userInfoSchema, {\n defaultValues: {\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n },\n });\n\n const handleOpenInfoDialog = useCallback(() => {\n userInfoForm.reset({\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n });\n setIsInfoDialogOpen(true);\n }, [\n accountData,\n accountRep,\n derivedLastName,\n userInfoLanguage,\n userInfoForm,\n ]);\n\n const onSubmitUserInfo = userInfoForm.handleSubmit(async (data) => {\n try {\n await updateCustomerMutation.mutateAsync(data);\n setIsInfoDialogOpen(false);\n } catch {\n // toast surfaced via onError\n }\n });\n\n const socialLinks = useMemo<Partial<Record<SocialKey, string>>>(() => {\n const src: Partial<Record<SocialFieldKey, string>> =\n accountRep?.social_links ?? {};\n const result: Partial<Record<SocialKey, string>> = {};\n for (const [key, field] of Object.entries(SOCIAL_KEY_TO_FIELD) as [\n SocialKey,\n SocialFieldKey | null,\n ][]) {\n if (!field) continue;\n const v = src[field];\n if (typeof v === \"string\" && v.length > 0) {\n result[key] = v;\n }\n }\n return result;\n }, [accountRep]);\n\n const handleCopyMySiteLink = useCallback(async () => {\n if (!mySiteUrl) return;\n try {\n await navigator.clipboard.writeText(mySiteUrl);\n onToast(t(\"mysite_link_copied\"), \"success\");\n } catch {\n onToast(t(\"failed_to_copy_link\"), \"error\");\n }\n }, [mySiteUrl, onToast, t]);\n\n const [isEditMySiteLinkOpen, setIsEditMySiteLinkOpen] = useState(false);\n const [mySiteSlugDraft, setMySiteSlugDraft] = useState(\"\");\n\n const handleOpenEditMySiteLink = useCallback(() => {\n setMySiteSlugDraft(mySiteCurrentSlug);\n setIsEditMySiteLinkOpen(true);\n }, [mySiteCurrentSlug]);\n\n const handleSubmitMySiteLink = useCallback(async () => {\n const trimmed = mySiteSlugDraft.trim();\n if (!trimmed) {\n onToast(t(\"mysite_link_empty\"), \"error\");\n return;\n }\n if (trimmed === mySiteCurrentSlug) {\n setIsEditMySiteLinkOpen(false);\n return;\n }\n try {\n await updateMySiteSettingsMutation.mutateAsync({ slug: trimmed });\n onToast(t(\"mysite_link_updated\"), \"success\");\n setIsEditMySiteLinkOpen(false);\n } catch {\n onToast(t(\"failed_to_update_mysite_link\"), \"error\");\n }\n }, [\n mySiteSlugDraft,\n mySiteCurrentSlug,\n updateMySiteSettingsMutation,\n onToast,\n t,\n ]);\n\n const [editingSocial, setEditingSocial] = useState<SocialKey | null>(null);\n const [socialDraft, setSocialDraft] = useState(\"\");\n\n const handleConnectSocial = useCallback(\n (key: SocialKey) => {\n const field = SOCIAL_KEY_TO_FIELD[key];\n if (!field) {\n onToast(t(\"platform_not_editable\"), \"warning\");\n return;\n }\n const current = accountRep?.social_links?.[field] ?? \"\";\n setSocialDraft(current);\n setEditingSocial(key);\n },\n [accountRep, onToast, t],\n );\n\n const updateSocialMutation = useMutation({\n mutationFn: async ({\n field,\n value,\n }: {\n field: SocialFieldKey;\n value: string;\n }) => {\n const current = accountRep?.social_links ?? {};\n await accountApi.updateAccount({\n account: {\n social_links: { ...current, [field]: value },\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"social_link_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_social_link\"), \"error\");\n },\n });\n\n const handleSubmitSocial = useCallback(async () => {\n if (!editingSocial) return;\n const field = SOCIAL_KEY_TO_FIELD[editingSocial];\n if (!field) return;\n await updateSocialMutation.mutateAsync({\n field,\n value: socialDraft.trim(),\n });\n setEditingSocial(null);\n }, [editingSocial, socialDraft, updateSocialMutation]);\n\n if (isAccountError && !isLoadingAccount) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"text-muted-foreground text-center text-sm\">\n {t(\"unable_to_load_account\")}\n </div>\n </div>\n );\n }\n\n if (isLoadingAccount || !accountData || !accountRep) {\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-16 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n const pointsBalance = rewardPointsEnabled\n ? (pointsLedgerData?.points_ledgers?.[0]?.total_balance ?? 0)\n : undefined;\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileLayout\n account={accountRep}\n pointsBalance={pointsBalance}\n pointsLedger={adaptedPointsLedger}\n pointsLabel={pointsLabel}\n rewardsEnabled={rewardPointsEnabled}\n addresses={addresses}\n paymentMethods={paymentMethods}\n mySiteDisplayUrl={mySiteDisplayUrl}\n socialLinks={socialLinks}\n onEditPersonalInfo={handleOpenInfoDialog}\n onAddAddress={() => setAddressDialog({ open: true, selected: null })}\n onEditAddress={(address) =>\n setAddressDialog({ open: true, selected: address })\n }\n onDeleteAddress={(address) => setDeletingAddress(address)}\n onAddPaymentMethod={() => {\n setSaveCardError(null);\n setIsAddCardOpen(true);\n }}\n onEditPaymentMethod={(pm) => setEditPaymentMethod(pm)}\n onCopyMySiteLink={handleCopyMySiteLink}\n onEditMySiteLink={handleOpenEditMySiteLink}\n onConnectSocial={handleConnectSocial}\n presentation={dialogPresentation}\n />\n\n <UserInfoDialog\n control={userInfoForm.control}\n isOpen={isInfoDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={() => setIsInfoDialogOpen(false)}\n languageOptions={adaptedLanguages.map((l) => ({\n name: l.name,\n value: l.iso,\n }))}\n errorMsg={undefined}\n isSubmitting={updateCustomerMutation.isPending}\n email={accountRep.email ?? \"\"}\n presentation={dialogPresentation}\n />\n\n <AddressFormDialog\n isOpen={addressDialog.open}\n onClose={() => setAddressDialog({ open: false, selected: null })}\n selectedAddress={addressDialog.selected}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ?? countryIso\n }\n languageIso={locale}\n t={(key: string) => t(key as never)}\n onSubmit={async (formData) => {\n if (addressDialog.selected) {\n await updateAddressMutation.mutateAsync({\n addressId: addressDialog.selected.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n setAddressDialog({ open: false, selected: null });\n }}\n isSubmitting={\n createAddressMutation.isPending || updateAddressMutation.isPending\n }\n onDelete={\n addressDialog.selected && !addressDialog.selected.default\n ? async () => {\n if (!addressDialog.selected) return;\n try {\n await deleteAddressMutation.mutateAsync(\n addressDialog.selected.id,\n );\n setAddressDialog({ open: false, selected: null });\n } catch {\n // toast surfaced via onError\n }\n }\n : undefined\n }\n isDeleting={deleteAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n presentation={dialogPresentation}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n openDialog={deletingAddress !== null}\n setOpenDialog={(open) => {\n if (!open) setDeletingAddress(null);\n }}\n onAction={async () => {\n if (!deletingAddress) return;\n try {\n await deleteAddressMutation.mutateAsync(deletingAddress.id);\n setDeletingAddress(null);\n } catch {\n // toast surfaced via onError\n }\n }}\n isLoading={deleteAddressMutation.isPending}\n actionText={t(\"delete\")}\n presentation={dialogPresentation}\n />\n\n <CreditCardFormDialog\n isOpen={isAddCardOpen}\n onClose={() => {\n // Don't let the card dialog close while a 3DS challenge is in flight —\n // the bank-verification modal renders behind it and would be stranded.\n if (cardAdd3DS.isActive) return;\n setSaveCardError(null);\n setIsAddCardOpen(false);\n }}\n error={saveCardError ?? undefined}\n t={(key: string) => t(key as never)}\n onSubmit={async (data) => {\n setSaveCardError(null);\n try {\n // Closure happens in cardAddSuccess (created PM) / the 3DS\n // onApproved branch — NOT here, since a three_ds_required response\n // resolves successfully while the bank check is still pending.\n await addCreditCardMutation.mutateAsync(data);\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={addCreditCardMutation.isPending}\n jwt=\"\"\n savedAddresses={addresses}\n defaultBillingAddressId={addresses.find((a) => a.default)?.id}\n presentation={dialogPresentation}\n renderAddressFormDialog={({ isOpen, onClose, onAddressCreated }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={null}\n onSubmit={async (data) => {\n try {\n const { address } =\n await createAddressMutation.mutateAsync(data);\n onAddressCreated(mapToFluidPayAddress(address));\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={createAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n languageIso={locale}\n t={(key: string) => t(key as never)}\n presentation={dialogPresentation}\n />\n )}\n />\n\n {cardAdd3DS.modal}\n\n {editPaymentMethod && (\n <EditPaymentMethodDialog\n isOpen\n onClose={() => setEditPaymentMethod(null)}\n paymentMethod={editPaymentMethod}\n billingAddress={editPaymentMethod.billing_address}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n onSubmit={(data) => {\n updatePaymentMethodMutation.mutate(\n { paymentMethodId: editPaymentMethod.id, data },\n { onSuccess: () => setEditPaymentMethod(null) },\n );\n }}\n isSubmitting={updatePaymentMethodMutation.isPending}\n onDelete={() => {\n deletePaymentMethodMutation.mutate(editPaymentMethod.id, {\n onSuccess: () => setEditPaymentMethod(null),\n });\n }}\n isDeleting={deletePaymentMethodMutation.isPending}\n presentation={dialogPresentation}\n />\n )}\n\n <ResponsiveDialog\n open={isEditMySiteLinkOpen}\n onOpenChange={(open) => {\n if (!open && updateMySiteSettingsMutation.isPending) return;\n setIsEditMySiteLinkOpen(open);\n }}\n title={t(\"edit_link\")}\n presentation={dialogPresentation}\n >\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"mysite-slug\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"your_mysite_link\")}\n </Label>\n <div className=\"ring-border focus-within:ring-foreground/40 flex items-center gap-1 rounded-md bg-transparent px-3 py-2 ring-1 transition-all focus-within:ring-2\">\n {mySiteUrlPrefix && (\n <span className=\"text-muted-foreground shrink-0 text-sm\">\n {mySiteUrlPrefix}\n </span>\n )}\n <Input\n id=\"mysite-slug\"\n value={mySiteSlugDraft}\n onChange={(e) => setMySiteSlugDraft(e.target.value)}\n onKeyDown={(e) => {\n if (\n e.key === \"Enter\" &&\n !updateMySiteSettingsMutation.isPending\n ) {\n e.preventDefault();\n void handleSubmitMySiteLink();\n }\n }}\n className=\"h-auto min-w-0 flex-1 border-0 p-0 shadow-none focus-visible:ring-0\"\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsEditMySiteLinkOpen(false)}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitMySiteLink();\n }}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {updateMySiteSettingsMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n\n <ResponsiveDialog\n open={editingSocial !== null}\n onOpenChange={(open) => !open && setEditingSocial(null)}\n title={\n editingSocial\n ? t(\"edit_platform_link\", {\n platform: SOCIAL_LABELS[editingSocial] ?? \"\",\n })\n : t(\"edit_social_link\")\n }\n presentation={dialogPresentation}\n >\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"social-handle\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"url\")}\n </Label>\n <Input\n id=\"social-handle\"\n value={socialDraft}\n onChange={(e) => setSocialDraft(e.target.value)}\n placeholder={\n editingSocial ? SOCIAL_PLACEHOLDERS[editingSocial] : \"\"\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void handleSubmitSocial();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setEditingSocial(null)}\n disabled={updateSocialMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitSocial();\n }}\n disabled={updateSocialMutation.isPending}\n >\n {updateSocialMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n </FluidPayCoreProvider>\n );\n}\n","import type { ComponentProps } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n return (\n <ProfileTranslationBridge>\n <ProfileScreenContent\n onToast={effectiveToast}\n countryIso={countryIso}\n divProps={divProps}\n />\n </ProfileTranslationBridge>\n );\n}\n\nfunction ProfileScreenContent({\n onToast,\n countryIso,\n divProps,\n}: {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n divProps: ComponentProps<\"div\">;\n}): React.JSX.Element {\n const { t } = useProfileTranslation();\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div {...divProps}>\n <ProfileContentScreen onToast={onToast} countryIso={countryIso} />\n </div>\n </>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProfileScreen-G3cmyl0b.cjs","names":["useProfileTranslation","Sparkles","Pencil","User","Mail","Phone","Quote","Link2","Copy","ResponsiveDialog","LogOut","titleCaseFromSnake","brandIconUrl","GENERIC_PAYMENT_ICON_URL","maskCardNumber","Plus","MapPin","EllipsesDropdown","Linkedin","Facebook","Twitter","Instagram","Youtube","Globe","isThreeDsRequiredCreate","canAccessRepSurfaces","useProfileTranslation","useSidebar","useActiveLocale","usePayApi","useAccountApi","createFluidPayApiAdapter","usePortalMySiteProfile","usePortalUpdateSettings","useAccount","payKeys","mapToFluidPayPaymentMethod","useCountriesApi","useLanguagesApi","storeKeys","useStore","accountKeys","usePortalCardAdd3DSFlow","getBrowserInfo","useZodForm","z","FluidPayCoreProvider","UserInfoDialog","AddressFormDialog","ConfirmActionDialog","CreditCardFormDialog","EditPaymentMethodDialog","ResponsiveDialog","Label","Input","DialogFooter","Button","useFluidContext","ProfileTranslationBridge","useProfileTranslation","ScreenHeaderBreadcrumbs","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage"],"sources":["../src/screens/profile/derive-last-name.ts","../src/screens/profile/ProfileLayout.tsx","../src/screens/profile-card-add-success.ts","../src/screens/ProfileContentScreen.tsx","../src/screens/ProfileScreen.tsx"],"sourcesContent":["export function deriveLastName(firstName: string, fullName: string): string {\n if (!firstName) return \"\";\n const prefix = `${firstName} `;\n return fullName.startsWith(prefix) ? fullName.slice(prefix.length) : \"\";\n}\n","import { type JSX, type ReactNode, useState, type ComponentType } from \"react\";\nimport {\n ResponsiveDialog,\n type ResponsiveDialogPresentation,\n} from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport {\n Sparkles,\n Pencil,\n Plus,\n Copy,\n Link2,\n MapPin,\n User,\n Mail,\n Phone,\n Quote,\n Linkedin,\n Facebook,\n Twitter,\n Instagram,\n Youtube,\n Globe,\n LogOut,\n} from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport type { PointsLedger } from \"@fluid-app/profile-core\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\nimport {\n brandIconUrl,\n GENERIC_PAYMENT_ICON_URL,\n} from \"@fluid-app/payments-display/brands\";\nimport { maskCardNumber } from \"@fluid-app/payments-display/display\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { titleCaseFromSnake } from \"@fluid-app/portal-core/format/title-case\";\n\ninterface ProfileLayoutProps {\n account: AccountRep;\n pointsBalance: number | undefined;\n pointsLedger?: PointsLedger[];\n pointsLabel: { singular: string; plural: string };\n rewardsEnabled?: boolean;\n addresses: fluidPay.CustomerAddress[];\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n mySiteDisplayUrl: string;\n socialLinks: Partial<Record<SocialKey, string>>;\n onEditPersonalInfo: () => void;\n onAddAddress: () => void;\n onEditAddress: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress: (address: fluidPay.CustomerAddress) => void;\n onAddPaymentMethod: () => void;\n onEditPaymentMethod: (method: fluidPay.CustomerPaymentMethod) => void;\n onCopyMySiteLink: () => void;\n onEditMySiteLink?: () => void;\n onConnectSocial: (key: SocialKey) => void;\n onSignOut?: () => void;\n presentation?: ResponsiveDialogPresentation;\n}\n\nexport function ProfileLayout(props: ProfileLayoutProps): JSX.Element {\n const { t } = useProfileTranslation();\n const {\n account,\n pointsBalance,\n pointsLedger,\n pointsLabel,\n rewardsEnabled,\n addresses,\n paymentMethods,\n mySiteDisplayUrl,\n socialLinks,\n onEditPersonalInfo,\n onAddAddress,\n onEditAddress,\n onDeleteAddress,\n onAddPaymentMethod,\n onEditPaymentMethod,\n onCopyMySiteLink,\n onEditMySiteLink,\n onConnectSocial,\n onSignOut,\n presentation = \"dialog\",\n } = props;\n\n const fullName =\n `${account.first_name ?? \"\"} ${account.last_name ?? \"\"}`.trim();\n const heroFirstName = (account.first_name || \"\").trim().split(\" \")[0] || \"\";\n const heroDisplay =\n heroFirstName || account.email?.split(\"@\")[0] || t(\"account_fallback\");\n const connectedSocialCount = Object.values(socialLinks).filter(\n (v) => typeof v === \"string\" && v.length > 0,\n ).length;\n const [isPointsHistoryOpen, setIsPointsHistoryOpen] = useState(false);\n const POINTS_PREVIEW_COUNT = 4;\n const ledger = pointsLedger ?? [];\n const ledgerPreview = ledger.slice(0, POINTS_PREVIEW_COUNT);\n const hasMoreLedger = ledger.length > POINTS_PREVIEW_COUNT;\n // Configured points label: capitalized plural for headings, count-aware form\n // (singular at 1) for \"N <label>\" amounts.\n const pointsLabelPluralCap = capitalize(pointsLabel.plural);\n const pointsCountLabel = (n: number): string =>\n n === 1 ? pointsLabel.singular : pointsLabel.plural;\n const sortedAddresses = [...addresses].sort(\n (a, b) => Number(b.default ?? false) - Number(a.default ?? false),\n );\n\n return (\n <div className=\"relative\">\n <div className=\"relative mx-auto max-w-4xl px-5 pt-8 pb-20 md:px-8\">\n {/* Hero */}\n <section className=\"flex items-center gap-3.5\">\n <div className=\"relative size-12 shrink-0 overflow-hidden rounded-full ring-1 ring-black/5 md:size-13\">\n {account.avatar_url ? (\n <img\n src={account.avatar_url}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"bg-primary text-primary-foreground flex h-full w-full items-center justify-center text-lg font-semibold\">\n {heroDisplay.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-foreground truncate text-xl font-bold tracking-tight md:text-2xl\">\n {heroDisplay}\n </h1>\n <p className=\"text-muted-foreground mt-0.5 truncate text-sm\">\n {account.email}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {rewardsEnabled && (\n <div className=\"ring-border text-foreground inline-flex items-center gap-1.5 rounded-md bg-transparent px-2.5 py-1 text-xs font-semibold ring-1\">\n <Sparkles className=\"text-primary size-3\" strokeWidth={2.25} />\n {(pointsBalance ?? 0).toLocaleString()}{\" \"}\n {pointsCountLabel(pointsBalance ?? 0)}\n </div>\n )}\n </div>\n </section>\n\n {/* Personal information */}\n <SectionHeader\n title={t(\"personal_information\")}\n action={\n <PillButton\n onClick={onEditPersonalInfo}\n icon={Pencil}\n label={t(\"edit\")}\n />\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n <FieldRow\n icon={User}\n label={t(\"name\")}\n value={fullName || account.first_name || \"\"}\n />\n <FieldRow\n icon={Mail}\n label={t(\"email\")}\n value={account.email ?? \"\"}\n />\n <FieldRow\n icon={Phone}\n label={t(\"phone\")}\n value={account.phone ?? \"\"}\n placeholder={t(\"add_phone_number\")}\n />\n <FieldRow\n icon={Quote}\n label={t(\"bio\")}\n value={account.bio ?? \"\"}\n placeholder={t(\"add_a_short_bio\")}\n multiline\n isLast\n />\n </div>\n\n {/* Payment methods */}\n <SectionHeader title={t(\"payment_methods\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-3\">\n {paymentMethods.map((method) => (\n <PaymentCardVisual\n key={method.id}\n method={method}\n onClick={() => onEditPaymentMethod(method)}\n />\n ))}\n <AddPaymentTile onClick={onAddPaymentMethod} />\n </div>\n\n {/* Points history */}\n {rewardsEnabled && (\n <>\n <SectionHeader\n title={t(\"points_history\", { label: pointsLabelPluralCap })}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"pts_available\", {\n count: String((pointsBalance ?? 0).toLocaleString()),\n label: pointsCountLabel(pointsBalance ?? 0),\n })}\n </span>\n }\n />\n {ledger.length > 0 ? (\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {ledgerPreview.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={!hasMoreLedger && i === ledgerPreview.length - 1}\n pointsLabelPlural={pointsLabelPluralCap}\n />\n ))}\n {hasMoreLedger && (\n <button\n type=\"button\"\n onClick={() => setIsPointsHistoryOpen(true)}\n className=\"text-foreground hover:bg-muted flex w-full items-center justify-center gap-1 px-4 py-3 text-xs font-bold transition-colors\"\n >\n {t(\"see_all_transactions\", { count: ledger.length })}\n </button>\n )}\n </div>\n ) : (\n <div className=\"ring-dashed ring-border mt-2.5 flex flex-col items-center justify-center gap-1 rounded-2xl bg-transparent px-4 py-8 text-center ring-1\">\n <Sparkles\n className=\"text-muted-foreground/75 size-5\"\n strokeWidth={1.75}\n />\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"no_points_yet\", { label: pointsLabel.plural })}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"earn_points_hint\", { label: pointsLabel.plural })}\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Your MySite link */}\n <SectionHeader\n title={t(\"your_mysite_link\")}\n action={\n onEditMySiteLink ? (\n <PillButton\n onClick={onEditMySiteLink}\n icon={Pencil}\n label={t(\"edit_link\")}\n />\n ) : undefined\n }\n />\n <div className=\"ring-border mt-2.5 flex items-center gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"bg-muted text-foreground flex size-11 shrink-0 items-center justify-center rounded-full\">\n <Link2 className=\"size-[18px]\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {t(\"public_link\")}\n </div>\n <div className=\"text-foreground mt-0.5 truncate font-mono text-sm font-semibold\">\n {mySiteDisplayUrl || t(\"set_your_mysite_link\")}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onCopyMySiteLink}\n disabled={!mySiteDisplayUrl}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Copy className=\"size-3\" strokeWidth={2.25} />\n {t(\"copy\")}\n </button>\n </div>\n\n {/* Shipping addresses */}\n <SectionHeader title={t(\"shipping_addresses\")} />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n {sortedAddresses.map((address) => (\n <AddressCard\n key={address.id}\n address={address}\n onEdit={() => onEditAddress(address)}\n onDelete={\n address.default ? undefined : () => onDeleteAddress(address)\n }\n presentation={presentation}\n />\n ))}\n <AddAddressTile onClick={onAddAddress} />\n </div>\n\n {/* Social media */}\n <SectionHeader\n title={t(\"social_media\")}\n action={\n <span className=\"text-muted-foreground/75 text-xs\">\n {t(\"connected_count\", { count: connectedSocialCount })}\n </span>\n }\n />\n <div className=\"ring-border mt-2.5 overflow-hidden rounded-2xl bg-transparent ring-1\">\n {SOCIAL_ENTRIES.map((entry, i) => (\n <SocialRow\n key={entry.key}\n entry={entry}\n handle={socialLinks[entry.key] ?? \"\"}\n isLast={i === SOCIAL_ENTRIES.length - 1}\n onConnect={() => onConnectSocial(entry.key)}\n />\n ))}\n </div>\n\n <ResponsiveDialog\n open={isPointsHistoryOpen}\n onOpenChange={setIsPointsHistoryOpen}\n title={t(\"points_history\", { label: pointsLabelPluralCap })}\n presentation={presentation}\n >\n <div className=\"ring-border overflow-hidden rounded-2xl bg-transparent ring-1\">\n {ledger.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={i === ledger.length - 1}\n pointsLabelPlural={pointsLabelPluralCap}\n />\n ))}\n </div>\n </ResponsiveDialog>\n\n {onSignOut && (\n <div className=\"ring-border mt-8 flex flex-wrap items-center justify-between gap-3 rounded-2xl bg-transparent p-3.5 ring-1\">\n <div className=\"flex items-center gap-3\">\n <div className=\"bg-destructive/10 flex size-9 items-center justify-center rounded-md\">\n <LogOut\n className=\"text-destructive size-4\"\n strokeWidth={2.25}\n />\n </div>\n <div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"sign_out\")}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"sign_out_description\")}\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"bg-destructive/15 text-destructive hover:bg-destructive/25 rounded-md px-4 py-2 text-xs font-bold transition-colors\"\n >\n {t(\"sign_out\")}\n </button>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction SectionHeader({\n title,\n action,\n}: {\n title: string;\n action?: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"mt-8 flex items-end justify-between\">\n <h2 className=\"text-foreground text-base font-bold tracking-tight\">\n {title}\n </h2>\n {action ?? null}\n </div>\n );\n}\n\nfunction PillButton({\n onClick,\n icon: Icon,\n label,\n disabled,\n}: {\n onClick: () => void;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n disabled?: boolean;\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Icon className=\"size-3\" strokeWidth={2.25} />\n {label}\n </button>\n );\n}\n\nfunction PointsLedgerRow({\n entry,\n isLast,\n pointsLabelPlural,\n}: {\n entry: PointsLedger;\n isLast: boolean;\n pointsLabelPlural: string;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const isCredit = entry.amount >= 0;\n const sign = isCredit ? \"+\" : \"−\";\n const magnitude = Math.abs(entry.amount).toLocaleString();\n const amountColor = isCredit ? \"text-emerald-600\" : \"text-destructive\";\n const sourceName = entry.metadata?.source?.name?.trim();\n const transactionType = entry.metadata?.transaction_type;\n const label =\n sourceName ||\n (transactionType\n ? titleCaseFromSnake(transactionType)\n : isCredit\n ? t(\"points_awarded\", { label: pointsLabelPlural })\n : t(\"points_redeemed\", { label: pointsLabelPlural }));\n const dateLabel = formatLedgerDate(entry.created_at);\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Sparkles\n className={`size-4 ${isCredit ? \"text-primary\" : \"text-muted-foreground\"}`}\n strokeWidth={2}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground truncate text-sm font-medium\">\n {label}\n </div>\n <div className=\"text-muted-foreground text-xs\">{dateLabel}</div>\n </div>\n <div\n className={`shrink-0 font-mono text-sm font-bold tabular-nums ${amountColor}`}\n >\n {sign}\n {magnitude}\n </div>\n </div>\n );\n}\n\n/** Capitalize the first letter for display in headings / titles. */\nfunction capitalize(value: string): string {\n return value.charAt(0).toUpperCase() + value.slice(1);\n}\n\nfunction formatLedgerDate(iso: string): string {\n try {\n const d = new Date(iso);\n return d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return iso;\n }\n}\n\nfunction FieldRow({\n icon: Icon,\n label,\n value,\n placeholder,\n isLast,\n multiline,\n}: {\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n label: string;\n value: string;\n placeholder?: string;\n isLast?: boolean;\n multiline?: boolean;\n}): JSX.Element {\n const display = value || placeholder || \"\";\n const isPlaceholder = !value && Boolean(placeholder);\n const valueClasses = multiline ? \"whitespace-pre-line\" : \"truncate\";\n return (\n <div\n className={`flex gap-3 px-4 py-3.5 ${multiline ? \"items-start\" : \"items-center\"} ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-muted-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-muted-foreground/75 text-xs font-bold tracking-widest uppercase\">\n {label}\n </div>\n <div\n className={`mt-0.5 ${valueClasses} text-sm font-medium ${isPlaceholder ? \"text-muted-foreground/55\" : \"text-foreground\"}`}\n >\n {display}\n </div>\n </div>\n </div>\n );\n}\n\nfunction PaymentCardVisual({\n method,\n onClick,\n}: {\n method: fluidPay.CustomerPaymentMethod;\n onClick: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const brand = (method.details.card_brand || \"\").toLowerCase();\n // Ordered, de-duplicated fallback chain: the server-provided logo, then the\n // brand-derived CDN icon, then the generic card icon. Each load failure\n // advances one step instead of collapsing straight to generic.\n const logoCandidates = [\n ...new Set(\n [\n method.details.logo_url,\n brandIconUrl(brand),\n GENERIC_PAYMENT_ICON_URL,\n ].filter((url): url is string => Boolean(url)),\n ),\n ];\n const [logoStep, setLogoStep] = useState(0);\n const logoSrc =\n logoCandidates[Math.min(logoStep, logoCandidates.length - 1)] ??\n GENERIC_PAYMENT_ICON_URL;\n const maskedNumber = maskCardNumber(method.details.last_four, brand);\n const expMonth = String(method.details.exp_month ?? \"\").padStart(2, \"0\");\n const expYear = String(method.details.exp_year ?? \"\").slice(-2);\n const exp = expMonth && expYear ? `${expMonth}/${expYear}` : \"\";\n const holder =\n method.details.card_holder || method.billing_address?.name || \"\";\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group bg-foreground text-background ring-foreground/10 relative flex aspect-[1.586/1] flex-col justify-between overflow-hidden rounded-xl p-4 text-left shadow-sm ring-1 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg\"\n >\n <div\n aria-hidden\n className=\"absolute inset-0 bg-[repeating-linear-gradient(135deg,transparent_0px,transparent_22px,currentColor_22px,currentColor_24px)] opacity-[0.04]\"\n />\n <div className=\"relative\">\n <div className=\"flex items-start justify-between\">\n <img\n src={logoSrc}\n alt={brand}\n className=\"h-7 w-auto object-contain\"\n onError={() =>\n setLogoStep((step) =>\n Math.min(step + 1, logoCandidates.length - 1),\n )\n }\n />\n {method.default && (\n <span className=\"bg-background/10 text-background/80 rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"text-background mt-3 font-mono text-lg font-bold tracking-wider\">\n {maskedNumber}\n </div>\n </div>\n <div className=\"relative flex items-end justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"cardholder\")}\n </div>\n <div className=\"text-background truncate text-xs font-semibold\">\n {holder || \" \"}\n </div>\n </div>\n <div>\n <div className=\"text-background/40 text-xs font-semibold tracking-widest uppercase\">\n {t(\"card_expires\")}\n </div>\n <div className=\"text-background font-mono text-xs font-semibold\">\n {exp}\n </div>\n </div>\n </div>\n </button>\n );\n}\n\nfunction AddPaymentTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex aspect-[1.586/1] flex-col items-center justify-center gap-1.5 rounded-xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-xs font-bold\">\n {t(\"add_payment_method\")}\n </div>\n <div className=\"text-muted-foreground/75 text-xs\">\n {t(\"accepted_cards\")}\n </div>\n </button>\n );\n}\n\nfunction AddressCard({\n address,\n onEdit,\n onDelete,\n presentation,\n}: {\n address: fluidPay.CustomerAddress;\n onEdit: () => void;\n onDelete?: () => void;\n presentation: ResponsiveDialogPresentation;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const label = address.name?.trim() || t(\"address\");\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n return (\n <div className=\"ring-border hover:bg-muted focus-within:ring-foreground/40 relative flex flex-col rounded-2xl bg-transparent ring-1 transition-all duration-200 focus-within:ring-2 hover:ring-2\">\n <button\n type=\"button\"\n onClick={onEdit}\n className=\"flex w-full flex-col rounded-2xl p-4 pr-12 text-left focus-visible:outline-none\"\n >\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-muted flex size-8 items-center justify-center rounded-full\">\n <MapPin\n className=\"text-muted-foreground size-4\"\n strokeWidth={2}\n />\n </div>\n <div className=\"text-foreground text-sm font-bold\">{label}</div>\n </div>\n {address.default && (\n <span className=\"bg-primary text-primary-foreground rounded-md px-2 py-0.5 text-xs font-bold tracking-wider uppercase\">\n {t(\"default\")}\n </span>\n )}\n </div>\n <div className=\"text-foreground mt-3 space-y-0.5 text-sm leading-snug\">\n {address.address1 && <div>{address.address1}</div>}\n {address.address2 && <div>{address.address2}</div>}\n {cityLine && <div>{cityLine}</div>}\n {address.country_code && (\n <div className=\"text-muted-foreground\">{address.country_code}</div>\n )}\n {address.phone && (\n <div className=\"text-muted-foreground\">{address.phone}</div>\n )}\n </div>\n </button>\n <div className=\"absolute top-2 right-2 z-10\">\n <EllipsesDropdown\n onEdit={onEdit}\n onDelete={onDelete}\n editLabel={t(\"edit\")}\n deleteLabel={t(\"delete\")}\n menuLabel={t(\"address\")}\n presentation={presentation}\n />\n </div>\n </div>\n );\n}\n\nfunction AddAddressTile({ onClick }: { onClick: () => void }): JSX.Element {\n const { t } = useProfileTranslation();\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-border text-muted-foreground hover:bg-background hover:text-foreground flex min-h-37 flex-col items-center justify-center gap-1.5 rounded-2xl bg-transparent ring-1 transition-colors\"\n >\n <div className=\"ring-border flex size-9 items-center justify-center rounded-full bg-transparent ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"add_an_address\")}\n </div>\n </button>\n );\n}\n\ntype SocialKey =\n | \"linkedin\"\n | \"facebook\"\n | \"x\"\n | \"instagram\"\n | \"youtube\"\n | \"pinterest\"\n | \"tiktok\";\n\ninterface SocialEntry {\n key: SocialKey;\n label: string;\n icon: ComponentType<{ className?: string; strokeWidth?: number }>;\n placeholder: string;\n}\n\nconst SOCIAL_ENTRIES: readonly SocialEntry[] = [\n {\n key: \"linkedin\",\n label: \"LinkedIn\",\n icon: Linkedin,\n placeholder: \"linkedin.com/in/username\",\n },\n {\n key: \"facebook\",\n label: \"Facebook\",\n icon: Facebook,\n placeholder: \"facebook.com/username\",\n },\n { key: \"x\", label: \"X\", icon: Twitter, placeholder: \"x.com/username\" },\n {\n key: \"instagram\",\n label: \"Instagram\",\n icon: Instagram,\n placeholder: \"instagram.com/username\",\n },\n {\n key: \"youtube\",\n label: \"YouTube\",\n icon: Youtube,\n placeholder: \"youtube.com/@channel\",\n },\n {\n key: \"pinterest\",\n label: \"Pinterest\",\n icon: Globe,\n placeholder: \"pinterest.com/username\",\n },\n {\n key: \"tiktok\",\n label: \"TikTok\",\n icon: Globe,\n placeholder: \"tiktok.com/@username\",\n },\n] as const;\n\nfunction SocialRow({\n entry,\n handle,\n isLast,\n onConnect,\n}: {\n entry: SocialEntry;\n handle: string;\n isLast: boolean;\n onConnect: () => void;\n}): JSX.Element {\n const { t } = useProfileTranslation();\n const Icon = entry.icon;\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-border border-b\"}`}\n >\n <div className=\"bg-muted text-foreground flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Icon className=\"size-4\" strokeWidth={2} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground text-sm font-bold\">{entry.label}</div>\n <div\n className={`truncate text-xs ${handle ? \"text-muted-foreground\" : \"text-muted-foreground/55\"}`}\n >\n {handle || entry.placeholder}\n </div>\n </div>\n <PillButton\n onClick={onConnect}\n icon={handle ? Pencil : Plus}\n label={handle ? t(\"edit\") : t(\"connect\")}\n />\n </div>\n );\n}\n\nexport type { SocialKey };\n","import { isThreeDsRequiredCreate } from \"@fluid-app/portal-core/pay-types\";\nimport type {\n CreatePaymentMethodResponse,\n ThreeDsRequiredCreateResult,\n} from \"@fluid-app/portal-core/pay-types\";\n\n/**\n * Build the create-payment-method onSuccess handler. On three_ds_required it\n * hands off to the 3DS flow and leaves the card dialog OPEN (begin() resolves\n * at modal-open, not flow-completion). On a created PM it runs the legacy\n * created path (invalidate + close + toast).\n */\nexport function buildProfileCardAddSuccess(deps: {\n begin: (created: ThreeDsRequiredCreateResult) => Promise<void>;\n onCreated: () => void;\n}) {\n return async (response: CreatePaymentMethodResponse) => {\n if (isThreeDsRequiredCreate(response)) {\n await deps.begin(response);\n return;\n }\n deps.onCreated();\n };\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { z } from \"zod\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n Button,\n DialogFooter,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { ResponsiveDialog } from \"@fluid-app/ui-components/components/ResponsiveDialog\";\nimport { useSidebar } from \"@fluid-app/portal-react/shell/sidebar\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n AddressFormDialog,\n ConfirmActionDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n UserInfoDialog,\n socialFields,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n CreditCardFormSubmitData,\n} from \"@fluid-app/profile-ui\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport { getBrowserInfo } from \"@fluid-app/fluid-pay-core/utils/browser-info\";\nimport { TOKEN_PROVIDER_VGS } from \"@fluid-app/portal-core/pay-types\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport type { AccountRep } from \"@fluid-app/portal-core/account-types\";\nimport { canAccessRepSurfaces } from \"@fluid-app/portal-core/member-permissions\";\nimport { useAccountApi } from \"@fluid-app/portal-core/account-api-context\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport {\n usePortalMySiteProfile,\n usePortalUpdateSettings,\n} from \"@fluid-app/mysite-ui/portal/hooks/use-mysite-portal\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { useLanguagesApi } from \"@fluid-app/store-core/languages-api-context\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { accountKeys, payKeys, storeKeys } from \"../account/query-keys\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { useStore } from \"../hooks/use-store\";\nimport { deriveLastName } from \"./profile/derive-last-name\";\nimport { ProfileLayout, type SocialKey } from \"./profile/ProfileLayout\";\nimport { usePortalCardAdd3DSFlow } from \"../hooks/use-portal-card-add-3ds-flow\";\nimport { buildProfileCardAddSuccess } from \"./profile-card-add-success\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nfunction mapAccountToCustomerAccount(\n raw: AccountRep,\n): fluidPay.CustomerAccount {\n return {\n fluid_pay_account: {\n id: raw.id,\n email: raw.email,\n address_count: 0,\n payment_methods_count: 0,\n language_iso: raw.language_iso,\n },\n customer: {\n id: raw.id,\n active: true,\n active_subscriptions_count: 0,\n display_total_spent: \"0\",\n email: raw.email,\n first_name: raw.first_name,\n full_name: `${raw.first_name} ${raw.last_name}`.trim(),\n inactive_subscriptions_count: 0,\n is_rep: canAccessRepSurfaces(raw),\n phone: raw.phone,\n orders_count: 0,\n },\n };\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n phone: raw.phone,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\ntype SocialFieldKey = (typeof socialFields)[number][\"name\"];\n\nconst SOCIAL_KEY_TO_FIELD: Record<SocialKey, SocialFieldKey | null> = {\n linkedin: \"linkedin\" as SocialFieldKey,\n facebook: \"facebook\" as SocialFieldKey,\n x: \"twitter\" as SocialFieldKey,\n instagram: \"instagram\" as SocialFieldKey,\n youtube: \"youtube\" as SocialFieldKey,\n pinterest: \"pinterest\" as SocialFieldKey,\n tiktok: \"tiktok\" as SocialFieldKey,\n};\n\nconst SOCIAL_LABELS: Record<SocialKey, string> = {\n linkedin: \"LinkedIn\",\n facebook: \"Facebook\",\n x: \"X\",\n instagram: \"Instagram\",\n youtube: \"YouTube\",\n pinterest: \"Pinterest\",\n tiktok: \"TikTok\",\n};\n\nconst SOCIAL_PLACEHOLDERS: Record<SocialKey, string> = {\n linkedin: \"linkedin.com/in/username\",\n facebook: \"facebook.com/username\",\n x: \"x.com/username\",\n instagram: \"instagram.com/username\",\n youtube: \"youtube.com/@channel\",\n pinterest: \"pinterest.com/username\",\n tiktok: \"tiktok.com/@username\",\n};\n\nexport function ProfileContentScreen({\n onToast,\n countryIso,\n}: ProfileContentScreenProps): React.JSX.Element {\n const { t } = useProfileTranslation();\n const { isMobile } = useSidebar();\n const dialogPresentation = isMobile ? \"bottom-sheet\" : \"dialog\";\n const { locale } = useActiveLocale();\n const payApi = usePayApi();\n const accountApi = useAccountApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const { data: mySiteProfile } = usePortalMySiteProfile();\n const updateMySiteSettingsMutation = usePortalUpdateSettings();\n\n const mySiteUrl = mySiteProfile?.mysite_url ?? \"\";\n const mySiteDisplayUrl = mySiteUrl\n ? mySiteUrl.replace(/^https?:\\/\\//, \"\")\n : \"\";\n const mySiteLastSlash = mySiteDisplayUrl.lastIndexOf(\"/\");\n const mySiteUrlPrefix =\n mySiteLastSlash >= 0 ? mySiteDisplayUrl.slice(0, mySiteLastSlash + 1) : \"\";\n const mySiteCurrentSlug =\n mySiteLastSlash >= 0\n ? mySiteDisplayUrl.slice(mySiteLastSlash + 1)\n : mySiteDisplayUrl;\n\n // Reuse the app-wide useAccount() cache entry shared with AppShell/PageRouter.\n const {\n data: accountRep,\n isLoading: isLoadingAccount,\n isError: isAccountError,\n } = useAccount();\n\n const accountData = useMemo(\n () => (accountRep ? mapAccountToCustomerAccount(accountRep) : undefined),\n [accountRep],\n );\n\n const { data: addressesData } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: true,\n });\n\n const { data: paymentMethodsData } = useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n enabled: true,\n });\n\n const countriesAdapter = useCountriesApi();\n const languagesAdapter = useLanguagesApi();\n\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(locale),\n queryFn: () => countriesAdapter.listCountries({ languageIso: locale }),\n enabled: true,\n });\n\n const { data: languagesData } = useQuery({\n queryKey: storeKeys.languages(),\n queryFn: () => languagesAdapter.listLanguages(),\n enabled: true,\n });\n\n const { data: pointsLedgerData, isError: isPointsLedgerError } = useQuery({\n queryKey: payKeys.pointsLedgers.list(),\n queryFn: () => payApi.fetchPointsLedgers(),\n enabled: true,\n retry: (failureCount, error) => {\n if (\n error instanceof Error &&\n \"status\" in error &&\n (error as { status: number }).status === 403\n ) {\n return false;\n }\n return failureCount < 1;\n },\n });\n\n const rewardPointsEnabled = !isPointsLedgerError && pointsLedgerData != null;\n\n // Per-company reward-points label (defaults point/points). Drives the\n // configured label across the profile points UI.\n const { data: store } = useStore();\n const pointsLabelSingular = store?.reward_points_label_singular || \"point\";\n const pointsLabelPlural = store?.reward_points_label_plural || \"points\";\n const pointsLabel = useMemo(\n () => ({ singular: pointsLabelSingular, plural: pointsLabelPlural }),\n [pointsLabelSingular, pointsLabelPlural],\n );\n\n const adaptedPointsLedger: PointsLedger[] = useMemo(() => {\n return (pointsLedgerData?.points_ledgers ?? []).map((entry) => {\n const meta = entry.metadata as {\n transaction_type?: string | null;\n source?: {\n name: string;\n email?: string;\n reason?: string;\n user_id?: number;\n } | null;\n } | null;\n return {\n id: entry.id,\n amount: entry.amount,\n company_id: 0,\n created_at: entry.created_at,\n customer_id: 0,\n metadata: {\n transaction_type: meta?.transaction_type ?? undefined,\n source: meta?.source ?? undefined,\n },\n total_balance: entry.total_balance,\n updated_at: entry.created_at,\n };\n });\n }, [pointsLedgerData]);\n\n const updateCustomerMutation = useMutation({\n mutationFn: async (data: UserFormData) => {\n await accountApi.updateAccount({\n account: {\n first_name: data.first_name,\n last_name: data.last_name,\n phone: data.phone_number,\n bio: data.bio,\n language_iso: data.language,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"profile_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_profile\"), \"error\");\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_delete_payment_method\"), \"error\");\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(t(\"failed_to_update_payment_method\"), \"error\");\n },\n });\n\n const createAddressMutation = useMutation({\n // Detect a server-side dedupe (POST /api/pay/addresses returns the existing\n // record when an identical address already exists, ignoring `name`). Snapshot\n // the current id set before the request and compare against the returned id.\n mutationFn: async (body: fluidPay.CreateAddressBody) => {\n const existingIds = new Set((addressesData ?? []).map((a) => a.id));\n const address = await payApi.createAddress({\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n phone: body.address.phone,\n default: body.address.default,\n },\n });\n return { address, deduped: existingIds.has(address.id) };\n },\n onSuccess: ({ deduped }) => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n if (deduped) {\n onToast(t(\"address_already_exists\"), \"warning\");\n } else {\n onToast(t(\"address_created\"), \"success\");\n }\n },\n onError: () => {\n onToast(t(\"failed_to_create_address\"), \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n phone: body.address.phone,\n default: body.address.default,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_address\"), \"error\");\n },\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(t(\"address_deleted\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_delete_address\"), \"error\");\n },\n });\n\n // Orchestrates the bank-challenge step when card add returns three_ds_required.\n // begin() resolves the moment the challenge modal opens — so dialog close and\n // the success toast live ONLY here (onApproved) and on the created branch\n // (onCreated below), never on the three_ds_required branch.\n const cardAdd3DS = usePortalCardAdd3DSFlow({\n payApi,\n t: (key: string) => t(key as never),\n onApproved: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n setIsAddCardOpen(false);\n onToast(t(\"payment_method_added\"), \"success\");\n },\n onFailed: (message) => {\n setSaveCardError(message);\n },\n onCanceled: () => {},\n });\n\n const cardAddSuccess = buildProfileCardAddSuccess({\n begin: cardAdd3DS.begin,\n onCreated: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n setIsAddCardOpen(false);\n onToast(t(\"payment_method_added\"), \"success\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: CreditCardFormSubmitData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n token_provider: TOKEN_PROVIDER_VGS,\n exp_month: data.payment_method.exp_month,\n exp_year: data.payment_method.exp_year,\n cvv_token: data.payment_method.cvv_token,\n card_holder: data.payment_method.card_holder,\n default: data.set_as_default,\n ...(data.payment_method.bin ? { bin: data.payment_method.bin } : {}),\n ...(data.payment_method.last_four\n ? { last_four: data.payment_method.last_four }\n : {}),\n ...(data.payment_method.card_network\n ? { card_network: data.payment_method.card_network }\n : {}),\n },\n billing_address_id: data.billing_address_id,\n browser_info: getBrowserInfo(),\n }),\n onSuccess: cardAddSuccess,\n onError: () => {\n onToast(t(\"failed_to_add_payment_method\"), \"error\");\n },\n });\n\n const addresses = addressesData ?? [];\n const paymentMethods = paymentMethodsData ?? [];\n\n const adaptedLanguages: Language[] = (languagesData?.languages ?? []).map(\n (l, i) => ({ id: i, name: l.name, iso: l.code }),\n );\n\n const countries = countriesData?.countries;\n\n const countryOptions = useMemo(\n () =>\n [...(countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countries],\n );\n\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countries]);\n\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n // Dialog open state\n const [isInfoDialogOpen, setIsInfoDialogOpen] = useState(false);\n const [addressDialog, setAddressDialog] = useState<{\n open: boolean;\n selected: fluidPay.CustomerAddress | null;\n }>({ open: false, selected: null });\n const [deletingAddress, setDeletingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [isAddCardOpen, setIsAddCardOpen] = useState(false);\n const [saveCardError, setSaveCardError] = useState<string | null>(null);\n const [editPaymentMethod, setEditPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n\n // User-info form (for the existing dialog)\n const userInfoLanguage = useMemo(() => {\n return (\n adaptedLanguages.find(\n (l) => l.iso === accountData?.fluid_pay_account.language_iso,\n )?.iso ?? \"\"\n );\n }, [adaptedLanguages, accountData]);\n\n const derivedLastName = useMemo(() => {\n if (!accountData) return \"\";\n const { first_name, full_name } = accountData.customer;\n return deriveLastName(first_name, full_name);\n }, [accountData]);\n\n const userInfoSchema = useMemo(\n () =>\n z.object({\n first_name: z.string().min(1, t(\"first_name_is_required\")),\n last_name: z.string().min(1, t(\"last_name_is_required\")),\n phone_number: z.string().optional(),\n language: z.string().min(1, t(\"language_is_required\")),\n bio: z.string().optional(),\n }),\n [t],\n );\n\n const userInfoForm = useZodForm<UserFormData>(userInfoSchema, {\n defaultValues: {\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n },\n });\n\n const handleOpenInfoDialog = useCallback(() => {\n userInfoForm.reset({\n first_name: accountData?.customer.first_name ?? \"\",\n last_name: derivedLastName,\n phone_number: accountData?.customer.phone ?? \"\",\n language: userInfoLanguage,\n bio: accountRep?.bio ?? \"\",\n });\n setIsInfoDialogOpen(true);\n }, [\n accountData,\n accountRep,\n derivedLastName,\n userInfoLanguage,\n userInfoForm,\n ]);\n\n const onSubmitUserInfo = userInfoForm.handleSubmit(async (data) => {\n try {\n await updateCustomerMutation.mutateAsync(data);\n setIsInfoDialogOpen(false);\n } catch {\n // toast surfaced via onError\n }\n });\n\n const socialLinks = useMemo<Partial<Record<SocialKey, string>>>(() => {\n const src: Partial<Record<SocialFieldKey, string>> =\n accountRep?.social_links ?? {};\n const result: Partial<Record<SocialKey, string>> = {};\n for (const [key, field] of Object.entries(SOCIAL_KEY_TO_FIELD) as [\n SocialKey,\n SocialFieldKey | null,\n ][]) {\n if (!field) continue;\n const v = src[field];\n if (typeof v === \"string\" && v.length > 0) {\n result[key] = v;\n }\n }\n return result;\n }, [accountRep]);\n\n const handleCopyMySiteLink = useCallback(async () => {\n if (!mySiteUrl) return;\n try {\n await navigator.clipboard.writeText(mySiteUrl);\n onToast(t(\"mysite_link_copied\"), \"success\");\n } catch {\n onToast(t(\"failed_to_copy_link\"), \"error\");\n }\n }, [mySiteUrl, onToast, t]);\n\n const [isEditMySiteLinkOpen, setIsEditMySiteLinkOpen] = useState(false);\n const [mySiteSlugDraft, setMySiteSlugDraft] = useState(\"\");\n\n const handleOpenEditMySiteLink = useCallback(() => {\n setMySiteSlugDraft(mySiteCurrentSlug);\n setIsEditMySiteLinkOpen(true);\n }, [mySiteCurrentSlug]);\n\n const handleSubmitMySiteLink = useCallback(async () => {\n const trimmed = mySiteSlugDraft.trim();\n if (!trimmed) {\n onToast(t(\"mysite_link_empty\"), \"error\");\n return;\n }\n if (trimmed === mySiteCurrentSlug) {\n setIsEditMySiteLinkOpen(false);\n return;\n }\n try {\n await updateMySiteSettingsMutation.mutateAsync({ slug: trimmed });\n onToast(t(\"mysite_link_updated\"), \"success\");\n setIsEditMySiteLinkOpen(false);\n } catch {\n onToast(t(\"failed_to_update_mysite_link\"), \"error\");\n }\n }, [\n mySiteSlugDraft,\n mySiteCurrentSlug,\n updateMySiteSettingsMutation,\n onToast,\n t,\n ]);\n\n const [editingSocial, setEditingSocial] = useState<SocialKey | null>(null);\n const [socialDraft, setSocialDraft] = useState(\"\");\n\n const handleConnectSocial = useCallback(\n (key: SocialKey) => {\n const field = SOCIAL_KEY_TO_FIELD[key];\n if (!field) {\n onToast(t(\"platform_not_editable\"), \"warning\");\n return;\n }\n const current = accountRep?.social_links?.[field] ?? \"\";\n setSocialDraft(current);\n setEditingSocial(key);\n },\n [accountRep, onToast, t],\n );\n\n const updateSocialMutation = useMutation({\n mutationFn: async ({\n field,\n value,\n }: {\n field: SocialFieldKey;\n value: string;\n }) => {\n const current = accountRep?.social_links ?? {};\n await accountApi.updateAccount({\n account: {\n social_links: { ...current, [field]: value },\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(t(\"social_link_updated\"), \"success\");\n },\n onError: () => {\n onToast(t(\"failed_to_update_social_link\"), \"error\");\n },\n });\n\n const handleSubmitSocial = useCallback(async () => {\n if (!editingSocial) return;\n const field = SOCIAL_KEY_TO_FIELD[editingSocial];\n if (!field) return;\n await updateSocialMutation.mutateAsync({\n field,\n value: socialDraft.trim(),\n });\n setEditingSocial(null);\n }, [editingSocial, socialDraft, updateSocialMutation]);\n\n if (isAccountError && !isLoadingAccount) {\n return (\n <div className=\"px-4 py-8 sm:px-9\">\n <div className=\"text-muted-foreground text-center text-sm\">\n {t(\"unable_to_load_account\")}\n </div>\n </div>\n );\n }\n\n if (isLoadingAccount || !accountData || !accountRep) {\n return (\n <div className=\"px-4 pt-4 sm:px-9 md:pt-8\">\n <div className=\"space-y-4\">\n <div className=\"bg-muted h-16 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n <div className=\"bg-muted h-32 animate-pulse rounded\" />\n </div>\n </div>\n );\n }\n\n const pointsBalance = rewardPointsEnabled\n ? (pointsLedgerData?.points_ledgers?.[0]?.total_balance ?? 0)\n : undefined;\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileLayout\n account={accountRep}\n pointsBalance={pointsBalance}\n pointsLedger={adaptedPointsLedger}\n pointsLabel={pointsLabel}\n rewardsEnabled={rewardPointsEnabled}\n addresses={addresses}\n paymentMethods={paymentMethods}\n mySiteDisplayUrl={mySiteDisplayUrl}\n socialLinks={socialLinks}\n onEditPersonalInfo={handleOpenInfoDialog}\n onAddAddress={() => setAddressDialog({ open: true, selected: null })}\n onEditAddress={(address) =>\n setAddressDialog({ open: true, selected: address })\n }\n onDeleteAddress={(address) => setDeletingAddress(address)}\n onAddPaymentMethod={() => {\n setSaveCardError(null);\n setIsAddCardOpen(true);\n }}\n onEditPaymentMethod={(pm) => setEditPaymentMethod(pm)}\n onCopyMySiteLink={handleCopyMySiteLink}\n onEditMySiteLink={handleOpenEditMySiteLink}\n onConnectSocial={handleConnectSocial}\n presentation={dialogPresentation}\n />\n\n <UserInfoDialog\n control={userInfoForm.control}\n isOpen={isInfoDialogOpen}\n onSubmit={onSubmitUserInfo}\n handleClose={() => setIsInfoDialogOpen(false)}\n languageOptions={adaptedLanguages.map((l) => ({\n name: l.name,\n value: l.iso,\n }))}\n errorMsg={undefined}\n isSubmitting={updateCustomerMutation.isPending}\n email={accountRep.email ?? \"\"}\n presentation={dialogPresentation}\n />\n\n <AddressFormDialog\n isOpen={addressDialog.open}\n onClose={() => setAddressDialog({ open: false, selected: null })}\n selectedAddress={addressDialog.selected}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ?? countryIso\n }\n languageIso={locale}\n t={(key: string) => t(key as never)}\n onSubmit={async (formData) => {\n if (addressDialog.selected) {\n await updateAddressMutation.mutateAsync({\n addressId: addressDialog.selected.id,\n body: formData,\n });\n } else {\n await createAddressMutation.mutateAsync(formData);\n }\n setAddressDialog({ open: false, selected: null });\n }}\n isSubmitting={\n createAddressMutation.isPending || updateAddressMutation.isPending\n }\n onDelete={\n addressDialog.selected && !addressDialog.selected.default\n ? async () => {\n if (!addressDialog.selected) return;\n try {\n await deleteAddressMutation.mutateAsync(\n addressDialog.selected.id,\n );\n setAddressDialog({ open: false, selected: null });\n } catch {\n // toast surfaced via onError\n }\n }\n : undefined\n }\n isDeleting={deleteAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n presentation={dialogPresentation}\n />\n\n <ConfirmActionDialog\n title={t(\"delete_address\")}\n description={t(\"delete_address_message\")}\n openDialog={deletingAddress !== null}\n setOpenDialog={(open) => {\n if (!open) setDeletingAddress(null);\n }}\n onAction={async () => {\n if (!deletingAddress) return;\n try {\n await deleteAddressMutation.mutateAsync(deletingAddress.id);\n setDeletingAddress(null);\n } catch {\n // toast surfaced via onError\n }\n }}\n isLoading={deleteAddressMutation.isPending}\n actionText={t(\"delete\")}\n presentation={dialogPresentation}\n />\n\n <CreditCardFormDialog\n isOpen={isAddCardOpen}\n onClose={() => {\n // Don't let the card dialog close while a 3DS challenge is in flight —\n // the bank-verification modal renders behind it and would be stranded.\n if (cardAdd3DS.isActive) return;\n setSaveCardError(null);\n setIsAddCardOpen(false);\n }}\n error={saveCardError ?? undefined}\n t={(key: string) => t(key as never)}\n onSubmit={async (data) => {\n setSaveCardError(null);\n try {\n // Closure happens in cardAddSuccess (created PM) / the 3DS\n // onApproved branch — NOT here, since a three_ds_required response\n // resolves successfully while the bank check is still pending.\n await addCreditCardMutation.mutateAsync(data);\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={addCreditCardMutation.isPending}\n jwt=\"\"\n savedAddresses={addresses}\n defaultBillingAddressId={addresses.find((a) => a.default)?.id}\n presentation={dialogPresentation}\n renderAddressFormDialog={({ isOpen, onClose, onAddressCreated }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={null}\n onSubmit={async (data) => {\n try {\n const { address } =\n await createAddressMutation.mutateAsync(data);\n onAddressCreated(mapToFluidPayAddress(address));\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={createAddressMutation.isPending}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n languageIso={locale}\n t={(key: string) => t(key as never)}\n presentation={dialogPresentation}\n />\n )}\n />\n\n {cardAdd3DS.modal}\n\n {editPaymentMethod && (\n <EditPaymentMethodDialog\n isOpen\n onClose={() => setEditPaymentMethod(null)}\n paymentMethod={editPaymentMethod}\n billingAddress={editPaymentMethod.billing_address}\n countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n onSubmit={(data) => {\n updatePaymentMethodMutation.mutate(\n { paymentMethodId: editPaymentMethod.id, data },\n { onSuccess: () => setEditPaymentMethod(null) },\n );\n }}\n isSubmitting={updatePaymentMethodMutation.isPending}\n onDelete={() => {\n deletePaymentMethodMutation.mutate(editPaymentMethod.id, {\n onSuccess: () => setEditPaymentMethod(null),\n });\n }}\n isDeleting={deletePaymentMethodMutation.isPending}\n presentation={dialogPresentation}\n />\n )}\n\n <ResponsiveDialog\n open={isEditMySiteLinkOpen}\n onOpenChange={(open) => {\n if (!open && updateMySiteSettingsMutation.isPending) return;\n setIsEditMySiteLinkOpen(open);\n }}\n title={t(\"edit_link\")}\n presentation={dialogPresentation}\n >\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"mysite-slug\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"your_mysite_link\")}\n </Label>\n <div className=\"ring-border focus-within:ring-foreground/40 flex items-center gap-1 rounded-md bg-transparent px-3 py-2 ring-1 transition-all focus-within:ring-2\">\n {mySiteUrlPrefix && (\n <span className=\"text-muted-foreground shrink-0 text-sm\">\n {mySiteUrlPrefix}\n </span>\n )}\n <Input\n id=\"mysite-slug\"\n value={mySiteSlugDraft}\n onChange={(e) => setMySiteSlugDraft(e.target.value)}\n onKeyDown={(e) => {\n if (\n e.key === \"Enter\" &&\n !updateMySiteSettingsMutation.isPending\n ) {\n e.preventDefault();\n void handleSubmitMySiteLink();\n }\n }}\n className=\"h-auto min-w-0 flex-1 border-0 p-0 shadow-none focus-visible:ring-0\"\n />\n </div>\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setIsEditMySiteLinkOpen(false)}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitMySiteLink();\n }}\n disabled={updateMySiteSettingsMutation.isPending}\n >\n {updateMySiteSettingsMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n\n <ResponsiveDialog\n open={editingSocial !== null}\n onOpenChange={(open) => !open && setEditingSocial(null)}\n title={\n editingSocial\n ? t(\"edit_platform_link\", {\n platform: SOCIAL_LABELS[editingSocial] ?? \"\",\n })\n : t(\"edit_social_link\")\n }\n presentation={dialogPresentation}\n >\n <div className=\"space-y-2 pt-2\">\n <Label\n htmlFor=\"social-handle\"\n className=\"mb-1.5 block text-sm font-medium\"\n >\n {t(\"url\")}\n </Label>\n <Input\n id=\"social-handle\"\n value={socialDraft}\n onChange={(e) => setSocialDraft(e.target.value)}\n placeholder={\n editingSocial ? SOCIAL_PLACEHOLDERS[editingSocial] : \"\"\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n void handleSubmitSocial();\n }\n }}\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setEditingSocial(null)}\n disabled={updateSocialMutation.isPending}\n >\n {t(\"cancel\")}\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitSocial();\n }}\n disabled={updateSocialMutation.isPending}\n >\n {updateSocialMutation.isPending ? t(\"saving\") : t(\"save\")}\n </Button>\n </DialogFooter>\n </ResponsiveDialog>\n </FluidPayCoreProvider>\n );\n}\n","import type { ComponentProps } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n return (\n <ProfileTranslationBridge>\n <ProfileScreenContent\n onToast={effectiveToast}\n countryIso={countryIso}\n divProps={divProps}\n />\n </ProfileTranslationBridge>\n );\n}\n\nfunction ProfileScreenContent({\n onToast,\n countryIso,\n divProps,\n}: {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n divProps: ComponentProps<\"div\">;\n}): React.JSX.Element {\n const { t } = useProfileTranslation();\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div {...divProps}>\n <ProfileContentScreen onToast={onToast} countryIso={countryIso} />\n </div>\n </>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}