@fluid-app/portal-sdk 0.1.259 → 0.1.261
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AlertWidget-CcIBGBik.mjs → AlertWidget-Bua0I46v.mjs} +2 -2
- package/dist/{AlertWidget-CcIBGBik.mjs.map → AlertWidget-Bua0I46v.mjs.map} +1 -1
- package/dist/{AlertWidget-BZ67Uqfh.cjs → AlertWidget-ByokSA3K.cjs} +2 -2
- package/dist/{AlertWidget-BZ67Uqfh.cjs.map → AlertWidget-ByokSA3K.cjs.map} +1 -1
- package/dist/{BulletListWidget-iGJI33Ed.cjs → BulletListWidget-BwrMNPZ-.cjs} +2 -2
- package/dist/{BulletListWidget-iGJI33Ed.cjs.map → BulletListWidget-BwrMNPZ-.cjs.map} +1 -1
- package/dist/{BulletListWidget-mRwUgtzN.mjs → BulletListWidget-DvT2x5wg.mjs} +2 -2
- package/dist/{BulletListWidget-mRwUgtzN.mjs.map → BulletListWidget-DvT2x5wg.mjs.map} +1 -1
- package/dist/{CalendarWidget-ByY49yYX.mjs → CalendarWidget-BB1C5K_j.mjs} +2 -2
- package/dist/{CalendarWidget-ByY49yYX.mjs.map → CalendarWidget-BB1C5K_j.mjs.map} +1 -1
- package/dist/{CalendarWidget-CSipLdwg.cjs → CalendarWidget-MVJmxwFQ.cjs} +2 -2
- package/dist/{CalendarWidget-CSipLdwg.cjs.map → CalendarWidget-MVJmxwFQ.cjs.map} +1 -1
- package/dist/{CardWidget-CXsjl-Is.cjs → CardWidget-5hGl1bt9.cjs} +2 -2
- package/dist/{CardWidget-DK4VQau1.mjs → CardWidget-CEERBKUN.mjs} +2 -2
- package/dist/{CardWidget-DK4VQau1.mjs.map → CardWidget-CEERBKUN.mjs.map} +1 -1
- package/dist/{CardWidget-DovkTkKg.cjs → CardWidget-Cf4-dF-v.cjs} +2 -2
- package/dist/{CardWidget-DovkTkKg.cjs.map → CardWidget-Cf4-dF-v.cjs.map} +1 -1
- package/dist/{CarouselWidget-Cu1b3ERq.cjs → CarouselWidget-BJSO17JY.cjs} +2 -2
- package/dist/{CarouselWidget-Cu1b3ERq.cjs.map → CarouselWidget-BJSO17JY.cjs.map} +1 -1
- package/dist/{CarouselWidget-C0X-nFyW.mjs → CarouselWidget-Dhjf60LS.mjs} +2 -2
- package/dist/{CarouselWidget-C0X-nFyW.mjs.map → CarouselWidget-Dhjf60LS.mjs.map} +1 -1
- package/dist/{CatchUpWidget-C17xpj3Z.cjs → CatchUpWidget-CFF-Fgdo.cjs} +2 -2
- package/dist/{CatchUpWidget-C17xpj3Z.cjs.map → CatchUpWidget-CFF-Fgdo.cjs.map} +1 -1
- package/dist/{CatchUpWidget-Bj30ZbUk.mjs → CatchUpWidget-CM-iCMhK.mjs} +2 -2
- package/dist/{CatchUpWidget-Bj30ZbUk.mjs.map → CatchUpWidget-CM-iCMhK.mjs.map} +1 -1
- package/dist/{ChartWidget-Brxz8j4Q.cjs → ChartWidget-6nZLzlQM.cjs} +2 -2
- package/dist/{ChartWidget-Brxz8j4Q.cjs.map → ChartWidget-6nZLzlQM.cjs.map} +1 -1
- package/dist/{ChartWidget-CIscUHUD.mjs → ChartWidget-CJXZ9qf7.mjs} +2 -2
- package/dist/{ChartWidget-CIscUHUD.mjs.map → ChartWidget-CJXZ9qf7.mjs.map} +1 -1
- package/dist/{ChartWidget-CNhmJePK.cjs → ChartWidget-WXGJeXdl.cjs} +2 -2
- package/dist/{ContainerWidget-YMePQ1FG.mjs → ContainerWidget-2Rep2gGz.mjs} +3 -3
- package/dist/{ContainerWidget-YMePQ1FG.mjs.map → ContainerWidget-2Rep2gGz.mjs.map} +1 -1
- package/dist/{ContainerWidget-D5rr47AN.cjs → ContainerWidget-CpIynF1n.cjs} +3 -3
- package/dist/{ContainerWidget-wtuUrr1c.cjs → ContainerWidget-DX9qO1T-.cjs} +3 -3
- package/dist/{ContainerWidget-wtuUrr1c.cjs.map → ContainerWidget-DX9qO1T-.cjs.map} +1 -1
- package/dist/{EmbedWidget-DE1yhLR1.mjs → EmbedWidget-Czn_RJbm.mjs} +2 -2
- package/dist/{EmbedWidget-DE1yhLR1.mjs.map → EmbedWidget-Czn_RJbm.mjs.map} +1 -1
- package/dist/{EmbedWidget-BO0TonyK.cjs → EmbedWidget-DFlg5AI7.cjs} +2 -2
- package/dist/{EmbedWidget-BO0TonyK.cjs.map → EmbedWidget-DFlg5AI7.cjs.map} +1 -1
- package/dist/{FluidProvider-CDNk3Ssn.mjs → FluidProvider-C0YKxODs.mjs} +49 -49
- package/dist/{FluidProvider-CDNk3Ssn.mjs.map → FluidProvider-C0YKxODs.mjs.map} +1 -1
- package/dist/{FluidProvider-P_MBgI-c.cjs → FluidProvider-CoSgK0jL.cjs} +49 -49
- package/dist/{FluidProvider-P_MBgI-c.cjs.map → FluidProvider-CoSgK0jL.cjs.map} +1 -1
- package/dist/{ImageWidget-DmaAQZBK.mjs → ImageWidget--WJppfij.mjs} +2 -2
- package/dist/{ImageWidget-DmaAQZBK.mjs.map → ImageWidget--WJppfij.mjs.map} +1 -1
- package/dist/{ImageWidget-CbQVxMe3.cjs → ImageWidget-CU2cet5p.cjs} +2 -2
- package/dist/{ImageWidget-CbQVxMe3.cjs.map → ImageWidget-CU2cet5p.cjs.map} +1 -1
- package/dist/{LayoutWidget-BK8AxE60.cjs → LayoutWidget-8DwDBW24.cjs} +2 -2
- package/dist/{LayoutWidget-BK8AxE60.cjs.map → LayoutWidget-8DwDBW24.cjs.map} +1 -1
- package/dist/{LayoutWidget-K2iF13-C.cjs → LayoutWidget-CUjv-pB1.cjs} +2 -2
- package/dist/{LayoutWidget-8KxCmJcd.mjs → LayoutWidget-iKNNIRPq.mjs} +2 -2
- package/dist/{LayoutWidget-8KxCmJcd.mjs.map → LayoutWidget-iKNNIRPq.mjs.map} +1 -1
- package/dist/{LinkWidget-Dvb6WlaR.mjs → LinkWidget-BoVmB_zf.mjs} +2 -2
- package/dist/{LinkWidget-Dvb6WlaR.mjs.map → LinkWidget-BoVmB_zf.mjs.map} +1 -1
- package/dist/{LinkWidget-DnAGzdnF.cjs → LinkWidget-BzgMcUuV.cjs} +2 -2
- package/dist/{LinkWidget-88wWH7-i.cjs → LinkWidget-DpylGthu.cjs} +2 -2
- package/dist/{LinkWidget-88wWH7-i.cjs.map → LinkWidget-DpylGthu.cjs.map} +1 -1
- package/dist/{ListWidget-xetptWnX.cjs → ListWidget-CQgei8SF.cjs} +2 -2
- package/dist/{ListWidget-xetptWnX.cjs.map → ListWidget-CQgei8SF.cjs.map} +1 -1
- package/dist/{ListWidget-Bsi4jdcz.mjs → ListWidget-CuwsaMQ9.mjs} +2 -2
- package/dist/{ListWidget-Bsi4jdcz.mjs.map → ListWidget-CuwsaMQ9.mjs.map} +1 -1
- package/dist/{ListWidget-BzuYuJkf.cjs → ListWidget-TXPwy2v6.cjs} +2 -2
- package/dist/MessagingScreen-CKIs5m0_.cjs +48 -0
- package/dist/{MessagingScreen-SQXX6kkC.mjs → MessagingScreen-Ck6c7BK3.mjs} +2 -2
- package/dist/{MessagingScreen-SQXX6kkC.mjs.map → MessagingScreen-Ck6c7BK3.mjs.map} +1 -1
- package/dist/MessagingScreen-DgS_ZEzO.mjs +46 -0
- package/dist/{MessagingScreen-CsZsCnnX.cjs → MessagingScreen-ga_zEAeB.cjs} +2 -2
- package/dist/{MessagingScreen-CsZsCnnX.cjs.map → MessagingScreen-ga_zEAeB.cjs.map} +1 -1
- package/dist/{MySiteWidget-DXY59o3T.cjs → MySiteWidget-BziY8ylH.cjs} +2 -2
- package/dist/{MySiteWidget-DXY59o3T.cjs.map → MySiteWidget-BziY8ylH.cjs.map} +1 -1
- package/dist/{MySiteWidget-8XrZA0Un.mjs → MySiteWidget-CsJzjc7o.mjs} +2 -2
- package/dist/{MySiteWidget-8XrZA0Un.mjs.map → MySiteWidget-CsJzjc7o.mjs.map} +1 -1
- package/dist/{NestedWidget-CSA2gUPx.cjs → NestedWidget-B1Rwz6nb.cjs} +2 -2
- package/dist/{NestedWidget-B8lW9Fzv.mjs → NestedWidget-DrZ62oaO.mjs} +2 -2
- package/dist/{NestedWidget-B8lW9Fzv.mjs.map → NestedWidget-DrZ62oaO.mjs.map} +1 -1
- package/dist/{NestedWidget-C2D4eWqb.cjs → NestedWidget-vrohV65N.cjs} +2 -2
- package/dist/{NestedWidget-C2D4eWqb.cjs.map → NestedWidget-vrohV65N.cjs.map} +1 -1
- package/dist/{PointsWidget-ComTSNQZ.cjs → PointsWidget-DI3N8-6W.cjs} +2 -2
- package/dist/{PointsWidget-ComTSNQZ.cjs.map → PointsWidget-DI3N8-6W.cjs.map} +1 -1
- package/dist/{PointsWidget-CRvG5LOV.mjs → PointsWidget-ubAn0b-m.mjs} +2 -2
- package/dist/{PointsWidget-CRvG5LOV.mjs.map → PointsWidget-ubAn0b-m.mjs.map} +1 -1
- package/dist/ProfileScreen-90-Jf8IH.mjs +46 -0
- package/dist/ProfileScreen-B7sbMdbH.cjs +48 -0
- package/dist/{ProfileScreen-C6Z8g6-L.cjs → ProfileScreen-DYO-1rw4.cjs} +2 -2
- package/dist/{ProfileScreen-C6Z8g6-L.cjs.map → ProfileScreen-DYO-1rw4.cjs.map} +1 -1
- package/dist/{ProfileScreen-C45yTIj-.mjs → ProfileScreen-FG1DZum3.mjs} +2 -2
- package/dist/{ProfileScreen-C45yTIj-.mjs.map → ProfileScreen-FG1DZum3.mjs.map} +1 -1
- package/dist/{QuickLinksWidget-Bcl4CxfW.cjs → QuickLinksWidget-Cpq1V-uX.cjs} +2 -2
- package/dist/{QuickLinksWidget-Bcl4CxfW.cjs.map → QuickLinksWidget-Cpq1V-uX.cjs.map} +1 -1
- package/dist/{QuickLinksWidget-roBJQ1Ge.mjs → QuickLinksWidget-J5axodVF.mjs} +2 -2
- package/dist/{QuickLinksWidget-roBJQ1Ge.mjs.map → QuickLinksWidget-J5axodVF.mjs.map} +1 -1
- package/dist/{QuickShareWidget-D_Ghjgwz.cjs → QuickShareWidget-CYPOXs8X.cjs} +2 -2
- package/dist/{QuickShareWidget-D_Ghjgwz.cjs.map → QuickShareWidget-CYPOXs8X.cjs.map} +1 -1
- package/dist/{QuickShareWidget-D-NVbmfw.mjs → QuickShareWidget-CyYW9nS6.mjs} +2 -2
- package/dist/{QuickShareWidget-D-NVbmfw.mjs.map → QuickShareWidget-CyYW9nS6.mjs.map} +1 -1
- package/dist/{RecentActivityWidget-Bz54YXQN.mjs → RecentActivityWidget-CndO-Ac0.mjs} +2 -2
- package/dist/{RecentActivityWidget-Bz54YXQN.mjs.map → RecentActivityWidget-CndO-Ac0.mjs.map} +1 -1
- package/dist/{RecentActivityWidget-sv_3ewZa.cjs → RecentActivityWidget-Cp3fYBM2.cjs} +2 -2
- package/dist/{RecentActivityWidget-sv_3ewZa.cjs.map → RecentActivityWidget-Cp3fYBM2.cjs.map} +1 -1
- package/dist/{SeparatorWidget-CY6uMLHP.cjs → SeparatorWidget-DW_9_L9_.cjs} +2 -2
- package/dist/{SeparatorWidget-CY6uMLHP.cjs.map → SeparatorWidget-DW_9_L9_.cjs.map} +1 -1
- package/dist/{SeparatorWidget-DR75Yj_C.mjs → SeparatorWidget-eI7b2n6u.mjs} +2 -2
- package/dist/{SeparatorWidget-DR75Yj_C.mjs.map → SeparatorWidget-eI7b2n6u.mjs.map} +1 -1
- package/dist/{ShopScreen-C3PYT1v_.cjs → ShopScreen-BDhf2CmC.cjs} +2 -2
- package/dist/{ShopScreen-C3PYT1v_.cjs.map → ShopScreen-BDhf2CmC.cjs.map} +1 -1
- package/dist/ShopScreen-BgTi5eCl.cjs +49 -0
- package/dist/ShopScreen-BhYkCXLT.mjs +47 -0
- package/dist/{ShopScreen-BFKwuM2U.mjs → ShopScreen-D0p5rQD8.mjs} +2 -2
- package/dist/{ShopScreen-BFKwuM2U.mjs.map → ShopScreen-D0p5rQD8.mjs.map} +1 -1
- package/dist/{TableWidget-yky-XAA1.cjs → TableWidget-BORWeyOR.cjs} +2 -2
- package/dist/{TableWidget-CiI5pArP.cjs → TableWidget-CT6T3IgY.cjs} +2 -2
- package/dist/{TableWidget-CiI5pArP.cjs.map → TableWidget-CT6T3IgY.cjs.map} +1 -1
- package/dist/{TableWidget-C87Czlh6.mjs → TableWidget-D8HBHejy.mjs} +2 -2
- package/dist/{TableWidget-C87Czlh6.mjs.map → TableWidget-D8HBHejy.mjs.map} +1 -1
- package/dist/{TextWidget-C7oY0X3r.cjs → TextWidget-CMOofhaH.cjs} +2 -2
- package/dist/{TextWidget-C7oY0X3r.cjs.map → TextWidget-CMOofhaH.cjs.map} +1 -1
- package/dist/{TextWidget-CfLUQr6V.mjs → TextWidget-DSGevTKM.mjs} +2 -2
- package/dist/{TextWidget-CfLUQr6V.mjs.map → TextWidget-DSGevTKM.mjs.map} +1 -1
- package/dist/{ToDoWidget-BY-6VIxD.mjs → ToDoWidget-5IiWutYI.mjs} +2 -2
- package/dist/{ToDoWidget-BY-6VIxD.mjs.map → ToDoWidget-5IiWutYI.mjs.map} +1 -1
- package/dist/{ToDoWidget-CpO7jdw0.cjs → ToDoWidget-B97blWRO.cjs} +2 -2
- package/dist/{ToDoWidget-CpO7jdw0.cjs.map → ToDoWidget-B97blWRO.cjs.map} +1 -1
- package/dist/{ToDoWidget-CjY1i0lz.cjs → ToDoWidget-kn1dtlKi.cjs} +2 -2
- package/dist/{VideoWidget-DSPDdiYr.mjs → VideoWidget-BiaPF0-w.mjs} +2 -2
- package/dist/{VideoWidget-DSPDdiYr.mjs.map → VideoWidget-BiaPF0-w.mjs.map} +1 -1
- package/dist/{VideoWidget-BpEF3gRZ.cjs → VideoWidget-zdT_mVo9.cjs} +2 -2
- package/dist/{VideoWidget-BpEF3gRZ.cjs.map → VideoWidget-zdT_mVo9.cjs.map} +1 -1
- package/dist/index.cjs +42 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +42 -42
- package/dist/index.mjs.map +1 -1
- package/dist/{registries-kvRRUHcO.mjs → registries-6F90ZS1m.mjs} +10 -1
- package/dist/registries-6F90ZS1m.mjs.map +1 -0
- package/dist/{registries-DBb6VjAX.cjs → registries-CVsthTnW.cjs} +10 -1
- package/dist/registries-CVsthTnW.cjs.map +1 -0
- package/package.json +18 -18
- package/dist/MessagingScreen-J59IMCoQ.mjs +0 -46
- package/dist/MessagingScreen-Sur4umLF.cjs +0 -48
- package/dist/ProfileScreen-B1J74rK1.cjs +0 -48
- package/dist/ProfileScreen-BdmW4weg.mjs +0 -46
- package/dist/ShopScreen-C_8yLQjA.mjs +0 -47
- package/dist/ShopScreen-Cg_DoIMi.cjs +0 -49
- package/dist/registries-DBb6VjAX.cjs.map +0 -1
- package/dist/registries-kvRRUHcO.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProfileScreen-C45yTIj-.mjs","names":[],"sources":["../src/screens/profile/derive-last-name.ts","../src/screens/profile/ProfileLayout.tsx","../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 Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@fluid-app/ui-primitives\";\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 type { AccountRep } from \"@fluid-app/portal-core/account-types\";\n\ninterface ProfileLayoutProps {\n account: AccountRep;\n pointsBalance: number | undefined;\n pointsLedger?: PointsLedger[];\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 onAddPaymentMethod: () => void;\n onEditPaymentMethod: (method: fluidPay.CustomerPaymentMethod) => void;\n onCopyMySiteLink: () => void;\n onEditMySiteLink?: () => void;\n onConnectSocial: (key: SocialKey) => void;\n onSignOut?: () => void;\n}\n\nexport function ProfileLayout(props: ProfileLayoutProps): JSX.Element {\n const {\n account,\n pointsBalance,\n pointsLedger,\n rewardsEnabled,\n addresses,\n paymentMethods,\n mySiteDisplayUrl,\n socialLinks,\n onEditPersonalInfo,\n onAddAddress,\n onEditAddress,\n onAddPaymentMethod,\n onEditPaymentMethod,\n onCopyMySiteLink,\n onEditMySiteLink,\n onConnectSocial,\n onSignOut,\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] || \"Account\";\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\n return (\n <div className=\"relative\">\n <div className=\"max-w-profile-container relative mx-auto px-5 pt-8 pb-20 md:px-8\">\n {/* Hero */}\n <section className=\"flex items-center gap-3.5\">\n <div className=\"size-profile-avatar-sm md:size-profile-avatar relative shrink-0 overflow-hidden rounded-full ring-1 ring-black/5\">\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-profile-dark text-profile-dark-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-profile-hero tracking-profile-hero text-profile-text md:text-profile-hero-lg truncate font-bold\">\n {heroDisplay}\n </h1>\n <p className=\"text-profile-sm-plus text-profile-text-muted mt-0.5 truncate\">\n {account.email}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {rewardsEnabled && (\n <div className=\"ring-profile-border bg-profile-card text-profile-xs-plus text-profile-text inline-flex items-center gap-1.5 rounded-md px-2.5 py-1 font-semibold ring-1\">\n <Sparkles\n className=\"text-profile-accent size-3\"\n strokeWidth={2.25}\n />\n {(pointsBalance ?? 0).toLocaleString()} pts\n </div>\n )}\n </div>\n </section>\n\n {/* Personal information */}\n <SectionHeader\n title=\"Personal information\"\n action={\n <PillButton\n onClick={onEditPersonalInfo}\n icon={Pencil}\n label=\"Edit\"\n />\n }\n />\n <div className=\"ring-profile-border bg-profile-card mt-2.5 overflow-hidden rounded-2xl ring-1\">\n <FieldRow\n icon={User}\n label=\"Name\"\n value={fullName || account.first_name || \"\"}\n />\n <FieldRow icon={Mail} label=\"Email\" value={account.email ?? \"\"} />\n <FieldRow\n icon={Phone}\n label=\"Phone\"\n value={account.phone ?? \"\"}\n placeholder=\"Add phone number\"\n />\n <FieldRow\n icon={Quote}\n label=\"Bio\"\n value={account.bio ?? \"\"}\n placeholder=\"Add a short bio\"\n multiline\n isLast\n />\n </div>\n\n {/* Payment methods */}\n <SectionHeader title=\"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=\"Points history\"\n action={\n <span className=\"text-profile-xs text-profile-text-faint\">\n {(pointsBalance ?? 0).toLocaleString()} pts available\n </span>\n }\n />\n {ledger.length > 0 ? (\n <div className=\"ring-profile-border bg-profile-card mt-2.5 overflow-hidden rounded-2xl ring-1\">\n {ledgerPreview.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={!hasMoreLedger && i === ledgerPreview.length - 1}\n />\n ))}\n {hasMoreLedger && (\n <button\n type=\"button\"\n onClick={() => setIsPointsHistoryOpen(true)}\n className=\"text-profile-xs text-profile-text hover:bg-profile-pill-hover flex w-full items-center justify-center gap-1 px-4 py-3 font-bold transition-colors\"\n >\n See all {ledger.length} transactions\n </button>\n )}\n </div>\n ) : (\n <div className=\"ring-dashed ring-profile-dashed-border bg-profile-card mt-2.5 flex flex-col items-center justify-center gap-1 rounded-2xl px-4 py-8 text-center ring-1\">\n <Sparkles\n className=\"text-profile-text-faint size-5\"\n strokeWidth={1.75}\n />\n <div className=\"text-profile-base text-profile-text font-bold\">\n No points yet\n </div>\n <div className=\"text-profile-xs text-profile-text-muted\">\n Earn points on every order to unlock rewards.\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Your MySite link */}\n <SectionHeader\n title=\"Your MySite link\"\n action={\n onEditMySiteLink ? (\n <PillButton\n onClick={onEditMySiteLink}\n icon={Pencil}\n label=\"Edit link\"\n />\n ) : undefined\n }\n />\n <div className=\"ring-profile-border bg-profile-card mt-2.5 flex items-center gap-3 rounded-2xl p-3.5 ring-1\">\n <div className=\"size-profile-mysite-icon bg-profile-icon-bg text-profile-text flex 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-profile-2xs tracking-profile-uppercase-1 text-profile-text-faint font-bold uppercase\">\n Public link\n </div>\n <div className=\"text-profile-base text-profile-text mt-0.5 truncate font-mono font-semibold\">\n {mySiteDisplayUrl || \"Set your MySite link\"}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onCopyMySiteLink}\n disabled={!mySiteDisplayUrl}\n className=\"ring-profile-border bg-profile-card text-profile-xs text-profile-text hover:bg-profile-pill-hover inline-flex items-center gap-1 rounded-md px-3 py-1.5 font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Copy className=\"size-3\" strokeWidth={2.25} />\n Copy\n </button>\n </div>\n\n {/* Shipping addresses */}\n <SectionHeader title=\"Shipping addresses\" />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n {addresses.map((address) => (\n <AddressCard\n key={address.id}\n address={address}\n onEdit={() => onEditAddress(address)}\n />\n ))}\n <AddAddressTile onClick={onAddAddress} />\n </div>\n\n {/* Social media */}\n <SectionHeader\n title=\"Social media\"\n action={\n <span className=\"text-profile-xs text-profile-text-faint\">\n {connectedSocialCount} connected\n </span>\n }\n />\n <div className=\"ring-profile-border bg-profile-card mt-2.5 overflow-hidden rounded-2xl 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 <Dialog\n open={isPointsHistoryOpen}\n onOpenChange={setIsPointsHistoryOpen}\n >\n <DialogContent className=\"max-w-md md:max-w-lg\">\n <DialogHeader>\n <DialogTitle>Points history</DialogTitle>\n </DialogHeader>\n <div className=\"ring-profile-border bg-profile-card max-h-[60vh] overflow-y-auto rounded-2xl ring-1\">\n {ledger.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={i === ledger.length - 1}\n />\n ))}\n </div>\n </DialogContent>\n </Dialog>\n\n {onSignOut && (\n <div className=\"ring-profile-border bg-profile-card mt-8 flex flex-wrap items-center justify-between gap-3 rounded-2xl p-3.5 ring-1\">\n <div className=\"flex items-center gap-3\">\n <div className=\"bg-profile-danger-bg flex size-9 items-center justify-center rounded-md\">\n <LogOut\n className=\"text-profile-danger-icon size-4\"\n strokeWidth={2.25}\n />\n </div>\n <div>\n <div className=\"text-profile-base text-profile-text font-bold\">\n Sign out\n </div>\n <div className=\"text-profile-xs-plus text-profile-text-muted\">\n You can sign back in any time\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"bg-profile-danger-button-bg text-profile-sm text-profile-danger-button-text hover:bg-profile-danger-button-hover rounded-md px-4 py-2 font-bold transition-colors\"\n >\n 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-profile-lg tracking-profile-heading text-profile-text font-bold\">\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-profile-border bg-profile-card text-profile-xs text-profile-text hover:bg-profile-pill-hover inline-flex items-center gap-1 rounded-md px-3 py-1.5 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}: {\n entry: PointsLedger;\n isLast: boolean;\n}): JSX.Element {\n const isCredit = entry.amount >= 0;\n const sign = isCredit ? \"+\" : \"−\";\n const magnitude = Math.abs(entry.amount).toLocaleString();\n const amountColor = isCredit\n ? \"text-emerald-600\"\n : \"text-profile-danger-icon\";\n const sourceName = entry.metadata?.source?.name?.trim();\n const transactionType = entry.metadata?.transaction_type;\n const label =\n sourceName ||\n (transactionType\n ? transactionType.charAt(0).toUpperCase() + transactionType.slice(1)\n : isCredit\n ? \"Points earned\"\n : \"Points redeemed\");\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-profile-divider border-b\"}`}\n >\n <div className=\"bg-profile-icon-bg flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Sparkles\n className={`size-4 ${isCredit ? \"text-profile-accent\" : \"text-profile-text-muted\"}`}\n strokeWidth={2}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-profile-md text-profile-text truncate font-medium\">\n {label}\n </div>\n <div className=\"text-profile-xs text-profile-text-muted\">\n {dateLabel}\n </div>\n </div>\n <div\n className={`text-profile-md shrink-0 font-mono font-bold tabular-nums ${amountColor}`}\n >\n {sign}\n {magnitude}\n </div>\n </div>\n );\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-profile-divider border-b\"}`}\n >\n <div className=\"bg-profile-icon-bg text-profile-text-muted 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-profile-2xs tracking-profile-uppercase-1 text-profile-text-faint font-bold uppercase\">\n {label}\n </div>\n <div\n className={`mt-0.5 ${valueClasses} text-profile-md font-medium ${isPlaceholder ? \"text-profile-text-placeholder\" : \"text-profile-text\"}`}\n >\n {display}\n </div>\n </div>\n </div>\n );\n}\n\nconst CARD_BRAND_LABEL: Record<string, string> = {\n amex: \"AMERICAN EXPRESS\",\n visa: \"VISA\",\n mastercard: \"MASTERCARD\",\n discover: \"DISCOVER\",\n diners: \"DINERS CLUB\",\n jcb: \"JCB\",\n unionpay: \"UNIONPAY\",\n};\n\nconst CARD_BRAND_BADGE: Record<string, string> = {\n amex: \"AMEX\",\n visa: \"VISA\",\n mastercard: \"MC\",\n discover: \"DISC\",\n diners: \"DC\",\n jcb: \"JCB\",\n unionpay: \"UPI\",\n};\n\nfunction PaymentCardVisual({\n method,\n onClick,\n}: {\n method: fluidPay.CustomerPaymentMethod;\n onClick: () => void;\n}): JSX.Element {\n const brand = (method.details.card_brand || \"\").toLowerCase();\n const brandLabel =\n CARD_BRAND_LABEL[brand] || (brand ? brand.toUpperCase() : \"CARD\");\n const badge = CARD_BRAND_BADGE[brand] || \"CARD\";\n const last4 = method.details.last_four ?? \"••••\";\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 = method.billing_address?.name ?? \"\";\n const badgeBg =\n brand === \"visa\"\n ? \"bg-[#1A1F71]\"\n : brand === \"mastercard\"\n ? \"bg-[#EB001B]\"\n : \"bg-[#0064D2]\";\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group relative flex aspect-[1.586/1] flex-col justify-between overflow-hidden rounded-xl bg-gradient-to-br from-[#1F2024] via-[#0F0F10] to-[#000000] p-4 text-left text-white shadow-sm ring-1 ring-black/10 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg hover:brightness-110\"\n >\n <div\n aria-hidden\n className=\"absolute inset-0 bg-[repeating-linear-gradient(135deg,transparent_0px,transparent_22px,rgba(255,255,255,0.04)_22px,rgba(255,255,255,0.04)_24px)]\"\n />\n <div className=\"relative flex items-start justify-between\">\n <div>\n <div className=\"text-profile-micro tracking-profile-uppercase-2 font-semibold text-white/50 uppercase\">\n {brandLabel}\n </div>\n <div className=\"text-profile-hero tracking-profile-mono mt-1 font-mono font-bold text-white\">\n {last4}\n </div>\n </div>\n {method.default && (\n <span className=\"text-profile-micro rounded-md bg-white/10 px-2 py-0.5 font-bold tracking-wider text-white/80 uppercase\">\n Default\n </span>\n )}\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-profile-nano tracking-profile-uppercase-2 font-semibold text-white/40 uppercase\">\n Cardholder\n </div>\n <div className=\"text-profile-xs-plus truncate font-semibold text-white\">\n {holder || \" \"}\n </div>\n </div>\n <div>\n <div className=\"text-profile-nano tracking-profile-uppercase-2 font-semibold text-white/40 uppercase\">\n Expires\n </div>\n <div className=\"text-profile-xs-plus font-mono font-semibold text-white\">\n {exp}\n </div>\n </div>\n <div\n className={`text-profile-micro shrink-0 rounded px-1.5 py-0.5 font-bold tracking-wider text-white ${badgeBg}`}\n >\n {badge}\n </div>\n </div>\n </button>\n );\n}\n\nfunction AddPaymentTile({ onClick }: { onClick: () => void }): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-profile-dashed-border bg-profile-card text-profile-text-muted hover:bg-profile-canvas hover:text-profile-text flex aspect-[1.586/1] flex-col items-center justify-center gap-1.5 rounded-xl ring-1 transition-colors\"\n >\n <div className=\"ring-profile-border bg-profile-card flex size-9 items-center justify-center rounded-full ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-profile-sm text-profile-text font-bold\">\n Add payment method\n </div>\n <div className=\"text-profile-2xs-plus text-profile-text-faint\">\n Visa, Mastercard, Amex\n </div>\n </button>\n );\n}\n\nfunction AddressCard({\n address,\n onEdit,\n}: {\n address: fluidPay.CustomerAddress;\n onEdit: () => void;\n}): JSX.Element {\n const label = address.name?.trim() || \"Address\";\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n return (\n <button\n type=\"button\"\n onClick={onEdit}\n className=\"ring-profile-border bg-profile-card hover:bg-profile-pill-hover focus-visible:ring-profile-text/40 flex flex-col rounded-2xl p-4 text-left ring-1 transition-all duration-200 hover:ring-2 focus-visible:ring-2 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-profile-icon-bg flex size-8 items-center justify-center rounded-full\">\n <MapPin\n className=\"text-profile-text-muted size-4\"\n strokeWidth={2}\n />\n </div>\n <div className=\"text-profile-md text-profile-text font-bold\">\n {label}\n </div>\n </div>\n {address.default && (\n <span className=\"bg-profile-dark text-profile-micro text-profile-dark-foreground rounded-md px-2 py-0.5 font-bold tracking-wider uppercase\">\n Default\n </span>\n )}\n </div>\n <div className=\"text-profile-sm-plus text-profile-text mt-3 space-y-0.5 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-profile-text-muted\">{address.country_code}</div>\n )}\n </div>\n </button>\n );\n}\n\nfunction AddAddressTile({ onClick }: { onClick: () => void }): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-profile-dashed-border min-h-profile-tile-min-h bg-profile-card text-profile-text-muted hover:bg-profile-canvas hover:text-profile-text flex flex-col items-center justify-center gap-1.5 rounded-2xl ring-1 transition-colors\"\n >\n <div className=\"ring-profile-border bg-profile-card flex size-9 items-center justify-center rounded-full ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-profile-base text-profile-text font-bold\">\n 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 Icon = entry.icon;\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-profile-divider border-b\"}`}\n >\n <div className=\"bg-profile-icon-bg text-profile-text 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-profile-base text-profile-text font-bold\">\n {entry.label}\n </div>\n <div\n className={`text-profile-sm truncate ${handle ? \"text-profile-text-muted\" : \"text-profile-text-placeholder\"}`}\n >\n {handle || entry.placeholder}\n </div>\n </div>\n <PillButton\n onClick={onConnect}\n icon={handle ? Pencil : Plus}\n label={handle ? \"Edit\" : \"Connect\"}\n />\n </div>\n );\n}\n\nexport type { SocialKey };\n","import { useCallback, useMemo, useState } from \"react\";\nimport { z } from \"zod\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { ProfileUIProvider } from \"@fluid-app/profile-core\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n AddressFormDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n UserInfoDialog,\n socialFields,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n} from \"@fluid-app/profile-ui\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\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 { useAccountApi } from \"@fluid-app/portal-core/account-api-context\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { usePortalMySiteProfile } 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 { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { accountKeys, payKeys, storeKeys } from \"../account/query-keys\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { deriveLastName } from \"./profile/derive-last-name\";\nimport { ProfileLayout, type SocialKey } from \"./profile/ProfileLayout\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nconst translations: Record<string, string> = {\n edit_profile: \"Edit Profile\",\n first_name: \"First Name\",\n last_name: \"Last Name\",\n phone_number: \"Phone Number\",\n bio: \"Bio\",\n add_a_short_bio: \"Add a short bio\",\n language: \"Language\",\n first_name_is_required: \"First name is required\",\n last_name_is_required: \"Last name is required\",\n language_is_required: \"Language is required\",\n saving: \"Saving...\",\n save_changes: \"Save Changes\",\n select_an_option: \"Select an option\",\n add_address: \"Add Address\",\n edit_address: \"Edit Address\",\n set_as_default_address: \"Set as default address\",\n save_address: \"Save Address\",\n card_number: \"Card Number\",\n expiration_date: \"Expiration (MM / YY)\",\n cvc: \"CVC\",\n cardholder_name: \"Cardholder Name\",\n add_credit_card: \"Add Credit Card\",\n save_card: \"Save Card\",\n securing: \"Loading secure form...\",\n add_payment_method: \"Add Payment Method\",\n delete_card: \"Delete card\",\n deleting: \"Deleting...\",\n tap_to_confirm: \"Tap to confirm\",\n edit_card: \"Card Details\",\n billing_address: \"Billing Address\",\n country: \"Country\",\n name: \"Name\",\n address_line_1: \"Address Line 1\",\n address_line_2: \"Address Line 2\",\n city: \"City\",\n state: \"State\",\n province: \"Province\",\n zip_code: \"Zip Code\",\n postal_code: \"Postal Code\",\n select_state: \"Select state\",\n set_as_default_payment_method: \"Set as default payment method\",\n cancel: \"Cancel\",\n save: \"Save\",\n close: \"Close\",\n edit: \"Edit\",\n default: \"Default\",\n card_expires: \"Expires\",\n no_billing_address: \"No billing address on file\",\n default_payment_method_updated: \"Payment method updated\",\n failed_to_set_default_payment_method: \"Failed to update payment method\",\n};\n\nfunction t(key: string): string {\n if (translations[key]) return translations[key];\n return key\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction mapAccountToCustomerAccount(\n raw: AccountRep,\n): fluidPay.CustomerAccount {\n return {\n fluid_pay_account: {\n id: raw.id,\n email: raw.email,\n address_count: 0,\n payment_methods_count: 0,\n language_iso: null,\n },\n customer: {\n id: raw.id,\n active: true,\n active_subscriptions_count: 0,\n display_total_spent: \"0\",\n email: raw.email,\n first_name: raw.first_name,\n full_name: `${raw.first_name} ${raw.last_name}`.trim(),\n inactive_subscriptions_count: 0,\n is_rep: raw.member_type === \"rep\",\n phone: raw.phone,\n orders_count: 0,\n },\n };\n}\n\nfunction composeAddressName(\n firstName: string,\n lastName: string,\n): string | null {\n const combined = `${firstName} ${lastName}`.trim();\n return combined.length > 0 ? combined : null;\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\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: null,\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}: ProfileContentScreenProps): React.JSX.Element {\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\n const mySiteUrl = mySiteProfile?.mysite_url ?? \"\";\n const mySiteDisplayUrl = mySiteUrl\n ? mySiteUrl.replace(/^https?:\\/\\//, \"\")\n : \"\";\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(),\n queryFn: () => countriesAdapter.listCountries(),\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 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 },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(\"Profile updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update profile\", \"error\");\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(\"Failed to delete payment method\", \"error\");\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(\"Failed to update payment method\", \"error\");\n },\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) =>\n payApi.createAddress({\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Address created\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to create address\", \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Address updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update address\", \"error\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: fluidPay.AddCreditCardData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n default: data.default_payment_method,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onToast(\"Payment method added\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to add payment method\", \"error\");\n },\n });\n\n 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 [isAddCardOpen, setIsAddCardOpen] = useState(false);\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 )?.name ?? \"English\"\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, \"First name is required\"),\n last_name: z.string().min(1, \"Last name is required\"),\n phone_number: z.string().optional(),\n language: z.string().min(1, \"Language is required\"),\n bio: z.string().optional(),\n }),\n [],\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(\"MySite link copied\", \"success\");\n } catch {\n onToast(\"Failed to copy link\", \"error\");\n }\n }, [mySiteUrl, onToast]);\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(\"This platform isn't editable yet\", \"warning\");\n return;\n }\n const current = accountRep?.social_links?.[field] ?? \"\";\n setSocialDraft(current);\n setEditingSocial(key);\n },\n [accountRep, onToast],\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(\"Social link updated\", \"success\");\n },\n onError: () => {\n onToast(\"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 Unable to load account data. Please try again later.\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 <ProfileUIProvider t={t}>\n <ProfileLayout\n account={accountRep}\n pointsBalance={pointsBalance}\n pointsLedger={adaptedPointsLedger}\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 onAddPaymentMethod={() => setIsAddCardOpen(true)}\n onEditPaymentMethod={(pm) => setEditPaymentMethod(pm)}\n onCopyMySiteLink={handleCopyMySiteLink}\n onConnectSocial={handleConnectSocial}\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.name,\n }))}\n errorMsg={undefined}\n isSubmitting={updateCustomerMutation.isPending}\n email={accountRep.email ?? \"\"}\n />\n\n <AddressFormDialog\n isOpen={addressDialog.open}\n onClose={() => setAddressDialog({ open: false, selected: null })}\n selectedAddress={addressDialog.selected}\n t={t}\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 countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n renderAddressAutocomplete={({ control, setValue, countryCode }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"postal_code\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n\n <CreditCardFormDialog\n isOpen={isAddCardOpen}\n onClose={() => setIsAddCardOpen(false)}\n t={t}\n onSubmit={async (data) => {\n try {\n await addCreditCardMutation.mutateAsync(data);\n setIsAddCardOpen(false);\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={addCreditCardMutation.isPending}\n countries={countryOptions}\n jwt=\"\"\n renderAddressAutocomplete={({ control, setValue, countryCode }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"zip\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n\n {editPaymentMethod && (\n <EditPaymentMethodDialog\n isOpen\n onClose={() => setEditPaymentMethod(null)}\n paymentMethod={editPaymentMethod}\n countries={countryOptions}\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 />\n )}\n\n <Dialog\n open={editingSocial !== null}\n onOpenChange={(open) => !open && setEditingSocial(null)}\n >\n <DialogContent className=\"max-w-sm md:max-w-md\">\n <DialogHeader>\n <DialogTitle>\n {editingSocial\n ? `Edit ${SOCIAL_LABELS[editingSocial]} link`\n : \"Edit social link\"}\n </DialogTitle>\n </DialogHeader>\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 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 autoFocus\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setEditingSocial(null)}\n disabled={updateSocialMutation.isPending}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitSocial();\n }}\n disabled={updateSocialMutation.isPending}\n >\n {updateSocialMutation.isPending ? \"Saving...\" : \"Save\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </ProfileUIProvider>\n </FluidPayCoreProvider>\n );\n}\n","import { type ComponentProps, useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Profile</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div {...divProps}>\n <ProfileContentScreen onToast={effectiveToast} countryIso={countryIso} />\n </div>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProfileScreen-FG1DZum3.mjs","names":[],"sources":["../src/screens/profile/derive-last-name.ts","../src/screens/profile/ProfileLayout.tsx","../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 Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from \"@fluid-app/ui-primitives\";\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 type { AccountRep } from \"@fluid-app/portal-core/account-types\";\n\ninterface ProfileLayoutProps {\n account: AccountRep;\n pointsBalance: number | undefined;\n pointsLedger?: PointsLedger[];\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 onAddPaymentMethod: () => void;\n onEditPaymentMethod: (method: fluidPay.CustomerPaymentMethod) => void;\n onCopyMySiteLink: () => void;\n onEditMySiteLink?: () => void;\n onConnectSocial: (key: SocialKey) => void;\n onSignOut?: () => void;\n}\n\nexport function ProfileLayout(props: ProfileLayoutProps): JSX.Element {\n const {\n account,\n pointsBalance,\n pointsLedger,\n rewardsEnabled,\n addresses,\n paymentMethods,\n mySiteDisplayUrl,\n socialLinks,\n onEditPersonalInfo,\n onAddAddress,\n onEditAddress,\n onAddPaymentMethod,\n onEditPaymentMethod,\n onCopyMySiteLink,\n onEditMySiteLink,\n onConnectSocial,\n onSignOut,\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] || \"Account\";\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\n return (\n <div className=\"relative\">\n <div className=\"max-w-profile-container relative mx-auto px-5 pt-8 pb-20 md:px-8\">\n {/* Hero */}\n <section className=\"flex items-center gap-3.5\">\n <div className=\"size-profile-avatar-sm md:size-profile-avatar relative shrink-0 overflow-hidden rounded-full ring-1 ring-black/5\">\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-profile-dark text-profile-dark-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-profile-hero tracking-profile-hero text-profile-text md:text-profile-hero-lg truncate font-bold\">\n {heroDisplay}\n </h1>\n <p className=\"text-profile-sm-plus text-profile-text-muted mt-0.5 truncate\">\n {account.email}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {rewardsEnabled && (\n <div className=\"ring-profile-border bg-profile-card text-profile-xs-plus text-profile-text inline-flex items-center gap-1.5 rounded-md px-2.5 py-1 font-semibold ring-1\">\n <Sparkles\n className=\"text-profile-accent size-3\"\n strokeWidth={2.25}\n />\n {(pointsBalance ?? 0).toLocaleString()} pts\n </div>\n )}\n </div>\n </section>\n\n {/* Personal information */}\n <SectionHeader\n title=\"Personal information\"\n action={\n <PillButton\n onClick={onEditPersonalInfo}\n icon={Pencil}\n label=\"Edit\"\n />\n }\n />\n <div className=\"ring-profile-border bg-profile-card mt-2.5 overflow-hidden rounded-2xl ring-1\">\n <FieldRow\n icon={User}\n label=\"Name\"\n value={fullName || account.first_name || \"\"}\n />\n <FieldRow icon={Mail} label=\"Email\" value={account.email ?? \"\"} />\n <FieldRow\n icon={Phone}\n label=\"Phone\"\n value={account.phone ?? \"\"}\n placeholder=\"Add phone number\"\n />\n <FieldRow\n icon={Quote}\n label=\"Bio\"\n value={account.bio ?? \"\"}\n placeholder=\"Add a short bio\"\n multiline\n isLast\n />\n </div>\n\n {/* Payment methods */}\n <SectionHeader title=\"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=\"Points history\"\n action={\n <span className=\"text-profile-xs text-profile-text-faint\">\n {(pointsBalance ?? 0).toLocaleString()} pts available\n </span>\n }\n />\n {ledger.length > 0 ? (\n <div className=\"ring-profile-border bg-profile-card mt-2.5 overflow-hidden rounded-2xl ring-1\">\n {ledgerPreview.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={!hasMoreLedger && i === ledgerPreview.length - 1}\n />\n ))}\n {hasMoreLedger && (\n <button\n type=\"button\"\n onClick={() => setIsPointsHistoryOpen(true)}\n className=\"text-profile-xs text-profile-text hover:bg-profile-pill-hover flex w-full items-center justify-center gap-1 px-4 py-3 font-bold transition-colors\"\n >\n See all {ledger.length} transactions\n </button>\n )}\n </div>\n ) : (\n <div className=\"ring-dashed ring-profile-dashed-border bg-profile-card mt-2.5 flex flex-col items-center justify-center gap-1 rounded-2xl px-4 py-8 text-center ring-1\">\n <Sparkles\n className=\"text-profile-text-faint size-5\"\n strokeWidth={1.75}\n />\n <div className=\"text-profile-base text-profile-text font-bold\">\n No points yet\n </div>\n <div className=\"text-profile-xs text-profile-text-muted\">\n Earn points on every order to unlock rewards.\n </div>\n </div>\n )}\n </>\n )}\n\n {/* Your MySite link */}\n <SectionHeader\n title=\"Your MySite link\"\n action={\n onEditMySiteLink ? (\n <PillButton\n onClick={onEditMySiteLink}\n icon={Pencil}\n label=\"Edit link\"\n />\n ) : undefined\n }\n />\n <div className=\"ring-profile-border bg-profile-card mt-2.5 flex items-center gap-3 rounded-2xl p-3.5 ring-1\">\n <div className=\"size-profile-mysite-icon bg-profile-icon-bg text-profile-text flex 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-profile-2xs tracking-profile-uppercase-1 text-profile-text-faint font-bold uppercase\">\n Public link\n </div>\n <div className=\"text-profile-base text-profile-text mt-0.5 truncate font-mono font-semibold\">\n {mySiteDisplayUrl || \"Set your MySite link\"}\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onCopyMySiteLink}\n disabled={!mySiteDisplayUrl}\n className=\"ring-profile-border bg-profile-card text-profile-xs text-profile-text hover:bg-profile-pill-hover inline-flex items-center gap-1 rounded-md px-3 py-1.5 font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Copy className=\"size-3\" strokeWidth={2.25} />\n Copy\n </button>\n </div>\n\n {/* Shipping addresses */}\n <SectionHeader title=\"Shipping addresses\" />\n <div className=\"mt-2.5 grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n {addresses.map((address) => (\n <AddressCard\n key={address.id}\n address={address}\n onEdit={() => onEditAddress(address)}\n />\n ))}\n <AddAddressTile onClick={onAddAddress} />\n </div>\n\n {/* Social media */}\n <SectionHeader\n title=\"Social media\"\n action={\n <span className=\"text-profile-xs text-profile-text-faint\">\n {connectedSocialCount} connected\n </span>\n }\n />\n <div className=\"ring-profile-border bg-profile-card mt-2.5 overflow-hidden rounded-2xl 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 <Dialog\n open={isPointsHistoryOpen}\n onOpenChange={setIsPointsHistoryOpen}\n >\n <DialogContent className=\"max-w-md md:max-w-lg\">\n <DialogHeader>\n <DialogTitle>Points history</DialogTitle>\n </DialogHeader>\n <div className=\"ring-profile-border bg-profile-card max-h-[60vh] overflow-y-auto rounded-2xl ring-1\">\n {ledger.map((entry, i) => (\n <PointsLedgerRow\n key={entry.id}\n entry={entry}\n isLast={i === ledger.length - 1}\n />\n ))}\n </div>\n </DialogContent>\n </Dialog>\n\n {onSignOut && (\n <div className=\"ring-profile-border bg-profile-card mt-8 flex flex-wrap items-center justify-between gap-3 rounded-2xl p-3.5 ring-1\">\n <div className=\"flex items-center gap-3\">\n <div className=\"bg-profile-danger-bg flex size-9 items-center justify-center rounded-md\">\n <LogOut\n className=\"text-profile-danger-icon size-4\"\n strokeWidth={2.25}\n />\n </div>\n <div>\n <div className=\"text-profile-base text-profile-text font-bold\">\n Sign out\n </div>\n <div className=\"text-profile-xs-plus text-profile-text-muted\">\n You can sign back in any time\n </div>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"bg-profile-danger-button-bg text-profile-sm text-profile-danger-button-text hover:bg-profile-danger-button-hover rounded-md px-4 py-2 font-bold transition-colors\"\n >\n 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-profile-lg tracking-profile-heading text-profile-text font-bold\">\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-profile-border bg-profile-card text-profile-xs text-profile-text hover:bg-profile-pill-hover inline-flex items-center gap-1 rounded-md px-3 py-1.5 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}: {\n entry: PointsLedger;\n isLast: boolean;\n}): JSX.Element {\n const isCredit = entry.amount >= 0;\n const sign = isCredit ? \"+\" : \"−\";\n const magnitude = Math.abs(entry.amount).toLocaleString();\n const amountColor = isCredit\n ? \"text-emerald-600\"\n : \"text-profile-danger-icon\";\n const sourceName = entry.metadata?.source?.name?.trim();\n const transactionType = entry.metadata?.transaction_type;\n const label =\n sourceName ||\n (transactionType\n ? transactionType.charAt(0).toUpperCase() + transactionType.slice(1)\n : isCredit\n ? \"Points earned\"\n : \"Points redeemed\");\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-profile-divider border-b\"}`}\n >\n <div className=\"bg-profile-icon-bg flex size-9 shrink-0 items-center justify-center rounded-full\">\n <Sparkles\n className={`size-4 ${isCredit ? \"text-profile-accent\" : \"text-profile-text-muted\"}`}\n strokeWidth={2}\n />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-profile-md text-profile-text truncate font-medium\">\n {label}\n </div>\n <div className=\"text-profile-xs text-profile-text-muted\">\n {dateLabel}\n </div>\n </div>\n <div\n className={`text-profile-md shrink-0 font-mono font-bold tabular-nums ${amountColor}`}\n >\n {sign}\n {magnitude}\n </div>\n </div>\n );\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-profile-divider border-b\"}`}\n >\n <div className=\"bg-profile-icon-bg text-profile-text-muted 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-profile-2xs tracking-profile-uppercase-1 text-profile-text-faint font-bold uppercase\">\n {label}\n </div>\n <div\n className={`mt-0.5 ${valueClasses} text-profile-md font-medium ${isPlaceholder ? \"text-profile-text-placeholder\" : \"text-profile-text\"}`}\n >\n {display}\n </div>\n </div>\n </div>\n );\n}\n\nconst CARD_BRAND_LABEL: Record<string, string> = {\n amex: \"AMERICAN EXPRESS\",\n visa: \"VISA\",\n mastercard: \"MASTERCARD\",\n discover: \"DISCOVER\",\n diners: \"DINERS CLUB\",\n jcb: \"JCB\",\n unionpay: \"UNIONPAY\",\n};\n\nconst CARD_BRAND_BADGE: Record<string, string> = {\n amex: \"AMEX\",\n visa: \"VISA\",\n mastercard: \"MC\",\n discover: \"DISC\",\n diners: \"DC\",\n jcb: \"JCB\",\n unionpay: \"UPI\",\n};\n\nfunction PaymentCardVisual({\n method,\n onClick,\n}: {\n method: fluidPay.CustomerPaymentMethod;\n onClick: () => void;\n}): JSX.Element {\n const brand = (method.details.card_brand || \"\").toLowerCase();\n const brandLabel =\n CARD_BRAND_LABEL[brand] || (brand ? brand.toUpperCase() : \"CARD\");\n const badge = CARD_BRAND_BADGE[brand] || \"CARD\";\n const last4 = method.details.last_four ?? \"••••\";\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 = method.billing_address?.name ?? \"\";\n const badgeBg =\n brand === \"visa\"\n ? \"bg-[#1A1F71]\"\n : brand === \"mastercard\"\n ? \"bg-[#EB001B]\"\n : \"bg-[#0064D2]\";\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group relative flex aspect-[1.586/1] flex-col justify-between overflow-hidden rounded-xl bg-gradient-to-br from-[#1F2024] via-[#0F0F10] to-[#000000] p-4 text-left text-white shadow-sm ring-1 ring-black/10 transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg hover:brightness-110\"\n >\n <div\n aria-hidden\n className=\"absolute inset-0 bg-[repeating-linear-gradient(135deg,transparent_0px,transparent_22px,rgba(255,255,255,0.04)_22px,rgba(255,255,255,0.04)_24px)]\"\n />\n <div className=\"relative flex items-start justify-between\">\n <div>\n <div className=\"text-profile-micro tracking-profile-uppercase-2 font-semibold text-white/50 uppercase\">\n {brandLabel}\n </div>\n <div className=\"text-profile-hero tracking-profile-mono mt-1 font-mono font-bold text-white\">\n {last4}\n </div>\n </div>\n {method.default && (\n <span className=\"text-profile-micro rounded-md bg-white/10 px-2 py-0.5 font-bold tracking-wider text-white/80 uppercase\">\n Default\n </span>\n )}\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-profile-nano tracking-profile-uppercase-2 font-semibold text-white/40 uppercase\">\n Cardholder\n </div>\n <div className=\"text-profile-xs-plus truncate font-semibold text-white\">\n {holder || \" \"}\n </div>\n </div>\n <div>\n <div className=\"text-profile-nano tracking-profile-uppercase-2 font-semibold text-white/40 uppercase\">\n Expires\n </div>\n <div className=\"text-profile-xs-plus font-mono font-semibold text-white\">\n {exp}\n </div>\n </div>\n <div\n className={`text-profile-micro shrink-0 rounded px-1.5 py-0.5 font-bold tracking-wider text-white ${badgeBg}`}\n >\n {badge}\n </div>\n </div>\n </button>\n );\n}\n\nfunction AddPaymentTile({ onClick }: { onClick: () => void }): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-profile-dashed-border bg-profile-card text-profile-text-muted hover:bg-profile-canvas hover:text-profile-text flex aspect-[1.586/1] flex-col items-center justify-center gap-1.5 rounded-xl ring-1 transition-colors\"\n >\n <div className=\"ring-profile-border bg-profile-card flex size-9 items-center justify-center rounded-full ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-profile-sm text-profile-text font-bold\">\n Add payment method\n </div>\n <div className=\"text-profile-2xs-plus text-profile-text-faint\">\n Visa, Mastercard, Amex\n </div>\n </button>\n );\n}\n\nfunction AddressCard({\n address,\n onEdit,\n}: {\n address: fluidPay.CustomerAddress;\n onEdit: () => void;\n}): JSX.Element {\n const label = address.name?.trim() || \"Address\";\n const cityLine = [address.city, address.state, address.postal_code]\n .filter(Boolean)\n .join(\", \");\n return (\n <button\n type=\"button\"\n onClick={onEdit}\n className=\"ring-profile-border bg-profile-card hover:bg-profile-pill-hover focus-visible:ring-profile-text/40 flex flex-col rounded-2xl p-4 text-left ring-1 transition-all duration-200 hover:ring-2 focus-visible:ring-2 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-profile-icon-bg flex size-8 items-center justify-center rounded-full\">\n <MapPin\n className=\"text-profile-text-muted size-4\"\n strokeWidth={2}\n />\n </div>\n <div className=\"text-profile-md text-profile-text font-bold\">\n {label}\n </div>\n </div>\n {address.default && (\n <span className=\"bg-profile-dark text-profile-micro text-profile-dark-foreground rounded-md px-2 py-0.5 font-bold tracking-wider uppercase\">\n Default\n </span>\n )}\n </div>\n <div className=\"text-profile-sm-plus text-profile-text mt-3 space-y-0.5 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-profile-text-muted\">{address.country_code}</div>\n )}\n </div>\n </button>\n );\n}\n\nfunction AddAddressTile({ onClick }: { onClick: () => void }): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-dashed ring-profile-dashed-border min-h-profile-tile-min-h bg-profile-card text-profile-text-muted hover:bg-profile-canvas hover:text-profile-text flex flex-col items-center justify-center gap-1.5 rounded-2xl ring-1 transition-colors\"\n >\n <div className=\"ring-profile-border bg-profile-card flex size-9 items-center justify-center rounded-full ring-1\">\n <Plus className=\"size-4\" strokeWidth={2.25} />\n </div>\n <div className=\"text-profile-base text-profile-text font-bold\">\n 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 Icon = entry.icon;\n return (\n <div\n className={`flex items-center gap-3 px-4 py-3.5 ${isLast ? \"\" : \"border-profile-divider border-b\"}`}\n >\n <div className=\"bg-profile-icon-bg text-profile-text 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-profile-base text-profile-text font-bold\">\n {entry.label}\n </div>\n <div\n className={`text-profile-sm truncate ${handle ? \"text-profile-text-muted\" : \"text-profile-text-placeholder\"}`}\n >\n {handle || entry.placeholder}\n </div>\n </div>\n <PillButton\n onClick={onConnect}\n icon={handle ? Pencil : Plus}\n label={handle ? \"Edit\" : \"Connect\"}\n />\n </div>\n );\n}\n\nexport type { SocialKey };\n","import { useCallback, useMemo, useState } from \"react\";\nimport { z } from \"zod\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n useZodForm,\n} from \"@fluid-app/ui-primitives\";\nimport { ProfileUIProvider } from \"@fluid-app/profile-core\";\nimport type { Language, PointsLedger } from \"@fluid-app/profile-core\";\nimport {\n AddressFormDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n UserInfoDialog,\n socialFields,\n} from \"@fluid-app/profile-ui\";\nimport type {\n UserFormData,\n EditPaymentMethodFormData,\n} from \"@fluid-app/profile-ui\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\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 { useAccountApi } from \"@fluid-app/portal-core/account-api-context\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { usePortalMySiteProfile } 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 { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { accountKeys, payKeys, storeKeys } from \"../account/query-keys\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { deriveLastName } from \"./profile/derive-last-name\";\nimport { ProfileLayout, type SocialKey } from \"./profile/ProfileLayout\";\n\ninterface ProfileContentScreenProps {\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n countryIso: string;\n}\n\nconst translations: Record<string, string> = {\n edit_profile: \"Edit Profile\",\n first_name: \"First Name\",\n last_name: \"Last Name\",\n phone_number: \"Phone Number\",\n bio: \"Bio\",\n add_a_short_bio: \"Add a short bio\",\n language: \"Language\",\n first_name_is_required: \"First name is required\",\n last_name_is_required: \"Last name is required\",\n language_is_required: \"Language is required\",\n saving: \"Saving...\",\n save_changes: \"Save Changes\",\n select_an_option: \"Select an option\",\n add_address: \"Add Address\",\n edit_address: \"Edit Address\",\n set_as_default_address: \"Set as default address\",\n save_address: \"Save Address\",\n card_number: \"Card Number\",\n expiration_date: \"Expiration (MM / YY)\",\n cvc: \"CVC\",\n cardholder_name: \"Cardholder Name\",\n add_credit_card: \"Add Credit Card\",\n save_card: \"Save Card\",\n securing: \"Loading secure form...\",\n add_payment_method: \"Add Payment Method\",\n delete_card: \"Delete card\",\n deleting: \"Deleting...\",\n tap_to_confirm: \"Tap to confirm\",\n edit_card: \"Card Details\",\n billing_address: \"Billing Address\",\n country: \"Country\",\n name: \"Name\",\n address_line_1: \"Address Line 1\",\n address_line_2: \"Address Line 2\",\n city: \"City\",\n state: \"State\",\n province: \"Province\",\n zip_code: \"Zip Code\",\n postal_code: \"Postal Code\",\n select_state: \"Select state\",\n set_as_default_payment_method: \"Set as default payment method\",\n cancel: \"Cancel\",\n save: \"Save\",\n close: \"Close\",\n edit: \"Edit\",\n default: \"Default\",\n card_expires: \"Expires\",\n no_billing_address: \"No billing address on file\",\n default_payment_method_updated: \"Payment method updated\",\n failed_to_set_default_payment_method: \"Failed to update payment method\",\n};\n\nfunction t(key: string): string {\n if (translations[key]) return translations[key];\n return key\n .split(\"_\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction mapAccountToCustomerAccount(\n raw: AccountRep,\n): fluidPay.CustomerAccount {\n return {\n fluid_pay_account: {\n id: raw.id,\n email: raw.email,\n address_count: 0,\n payment_methods_count: 0,\n language_iso: null,\n },\n customer: {\n id: raw.id,\n active: true,\n active_subscriptions_count: 0,\n display_total_spent: \"0\",\n email: raw.email,\n first_name: raw.first_name,\n full_name: `${raw.first_name} ${raw.last_name}`.trim(),\n inactive_subscriptions_count: 0,\n is_rep: raw.member_type === \"rep\",\n phone: raw.phone,\n orders_count: 0,\n },\n };\n}\n\nfunction composeAddressName(\n firstName: string,\n lastName: string,\n): string | null {\n const combined = `${firstName} ${lastName}`.trim();\n return combined.length > 0 ? combined : null;\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\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: null,\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}: ProfileContentScreenProps): React.JSX.Element {\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\n const mySiteUrl = mySiteProfile?.mysite_url ?? \"\";\n const mySiteDisplayUrl = mySiteUrl\n ? mySiteUrl.replace(/^https?:\\/\\//, \"\")\n : \"\";\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(),\n queryFn: () => countriesAdapter.listCountries(),\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 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 },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: accountKeys.all });\n onToast(\"Profile updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update profile\", \"error\");\n },\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(\"Failed to delete payment method\", \"error\");\n },\n });\n\n const updatePaymentMethodMutation = useMutation({\n mutationFn: ({\n paymentMethodId,\n data,\n }: {\n paymentMethodId: number;\n data: EditPaymentMethodFormData;\n }) =>\n payApi.updatePaymentMethod(paymentMethodId, {\n payment_method: {\n default: data.set_as_default,\n billing_address: {\n name: data.billing_address.name,\n street1: data.billing_address.address1,\n street2: data.billing_address.address2 ?? null,\n city: data.billing_address.city,\n state: data.billing_address.state,\n zip: data.billing_address.zip,\n country: data.billing_address.country_code,\n },\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n },\n onError: () => {\n onToast(\"Failed to update payment method\", \"error\");\n },\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) =>\n payApi.createAddress({\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Address created\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to create address\", \"error\");\n },\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: composeAddressName(\n body.address.first_name,\n body.address.last_name,\n ),\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onToast(\"Address updated\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to update address\", \"error\");\n },\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: fluidPay.AddCreditCardData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n default: data.default_payment_method,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onToast(\"Payment method added\", \"success\");\n },\n onError: () => {\n onToast(\"Failed to add payment method\", \"error\");\n },\n });\n\n 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 [isAddCardOpen, setIsAddCardOpen] = useState(false);\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 )?.name ?? \"English\"\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, \"First name is required\"),\n last_name: z.string().min(1, \"Last name is required\"),\n phone_number: z.string().optional(),\n language: z.string().min(1, \"Language is required\"),\n bio: z.string().optional(),\n }),\n [],\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(\"MySite link copied\", \"success\");\n } catch {\n onToast(\"Failed to copy link\", \"error\");\n }\n }, [mySiteUrl, onToast]);\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(\"This platform isn't editable yet\", \"warning\");\n return;\n }\n const current = accountRep?.social_links?.[field] ?? \"\";\n setSocialDraft(current);\n setEditingSocial(key);\n },\n [accountRep, onToast],\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(\"Social link updated\", \"success\");\n },\n onError: () => {\n onToast(\"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 Unable to load account data. Please try again later.\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 <ProfileUIProvider t={t}>\n <ProfileLayout\n account={accountRep}\n pointsBalance={pointsBalance}\n pointsLedger={adaptedPointsLedger}\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 onAddPaymentMethod={() => setIsAddCardOpen(true)}\n onEditPaymentMethod={(pm) => setEditPaymentMethod(pm)}\n onCopyMySiteLink={handleCopyMySiteLink}\n onConnectSocial={handleConnectSocial}\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.name,\n }))}\n errorMsg={undefined}\n isSubmitting={updateCustomerMutation.isPending}\n email={accountRep.email ?? \"\"}\n />\n\n <AddressFormDialog\n isOpen={addressDialog.open}\n onClose={() => setAddressDialog({ open: false, selected: null })}\n selectedAddress={addressDialog.selected}\n t={t}\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 countries={countryOptions}\n fetchStates={fetchStatesFromCountries}\n renderAddressAutocomplete={({ control, setValue, countryCode }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"postal_code\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n\n <CreditCardFormDialog\n isOpen={isAddCardOpen}\n onClose={() => setIsAddCardOpen(false)}\n t={t}\n onSubmit={async (data) => {\n try {\n await addCreditCardMutation.mutateAsync(data);\n setIsAddCardOpen(false);\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={addCreditCardMutation.isPending}\n countries={countryOptions}\n jwt=\"\"\n renderAddressAutocomplete={({ control, setValue, countryCode }) => (\n <AddressAutocompleteInput\n control={control}\n setValue={setValue}\n countryIso={countryCode}\n addressLineField=\"address1\"\n cityField=\"city\"\n stateField=\"state\"\n postalCodeField=\"zip\"\n placeholder={t(\"address_line_1\")}\n />\n )}\n />\n\n {editPaymentMethod && (\n <EditPaymentMethodDialog\n isOpen\n onClose={() => setEditPaymentMethod(null)}\n paymentMethod={editPaymentMethod}\n countries={countryOptions}\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 />\n )}\n\n <Dialog\n open={editingSocial !== null}\n onOpenChange={(open) => !open && setEditingSocial(null)}\n >\n <DialogContent className=\"max-w-sm md:max-w-md\">\n <DialogHeader>\n <DialogTitle>\n {editingSocial\n ? `Edit ${SOCIAL_LABELS[editingSocial]} link`\n : \"Edit social link\"}\n </DialogTitle>\n </DialogHeader>\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 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 autoFocus\n />\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setEditingSocial(null)}\n disabled={updateSocialMutation.isPending}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={() => {\n void handleSubmitSocial();\n }}\n disabled={updateSocialMutation.isPending}\n >\n {updateSocialMutation.isPending ? \"Saving...\" : \"Save\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </ProfileUIProvider>\n </FluidPayCoreProvider>\n );\n}\n","import { type ComponentProps, useMemo } from \"react\";\nimport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbPage,\n fluidToast,\n} from \"@fluid-app/ui-primitives\";\nimport { useScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileContentScreen } from \"./ProfileContentScreen\";\n\ntype ProfileScreenProps = ComponentProps<\"div\"> & {\n background?: BackgroundValue;\n textColor?: ColorOptions;\n accentColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n};\n\nfunction defaultToast(message: string, type: \"success\" | \"error\" | \"warning\") {\n fluidToast({ title: message, type });\n}\n\nexport function ProfileScreen({\n onToast,\n /* eslint-disable @typescript-eslint/no-unused-vars -- destructured to exclude from divProps spread */\n background,\n textColor,\n accentColor,\n padding,\n borderRadius,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...divProps\n}: ProfileScreenProps): React.JSX.Element {\n const { config } = useFluidContext();\n const effectiveToast = onToast ?? defaultToast;\n const countryIso = config.countryIso ?? \"US\";\n\n const headerBreadcrumbs = useMemo(\n () => (\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">Profile</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n ),\n [],\n );\n useScreenHeaderBreadcrumbs(headerBreadcrumbs);\n\n return (\n <div {...divProps}>\n <ProfileContentScreen onToast={effectiveToast} countryIso={countryIso} />\n </div>\n );\n}\n\nexport const profileScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"ProfileScreen\",\n displayName: \"Profile Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require("./chunk-9hOWP6kD.cjs");
|
|
2
|
-
const require_registries = require("./registries-
|
|
2
|
+
const require_registries = require("./registries-CVsthTnW.cjs");
|
|
3
3
|
require("react");
|
|
4
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
5
|
let lucide_react = require("lucide-react");
|
|
@@ -560,4 +560,4 @@ Object.defineProperty(exports, "quickLinksWidgetPropertySchema", {
|
|
|
560
560
|
}
|
|
561
561
|
});
|
|
562
562
|
|
|
563
|
-
//# sourceMappingURL=QuickLinksWidget-
|
|
563
|
+
//# sourceMappingURL=QuickLinksWidget-Cpq1V-uX.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuickLinksWidget-Bcl4CxfW.cjs","names":["BookmarkIcon","LinkIcon","ChevronRight","borderWidthClasses","borderColorClasses","getFontSizeField","getColorField","getBorderRadiusField","getPaddingField","getBorderWidthField","getBorderColorField"],"sources":["../../widgets/src/widgets/QuickLinksWidget.tsx"],"sourcesContent":["import { type ComponentProps } from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type {\n PropertyField,\n WidgetPropertySchema,\n} from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\nimport {\n Bell,\n BookmarkIcon,\n Calendar,\n ChevronRight,\n ExternalLink,\n Gift,\n Globe,\n Heart,\n Link as LinkIcon,\n Mail,\n MapPin,\n MessageCircle,\n Package,\n Phone,\n Play,\n Share2,\n ShoppingBag,\n Sparkles,\n Star,\n Trophy,\n User,\n Video,\n Zap,\n type LucideIcon,\n} from \"lucide-react\";\n\n// ---------- icon registry ----------\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n User,\n Share2,\n ShoppingBag,\n Video,\n Mail,\n MessageCircle,\n Globe,\n Calendar,\n Bell,\n Heart,\n Star,\n Zap,\n Gift,\n Phone,\n MapPin,\n Play,\n Package,\n ExternalLink,\n Bookmark: BookmarkIcon,\n Trophy,\n Sparkles,\n Link: LinkIcon,\n};\n\nconst ICON_OPTIONS: Array<{ label: string; value: string }> = [\n { label: \"Link (default)\", value: \"Link\" },\n { label: \"User / Profile\", value: \"User\" },\n { label: \"Share\", value: \"Share2\" },\n { label: \"Shopping Bag\", value: \"ShoppingBag\" },\n { label: \"Video\", value: \"Video\" },\n { label: \"Mail\", value: \"Mail\" },\n { label: \"Message\", value: \"MessageCircle\" },\n { label: \"Globe\", value: \"Globe\" },\n { label: \"Calendar\", value: \"Calendar\" },\n { label: \"Bell / Notifications\", value: \"Bell\" },\n { label: \"Heart\", value: \"Heart\" },\n { label: \"Star\", value: \"Star\" },\n { label: \"Zap / Lightning\", value: \"Zap\" },\n { label: \"Gift\", value: \"Gift\" },\n { label: \"Phone\", value: \"Phone\" },\n { label: \"Map Pin\", value: \"MapPin\" },\n { label: \"Play\", value: \"Play\" },\n { label: \"Package\", value: \"Package\" },\n { label: \"External Link\", value: \"ExternalLink\" },\n { label: \"Bookmark\", value: \"Bookmark\" },\n { label: \"Trophy\", value: \"Trophy\" },\n { label: \"Sparkles\", value: \"Sparkles\" },\n];\n\nconst capitalize = (s: string): string =>\n s ? s.charAt(0).toUpperCase() + s.slice(1) : s;\n\nconst getIcon = (name: string | undefined): LucideIcon => {\n if (!name) return LinkIcon;\n return ICON_MAP[name] ?? ICON_MAP[capitalize(name)] ?? LinkIcon;\n};\n\n// ---------- link parsing / collection ----------\n\ntype ParsedLink = {\n id: string;\n label: string;\n url: string;\n iconName: string;\n iconColor: ColorOptions;\n};\n\nconst isColorOption = (value: string): value is ColorOptions =>\n [\n \"background\",\n \"foreground\",\n \"primary\",\n \"secondary\",\n \"accent\",\n \"muted\",\n \"destructive\",\n ].includes(value);\n\nconst FALLBACK_COLOR_CYCLE: ColorOptions[] = [\n \"primary\",\n \"accent\",\n \"secondary\",\n \"destructive\",\n];\n\n// Legacy format per line: \"Label | URL | IconName | ColorOption\"\n// Kept for backwards compatibility with existing saved configs.\nconst parseLegacyLinks = (raw: string[] | string): ParsedLink[] => {\n const lines = Array.isArray(raw) ? raw : raw.split(/\\r?\\n/).filter(Boolean);\n return lines\n .map((line, index) => {\n const parts = line.split(\"|\").map((s) => s.trim());\n const label = parts[0] ?? \"\";\n if (!label) return null;\n const url = parts[1] ?? \"#\";\n const iconName = parts[2] && parts[2].length > 0 ? parts[2] : \"Link\";\n const colorCandidate = parts[3];\n const iconColor: ColorOptions =\n colorCandidate && isColorOption(colorCandidate)\n ? colorCandidate\n : (FALLBACK_COLOR_CYCLE[index % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\");\n return {\n id: `link-${index}`,\n label,\n url,\n iconName,\n iconColor,\n };\n })\n .filter((x): x is ParsedLink => x !== null);\n};\n\n// New structured format — gather links from individual link{n}* props\nconst MAX_LINKS = 8;\n\ntype SlotProps = {\n enabled: boolean;\n label: string | undefined;\n url: string | undefined;\n icon: string | undefined;\n color: ColorOptions | undefined;\n};\n\n// Per-slot merge of structured props with the legacy `links` array. A slot\n// is \"structurally configured\" when at least one of its content props\n// (label / url / icon / color) is explicitly set; in that case structured\n// props win and the slot's `enabled` flag is honored. Slots that haven't\n// been structurally touched fall back to the legacy entry at the same\n// index — so editing one slot in a legacy-format widget doesn't silently\n// drop URLs/icons/colors for the other slots.\nconst resolveLinks = (\n slots: SlotProps[],\n legacy: ParsedLink[],\n): ParsedLink[] => {\n return slots\n .map((slot, index): ParsedLink | null => {\n const legacyEntry = legacy[index];\n\n const hasStructured =\n slot.label !== undefined ||\n slot.url !== undefined ||\n slot.icon !== undefined ||\n slot.color !== undefined;\n\n if (hasStructured) {\n // Slot 1 is always enabled; slots 2+ need enabled=true.\n const isSlotActive = index === 0 || slot.enabled;\n if (!isSlotActive) return null;\n\n const label = (slot.label ?? legacyEntry?.label ?? \"\").trim();\n if (!label) return null;\n\n const url =\n slot.url && slot.url.length > 0\n ? slot.url\n : (legacyEntry?.url ?? \"#\");\n const iconName =\n slot.icon && slot.icon.length > 0\n ? slot.icon\n : (legacyEntry?.iconName ?? \"Link\");\n const iconColor: ColorOptions =\n slot.color ??\n legacyEntry?.iconColor ??\n FALLBACK_COLOR_CYCLE[index % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\";\n\n return {\n id: `link-${index}`,\n label,\n url,\n iconName,\n iconColor,\n };\n }\n\n // No structured props for this slot — use the legacy entry as-is.\n // Legacy widgets predate the per-slot `enabled` toggle, so we don't\n // gate legacy entries on it (otherwise legacy slots 5+ would vanish\n // because their `linkNEnabled` defaults to `false`).\n return legacyEntry ?? null;\n })\n .filter((x): x is ParsedLink => x !== null);\n};\n\n// ---------- link row ----------\n\ntype LinkRowProps = {\n link: ParsedLink;\n textColor: ColorOptions;\n borderRadius: BorderRadiusOptions;\n openInNewTab: boolean;\n showChevron: boolean;\n iconRadius: BorderRadiusOptions;\n layout: \"cards\" | \"list\";\n isLast: boolean;\n};\n\nfunction LinkRow({\n link,\n textColor,\n borderRadius,\n openInNewTab,\n showChevron,\n iconRadius,\n layout,\n isLast,\n}: LinkRowProps) {\n const Icon = getIcon(link.iconName);\n\n const wrapperBase = `group relative flex items-center gap-3 py-3 transition-all duration-200`;\n const wrapperCardClasses = `rounded-${borderRadius} px-3 bg-${textColor}/5 hover:bg-${textColor}/10 hover:-translate-y-0.5`;\n const wrapperListClasses = `px-0 hover:bg-${textColor}/5 rounded-md`;\n\n const wrapperClasses =\n layout === \"cards\"\n ? `${wrapperBase} ${wrapperCardClasses}`\n : `${wrapperBase} ${wrapperListClasses}`;\n\n const content = (\n <>\n {/* Icon badge — colored gradient square with white icon centered */}\n <span\n aria-hidden=\"true\"\n className={`relative flex size-10 shrink-0 items-center justify-center rounded-${iconRadius} text-${link.iconColor}-foreground`}\n style={{\n background: `linear-gradient(135deg, color-mix(in oklch, var(--color-${link.iconColor}) 75%, white 25%) 0%, var(--color-${link.iconColor}) 100%)`,\n boxShadow: `\n inset 0 1px 0 rgba(255,255,255,0.25),\n inset 0 -1px 0 rgba(0,0,0,0.1),\n 0 1px 2px color-mix(in oklch, var(--color-${link.iconColor}) 30%, transparent)\n `,\n }}\n >\n <Icon className=\"size-5\" strokeWidth={2.25} />\n </span>\n\n {/* Label */}\n <span\n className={`min-w-0 flex-1 truncate text-[15px] font-bold tracking-[-0.01em] text-${textColor}`}\n >\n {link.label}\n </span>\n\n {/* Chevron */}\n {showChevron && (\n <ChevronRight\n aria-hidden=\"true\"\n className={`size-4 shrink-0 text-${textColor}/35 transition-transform duration-200 group-hover:translate-x-0.5 group-hover:text-${textColor}/60`}\n />\n )}\n </>\n );\n\n const separator =\n layout === \"list\" && !isLast ? (\n <div\n aria-hidden=\"true\"\n className=\"ml-[52px]\"\n style={{\n borderBottom: `1px solid color-mix(in oklch, var(--color-${textColor}) 8%, transparent)`,\n }}\n />\n ) : null;\n\n const href = link.url && link.url !== \"#\" ? link.url : undefined;\n\n if (href) {\n return (\n <>\n <a\n href={href}\n target={openInNewTab ? \"_blank\" : undefined}\n rel={openInNewTab ? \"noopener noreferrer\" : undefined}\n className={wrapperClasses}\n >\n {content}\n </a>\n {separator}\n </>\n );\n }\n\n return (\n <>\n <div className={wrapperClasses}>{content}</div>\n {separator}\n </>\n );\n}\n\n// ---------- widget ----------\n\ntype QuickLinksWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Links — new structured per-slot props\n link1Label?: string;\n link1Url?: string;\n link1Icon?: string;\n link1Color?: ColorOptions;\n link2Enabled?: boolean;\n link2Label?: string;\n link2Url?: string;\n link2Icon?: string;\n link2Color?: ColorOptions;\n link3Enabled?: boolean;\n link3Label?: string;\n link3Url?: string;\n link3Icon?: string;\n link3Color?: ColorOptions;\n link4Enabled?: boolean;\n link4Label?: string;\n link4Url?: string;\n link4Icon?: string;\n link4Color?: ColorOptions;\n link5Enabled?: boolean;\n link5Label?: string;\n link5Url?: string;\n link5Icon?: string;\n link5Color?: ColorOptions;\n link6Enabled?: boolean;\n link6Label?: string;\n link6Url?: string;\n link6Icon?: string;\n link6Color?: ColorOptions;\n link7Enabled?: boolean;\n link7Label?: string;\n link7Url?: string;\n link7Icon?: string;\n link7Color?: ColorOptions;\n link8Enabled?: boolean;\n link8Label?: string;\n link8Url?: string;\n link8Icon?: string;\n link8Color?: ColorOptions;\n\n // Legacy — still accepted for backwards compatibility\n links?: string[] | string;\n\n // Layout\n layout?: \"cards\" | \"list\";\n iconRadius?: BorderRadiusOptions;\n showChevron?: boolean;\n openInNewTab?: boolean;\n\n // Design\n background?: BackgroundValue;\n textColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n};\n\nexport function QuickLinksWidget({\n titleEnabled = true,\n title = \"Quick Links\",\n titleFontSize = \"md\",\n titleColor = \"foreground\",\n\n link1Label,\n link1Url,\n link1Icon,\n link1Color,\n link2Enabled = true,\n link2Label,\n link2Url,\n link2Icon,\n link2Color,\n link3Enabled = true,\n link3Label,\n link3Url,\n link3Icon,\n link3Color,\n link4Enabled = true,\n link4Label,\n link4Url,\n link4Icon,\n link4Color,\n link5Enabled = false,\n link5Label,\n link5Url,\n link5Icon,\n link5Color,\n link6Enabled = false,\n link6Label,\n link6Url,\n link6Icon,\n link6Color,\n link7Enabled = false,\n link7Label,\n link7Url,\n link7Icon,\n link7Color,\n link8Enabled = false,\n link8Label,\n link8Url,\n link8Icon,\n link8Color,\n\n links,\n\n layout = \"cards\",\n iconRadius = \"lg\",\n showChevron = true,\n openInNewTab = false,\n\n background = { type: \"solid\", color: \"background\" },\n textColor = \"foreground\",\n padding = 4,\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n\n className,\n ...props\n}: QuickLinksWidgetProps): React.JSX.Element {\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n // Pass props through verbatim — schema `defaultValue`s pre-populate the\n // builder, so the component shouldn't second-guess with hardcoded\n // fallbacks (which would mask a user's explicit blank label).\n const slots: SlotProps[] = [\n {\n enabled: true,\n label: link1Label,\n url: link1Url,\n icon: link1Icon,\n color: link1Color,\n },\n {\n enabled: link2Enabled,\n label: link2Label,\n url: link2Url,\n icon: link2Icon,\n color: link2Color,\n },\n {\n enabled: link3Enabled,\n label: link3Label,\n url: link3Url,\n icon: link3Icon,\n color: link3Color,\n },\n {\n enabled: link4Enabled,\n label: link4Label,\n url: link4Url,\n icon: link4Icon,\n color: link4Color,\n },\n {\n enabled: link5Enabled,\n label: link5Label,\n url: link5Url,\n icon: link5Icon,\n color: link5Color,\n },\n {\n enabled: link6Enabled,\n label: link6Label,\n url: link6Url,\n icon: link6Icon,\n color: link6Color,\n },\n {\n enabled: link7Enabled,\n label: link7Label,\n url: link7Url,\n icon: link7Icon,\n color: link7Color,\n },\n {\n enabled: link8Enabled,\n label: link8Label,\n url: link8Url,\n icon: link8Icon,\n color: link8Color,\n },\n ];\n\n const legacyLinks: ParsedLink[] = links ? parseLegacyLinks(links) : [];\n const parsed: ParsedLink[] = resolveLinks(slots, legacyLinks);\n\n return (\n <div\n className={`@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n <div className={`p-${padding} flex flex-col gap-3`}>\n {titleEnabled && title && (\n <h2\n className={`text-${titleFontSize} leading-tight font-bold tracking-[-0.01em] text-${titleColor}`}\n >\n {title}\n </h2>\n )}\n\n {parsed.length === 0 ? (\n <p className={`text-[13px] text-${textColor}/55`}>\n No links configured.\n </p>\n ) : layout === \"cards\" ? (\n <div className=\"flex flex-col gap-2\">\n {parsed.map((link, idx) => (\n <LinkRow\n key={link.id}\n link={link}\n textColor={textColor}\n borderRadius={borderRadius}\n openInNewTab={openInNewTab}\n showChevron={showChevron}\n iconRadius={iconRadius}\n layout=\"cards\"\n isLast={idx === parsed.length - 1}\n />\n ))}\n </div>\n ) : (\n <div\n className={`flex flex-col overflow-hidden rounded-${borderRadius} bg-${textColor}/5`}\n >\n {parsed.map((link, idx) => (\n <LinkRow\n key={link.id}\n link={link}\n textColor={textColor}\n borderRadius={borderRadius}\n openInNewTab={openInNewTab}\n showChevron={showChevron}\n iconRadius={iconRadius}\n layout=\"list\"\n isLast={idx === parsed.length - 1}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ---------- schema helpers ----------\n\ntype SlotDefaults = {\n label: string;\n icon: string;\n color: ColorOptions;\n};\n\nconst SLOT_DEFAULTS: Record<number, SlotDefaults | undefined> = {\n 1: { label: \"Profile\", icon: \"User\", color: \"primary\" },\n 2: { label: \"Social\", icon: \"Share2\", color: \"accent\" },\n 3: { label: \"Product Links\", icon: \"ShoppingBag\", color: \"secondary\" },\n 4: { label: \"Video\", icon: \"Video\", color: \"destructive\" },\n};\n\nfunction buildLinkSlotFields(slot: number): PropertyField[] {\n const group = `Link ${slot}`;\n const isFirst = slot === 1;\n const defaults = SLOT_DEFAULTS[slot];\n // Enable slots 2-4 by default to match the previous widget behavior.\n const enabledDefault = slot >= 2 && slot <= 4;\n const requires = isFirst ? undefined : `link${slot}Enabled`;\n\n const fields: PropertyField[] = [];\n\n if (!isFirst) {\n fields.push({\n key: `link${slot}Enabled`,\n label: `Show Link ${slot}`,\n type: \"boolean\",\n description: `Display link slot ${slot}`,\n defaultValue: enabledDefault,\n group,\n });\n }\n\n fields.push({\n key: `link${slot}Label`,\n label: \"Label\",\n type: \"text\",\n description: \"Text shown on the link\",\n defaultValue: defaults?.label ?? \"\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Url`,\n label: \"URL\",\n type: \"text\",\n description: \"Where the link points (use '#' for a placeholder)\",\n defaultValue: \"#\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Icon`,\n label: \"Icon\",\n type: \"select\",\n description: \"Icon displayed in the colored badge\",\n options: ICON_OPTIONS,\n defaultValue: defaults?.icon ?? \"Link\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Color`,\n label: \"Badge Color\",\n type: \"colorSelect\",\n description: \"Color of the icon badge\",\n defaultValue:\n defaults?.color ??\n FALLBACK_COLOR_CYCLE[(slot - 1) % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n return fields;\n}\n\nconst linkSlotFields: PropertyField[] = Array.from(\n { length: MAX_LINKS },\n (_, i) => buildLinkSlotFields(i + 1),\n).flat();\n\n// ---------- schema ----------\n\nexport const quickLinksWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"QuickLinksWidget\",\n displayName: \"Quick Links\",\n fields: [\n // Title group\n {\n key: \"titleEnabled\",\n label: \"Show Title\",\n type: \"boolean\",\n description: \"Small heading shown above the link list\",\n defaultValue: true,\n group: \"Title\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Heading shown above the links\",\n defaultValue: \"Quick Links\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the widget title\",\n defaultValue: \"md\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the widget title\",\n defaultValue: \"foreground\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Links — 8 structured slots\n ...linkSlotFields,\n\n // Layout group\n {\n key: \"layout\",\n label: \"Layout\",\n type: \"buttonGroup\",\n description: \"Cards: separated tiles. List: grouped rows with dividers.\",\n defaultValue: \"cards\",\n options: [\n { label: \"Cards\", value: \"cards\" },\n { label: \"List\", value: \"list\" },\n ],\n group: \"Layout\",\n },\n getBorderRadiusField({\n key: \"iconRadius\",\n label: \"Icon Corner Radius\",\n description: \"Corner radius for the colored icon badge\",\n defaultValue: \"lg\",\n group: \"Layout\",\n }),\n {\n key: \"showChevron\",\n label: \"Show Chevron\",\n type: \"boolean\",\n description: \"Right-aligned chevron indicating each row is a link\",\n defaultValue: true,\n group: \"Layout\",\n },\n {\n key: \"openInNewTab\",\n label: \"Open in New Tab\",\n type: \"boolean\",\n description: \"Open links in a new tab instead of the same window\",\n defaultValue: false,\n group: \"Layout\",\n },\n\n // Design group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget container\",\n defaultValue: \"background\",\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description:\n \"Label + chevron color, and the base for row backgrounds (via opacity)\",\n defaultValue: \"foreground\",\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding around the widget\",\n defaultValue: 4,\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description:\n \"Widget border radius (also drives row corners in cards layout)\",\n defaultValue: \"md\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Widget border width\",\n defaultValue: \"none\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Widget border color\",\n defaultValue: \"muted\",\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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BAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAW;YAAiB;EAAc,CAAA,EAC9C,UACA,EAAA,CAAA;;AAwEP,SAAgB,iBAAiB,EAC/B,eAAe,MACf,QAAQ,eACR,gBAAgB,MAChB,aAAa,cAEb,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YAEA,OAEA,SAAS,SACT,aAAa,MACb,cAAc,MACd,eAAe,OAEf,aAAa;CAAE,MAAM;CAAS,OAAO;CAAc,EACnD,YAAY,cACZ,UAAU,GACV,eAAe,MACf,cAAc,QACd,cAAc,SAEd,WACA,GAAG,SACwC;CAC3C,MAAM,kBAAkB,WAAW,SAAS;CAC5C,MAAM,mBACH,WAAW,UAAU,aAAa,WAAW,UAAU,aACxD,WAAW,SAAS,UAChB,OAAO,WAAW,SAAS,aAAa,WAAW,SAAS,SAAS,KACrE;CAiEN,MAAM,SAAuB,aA5DF;EACzB;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;G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"}
|
|
1
|
+
{"version":3,"file":"QuickLinksWidget-Cpq1V-uX.cjs","names":["BookmarkIcon","LinkIcon","ChevronRight","borderWidthClasses","borderColorClasses","getFontSizeField","getColorField","getBorderRadiusField","getPaddingField","getBorderWidthField","getBorderColorField"],"sources":["../../widgets/src/widgets/QuickLinksWidget.tsx"],"sourcesContent":["import { type ComponentProps } from \"react\";\nimport type React from \"react\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n BorderWidthOptions,\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type {\n PropertyField,\n WidgetPropertySchema,\n} from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n getColorField,\n getFontSizeField,\n getPaddingField,\n borderWidthClasses,\n borderColorClasses,\n} from \"../core/fields\";\nimport {\n Bell,\n BookmarkIcon,\n Calendar,\n ChevronRight,\n ExternalLink,\n Gift,\n Globe,\n Heart,\n Link as LinkIcon,\n Mail,\n MapPin,\n MessageCircle,\n Package,\n Phone,\n Play,\n Share2,\n ShoppingBag,\n Sparkles,\n Star,\n Trophy,\n User,\n Video,\n Zap,\n type LucideIcon,\n} from \"lucide-react\";\n\n// ---------- icon registry ----------\n\nconst ICON_MAP: Record<string, LucideIcon> = {\n User,\n Share2,\n ShoppingBag,\n Video,\n Mail,\n MessageCircle,\n Globe,\n Calendar,\n Bell,\n Heart,\n Star,\n Zap,\n Gift,\n Phone,\n MapPin,\n Play,\n Package,\n ExternalLink,\n Bookmark: BookmarkIcon,\n Trophy,\n Sparkles,\n Link: LinkIcon,\n};\n\nconst ICON_OPTIONS: Array<{ label: string; value: string }> = [\n { label: \"Link (default)\", value: \"Link\" },\n { label: \"User / Profile\", value: \"User\" },\n { label: \"Share\", value: \"Share2\" },\n { label: \"Shopping Bag\", value: \"ShoppingBag\" },\n { label: \"Video\", value: \"Video\" },\n { label: \"Mail\", value: \"Mail\" },\n { label: \"Message\", value: \"MessageCircle\" },\n { label: \"Globe\", value: \"Globe\" },\n { label: \"Calendar\", value: \"Calendar\" },\n { label: \"Bell / Notifications\", value: \"Bell\" },\n { label: \"Heart\", value: \"Heart\" },\n { label: \"Star\", value: \"Star\" },\n { label: \"Zap / Lightning\", value: \"Zap\" },\n { label: \"Gift\", value: \"Gift\" },\n { label: \"Phone\", value: \"Phone\" },\n { label: \"Map Pin\", value: \"MapPin\" },\n { label: \"Play\", value: \"Play\" },\n { label: \"Package\", value: \"Package\" },\n { label: \"External Link\", value: \"ExternalLink\" },\n { label: \"Bookmark\", value: \"Bookmark\" },\n { label: \"Trophy\", value: \"Trophy\" },\n { label: \"Sparkles\", value: \"Sparkles\" },\n];\n\nconst capitalize = (s: string): string =>\n s ? s.charAt(0).toUpperCase() + s.slice(1) : s;\n\nconst getIcon = (name: string | undefined): LucideIcon => {\n if (!name) return LinkIcon;\n return ICON_MAP[name] ?? ICON_MAP[capitalize(name)] ?? LinkIcon;\n};\n\n// ---------- link parsing / collection ----------\n\ntype ParsedLink = {\n id: string;\n label: string;\n url: string;\n iconName: string;\n iconColor: ColorOptions;\n};\n\nconst isColorOption = (value: string): value is ColorOptions =>\n [\n \"background\",\n \"foreground\",\n \"primary\",\n \"secondary\",\n \"accent\",\n \"muted\",\n \"destructive\",\n ].includes(value);\n\nconst FALLBACK_COLOR_CYCLE: ColorOptions[] = [\n \"primary\",\n \"accent\",\n \"secondary\",\n \"destructive\",\n];\n\n// Legacy format per line: \"Label | URL | IconName | ColorOption\"\n// Kept for backwards compatibility with existing saved configs.\nconst parseLegacyLinks = (raw: string[] | string): ParsedLink[] => {\n const lines = Array.isArray(raw) ? raw : raw.split(/\\r?\\n/).filter(Boolean);\n return lines\n .map((line, index) => {\n const parts = line.split(\"|\").map((s) => s.trim());\n const label = parts[0] ?? \"\";\n if (!label) return null;\n const url = parts[1] ?? \"#\";\n const iconName = parts[2] && parts[2].length > 0 ? parts[2] : \"Link\";\n const colorCandidate = parts[3];\n const iconColor: ColorOptions =\n colorCandidate && isColorOption(colorCandidate)\n ? colorCandidate\n : (FALLBACK_COLOR_CYCLE[index % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\");\n return {\n id: `link-${index}`,\n label,\n url,\n iconName,\n iconColor,\n };\n })\n .filter((x): x is ParsedLink => x !== null);\n};\n\n// New structured format — gather links from individual link{n}* props\nconst MAX_LINKS = 8;\n\ntype SlotProps = {\n enabled: boolean;\n label: string | undefined;\n url: string | undefined;\n icon: string | undefined;\n color: ColorOptions | undefined;\n};\n\n// Per-slot merge of structured props with the legacy `links` array. A slot\n// is \"structurally configured\" when at least one of its content props\n// (label / url / icon / color) is explicitly set; in that case structured\n// props win and the slot's `enabled` flag is honored. Slots that haven't\n// been structurally touched fall back to the legacy entry at the same\n// index — so editing one slot in a legacy-format widget doesn't silently\n// drop URLs/icons/colors for the other slots.\nconst resolveLinks = (\n slots: SlotProps[],\n legacy: ParsedLink[],\n): ParsedLink[] => {\n return slots\n .map((slot, index): ParsedLink | null => {\n const legacyEntry = legacy[index];\n\n const hasStructured =\n slot.label !== undefined ||\n slot.url !== undefined ||\n slot.icon !== undefined ||\n slot.color !== undefined;\n\n if (hasStructured) {\n // Slot 1 is always enabled; slots 2+ need enabled=true.\n const isSlotActive = index === 0 || slot.enabled;\n if (!isSlotActive) return null;\n\n const label = (slot.label ?? legacyEntry?.label ?? \"\").trim();\n if (!label) return null;\n\n const url =\n slot.url && slot.url.length > 0\n ? slot.url\n : (legacyEntry?.url ?? \"#\");\n const iconName =\n slot.icon && slot.icon.length > 0\n ? slot.icon\n : (legacyEntry?.iconName ?? \"Link\");\n const iconColor: ColorOptions =\n slot.color ??\n legacyEntry?.iconColor ??\n FALLBACK_COLOR_CYCLE[index % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\";\n\n return {\n id: `link-${index}`,\n label,\n url,\n iconName,\n iconColor,\n };\n }\n\n // No structured props for this slot — use the legacy entry as-is.\n // Legacy widgets predate the per-slot `enabled` toggle, so we don't\n // gate legacy entries on it (otherwise legacy slots 5+ would vanish\n // because their `linkNEnabled` defaults to `false`).\n return legacyEntry ?? null;\n })\n .filter((x): x is ParsedLink => x !== null);\n};\n\n// ---------- link row ----------\n\ntype LinkRowProps = {\n link: ParsedLink;\n textColor: ColorOptions;\n borderRadius: BorderRadiusOptions;\n openInNewTab: boolean;\n showChevron: boolean;\n iconRadius: BorderRadiusOptions;\n layout: \"cards\" | \"list\";\n isLast: boolean;\n};\n\nfunction LinkRow({\n link,\n textColor,\n borderRadius,\n openInNewTab,\n showChevron,\n iconRadius,\n layout,\n isLast,\n}: LinkRowProps) {\n const Icon = getIcon(link.iconName);\n\n const wrapperBase = `group relative flex items-center gap-3 py-3 transition-all duration-200`;\n const wrapperCardClasses = `rounded-${borderRadius} px-3 bg-${textColor}/5 hover:bg-${textColor}/10 hover:-translate-y-0.5`;\n const wrapperListClasses = `px-0 hover:bg-${textColor}/5 rounded-md`;\n\n const wrapperClasses =\n layout === \"cards\"\n ? `${wrapperBase} ${wrapperCardClasses}`\n : `${wrapperBase} ${wrapperListClasses}`;\n\n const content = (\n <>\n {/* Icon badge — colored gradient square with white icon centered */}\n <span\n aria-hidden=\"true\"\n className={`relative flex size-10 shrink-0 items-center justify-center rounded-${iconRadius} text-${link.iconColor}-foreground`}\n style={{\n background: `linear-gradient(135deg, color-mix(in oklch, var(--color-${link.iconColor}) 75%, white 25%) 0%, var(--color-${link.iconColor}) 100%)`,\n boxShadow: `\n inset 0 1px 0 rgba(255,255,255,0.25),\n inset 0 -1px 0 rgba(0,0,0,0.1),\n 0 1px 2px color-mix(in oklch, var(--color-${link.iconColor}) 30%, transparent)\n `,\n }}\n >\n <Icon className=\"size-5\" strokeWidth={2.25} />\n </span>\n\n {/* Label */}\n <span\n className={`min-w-0 flex-1 truncate text-[15px] font-bold tracking-[-0.01em] text-${textColor}`}\n >\n {link.label}\n </span>\n\n {/* Chevron */}\n {showChevron && (\n <ChevronRight\n aria-hidden=\"true\"\n className={`size-4 shrink-0 text-${textColor}/35 transition-transform duration-200 group-hover:translate-x-0.5 group-hover:text-${textColor}/60`}\n />\n )}\n </>\n );\n\n const separator =\n layout === \"list\" && !isLast ? (\n <div\n aria-hidden=\"true\"\n className=\"ml-[52px]\"\n style={{\n borderBottom: `1px solid color-mix(in oklch, var(--color-${textColor}) 8%, transparent)`,\n }}\n />\n ) : null;\n\n const href = link.url && link.url !== \"#\" ? link.url : undefined;\n\n if (href) {\n return (\n <>\n <a\n href={href}\n target={openInNewTab ? \"_blank\" : undefined}\n rel={openInNewTab ? \"noopener noreferrer\" : undefined}\n className={wrapperClasses}\n >\n {content}\n </a>\n {separator}\n </>\n );\n }\n\n return (\n <>\n <div className={wrapperClasses}>{content}</div>\n {separator}\n </>\n );\n}\n\n// ---------- widget ----------\n\ntype QuickLinksWidgetProps = ComponentProps<\"div\"> & {\n // Title\n titleEnabled?: boolean;\n title?: string;\n titleFontSize?: FontSizeOptions;\n titleColor?: ColorOptions;\n\n // Links — new structured per-slot props\n link1Label?: string;\n link1Url?: string;\n link1Icon?: string;\n link1Color?: ColorOptions;\n link2Enabled?: boolean;\n link2Label?: string;\n link2Url?: string;\n link2Icon?: string;\n link2Color?: ColorOptions;\n link3Enabled?: boolean;\n link3Label?: string;\n link3Url?: string;\n link3Icon?: string;\n link3Color?: ColorOptions;\n link4Enabled?: boolean;\n link4Label?: string;\n link4Url?: string;\n link4Icon?: string;\n link4Color?: ColorOptions;\n link5Enabled?: boolean;\n link5Label?: string;\n link5Url?: string;\n link5Icon?: string;\n link5Color?: ColorOptions;\n link6Enabled?: boolean;\n link6Label?: string;\n link6Url?: string;\n link6Icon?: string;\n link6Color?: ColorOptions;\n link7Enabled?: boolean;\n link7Label?: string;\n link7Url?: string;\n link7Icon?: string;\n link7Color?: ColorOptions;\n link8Enabled?: boolean;\n link8Label?: string;\n link8Url?: string;\n link8Icon?: string;\n link8Color?: ColorOptions;\n\n // Legacy — still accepted for backwards compatibility\n links?: string[] | string;\n\n // Layout\n layout?: \"cards\" | \"list\";\n iconRadius?: BorderRadiusOptions;\n showChevron?: boolean;\n openInNewTab?: boolean;\n\n // Design\n background?: BackgroundValue;\n textColor?: ColorOptions;\n padding?: PaddingOptions;\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n};\n\nexport function QuickLinksWidget({\n titleEnabled = true,\n title = \"Quick Links\",\n titleFontSize = \"md\",\n titleColor = \"foreground\",\n\n link1Label,\n link1Url,\n link1Icon,\n link1Color,\n link2Enabled = true,\n link2Label,\n link2Url,\n link2Icon,\n link2Color,\n link3Enabled = true,\n link3Label,\n link3Url,\n link3Icon,\n link3Color,\n link4Enabled = true,\n link4Label,\n link4Url,\n link4Icon,\n link4Color,\n link5Enabled = false,\n link5Label,\n link5Url,\n link5Icon,\n link5Color,\n link6Enabled = false,\n link6Label,\n link6Url,\n link6Icon,\n link6Color,\n link7Enabled = false,\n link7Label,\n link7Url,\n link7Icon,\n link7Color,\n link8Enabled = false,\n link8Label,\n link8Url,\n link8Icon,\n link8Color,\n\n links,\n\n layout = \"cards\",\n iconRadius = \"lg\",\n showChevron = true,\n openInNewTab = false,\n\n background = { type: \"solid\", color: \"background\" },\n textColor = \"foreground\",\n padding = 4,\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n\n className,\n ...props\n}: QuickLinksWidgetProps): React.JSX.Element {\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n // Pass props through verbatim — schema `defaultValue`s pre-populate the\n // builder, so the component shouldn't second-guess with hardcoded\n // fallbacks (which would mask a user's explicit blank label).\n const slots: SlotProps[] = [\n {\n enabled: true,\n label: link1Label,\n url: link1Url,\n icon: link1Icon,\n color: link1Color,\n },\n {\n enabled: link2Enabled,\n label: link2Label,\n url: link2Url,\n icon: link2Icon,\n color: link2Color,\n },\n {\n enabled: link3Enabled,\n label: link3Label,\n url: link3Url,\n icon: link3Icon,\n color: link3Color,\n },\n {\n enabled: link4Enabled,\n label: link4Label,\n url: link4Url,\n icon: link4Icon,\n color: link4Color,\n },\n {\n enabled: link5Enabled,\n label: link5Label,\n url: link5Url,\n icon: link5Icon,\n color: link5Color,\n },\n {\n enabled: link6Enabled,\n label: link6Label,\n url: link6Url,\n icon: link6Icon,\n color: link6Color,\n },\n {\n enabled: link7Enabled,\n label: link7Label,\n url: link7Url,\n icon: link7Icon,\n color: link7Color,\n },\n {\n enabled: link8Enabled,\n label: link8Label,\n url: link8Url,\n icon: link8Icon,\n color: link8Color,\n },\n ];\n\n const legacyLinks: ParsedLink[] = links ? parseLegacyLinks(links) : [];\n const parsed: ParsedLink[] = resolveLinks(slots, legacyLinks);\n\n return (\n <div\n className={`@container overflow-hidden rounded-${borderRadius} bg-${backgroundColor} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} ${className ?? \"\"}`}\n style={{ backgroundImage }}\n {...props}\n >\n <div className={`p-${padding} flex flex-col gap-3`}>\n {titleEnabled && title && (\n <h2\n className={`text-${titleFontSize} leading-tight font-bold tracking-[-0.01em] text-${titleColor}`}\n >\n {title}\n </h2>\n )}\n\n {parsed.length === 0 ? (\n <p className={`text-[13px] text-${textColor}/55`}>\n No links configured.\n </p>\n ) : layout === \"cards\" ? (\n <div className=\"flex flex-col gap-2\">\n {parsed.map((link, idx) => (\n <LinkRow\n key={link.id}\n link={link}\n textColor={textColor}\n borderRadius={borderRadius}\n openInNewTab={openInNewTab}\n showChevron={showChevron}\n iconRadius={iconRadius}\n layout=\"cards\"\n isLast={idx === parsed.length - 1}\n />\n ))}\n </div>\n ) : (\n <div\n className={`flex flex-col overflow-hidden rounded-${borderRadius} bg-${textColor}/5`}\n >\n {parsed.map((link, idx) => (\n <LinkRow\n key={link.id}\n link={link}\n textColor={textColor}\n borderRadius={borderRadius}\n openInNewTab={openInNewTab}\n showChevron={showChevron}\n iconRadius={iconRadius}\n layout=\"list\"\n isLast={idx === parsed.length - 1}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ---------- schema helpers ----------\n\ntype SlotDefaults = {\n label: string;\n icon: string;\n color: ColorOptions;\n};\n\nconst SLOT_DEFAULTS: Record<number, SlotDefaults | undefined> = {\n 1: { label: \"Profile\", icon: \"User\", color: \"primary\" },\n 2: { label: \"Social\", icon: \"Share2\", color: \"accent\" },\n 3: { label: \"Product Links\", icon: \"ShoppingBag\", color: \"secondary\" },\n 4: { label: \"Video\", icon: \"Video\", color: \"destructive\" },\n};\n\nfunction buildLinkSlotFields(slot: number): PropertyField[] {\n const group = `Link ${slot}`;\n const isFirst = slot === 1;\n const defaults = SLOT_DEFAULTS[slot];\n // Enable slots 2-4 by default to match the previous widget behavior.\n const enabledDefault = slot >= 2 && slot <= 4;\n const requires = isFirst ? undefined : `link${slot}Enabled`;\n\n const fields: PropertyField[] = [];\n\n if (!isFirst) {\n fields.push({\n key: `link${slot}Enabled`,\n label: `Show Link ${slot}`,\n type: \"boolean\",\n description: `Display link slot ${slot}`,\n defaultValue: enabledDefault,\n group,\n });\n }\n\n fields.push({\n key: `link${slot}Label`,\n label: \"Label\",\n type: \"text\",\n description: \"Text shown on the link\",\n defaultValue: defaults?.label ?? \"\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Url`,\n label: \"URL\",\n type: \"text\",\n description: \"Where the link points (use '#' for a placeholder)\",\n defaultValue: \"#\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Icon`,\n label: \"Icon\",\n type: \"select\",\n description: \"Icon displayed in the colored badge\",\n options: ICON_OPTIONS,\n defaultValue: defaults?.icon ?? \"Link\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n fields.push({\n key: `link${slot}Color`,\n label: \"Badge Color\",\n type: \"colorSelect\",\n description: \"Color of the icon badge\",\n defaultValue:\n defaults?.color ??\n FALLBACK_COLOR_CYCLE[(slot - 1) % FALLBACK_COLOR_CYCLE.length] ??\n \"primary\",\n group,\n ...(requires ? { requiresKeyToBeTrue: requires } : {}),\n });\n\n return fields;\n}\n\nconst linkSlotFields: PropertyField[] = Array.from(\n { length: MAX_LINKS },\n (_, i) => buildLinkSlotFields(i + 1),\n).flat();\n\n// ---------- schema ----------\n\nexport const quickLinksWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"QuickLinksWidget\",\n displayName: \"Quick Links\",\n fields: [\n // Title group\n {\n key: \"titleEnabled\",\n label: \"Show Title\",\n type: \"boolean\",\n description: \"Small heading shown above the link list\",\n defaultValue: true,\n group: \"Title\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Heading shown above the links\",\n defaultValue: \"Quick Links\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleFontSize\",\n label: \"Title Font Size\",\n description: \"Font size for the widget title\",\n defaultValue: \"md\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the widget title\",\n defaultValue: \"foreground\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Links — 8 structured slots\n ...linkSlotFields,\n\n // Layout group\n {\n key: \"layout\",\n label: \"Layout\",\n type: \"buttonGroup\",\n description: \"Cards: separated tiles. List: grouped rows with dividers.\",\n defaultValue: \"cards\",\n options: [\n { label: \"Cards\", value: \"cards\" },\n { label: \"List\", value: \"list\" },\n ],\n group: \"Layout\",\n },\n getBorderRadiusField({\n key: \"iconRadius\",\n label: \"Icon Corner Radius\",\n description: \"Corner radius for the colored icon badge\",\n defaultValue: \"lg\",\n group: \"Layout\",\n }),\n {\n key: \"showChevron\",\n label: \"Show Chevron\",\n type: \"boolean\",\n description: \"Right-aligned chevron indicating each row is a link\",\n defaultValue: true,\n group: \"Layout\",\n },\n {\n key: \"openInNewTab\",\n label: \"Open in New Tab\",\n type: \"boolean\",\n description: \"Open links in a new tab instead of the same window\",\n defaultValue: false,\n group: \"Layout\",\n },\n\n // Design group\n {\n type: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background for the widget container\",\n defaultValue: \"background\",\n group: \"Design\",\n },\n getColorField({\n key: \"textColor\",\n label: \"Text Color\",\n description:\n \"Label + chevron color, and the base for row backgrounds (via opacity)\",\n defaultValue: \"foreground\",\n group: \"Design\",\n }),\n {\n key: \"separator\",\n type: \"separator\",\n label: \"Separator\",\n group: \"Design\",\n },\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding around the widget\",\n defaultValue: 4,\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description:\n \"Widget border radius (also drives row corners in cards layout)\",\n defaultValue: \"md\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Widget border width\",\n defaultValue: \"none\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Widget border color\",\n defaultValue: \"muted\",\n group: \"Design\",\n }),\n ],\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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BAAA,GAAA,kBAAA,MAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EAAK,WAAW;YAAiB;EAAc,CAAA,EAC9C,UACA,EAAA,CAAA;;AAwEP,SAAgB,iBAAiB,EAC/B,eAAe,MACf,QAAQ,eACR,gBAAgB,MAChB,aAAa,cAEb,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,MACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YACA,eAAe,OACf,YACA,UACA,WACA,YAEA,OAEA,SAAS,SACT,aAAa,MACb,cAAc,MACd,eAAe,OAEf,aAAa;CAAE,MAAM;CAAS,OAAO;CAAc,EACnD,YAAY,cACZ,UAAU,GACV,eAAe,MACf,cAAc,QACd,cAAc,SAEd,WACA,GAAG,SACwC;CAC3C,MAAM,kBAAkB,WAAW,SAAS;CAC5C,MAAM,mBACH,WAAW,UAAU,aAAa,WAAW,UAAU,aACxD,WAAW,SAAS,UAChB,OAAO,WAAW,SAAS,aAAa,WAAW,SAAS,SAAS,KACrE;CAiEN,MAAM,SAAuB,aA5DF;EACzB;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;GACR;EACD;GACE,SAAS;GACT,OAAO;GACP,KAAK;GACL,MAAM;GACN,OAAO;G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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { I as __exportAll } from "./portal_tenant_content-DPLnrtOG.mjs";
|
|
2
|
-
import { i as getBorderColorField, l as getColorField, m as getPaddingField, n as borderWidthClasses, o as getBorderRadiusField, s as getBorderWidthField, t as borderColorClasses, u as getFontSizeField } from "./registries-
|
|
2
|
+
import { i as getBorderColorField, l as getColorField, m as getPaddingField, n as borderWidthClasses, o as getBorderRadiusField, s as getBorderWidthField, t as borderColorClasses, u as getFontSizeField } from "./registries-6F90ZS1m.mjs";
|
|
3
3
|
import "react";
|
|
4
4
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
5
5
|
import { Bell, BookmarkIcon, Calendar, ChevronRight, ExternalLink, Gift, Globe, Heart, Link, Mail, MapPin, MessageCircle, Package, Phone, Play, Share2, ShoppingBag, Sparkles, Star, Trophy, User, Video, Zap } from "lucide-react";
|
|
@@ -543,4 +543,4 @@ const quickLinksWidgetPropertySchema = {
|
|
|
543
543
|
//#endregion
|
|
544
544
|
export { QuickLinksWidget_exports as n, quickLinksWidgetPropertySchema as r, QuickLinksWidget as t };
|
|
545
545
|
|
|
546
|
-
//# sourceMappingURL=QuickLinksWidget-
|
|
546
|
+
//# sourceMappingURL=QuickLinksWidget-J5axodVF.mjs.map
|