@fluid-app/portal-sdk 0.1.356 → 0.1.358
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/{AddressAutocompleteInput-BGGxo7jv.cjs → AddressAutocompleteInput-DV1DS05i.cjs} +2 -2
- package/dist/{AddressAutocompleteInput-BGGxo7jv.cjs.map → AddressAutocompleteInput-DV1DS05i.cjs.map} +1 -1
- package/dist/{AddressAutocompleteInput-BuDxK4vh.mjs → AddressAutocompleteInput-Z80mEIXZ.mjs} +2 -2
- package/dist/{AddressAutocompleteInput-BuDxK4vh.mjs.map → AddressAutocompleteInput-Z80mEIXZ.mjs.map} +1 -1
- package/dist/{CalendarWidget-CbS9AsMH.mjs → CalendarWidget-CQJfz8Jn.mjs} +2 -2
- package/dist/{CalendarWidget-CbS9AsMH.mjs.map → CalendarWidget-CQJfz8Jn.mjs.map} +1 -1
- package/dist/{CalendarWidget-B8ZIA_pe.cjs → CalendarWidget-z0It6f_7.cjs} +2 -2
- package/dist/{CalendarWidget-B8ZIA_pe.cjs.map → CalendarWidget-z0It6f_7.cjs.map} +1 -1
- package/dist/{CardWidget-B4LEZKbB.mjs → CardWidget-BpzZMsvX.mjs} +2 -2
- package/dist/{CardWidget-B4LEZKbB.mjs.map → CardWidget-BpzZMsvX.mjs.map} +1 -1
- package/dist/{CardWidget-BNW0Yqgd.cjs → CardWidget-Ccmmph6S.cjs} +2 -2
- package/dist/{CardWidget-BNW0Yqgd.cjs.map → CardWidget-Ccmmph6S.cjs.map} +1 -1
- package/dist/{CardWidget-CyNXwk60.cjs → CardWidget-D_3rdNrP.cjs} +3 -3
- package/dist/{CatchUpWidget-Cj10cTha.mjs → CatchUpWidget-BCe8hmdk.mjs} +2 -2
- package/dist/{CatchUpWidget-Cj10cTha.mjs.map → CatchUpWidget-BCe8hmdk.mjs.map} +1 -1
- package/dist/{CatchUpWidget-CiVhawuh.cjs → CatchUpWidget-DCDoIckB.cjs} +2 -2
- package/dist/{CatchUpWidget-CiVhawuh.cjs.map → CatchUpWidget-DCDoIckB.cjs.map} +1 -1
- package/dist/ContainerWidget-B8Ckbqiq.cjs +8 -0
- package/dist/{ContainerWidget-Dpt2viZ0.cjs → ContainerWidget-BEHBqh0a.cjs} +2 -2
- package/dist/{ContainerWidget-Dpt2viZ0.cjs.map → ContainerWidget-BEHBqh0a.cjs.map} +1 -1
- package/dist/{ContainerWidget-DSQ151lW.mjs → ContainerWidget-Bdq6CaDc.mjs} +2 -2
- package/dist/{ContainerWidget-DSQ151lW.mjs.map → ContainerWidget-Bdq6CaDc.mjs.map} +1 -1
- package/dist/{FluidProvider-4gmkqnRY.mjs → FluidProvider-DV227FL2.mjs} +20 -22
- package/dist/{FluidProvider-4gmkqnRY.mjs.map → FluidProvider-DV227FL2.mjs.map} +1 -1
- package/dist/{FluidProvider-C3hiUfMl.cjs → FluidProvider-Dgy4onF4.cjs} +20 -22
- package/dist/{FluidProvider-C3hiUfMl.cjs.map → FluidProvider-Dgy4onF4.cjs.map} +1 -1
- package/dist/{LayoutWidget-DCHpM0WT.cjs → LayoutWidget-DDviSQKj.cjs} +3 -3
- package/dist/{LayoutWidget-D8oT-Xnt.cjs → LayoutWidget-DOz-WOsy.cjs} +2 -2
- package/dist/{LayoutWidget-D8oT-Xnt.cjs.map → LayoutWidget-DOz-WOsy.cjs.map} +1 -1
- package/dist/{LayoutWidget-Byp1iMxL.mjs → LayoutWidget-DsXDBXSO.mjs} +2 -2
- package/dist/{LayoutWidget-Byp1iMxL.mjs.map → LayoutWidget-DsXDBXSO.mjs.map} +1 -1
- package/dist/{MessagingScreen-CY501qWL.cjs → MessagingScreen-C69BJ8Fz.cjs} +2 -2
- package/dist/{MessagingScreen-CY501qWL.cjs.map → MessagingScreen-C69BJ8Fz.cjs.map} +1 -1
- package/dist/{MessagingScreen-Bd7EcXG9.mjs → MessagingScreen-CCb05_Wj.mjs} +2 -2
- package/dist/{MessagingScreen-Bd7EcXG9.mjs.map → MessagingScreen-CCb05_Wj.mjs.map} +1 -1
- package/dist/{MessagingScreen-BTxXlcvu.cjs → MessagingScreen-DiaV8xau.cjs} +13 -13
- package/dist/{MessagingScreen-C1gQKJMl.mjs → MessagingScreen-r732O1LD.mjs} +13 -13
- package/dist/{MySiteWidget-C_qQJaPH.mjs → MySiteWidget-BvFHv9me.mjs} +2 -2
- package/dist/{MySiteWidget-C_qQJaPH.mjs.map → MySiteWidget-BvFHv9me.mjs.map} +1 -1
- package/dist/{MySiteWidget-CGWlrGMu.cjs → MySiteWidget-BwmprXJj.cjs} +2 -2
- package/dist/{MySiteWidget-CGWlrGMu.cjs.map → MySiteWidget-BwmprXJj.cjs.map} +1 -1
- package/dist/{OrdersScreen-Dovc4_iw.cjs → OrdersScreen-BlP4uKE8.cjs} +2 -2
- package/dist/{OrdersScreen-Dovc4_iw.cjs.map → OrdersScreen-BlP4uKE8.cjs.map} +1 -1
- package/dist/{OrdersScreen-CG1BFasK.mjs → OrdersScreen-CZEhg3LN.mjs} +13 -13
- package/dist/{OrdersScreen-Cj-F__x-.cjs → OrdersScreen-DYyG4PZG.cjs} +13 -13
- package/dist/{OrdersScreen-BkGK5lOJ.mjs → OrdersScreen-S4YnUuzD.mjs} +2 -2
- package/dist/{OrdersScreen-BkGK5lOJ.mjs.map → OrdersScreen-S4YnUuzD.mjs.map} +1 -1
- package/dist/{PointsWidget-D_wPrx7u.mjs → PointsWidget-BvLIjvRG.mjs} +2 -2
- package/dist/{PointsWidget-D_wPrx7u.mjs.map → PointsWidget-BvLIjvRG.mjs.map} +1 -1
- package/dist/{PointsWidget-Cj3Vlk8M.cjs → PointsWidget-Q3s6gojq.cjs} +2 -2
- package/dist/{PointsWidget-Cj3Vlk8M.cjs.map → PointsWidget-Q3s6gojq.cjs.map} +1 -1
- package/dist/{ProfileScreen-BnOsfmSv.mjs → ProfileScreen-BJUYFJ_D.mjs} +3 -3
- package/dist/{ProfileScreen-BnOsfmSv.mjs.map → ProfileScreen-BJUYFJ_D.mjs.map} +1 -1
- package/dist/{ProfileScreen-D7FVbC5w.mjs → ProfileScreen-CmqHo3UG.mjs} +14 -14
- package/dist/{ProfileScreen-BNMKmLej.cjs → ProfileScreen-DFiM2Iv_.cjs} +14 -14
- package/dist/{ProfileScreen-_uLD_hGd.cjs → ProfileScreen-Dta2L4BA.cjs} +3 -3
- package/dist/{ProfileScreen-_uLD_hGd.cjs.map → ProfileScreen-Dta2L4BA.cjs.map} +1 -1
- package/dist/{RecentActivityWidget-BwRBJmUU.cjs → RecentActivityWidget-NkdK9KfL.cjs} +2 -2
- package/dist/{RecentActivityWidget-BwRBJmUU.cjs.map → RecentActivityWidget-NkdK9KfL.cjs.map} +1 -1
- package/dist/{RecentActivityWidget-YZNGdnXV.mjs → RecentActivityWidget-ziAimCYB.mjs} +2 -2
- package/dist/{RecentActivityWidget-YZNGdnXV.mjs.map → RecentActivityWidget-ziAimCYB.mjs.map} +1 -1
- package/dist/{ScreenRenderer-CWjMFFLJ.mjs → ScreenRenderer-BTSp4KZp.mjs} +2 -2
- package/dist/{ScreenRenderer-CWjMFFLJ.mjs.map → ScreenRenderer-BTSp4KZp.mjs.map} +1 -1
- package/dist/{ScreenRenderer-V_7y2I2L.cjs → ScreenRenderer-DowNn61T.cjs} +2 -2
- package/dist/{ScreenRenderer-V_7y2I2L.cjs.map → ScreenRenderer-DowNn61T.cjs.map} +1 -1
- package/dist/{ShopScreen-BCjAIhLU.cjs → ShopScreen-Bqup6l0o.cjs} +2 -2
- package/dist/{ShopScreen-BCjAIhLU.cjs.map → ShopScreen-Bqup6l0o.cjs.map} +1 -1
- package/dist/{ShopScreen-PB6cJLZy.mjs → ShopScreen-CC0t8ZDI.mjs} +13 -13
- package/dist/{ShopScreen-BysfBfa-.mjs → ShopScreen-CzYB_rpN.mjs} +2 -2
- package/dist/{ShopScreen-BysfBfa-.mjs.map → ShopScreen-CzYB_rpN.mjs.map} +1 -1
- package/dist/{ShopScreen-wh35dnaz.cjs → ShopScreen-D3Celpra.cjs} +13 -13
- package/dist/{SubscriptionsScreen-DVHAkuSA.cjs → SubscriptionsScreen-BJ8Qsjec.cjs} +14 -14
- package/dist/{SubscriptionsScreen-XYiCtWX-.cjs → SubscriptionsScreen-BMVXwFoz.cjs} +3 -3
- package/dist/{SubscriptionsScreen-XYiCtWX-.cjs.map → SubscriptionsScreen-BMVXwFoz.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-Ct9NInN-.mjs → SubscriptionsScreen-DRRbvg51.mjs} +3 -3
- package/dist/{SubscriptionsScreen-Ct9NInN-.mjs.map → SubscriptionsScreen-DRRbvg51.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-gRAIaiXS.mjs → SubscriptionsScreen-DRcs0JF5.mjs} +14 -14
- package/dist/{ToDoWidget-DWegq3Rs.mjs → ToDoWidget-C6Kk46b7.mjs} +2 -2
- package/dist/{ToDoWidget-DWegq3Rs.mjs.map → ToDoWidget-C6Kk46b7.mjs.map} +1 -1
- package/dist/{ToDoWidget-BZi0xnAv.cjs → ToDoWidget-Szg7F0yS.cjs} +2 -2
- package/dist/{ToDoWidget-BZi0xnAv.cjs.map → ToDoWidget-Szg7F0yS.cjs.map} +1 -1
- package/dist/{ToDoWidget-BDOZr5av.cjs → ToDoWidget-YlUL-lNO.cjs} +2 -2
- package/dist/index.cjs +28 -28
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +28 -28
- package/dist/{registry-context-BISkmKM2.cjs → registry-context-BliPhkUQ.cjs} +7 -3
- package/dist/{registry-context-DWAhoLQA.mjs.map → registry-context-BliPhkUQ.cjs.map} +1 -1
- package/dist/{registry-context-DWAhoLQA.mjs → registry-context-CSsT6Rtk.mjs} +7 -3
- package/dist/{registry-context-BISkmKM2.cjs.map → registry-context-CSsT6Rtk.mjs.map} +1 -1
- package/package.json +13 -13
- package/dist/ContainerWidget-CEZnuIbT.cjs +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubscriptionsScreen-XYiCtWX-.cjs","names":["addDays","addMonths","getInternalDefaultOptions","toDate","constructFrom","constructFrom","millisecondsInHour","millisecondsInMinute","millisecondsInSecond","getWeekYear","startOfWeek","constructFrom","startOfISOWeek","toDate","getWeek","startOfWeek","toDate","getISOWeek","startOfISOWeek","getDefaultOptions","toDate","addDays","toDate","addDays","constructFrom","getTimezoneOffsetInMilliseconds","constructFrom","getTimezoneOffsetInMilliseconds","constructFrom","constructFrom","constructFrom","defaultLocale","toDate","longFormatters","isProtectedWeekYearToken","isProtectedDayOfYearToken","usePortalTenantClient","usePortalTenantClient","createTranslationContext","createDomainTranslations","createStaticDictAdapter","useActiveLocale","useDomainDict","ScreenHeaderBreadcrumbs","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage","Package","Popover","PopoverTrigger","PopoverContent","ImageOff","Play","Repeat","AlertCircle","Truck","Check","Package","Repeat","Check","Check","CreditCard","Sheet","SheetContent","SheetTitle","mapToFluidPayAddress","useAppNavigation","usePayApi","useCountriesApi","useProfileTranslation","useFluidContext","useActiveLocale","useStore","payKeys","mapToFluidPayPaymentMethod","storeKeys","isApiError","AddressFormDialog","AddressAutocompleteInput","CreditCardFormDialog","FluidPayCoreProvider","createFluidPayApiAdapter","ProfileTranslationBridge","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button","AlertDialogFooter","AlertDialogCancel","format","Dialog","DialogContent","DialogHeader","DialogTitle","Label","DialogFooter","Button","addDays","format","Dialog","DialogContent","DialogHeader","DialogTitle","Label","Popover","PopoverTrigger","Button","cn","CalendarIcon","PopoverContent","Calendar","DialogFooter","addDays","addMonths","isAfter","format","ChevronLeft","cn","ChevronRight","Dialog","DialogContent","DialogHeader","DialogTitle","Label","PortalContainerProvider","Popover","PopoverTrigger","Button","CalendarIcon","PopoverContent","Calendar","DialogFooter","CreditCard","CircleDollarSign","BadgeAlert","CalendarClock","Sparkles","Wallet","DollarSign","Receipt","PiggyBank","ShieldCheck","Calendar","Banknote","RefreshCw","X","Button","Skeleton","cn","Minus","Input","Plus","Button","SkipForward","CalendarDays","Pause","XCircle","CreditCard","Play","RotateCcw","format","addMonths","SubscriptionDetailScreen","ScreenHeaderBreadcrumbs","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","useProfileTranslation","getCardExpiry","cn","ChevronDown","PaymentIcon","getCardDisplayName","Skeleton","EllipsesDropdown","mapToFluidPayAddress","ProfileTranslationBridge","useProfileTranslation","usePayApi","createFluidPayApiAdapter","payKeys","mapToFluidPayPaymentMethod","useCountriesApi","storeKeys","FluidPayCoreProvider","CreditCardFormDialog","AddressFormDialog","AddressAutocompleteInput","EditPaymentMethodDialog","ConfirmActionDialog","useProfileTranslation","cn","ChevronDown","Skeleton","EllipsesDropdown","ProfileTranslationBridge","useProfileTranslation","useFluidContext","useActiveLocale","usePayApi","createFluidPayApiAdapter","payKeys","useCountriesApi","storeKeys","FluidPayCoreProvider","AddressFormDialog","AddressAutocompleteInput","ConfirmActionDialog","useAppNavigation","SubscriptionDetailScreenContent","useAppNavigation","useAccount"],"sources":["../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addWeeks.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addYears.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDefaultOptions.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISODay.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/transpose.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/Setter.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/EraParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/constants.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/utils.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/YearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/LocalWeekYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOWeekYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ExtendedYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/QuarterParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/StandAloneQuarterParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/MonthParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/StandAloneMonthParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setWeek.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/LocalWeekParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setISOWeek.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOWeekParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DateParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DayOfYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setDay.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/LocalDayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/StandAloneLocalDayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setISODay.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISODayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/AMPMParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/AMPMMidnightParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DayPeriodParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour1to12Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour0to23Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour0To11Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour1To24Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/MinuteParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/SecondParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/FractionOfSecondParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOTimezoneWithZParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOTimezoneParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/TimestampSecondsParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/TimestampMillisecondsParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse.js","../../../subscriptions/core/src/subscriptions-api-context.ts","../../../subscriptions/core/src/provider.tsx","../../../subscriptions/core/src/query-keys.ts","../../../subscriptions/core/src/bundles-api-context.ts","../../../subscriptions/core/src/bundles-provider.tsx","../../../subscriptions/core/src/hooks/use-subscriptions.ts","../../../subscriptions/core/src/hooks/use-infinite-subscriptions.ts","../../../subscriptions/core/src/hooks/use-subscription.ts","../../../subscriptions/core/src/hooks/use-pause-subscription.ts","../../../subscriptions/core/src/hooks/use-resume-subscription.ts","../../../subscriptions/core/src/hooks/use-skip-subscription.ts","../../../subscriptions/core/src/hooks/use-cancel-subscription.ts","../../../subscriptions/core/src/hooks/use-reactivate-subscription.ts","../../../subscriptions/core/src/hooks/use-retry-subscription.ts","../../../subscriptions/core/src/hooks/use-update-subscription-info.ts","../../../subscriptions/core/src/hooks/use-bundles.ts","../../../subscriptions/core/src/hooks/use-create-bundle.ts","../../../subscriptions/core/src/utils/subscription-helpers.ts","../src/adapters/subscriptions-api-adapter.ts","../src/subscriptions/PortalSubscriptionsApiProvider.tsx","../src/adapters/bundles-api-adapter.ts","../src/subscriptions/PortalBundlesApiProvider.tsx","../../../subscriptions/core/src/translation-api-context.ts","../../../subscriptions/core/src/translation-dictionary.ts","../../../subscriptions/core/src/translation-adapter.ts","../src/providers/SubscriptionsTranslationBridge.tsx","../src/screens/subscriptions/portal-subscriptions-list-helpers.ts","../src/screens/subscriptions/PortalSubscriptionsList.tsx","../src/screens/subscriptions/bundle-drawer/payment-utils.ts","../src/screens/subscriptions/bundle-drawer/use-bundle-form.ts","../src/screens/subscriptions/bundle-drawer/DrawerStepTabs.tsx","../src/screens/subscriptions/bundle-drawer/DrawerStepSelect.tsx","../src/screens/subscriptions/bundle-drawer/DrawerStepDate.tsx","../src/screens/subscriptions/bundle-drawer/DrawerStepAddress.tsx","../src/screens/subscriptions/bundle-drawer/DrawerStepPayment.tsx","../src/screens/subscriptions/bundle-drawer/BundleSubscriptionsDrawer.tsx","../src/screens/SubscriptionsListScreen.tsx","../../../subscriptions/ui/src/components/cancel-subscription-dialog.tsx","../../../subscriptions/ui/src/components/pause-subscription-dialog.tsx","../../../subscriptions/ui/src/lib/parse-iso-date.ts","../../../subscriptions/ui/src/components/resume-subscription-dialog.tsx","../../../subscriptions/ui/src/components/edit-bill-date-dialog.tsx","../../../subscriptions/ui/src/lib/cn.ts","../../../subscriptions/ui/src/components/status-pill.tsx","../../../subscriptions/ui/src/components/past-due-banner.tsx","../../../subscriptions/ui/src/lib/format.ts","../../../subscriptions/ui/src/components/subscription-detail.tsx","../../../subscriptions/ui/src/screens/SubscriptionDetailScreen.tsx","../src/subscriptions/SelectablePaymentMethodDropdown.tsx","../src/subscriptions/PortalSubscriptionPaymentMethodSection.tsx","../src/subscriptions/SelectableAddressDropdown.tsx","../src/subscriptions/PortalSubscriptionShippingAddressSection.tsx","../src/screens/SubscriptionDetailScreen.tsx","../src/screens/SubscriptionsScreen.tsx"],"sourcesContent":["import { addDays } from \"./addDays.js\";\n\n/**\n * The {@link addWeeks} function options.\n */\n\n/**\n * @name addWeeks\n * @category Week Helpers\n * @summary Add the specified number of weeks to the given date.\n *\n * @description\n * Add the specified number of weeks to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of weeks to be added.\n * @param options - An object with options\n *\n * @returns The new date with the weeks added\n *\n * @example\n * // Add 4 weeks to 1 September 2014:\n * const result = addWeeks(new Date(2014, 8, 1), 4)\n * //=> Mon Sep 29 2014 00:00:00\n */\nexport function addWeeks(date, amount, options) {\n return addDays(date, amount * 7, options);\n}\n\n// Fallback for modularized imports:\nexport default addWeeks;\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The {@link addYears} function options.\n */\n\n/**\n * @name addYears\n * @category Year Helpers\n * @summary Add the specified number of years to the given date.\n *\n * @description\n * Add the specified number of years to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The date to be changed\n * @param amount - The amount of years to be added.\n * @param options - The options\n *\n * @returns The new date with the years added\n *\n * @example\n * // Add 5 years to 1 September 2014:\n * const result = addYears(new Date(2014, 8, 1), 5)\n * //=> Sun Sep 01 2019 00:00:00\n */\nexport function addYears(date, amount, options) {\n return addMonths(date, amount * 12, options);\n}\n\n// Fallback for modularized imports:\nexport default addYears;\n","import { getDefaultOptions as getInternalDefaultOptions } from \"./_lib/defaultOptions.js\";\n\n/**\n * @name getDefaultOptions\n * @category Common Helpers\n * @summary Get default options.\n * @pure false\n *\n * @description\n * Returns an object that contains defaults for\n * `options.locale`, `options.weekStartsOn` and `options.firstWeekContainsDate`\n * arguments for all functions.\n *\n * You can change these with [setDefaultOptions](https://date-fns.org/docs/setDefaultOptions).\n *\n * @returns The default options\n *\n * @example\n * const result = getDefaultOptions()\n * //=> {}\n *\n * @example\n * setDefaultOptions({ weekStarsOn: 1, firstWeekContainsDate: 4 })\n * const result = getDefaultOptions()\n * //=> { weekStarsOn: 1, firstWeekContainsDate: 4 }\n */\nexport function getDefaultOptions() {\n return Object.assign({}, getInternalDefaultOptions());\n}\n\n// Fallback for modularized imports:\nexport default getDefaultOptions;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISODay} function options.\n */\n\n/**\n * @name getISODay\n * @category Weekday Helpers\n * @summary Get the day of the ISO week of the given date.\n *\n * @description\n * Get the day of the ISO week of the given date,\n * which is 7 for Sunday, 1 for Monday etc.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The day of ISO week\n *\n * @example\n * // Which day of the ISO week is 26 February 2012?\n * const result = getISODay(new Date(2012, 1, 26))\n * //=> 7\n */\nexport function getISODay(date, options) {\n const day = toDate(date, options?.in).getDay();\n return day === 0 ? 7 : day;\n}\n\n// Fallback for modularized imports:\nexport default getISODay;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name transpose\n * @category Generic Helpers\n * @summary Transpose the date to the given constructor.\n *\n * @description\n * The function transposes the date to the given constructor. It helps you\n * to transpose the date in the system time zone to say `UTCDate` or any other\n * date extension.\n *\n * @typeParam InputDate - The input `Date` type derived from the passed argument.\n * @typeParam ResultDate - The result `Date` type derived from the passed constructor.\n *\n * @param date - The date to use values from\n * @param constructor - The date constructor to use\n *\n * @returns Date transposed to the given constructor\n *\n * @example\n * // Create July 10, 2022 00:00 in locale time zone\n * const date = new Date(2022, 6, 10)\n * //=> 'Sun Jul 10 2022 00:00:00 GMT+0800 (Singapore Standard Time)'\n *\n * @example\n * // Transpose the date to July 10, 2022 00:00 in UTC\n * transpose(date, UTCDate)\n * //=> 'Sun Jul 10 2022 00:00:00 GMT+0000 (Coordinated Universal Time)'\n */\nexport function transpose(date, constructor) {\n const date_ = isConstructor(constructor)\n ? new constructor(0)\n : constructFrom(constructor, 0);\n date_.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n date_.setHours(\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n );\n return date_;\n}\n\nfunction isConstructor(constructor) {\n return (\n typeof constructor === \"function\" &&\n constructor.prototype?.constructor === constructor\n );\n}\n\n// Fallback for modularized imports:\nexport default transpose;\n","import { constructFrom } from \"../../constructFrom.js\";\nimport { transpose } from \"../../transpose.js\";\n\nconst TIMEZONE_UNIT_PRIORITY = 10;\n\nexport class Setter {\n subPriority = 0;\n\n validate(_utcDate, _options) {\n return true;\n }\n}\n\nexport class ValueSetter extends Setter {\n constructor(\n value,\n\n validateValue,\n\n setValue,\n\n priority,\n subPriority,\n ) {\n super();\n this.value = value;\n this.validateValue = validateValue;\n this.setValue = setValue;\n this.priority = priority;\n if (subPriority) {\n this.subPriority = subPriority;\n }\n }\n\n validate(date, options) {\n return this.validateValue(date, this.value, options);\n }\n\n set(date, flags, options) {\n return this.setValue(date, flags, this.value, options);\n }\n}\n\nexport class DateTimezoneSetter extends Setter {\n priority = TIMEZONE_UNIT_PRIORITY;\n subPriority = -1;\n\n constructor(context, reference) {\n super();\n this.context = context || ((date) => constructFrom(reference, date));\n }\n\n set(date, flags) {\n if (flags.timestampIsSet) return date;\n return constructFrom(date, transpose(date, this.context));\n }\n}\n","import { ValueSetter } from \"./Setter.js\";\n\nexport class Parser {\n run(dateString, token, match, options) {\n const result = this.parse(dateString, token, match, options);\n if (!result) {\n return null;\n }\n\n return {\n setter: new ValueSetter(\n result.value,\n this.validate,\n this.set,\n this.priority,\n this.subPriority,\n ),\n rest: result.rest,\n };\n }\n\n validate(_utcDate, _value, _options) {\n return true;\n }\n}\n","import { Parser } from \"../Parser.js\";\n\nexport class EraParser extends Parser {\n priority = 140;\n\n parse(dateString, token, match) {\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return (\n match.era(dateString, { width: \"abbreviated\" }) ||\n match.era(dateString, { width: \"narrow\" })\n );\n\n // A, B\n case \"GGGGG\":\n return match.era(dateString, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return (\n match.era(dateString, { width: \"wide\" }) ||\n match.era(dateString, { width: \"abbreviated\" }) ||\n match.era(dateString, { width: \"narrow\" })\n );\n }\n }\n\n set(date, flags, value) {\n flags.era = value;\n date.setFullYear(value, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"R\", \"u\", \"t\", \"T\"];\n}\n","export const numericPatterns = {\n month: /^(1[0-2]|0?\\d)/, // 0 to 12\n date: /^(3[0-1]|[0-2]?\\d)/, // 0 to 31\n dayOfYear: /^(36[0-6]|3[0-5]\\d|[0-2]?\\d?\\d)/, // 0 to 366\n week: /^(5[0-3]|[0-4]?\\d)/, // 0 to 53\n hour23h: /^(2[0-3]|[0-1]?\\d)/, // 0 to 23\n hour24h: /^(2[0-4]|[0-1]?\\d)/, // 0 to 24\n hour11h: /^(1[0-1]|0?\\d)/, // 0 to 11\n hour12h: /^(1[0-2]|0?\\d)/, // 0 to 12\n minute: /^[0-5]?\\d/, // 0 to 59\n second: /^[0-5]?\\d/, // 0 to 59\n\n singleDigit: /^\\d/, // 0 to 9\n twoDigits: /^\\d{1,2}/, // 0 to 99\n threeDigits: /^\\d{1,3}/, // 0 to 999\n fourDigits: /^\\d{1,4}/, // 0 to 9999\n\n anyDigitsSigned: /^-?\\d+/,\n singleDigitSigned: /^-?\\d/, // 0 to 9, -0 to -9\n twoDigitsSigned: /^-?\\d{1,2}/, // 0 to 99, -0 to -99\n threeDigitsSigned: /^-?\\d{1,3}/, // 0 to 999, -0 to -999\n fourDigitsSigned: /^-?\\d{1,4}/, // 0 to 9999, -0 to -9999\n};\n\nexport const timezonePatterns = {\n basicOptionalMinutes: /^([+-])(\\d{2})(\\d{2})?|Z/,\n basic: /^([+-])(\\d{2})(\\d{2})|Z/,\n basicOptionalSeconds: /^([+-])(\\d{2})(\\d{2})((\\d{2}))?|Z/,\n extended: /^([+-])(\\d{2}):(\\d{2})|Z/,\n extendedOptionalSeconds: /^([+-])(\\d{2}):(\\d{2})(:(\\d{2}))?|Z/,\n};\n","import {\n millisecondsInHour,\n millisecondsInMinute,\n millisecondsInSecond,\n} from \"../../constants.js\";\n\nimport { numericPatterns } from \"./constants.js\";\n\nexport function mapValue(parseFnResult, mapFn) {\n if (!parseFnResult) {\n return parseFnResult;\n }\n\n return {\n value: mapFn(parseFnResult.value),\n rest: parseFnResult.rest,\n };\n}\n\nexport function parseNumericPattern(pattern, dateString) {\n const matchResult = dateString.match(pattern);\n\n if (!matchResult) {\n return null;\n }\n\n return {\n value: parseInt(matchResult[0], 10),\n rest: dateString.slice(matchResult[0].length),\n };\n}\n\nexport function parseTimezonePattern(pattern, dateString) {\n const matchResult = dateString.match(pattern);\n\n if (!matchResult) {\n return null;\n }\n\n // Input is 'Z'\n if (matchResult[0] === \"Z\") {\n return {\n value: 0,\n rest: dateString.slice(1),\n };\n }\n\n const sign = matchResult[1] === \"+\" ? 1 : -1;\n const hours = matchResult[2] ? parseInt(matchResult[2], 10) : 0;\n const minutes = matchResult[3] ? parseInt(matchResult[3], 10) : 0;\n const seconds = matchResult[5] ? parseInt(matchResult[5], 10) : 0;\n\n return {\n value:\n sign *\n (hours * millisecondsInHour +\n minutes * millisecondsInMinute +\n seconds * millisecondsInSecond),\n rest: dateString.slice(matchResult[0].length),\n };\n}\n\nexport function parseAnyDigitsSigned(dateString) {\n return parseNumericPattern(numericPatterns.anyDigitsSigned, dateString);\n}\n\nexport function parseNDigits(n, dateString) {\n switch (n) {\n case 1:\n return parseNumericPattern(numericPatterns.singleDigit, dateString);\n case 2:\n return parseNumericPattern(numericPatterns.twoDigits, dateString);\n case 3:\n return parseNumericPattern(numericPatterns.threeDigits, dateString);\n case 4:\n return parseNumericPattern(numericPatterns.fourDigits, dateString);\n default:\n return parseNumericPattern(new RegExp(\"^\\\\d{1,\" + n + \"}\"), dateString);\n }\n}\n\nexport function parseNDigitsSigned(n, dateString) {\n switch (n) {\n case 1:\n return parseNumericPattern(numericPatterns.singleDigitSigned, dateString);\n case 2:\n return parseNumericPattern(numericPatterns.twoDigitsSigned, dateString);\n case 3:\n return parseNumericPattern(numericPatterns.threeDigitsSigned, dateString);\n case 4:\n return parseNumericPattern(numericPatterns.fourDigitsSigned, dateString);\n default:\n return parseNumericPattern(new RegExp(\"^-?\\\\d{1,\" + n + \"}\"), dateString);\n }\n}\n\nexport function dayPeriodEnumToHours(dayPeriod) {\n switch (dayPeriod) {\n case \"morning\":\n return 4;\n case \"evening\":\n return 17;\n case \"pm\":\n case \"noon\":\n case \"afternoon\":\n return 12;\n case \"am\":\n case \"midnight\":\n case \"night\":\n default:\n return 0;\n }\n}\n\nexport function normalizeTwoDigitYear(twoDigitYear, currentYear) {\n const isCommonEra = currentYear > 0;\n // Absolute number of the current year:\n // 1 -> 1 AC\n // 0 -> 1 BC\n // -1 -> 2 BC\n const absCurrentYear = isCommonEra ? currentYear : 1 - currentYear;\n\n let result;\n if (absCurrentYear <= 50) {\n result = twoDigitYear || 100;\n } else {\n const rangeEnd = absCurrentYear + 50;\n const rangeEndCentury = Math.trunc(rangeEnd / 100) * 100;\n const isPreviousCentury = twoDigitYear >= rangeEnd % 100;\n result = twoDigitYear + rangeEndCentury - (isPreviousCentury ? 100 : 0);\n }\n\n return isCommonEra ? result : 1 - result;\n}\n\nexport function isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { mapValue, normalizeTwoDigitYear, parseNDigits } from \"../utils.js\";\n\n// From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns\n// | Year | y | yy | yyy | yyyy | yyyyy |\n// |----------|-------|----|-------|-------|-------|\n// | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n// | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n// | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n// | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n// | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\nexport class YearParser extends Parser {\n priority = 130;\n incompatibleTokens = [\"Y\", \"R\", \"u\", \"w\", \"I\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n\n parse(dateString, token, match) {\n const valueCallback = (year) => ({\n year,\n isTwoDigitYear: token === \"yy\",\n });\n\n switch (token) {\n case \"y\":\n return mapValue(parseNDigits(4, dateString), valueCallback);\n case \"yo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"year\",\n }),\n valueCallback,\n );\n default:\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n }\n }\n\n validate(_date, value) {\n return value.isTwoDigitYear || value.year > 0;\n }\n\n set(date, flags, value) {\n const currentYear = date.getFullYear();\n\n if (value.isTwoDigitYear) {\n const normalizedTwoDigitYear = normalizeTwoDigitYear(\n value.year,\n currentYear,\n );\n date.setFullYear(normalizedTwoDigitYear, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n const year =\n !(\"era\" in flags) || flags.era === 1 ? value.year : 1 - value.year;\n date.setFullYear(year, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n}\n","import { getWeekYear } from \"../../../getWeekYear.js\";\n\nimport { startOfWeek } from \"../../../startOfWeek.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, normalizeTwoDigitYear, parseNDigits } from \"../utils.js\";\n\n// Local week-numbering year\nexport class LocalWeekYearParser extends Parser {\n priority = 130;\n\n parse(dateString, token, match) {\n const valueCallback = (year) => ({\n year,\n isTwoDigitYear: token === \"YY\",\n });\n\n switch (token) {\n case \"Y\":\n return mapValue(parseNDigits(4, dateString), valueCallback);\n case \"Yo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"year\",\n }),\n valueCallback,\n );\n default:\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n }\n }\n\n validate(_date, value) {\n return value.isTwoDigitYear || value.year > 0;\n }\n\n set(date, flags, value, options) {\n const currentYear = getWeekYear(date, options);\n\n if (value.isTwoDigitYear) {\n const normalizedTwoDigitYear = normalizeTwoDigitYear(\n value.year,\n currentYear,\n );\n date.setFullYear(\n normalizedTwoDigitYear,\n 0,\n options.firstWeekContainsDate,\n );\n date.setHours(0, 0, 0, 0);\n return startOfWeek(date, options);\n }\n\n const year =\n !(\"era\" in flags) || flags.era === 1 ? value.year : 1 - value.year;\n date.setFullYear(year, 0, options.firstWeekContainsDate);\n date.setHours(0, 0, 0, 0);\n return startOfWeek(date, options);\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"Q\",\n \"q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"t\",\n \"T\",\n ];\n}\n","import { startOfISOWeek } from \"../../../startOfISOWeek.js\";\nimport { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigitsSigned } from \"../utils.js\";\n\n// ISO week-numbering year\nexport class ISOWeekYearParser extends Parser {\n priority = 130;\n\n parse(dateString, token) {\n if (token === \"R\") {\n return parseNDigitsSigned(4, dateString);\n }\n\n return parseNDigitsSigned(token.length, dateString);\n }\n\n set(date, _flags, value) {\n const firstWeekOfYear = constructFrom(date, 0);\n firstWeekOfYear.setFullYear(value, 0, 4);\n firstWeekOfYear.setHours(0, 0, 0, 0);\n return startOfISOWeek(firstWeekOfYear);\n }\n\n incompatibleTokens = [\n \"G\",\n \"y\",\n \"Y\",\n \"u\",\n \"Q\",\n \"q\",\n \"M\",\n \"L\",\n \"w\",\n \"d\",\n \"D\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigitsSigned } from \"../utils.js\";\n\nexport class ExtendedYearParser extends Parser {\n priority = 130;\n\n parse(dateString, token) {\n if (token === \"u\") {\n return parseNDigitsSigned(4, dateString);\n }\n\n return parseNDigitsSigned(token.length, dateString);\n }\n\n set(date, _flags, value) {\n date.setFullYear(value, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"G\", \"y\", \"Y\", \"R\", \"w\", \"I\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigits } from \"../utils.js\";\n\nexport class QuarterParser extends Parser {\n priority = 120;\n\n parse(dateString, token, match) {\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n case \"QQ\": // 01, 02, 03, 04\n return parseNDigits(token.length, dateString);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return match.ordinalNumber(dateString, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return (\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return match.quarter(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return (\n match.quarter(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 4;\n }\n\n set(date, _flags, value) {\n date.setMonth((value - 1) * 3, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"M\",\n \"L\",\n \"w\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigits } from \"../utils.js\";\n\nexport class StandAloneQuarterParser extends Parser {\n priority = 120;\n\n parse(dateString, token, match) {\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n case \"qq\": // 01, 02, 03, 04\n return parseNDigits(token.length, dateString);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return match.ordinalNumber(dateString, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return (\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n })\n );\n\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return match.quarter(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return (\n match.quarter(dateString, {\n width: \"wide\",\n context: \"standalone\",\n }) ||\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 4;\n }\n\n set(date, _flags, value) {\n date.setMonth((value - 1) * 3, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class MonthParser extends Parser {\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"L\",\n \"w\",\n \"I\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n\n priority = 110;\n\n parse(dateString, token, match) {\n const valueCallback = (value) => value - 1;\n\n switch (token) {\n // 1, 2, ..., 12\n case \"M\":\n return mapValue(\n parseNumericPattern(numericPatterns.month, dateString),\n valueCallback,\n );\n // 01, 02, ..., 12\n case \"MM\":\n return mapValue(parseNDigits(2, dateString), valueCallback);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"month\",\n }),\n valueCallback,\n );\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return (\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // J, F, ..., D\n case \"MMMMM\":\n return match.month(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return (\n match.month(dateString, { width: \"wide\", context: \"formatting\" }) ||\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 11;\n }\n\n set(date, _flags, value) {\n date.setMonth(value, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class StandAloneMonthParser extends Parser {\n priority = 110;\n\n parse(dateString, token, match) {\n const valueCallback = (value) => value - 1;\n\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return mapValue(\n parseNumericPattern(numericPatterns.month, dateString),\n valueCallback,\n );\n // 01, 02, ..., 12\n case \"LL\":\n return mapValue(parseNDigits(2, dateString), valueCallback);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"month\",\n }),\n valueCallback,\n );\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return (\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n\n // J, F, ..., D\n case \"LLLLL\":\n return match.month(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return (\n match.month(dateString, { width: \"wide\", context: \"standalone\" }) ||\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 11;\n }\n\n set(date, _flags, value) {\n date.setMonth(value, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"M\",\n \"w\",\n \"I\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { getWeek } from \"./getWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setWeek} function options.\n */\n\n/**\n * @name setWeek\n * @category Week Helpers\n * @summary Set the local week to the given date.\n *\n * @description\n * Set the local week to the given date, saving the weekday number.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param week - The week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the local week set\n *\n * @example\n * // Set the 1st week to 2 January 2005 with default options:\n * const result = setWeek(new Date(2005, 0, 2), 1)\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // Set the 1st week to 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January:\n * const result = setWeek(new Date(2005, 0, 2), 1, {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Sun Jan 4 2004 00:00:00\n */\nexport function setWeek(date, week, options) {\n const date_ = toDate(date, options?.in);\n const diff = getWeek(date_, options) - week;\n date_.setDate(date_.getDate() - diff * 7);\n return toDate(date_, options?.in);\n}\n\n// Fallback for modularized imports:\nexport default setWeek;\n","import { setWeek } from \"../../../setWeek.js\";\nimport { startOfWeek } from \"../../../startOfWeek.js\";\nimport { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\n// Local week of year\nexport class LocalWeekParser extends Parser {\n priority = 100;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"w\":\n return parseNumericPattern(numericPatterns.week, dateString);\n case \"wo\":\n return match.ordinalNumber(dateString, { unit: \"week\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 53;\n }\n\n set(date, _flags, value, options) {\n return startOfWeek(setWeek(date, value, options), options);\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"t\",\n \"T\",\n ];\n}\n","import { getISOWeek } from \"./getISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setISOWeek} function options.\n */\n\n/**\n * @name setISOWeek\n * @category ISO Week Helpers\n * @summary Set the ISO week to the given date.\n *\n * @description\n * Set the ISO week to the given date, saving the weekday number.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The `Date` type of the context function.\n *\n * @param date - The date to be changed\n * @param week - The ISO week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the ISO week set\n *\n * @example\n * // Set the 53rd ISO week to 7 August 2004:\n * const result = setISOWeek(new Date(2004, 7, 7), 53)\n * //=> Sat Jan 01 2005 00:00:00\n */\nexport function setISOWeek(date, week, options) {\n const _date = toDate(date, options?.in);\n const diff = getISOWeek(_date, options) - week;\n _date.setDate(_date.getDate() - diff * 7);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default setISOWeek;\n","import { setISOWeek } from \"../../../setISOWeek.js\";\nimport { startOfISOWeek } from \"../../../startOfISOWeek.js\";\nimport { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\n// ISO week of year\nexport class ISOWeekParser extends Parser {\n priority = 100;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"I\":\n return parseNumericPattern(numericPatterns.week, dateString);\n case \"Io\":\n return match.ordinalNumber(dateString, { unit: \"week\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 53;\n }\n\n set(date, _flags, value) {\n return startOfISOWeek(setISOWeek(date, value));\n }\n\n incompatibleTokens = [\n \"y\",\n \"Y\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"d\",\n \"D\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport {\n isLeapYearIndex,\n parseNDigits,\n parseNumericPattern,\n} from \"../utils.js\";\n\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst DAYS_IN_MONTH_LEAP_YEAR = [\n 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,\n];\n\n// Day of the month\nexport class DateParser extends Parser {\n priority = 90;\n subPriority = 1;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"d\":\n return parseNumericPattern(numericPatterns.date, dateString);\n case \"do\":\n return match.ordinalNumber(dateString, { unit: \"date\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(date, value) {\n const year = date.getFullYear();\n const isLeapYear = isLeapYearIndex(year);\n const month = date.getMonth();\n if (isLeapYear) {\n return value >= 1 && value <= DAYS_IN_MONTH_LEAP_YEAR[month];\n } else {\n return value >= 1 && value <= DAYS_IN_MONTH[month];\n }\n }\n\n set(date, _flags, value) {\n date.setDate(value);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"w\",\n \"I\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport {\n isLeapYearIndex,\n parseNDigits,\n parseNumericPattern,\n} from \"../utils.js\";\n\nexport class DayOfYearParser extends Parser {\n priority = 90;\n\n subpriority = 1;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"D\":\n case \"DD\":\n return parseNumericPattern(numericPatterns.dayOfYear, dateString);\n case \"Do\":\n return match.ordinalNumber(dateString, { unit: \"date\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(date, value) {\n const year = date.getFullYear();\n const isLeapYear = isLeapYearIndex(year);\n if (isLeapYear) {\n return value >= 1 && value <= 366;\n } else {\n return value >= 1 && value <= 365;\n }\n }\n\n set(date, _flags, value) {\n date.setMonth(0, value);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"I\",\n \"d\",\n \"E\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { addDays } from \"./addDays.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setDay} function options.\n */\n\n/**\n * @name setDay\n * @category Weekday Helpers\n * @summary Set the day of the week to the given date.\n *\n * @description\n * Set the day of the week to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param day - The day of the week of the new date\n * @param options - An object with options.\n *\n * @returns The new date with the day of the week set\n *\n * @example\n * // Set week day to Sunday, with the default weekStartsOn of Sunday:\n * const result = setDay(new Date(2014, 8, 1), 0)\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // Set week day to Sunday, with a weekStartsOn of Monday:\n * const result = setDay(new Date(2014, 8, 1), 0, { weekStartsOn: 1 })\n * //=> Sun Sep 07 2014 00:00:00\n */\nexport function setDay(date, day, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const date_ = toDate(date, options?.in);\n const currentDay = date_.getDay();\n\n const remainder = day % 7;\n const dayIndex = (remainder + 7) % 7;\n\n const delta = 7 - weekStartsOn;\n const diff =\n day < 0 || day > 6\n ? day - ((currentDay + delta) % 7)\n : ((dayIndex + delta) % 7) - ((currentDay + delta) % 7);\n return addDays(date_, diff, options);\n}\n\n// Fallback for modularized imports:\nexport default setDay;\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\n// Day of week\nexport class DayParser extends Parser {\n priority = 90;\n\n parse(dateString, token, match) {\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return (\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // T\n case \"EEEEE\":\n return match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return (\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // Tuesday\n case \"EEEE\":\n default:\n return (\n match.day(dateString, { width: \"wide\", context: \"formatting\" }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 6;\n }\n\n set(date, _flags, value, options) {\n date = setDay(date, value, options);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"D\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n}\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// Local day of week\nexport class LocalDayParser extends Parser {\n priority = 90;\n parse(dateString, token, match, options) {\n const valueCallback = (value) => {\n // We want here floor instead of trunc, so we get -7 for value 0 instead of 0\n const wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n return ((value + options.weekStartsOn + 6) % 7) + wholeWeekDays;\n };\n\n switch (token) {\n // 3\n case \"e\":\n case \"ee\": // 03\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n // 3rd\n case \"eo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"day\",\n }),\n valueCallback,\n );\n // Tue\n case \"eee\":\n return (\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // T\n case \"eeeee\":\n return match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return (\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // Tuesday\n case \"eeee\":\n default:\n return (\n match.day(dateString, { width: \"wide\", context: \"formatting\" }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 6;\n }\n\n set(date, _flags, value, options) {\n date = setDay(date, value, options);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"E\",\n \"i\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// Stand-alone local day of week\nexport class StandAloneLocalDayParser extends Parser {\n priority = 90;\n\n parse(dateString, token, match, options) {\n const valueCallback = (value) => {\n // We want here floor instead of trunc, so we get -7 for value 0 instead of 0\n const wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n return ((value + options.weekStartsOn + 6) % 7) + wholeWeekDays;\n };\n\n switch (token) {\n // 3\n case \"c\":\n case \"cc\": // 03\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n // 3rd\n case \"co\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"day\",\n }),\n valueCallback,\n );\n // Tue\n case \"ccc\":\n return (\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n\n // T\n case \"ccccc\":\n return match.day(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return (\n match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n\n // Tuesday\n case \"cccc\":\n default:\n return (\n match.day(dateString, { width: \"wide\", context: \"standalone\" }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 6;\n }\n\n set(date, _flags, value, options) {\n date = setDay(date, value, options);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"E\",\n \"i\",\n \"e\",\n \"t\",\n \"T\",\n ];\n}\n","import { addDays } from \"./addDays.js\";\nimport { getISODay } from \"./getISODay.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setISODay} function options.\n */\n\n/**\n * @name setISODay\n * @category Weekday Helpers\n * @summary Set the day of the ISO week to the given date.\n *\n * @description\n * Set the day of the ISO week to the given date.\n * ISO week starts with Monday.\n * 7 is the index of Sunday, 1 is the index of Monday, etc.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param day - The day of the ISO week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the day of the ISO week set\n *\n * @example\n * // Set Sunday to 1 September 2014:\n * const result = setISODay(new Date(2014, 8, 1), 7)\n * //=> Sun Sep 07 2014 00:00:00\n */\nexport function setISODay(date, day, options) {\n const date_ = toDate(date, options?.in);\n const currentDay = getISODay(date_, options);\n const diff = day - currentDay;\n return addDays(date_, diff, options);\n}\n\n// Fallback for modularized imports:\nexport default setISODay;\n","import { setISODay } from \"../../../setISODay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// ISO day of week\nexport class ISODayParser extends Parser {\n priority = 90;\n\n parse(dateString, token, match) {\n const valueCallback = (value) => {\n if (value === 0) {\n return 7;\n }\n return value;\n };\n\n switch (token) {\n // 2\n case \"i\":\n case \"ii\": // 02\n return parseNDigits(token.length, dateString);\n // 2nd\n case \"io\":\n return match.ordinalNumber(dateString, { unit: \"day\" });\n // Tue\n case \"iii\":\n return mapValue(\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"short\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n // T\n case \"iiiii\":\n return mapValue(\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n // Tu\n case \"iiiiii\":\n return mapValue(\n match.day(dateString, {\n width: \"short\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n // Tuesday\n case \"iiii\":\n default:\n return mapValue(\n match.day(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"short\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 7;\n }\n\n set(date, _flags, value) {\n date = setISODay(date, value);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"y\",\n \"Y\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"d\",\n \"D\",\n \"E\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\nexport class AMPMParser extends Parser {\n priority = 80;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"a\":\n case \"aa\":\n case \"aaa\":\n return (\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n case \"aaaaa\":\n return match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return (\n match.dayPeriod(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n set(date, _flags, value) {\n date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"b\", \"B\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\nexport class AMPMMidnightParser extends Parser {\n priority = 80;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"b\":\n case \"bb\":\n case \"bbb\":\n return (\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n case \"bbbbb\":\n return match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return (\n match.dayPeriod(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n set(date, _flags, value) {\n date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"B\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\n// in the morning, in the afternoon, in the evening, at night\nexport class DayPeriodParser extends Parser {\n priority = 80;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return (\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n case \"BBBBB\":\n return match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return (\n match.dayPeriod(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n set(date, _flags, value) {\n date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"b\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour1to12Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"h\":\n return parseNumericPattern(numericPatterns.hour12h, dateString);\n case \"ho\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 12;\n }\n\n set(date, _flags, value) {\n const isPM = date.getHours() >= 12;\n if (isPM && value < 12) {\n date.setHours(value + 12, 0, 0, 0);\n } else if (!isPM && value === 12) {\n date.setHours(0, 0, 0, 0);\n } else {\n date.setHours(value, 0, 0, 0);\n }\n return date;\n }\n\n incompatibleTokens = [\"H\", \"K\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour0to23Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"H\":\n return parseNumericPattern(numericPatterns.hour23h, dateString);\n case \"Ho\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 23;\n }\n\n set(date, _flags, value) {\n date.setHours(value, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"b\", \"h\", \"K\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour0To11Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"K\":\n return parseNumericPattern(numericPatterns.hour11h, dateString);\n case \"Ko\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 11;\n }\n\n set(date, _flags, value) {\n const isPM = date.getHours() >= 12;\n if (isPM && value < 12) {\n date.setHours(value + 12, 0, 0, 0);\n } else {\n date.setHours(value, 0, 0, 0);\n }\n return date;\n }\n\n incompatibleTokens = [\"h\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour1To24Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"k\":\n return parseNumericPattern(numericPatterns.hour24h, dateString);\n case \"ko\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 24;\n }\n\n set(date, _flags, value) {\n const hours = value <= 24 ? value % 24 : value;\n date.setHours(hours, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"b\", \"h\", \"H\", \"K\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class MinuteParser extends Parser {\n priority = 60;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"m\":\n return parseNumericPattern(numericPatterns.minute, dateString);\n case \"mo\":\n return match.ordinalNumber(dateString, { unit: \"minute\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 59;\n }\n\n set(date, _flags, value) {\n date.setMinutes(value, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class SecondParser extends Parser {\n priority = 50;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"s\":\n return parseNumericPattern(numericPatterns.second, dateString);\n case \"so\":\n return match.ordinalNumber(dateString, { unit: \"second\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 59;\n }\n\n set(date, _flags, value) {\n date.setSeconds(value, 0);\n return date;\n }\n\n incompatibleTokens = [\"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\nexport class FractionOfSecondParser extends Parser {\n priority = 30;\n\n parse(dateString, token) {\n const valueCallback = (value) =>\n Math.trunc(value * Math.pow(10, -token.length + 3));\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n }\n\n set(date, _flags, value) {\n date.setMilliseconds(value);\n return date;\n }\n\n incompatibleTokens = [\"t\", \"T\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"../../../_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { timezonePatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseTimezonePattern } from \"../utils.js\";\n\n// Timezone (ISO-8601. +00:00 is `'Z'`)\nexport class ISOTimezoneWithZParser extends Parser {\n priority = 10;\n\n parse(dateString, token) {\n switch (token) {\n case \"X\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalMinutes,\n dateString,\n );\n case \"XX\":\n return parseTimezonePattern(timezonePatterns.basic, dateString);\n case \"XXXX\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalSeconds,\n dateString,\n );\n case \"XXXXX\":\n return parseTimezonePattern(\n timezonePatterns.extendedOptionalSeconds,\n dateString,\n );\n case \"XXX\":\n default:\n return parseTimezonePattern(timezonePatterns.extended, dateString);\n }\n }\n\n set(date, flags, value) {\n if (flags.timestampIsSet) return date;\n return constructFrom(\n date,\n date.getTime() - getTimezoneOffsetInMilliseconds(date) - value,\n );\n }\n\n incompatibleTokens = [\"t\", \"T\", \"x\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"../../../_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { timezonePatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseTimezonePattern } from \"../utils.js\";\n\n// Timezone (ISO-8601)\nexport class ISOTimezoneParser extends Parser {\n priority = 10;\n\n parse(dateString, token) {\n switch (token) {\n case \"x\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalMinutes,\n dateString,\n );\n case \"xx\":\n return parseTimezonePattern(timezonePatterns.basic, dateString);\n case \"xxxx\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalSeconds,\n dateString,\n );\n case \"xxxxx\":\n return parseTimezonePattern(\n timezonePatterns.extendedOptionalSeconds,\n dateString,\n );\n case \"xxx\":\n default:\n return parseTimezonePattern(timezonePatterns.extended, dateString);\n }\n }\n\n set(date, flags, value) {\n if (flags.timestampIsSet) return date;\n return constructFrom(\n date,\n date.getTime() - getTimezoneOffsetInMilliseconds(date) - value,\n );\n }\n\n incompatibleTokens = [\"t\", \"T\", \"X\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseAnyDigitsSigned } from \"../utils.js\";\n\nexport class TimestampSecondsParser extends Parser {\n priority = 40;\n\n parse(dateString) {\n return parseAnyDigitsSigned(dateString);\n }\n\n set(date, _flags, value) {\n return [constructFrom(date, value * 1000), { timestampIsSet: true }];\n }\n\n incompatibleTokens = \"*\";\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseAnyDigitsSigned } from \"../utils.js\";\n\nexport class TimestampMillisecondsParser extends Parser {\n priority = 20;\n\n parse(dateString) {\n return parseAnyDigitsSigned(dateString);\n }\n\n set(date, _flags, value) {\n return [constructFrom(date, value), { timestampIsSet: true }];\n }\n\n incompatibleTokens = \"*\";\n}\n","import { EraParser } from \"./parsers/EraParser.js\";\nimport { YearParser } from \"./parsers/YearParser.js\";\nimport { LocalWeekYearParser } from \"./parsers/LocalWeekYearParser.js\";\nimport { ISOWeekYearParser } from \"./parsers/ISOWeekYearParser.js\";\nimport { ExtendedYearParser } from \"./parsers/ExtendedYearParser.js\";\nimport { QuarterParser } from \"./parsers/QuarterParser.js\";\nimport { StandAloneQuarterParser } from \"./parsers/StandAloneQuarterParser.js\";\nimport { MonthParser } from \"./parsers/MonthParser.js\";\nimport { StandAloneMonthParser } from \"./parsers/StandAloneMonthParser.js\";\nimport { LocalWeekParser } from \"./parsers/LocalWeekParser.js\";\nimport { ISOWeekParser } from \"./parsers/ISOWeekParser.js\";\nimport { DateParser } from \"./parsers/DateParser.js\";\nimport { DayOfYearParser } from \"./parsers/DayOfYearParser.js\";\nimport { DayParser } from \"./parsers/DayParser.js\";\nimport { LocalDayParser } from \"./parsers/LocalDayParser.js\";\nimport { StandAloneLocalDayParser } from \"./parsers/StandAloneLocalDayParser.js\";\nimport { ISODayParser } from \"./parsers/ISODayParser.js\";\nimport { AMPMParser } from \"./parsers/AMPMParser.js\";\nimport { AMPMMidnightParser } from \"./parsers/AMPMMidnightParser.js\";\nimport { DayPeriodParser } from \"./parsers/DayPeriodParser.js\";\nimport { Hour1to12Parser } from \"./parsers/Hour1to12Parser.js\";\nimport { Hour0to23Parser } from \"./parsers/Hour0to23Parser.js\";\nimport { Hour0To11Parser } from \"./parsers/Hour0To11Parser.js\";\nimport { Hour1To24Parser } from \"./parsers/Hour1To24Parser.js\";\nimport { MinuteParser } from \"./parsers/MinuteParser.js\";\nimport { SecondParser } from \"./parsers/SecondParser.js\";\nimport { FractionOfSecondParser } from \"./parsers/FractionOfSecondParser.js\";\nimport { ISOTimezoneWithZParser } from \"./parsers/ISOTimezoneWithZParser.js\";\nimport { ISOTimezoneParser } from \"./parsers/ISOTimezoneParser.js\";\nimport { TimestampSecondsParser } from \"./parsers/TimestampSecondsParser.js\";\nimport { TimestampMillisecondsParser } from \"./parsers/TimestampMillisecondsParser.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O* | Timezone (GMT) |\n * | p | | P | |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z* | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `parse` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n */\nexport const parsers = {\n G: new EraParser(),\n y: new YearParser(),\n Y: new LocalWeekYearParser(),\n R: new ISOWeekYearParser(),\n u: new ExtendedYearParser(),\n Q: new QuarterParser(),\n q: new StandAloneQuarterParser(),\n M: new MonthParser(),\n L: new StandAloneMonthParser(),\n w: new LocalWeekParser(),\n I: new ISOWeekParser(),\n d: new DateParser(),\n D: new DayOfYearParser(),\n E: new DayParser(),\n e: new LocalDayParser(),\n c: new StandAloneLocalDayParser(),\n i: new ISODayParser(),\n a: new AMPMParser(),\n b: new AMPMMidnightParser(),\n B: new DayPeriodParser(),\n h: new Hour1to12Parser(),\n H: new Hour0to23Parser(),\n K: new Hour0To11Parser(),\n k: new Hour1To24Parser(),\n m: new MinuteParser(),\n s: new SecondParser(),\n S: new FractionOfSecondParser(),\n X: new ISOTimezoneWithZParser(),\n x: new ISOTimezoneParser(),\n t: new TimestampSecondsParser(),\n T: new TimestampMillisecondsParser(),\n};\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getDefaultOptions } from \"./getDefaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\nimport { DateTimezoneSetter } from \"./parse/_lib/Setter.js\";\nimport { parsers } from \"./parse/_lib/parsers.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { longFormatters, parsers };\n\n/**\n * The {@link parse} function options.\n */\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\n\nconst notWhitespaceRegExp = /\\S/;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\n/**\n * @name parse\n * @category Common Helpers\n * @summary Parse the date.\n *\n * @description\n * Return the date parsed from string using the given format string.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters in the format string wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n *\n * Format of the format string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 5 below the table).\n *\n * Not all tokens are compatible. Combinations that don't make sense or could lead to bugs are prohibited\n * and will throw `RangeError`. For example usage of 24-hour format token with AM/PM token will throw an exception:\n *\n * ```javascript\n * parse('23 AM', 'HH a', new Date())\n * //=> RangeError: The format string mustn't contain `HH` and `a` at the same time\n * ```\n *\n * See the compatibility table: https://docs.google.com/spreadsheets/d/e/2PACX-1vQOPU3xUhplll6dyoMmVUXHKl_8CRDs6_ueLmex3SoqwhuolkuN3O05l4rqx5h1dKX8eb46Ul-CCSrq/pubhtml?gid=0&single=true\n *\n * Accepted format string patterns:\n * | Unit |Prior| Pattern | Result examples | Notes |\n * |---------------------------------|-----|---------|-----------------------------------|-------|\n * | Era | 140 | G..GGG | AD, BC | |\n * | | | GGGG | Anno Domini, Before Christ | 2 |\n * | | | GGGGG | A, B | |\n * | Calendar year | 130 | y | 44, 1, 1900, 2017, 9999 | 4 |\n * | | | yo | 44th, 1st, 1900th, 9999999th | 4,5 |\n * | | | yy | 44, 01, 00, 17 | 4 |\n * | | | yyy | 044, 001, 123, 999 | 4 |\n * | | | yyyy | 0044, 0001, 1900, 2017 | 4 |\n * | | | yyyyy | ... | 2,4 |\n * | Local week-numbering year | 130 | Y | 44, 1, 1900, 2017, 9000 | 4 |\n * | | | Yo | 44th, 1st, 1900th, 9999999th | 4,5 |\n * | | | YY | 44, 01, 00, 17 | 4,6 |\n * | | | YYY | 044, 001, 123, 999 | 4 |\n * | | | YYYY | 0044, 0001, 1900, 2017 | 4,6 |\n * | | | YYYYY | ... | 2,4 |\n * | ISO week-numbering year | 130 | R | -43, 1, 1900, 2017, 9999, -9999 | 4,5 |\n * | | | RR | -43, 01, 00, 17 | 4,5 |\n * | | | RRR | -043, 001, 123, 999, -999 | 4,5 |\n * | | | RRRR | -0043, 0001, 2017, 9999, -9999 | 4,5 |\n * | | | RRRRR | ... | 2,4,5 |\n * | Extended year | 130 | u | -43, 1, 1900, 2017, 9999, -999 | 4 |\n * | | | uu | -43, 01, 99, -99 | 4 |\n * | | | uuu | -043, 001, 123, 999, -999 | 4 |\n * | | | uuuu | -0043, 0001, 2017, 9999, -9999 | 4 |\n * | | | uuuuu | ... | 2,4 |\n * | Quarter (formatting) | 120 | Q | 1, 2, 3, 4 | |\n * | | | Qo | 1st, 2nd, 3rd, 4th | 5 |\n * | | | QQ | 01, 02, 03, 04 | |\n * | | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | 120 | q | 1, 2, 3, 4 | |\n * | | | qo | 1st, 2nd, 3rd, 4th | 5 |\n * | | | qq | 01, 02, 03, 04 | |\n * | | | qqq | Q1, Q2, Q3, Q4 | |\n * | | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | | qqqqq | 1, 2, 3, 4 | 3 |\n * | Month (formatting) | 110 | M | 1, 2, ..., 12 | |\n * | | | Mo | 1st, 2nd, ..., 12th | 5 |\n * | | | MM | 01, 02, ..., 12 | |\n * | | | MMM | Jan, Feb, ..., Dec | |\n * | | | MMMM | January, February, ..., December | 2 |\n * | | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | 110 | L | 1, 2, ..., 12 | |\n * | | | Lo | 1st, 2nd, ..., 12th | 5 |\n * | | | LL | 01, 02, ..., 12 | |\n * | | | LLL | Jan, Feb, ..., Dec | |\n * | | | LLLL | January, February, ..., December | 2 |\n * | | | LLLLL | J, F, ..., D | |\n * | Local week of year | 100 | w | 1, 2, ..., 53 | |\n * | | | wo | 1st, 2nd, ..., 53th | 5 |\n * | | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | 100 | I | 1, 2, ..., 53 | 5 |\n * | | | Io | 1st, 2nd, ..., 53th | 5 |\n * | | | II | 01, 02, ..., 53 | 5 |\n * | Day of month | 90 | d | 1, 2, ..., 31 | |\n * | | | do | 1st, 2nd, ..., 31st | 5 |\n * | | | dd | 01, 02, ..., 31 | |\n * | Day of year | 90 | D | 1, 2, ..., 365, 366 | 7 |\n * | | | Do | 1st, 2nd, ..., 365th, 366th | 5 |\n * | | | DD | 01, 02, ..., 365, 366 | 7 |\n * | | | DDD | 001, 002, ..., 365, 366 | |\n * | | | DDDD | ... | 2 |\n * | Day of week (formatting) | 90 | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | | EEEEE | M, T, W, T, F, S, S | |\n * | | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | 90 | i | 1, 2, 3, ..., 7 | 5 |\n * | | | io | 1st, 2nd, ..., 7th | 5 |\n * | | | ii | 01, 02, ..., 07 | 5 |\n * | | | iii | Mon, Tue, Wed, ..., Sun | 5 |\n * | | | iiii | Monday, Tuesday, ..., Sunday | 2,5 |\n * | | | iiiii | M, T, W, T, F, S, S | 5 |\n * | | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 5 |\n * | Local day of week (formatting) | 90 | e | 2, 3, 4, ..., 1 | |\n * | | | eo | 2nd, 3rd, ..., 1st | 5 |\n * | | | ee | 02, 03, ..., 01 | |\n * | | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | | eeeee | M, T, W, T, F, S, S | |\n * | | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | 90 | c | 2, 3, 4, ..., 1 | |\n * | | | co | 2nd, 3rd, ..., 1st | 5 |\n * | | | cc | 02, 03, ..., 01 | |\n * | | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | | ccccc | M, T, W, T, F, S, S | |\n * | | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | 80 | a..aaa | AM, PM | |\n * | | | aaaa | a.m., p.m. | 2 |\n * | | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | 80 | b..bbb | AM, PM, noon, midnight | |\n * | | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | | bbbbb | a, p, n, mi | |\n * | Flexible day period | 80 | B..BBB | at night, in the morning, ... | |\n * | | | BBBB | at night, in the morning, ... | 2 |\n * | | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | 70 | h | 1, 2, ..., 11, 12 | |\n * | | | ho | 1st, 2nd, ..., 11th, 12th | 5 |\n * | | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | 70 | H | 0, 1, 2, ..., 23 | |\n * | | | Ho | 0th, 1st, 2nd, ..., 23rd | 5 |\n * | | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | 70 | K | 1, 2, ..., 11, 0 | |\n * | | | Ko | 1st, 2nd, ..., 11th, 0th | 5 |\n * | | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | 70 | k | 24, 1, 2, ..., 23 | |\n * | | | ko | 24th, 1st, 2nd, ..., 23rd | 5 |\n * | | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | 60 | m | 0, 1, ..., 59 | |\n * | | | mo | 0th, 1st, ..., 59th | 5 |\n * | | | mm | 00, 01, ..., 59 | |\n * | Second | 50 | s | 0, 1, ..., 59 | |\n * | | | so | 0th, 1st, ..., 59th | 5 |\n * | | | ss | 00, 01, ..., 59 | |\n * | Seconds timestamp | 40 | t | 512969520 | |\n * | | | tt | ... | 2 |\n * | Fraction of second | 30 | S | 0, 1, ..., 9 | |\n * | | | SS | 00, 01, ..., 99 | |\n * | | | SSS | 000, 001, ..., 999 | |\n * | | | SSSS | ... | 2 |\n * | Milliseconds timestamp | 20 | T | 512969520900 | |\n * | | | TT | ... | 2 |\n * | Timezone (ISO-8601 w/ Z) | 10 | X | -08, +0530, Z | |\n * | | | XX | -0800, +0530, Z | |\n * | | | XXX | -08:00, +05:30, Z | |\n * | | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | 10 | x | -08, +0530, +00 | |\n * | | | xx | -0800, +0530, +0000 | |\n * | | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Long localized date | NA | P | 05/29/1453 | 5,8 |\n * | | | PP | May 29, 1453 | |\n * | | | PPP | May 29th, 1453 | |\n * | | | PPPP | Sunday, May 29th, 1453 | 2,5,8 |\n * | Long localized time | NA | p | 12:00 AM | 5,8 |\n * | | | pp | 12:00:00 AM | |\n * | Combination of date and time | NA | Pp | 05/29/1453, 12:00 AM | |\n * | | | PPpp | May 29, 1453, 12:00:00 AM | |\n * | | | PPPpp | May 29th, 1453 at ... | |\n * | | | PPPPpp | Sunday, May 29th, 1453 at ... | 2,5,8 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular.\n * In `format` function, they will produce different result:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * `parse` will try to match both formatting and stand-alone units interchangeably.\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table:\n * - for numerical units (`yyyyyyyy`) `parse` will try to match a number\n * as wide as the sequence\n * - for text units (`MMMMMMMM`) `parse` will try to match the widest variation of the unit.\n * These variations are marked with \"2\" in the last column of the table.\n *\n * 3. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 4. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` will try to guess the century of two digit year by proximity with `referenceDate`:\n *\n * `parse('50', 'yy', new Date(2018, 0, 1)) //=> Sat Jan 01 2050 00:00:00`\n *\n * `parse('75', 'yy', new Date(2018, 0, 1)) //=> Wed Jan 01 1975 00:00:00`\n *\n * while `uu` will just assign the year as is:\n *\n * `parse('50', 'uu', new Date(2018, 0, 1)) //=> Sat Jan 01 0050 00:00:00`\n *\n * `parse('75', 'uu', new Date(2018, 0, 1)) //=> Tue Jan 01 0075 00:00:00`\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [setISOWeekYear](https://date-fns.org/docs/setISOWeekYear)\n * and [setWeekYear](https://date-fns.org/docs/setWeekYear)).\n *\n * 5. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 6. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 7. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 8. `P+` tokens do not have a defined priority since they are merely aliases to other tokens based\n * on the given locale.\n *\n * using `en-US` locale: `P` => `MM/dd/yyyy`\n * using `en-US` locale: `p` => `hh:mm a`\n * using `pt-BR` locale: `P` => `dd/MM/yyyy`\n * using `pt-BR` locale: `p` => `HH:mm`\n *\n * Values will be assigned to the date in the descending order of its unit's priority.\n * Units of an equal priority overwrite each other in the order of appearance.\n *\n * If no values of higher priority are parsed (e.g. when parsing string 'January 1st' without a year),\n * the values will be taken from 3rd argument `referenceDate` which works as a context of parsing.\n *\n * `referenceDate` must be passed for correct work of the function.\n * If you're not sure which `referenceDate` to supply, create a new instance of Date:\n * `parse('02/11/2014', 'MM/dd/yyyy', new Date())`\n * In this case parsing will be done in the context of the current date.\n * If `referenceDate` is `Invalid Date` or a value not convertible to valid `Date`,\n * then `Invalid Date` will be returned.\n *\n * The result may vary by locale.\n *\n * If `formatString` matches with `dateString` but does not provides tokens, `referenceDate` will be returned.\n *\n * If parsing failed, `Invalid Date` will be returned.\n * Invalid Date is a Date, whose time value is NaN.\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param dateStr - The string to parse\n * @param formatStr - The string of tokens\n * @param referenceDate - defines values missing from the parsed dateString\n * @param options - An object with options.\n * see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @returns The parsed date\n *\n * @throws `options.locale` must contain `match` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Parse 11 February 2014 from middle-endian format:\n * var result = parse('02/11/2014', 'MM/dd/yyyy', new Date())\n * //=> Tue Feb 11 2014 00:00:00\n *\n * @example\n * // Parse 28th of February in Esperanto locale in the context of 2010 year:\n * import eo from 'date-fns/locale/eo'\n * var result = parse('28-a de februaro', \"do 'de' MMMM\", new Date(2010, 0, 1), {\n * locale: eo\n * })\n * //=> Sun Feb 28 2010 00:00:00\n */\nexport function parse(dateStr, formatStr, referenceDate, options) {\n const invalidDate = () => constructFrom(options?.in || referenceDate, NaN);\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n if (!formatStr)\n return dateStr ? invalidDate() : toDate(referenceDate, options?.in);\n\n const subFnOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n // If timezone isn't specified, it will try to use the context or\n // the reference date and fallback to the system time zone.\n const setters = [new DateTimezoneSetter(options?.in, referenceDate)];\n\n const tokens = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter in longFormatters) {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp);\n\n const usedTokens = [];\n\n for (let token of tokens) {\n if (\n !options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)\n ) {\n warnOrThrowProtectedError(token, formatStr, dateStr);\n }\n if (\n !options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token)\n ) {\n warnOrThrowProtectedError(token, formatStr, dateStr);\n }\n\n const firstCharacter = token[0];\n const parser = parsers[firstCharacter];\n if (parser) {\n const { incompatibleTokens } = parser;\n if (Array.isArray(incompatibleTokens)) {\n const incompatibleToken = usedTokens.find(\n (usedToken) =>\n incompatibleTokens.includes(usedToken.token) ||\n usedToken.token === firstCharacter,\n );\n if (incompatibleToken) {\n throw new RangeError(\n `The format string mustn't contain \\`${incompatibleToken.fullToken}\\` and \\`${token}\\` at the same time`,\n );\n }\n } else if (parser.incompatibleTokens === \"*\" && usedTokens.length > 0) {\n throw new RangeError(\n `The format string mustn't contain \\`${token}\\` and any other token at the same time`,\n );\n }\n\n usedTokens.push({ token: firstCharacter, fullToken: token });\n\n const parseResult = parser.run(\n dateStr,\n token,\n locale.match,\n subFnOptions,\n );\n\n if (!parseResult) {\n return invalidDate();\n }\n\n setters.push(parseResult.setter);\n\n dateStr = parseResult.rest;\n } else {\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n // Replace two single quote characters with one single quote character\n if (token === \"''\") {\n token = \"'\";\n } else if (firstCharacter === \"'\") {\n token = cleanEscapedString(token);\n }\n\n // Cut token from string, or, if string doesn't match the token, return Invalid Date\n if (dateStr.indexOf(token) === 0) {\n dateStr = dateStr.slice(token.length);\n } else {\n return invalidDate();\n }\n }\n }\n\n // Check if the remaining input contains something other than whitespace\n if (dateStr.length > 0 && notWhitespaceRegExp.test(dateStr)) {\n return invalidDate();\n }\n\n const uniquePrioritySetters = setters\n .map((setter) => setter.priority)\n .sort((a, b) => b - a)\n .filter((priority, index, array) => array.indexOf(priority) === index)\n .map((priority) =>\n setters\n .filter((setter) => setter.priority === priority)\n .sort((a, b) => b.subPriority - a.subPriority),\n )\n .map((setterArray) => setterArray[0]);\n\n let date = toDate(referenceDate, options?.in);\n\n if (isNaN(+date)) return invalidDate();\n\n const flags = {};\n for (const setter of uniquePrioritySetters) {\n if (!setter.validate(date, subFnOptions)) {\n return invalidDate();\n }\n\n const result = setter.set(date, flags, subFnOptions);\n // Result is tuple (date, flags)\n if (Array.isArray(result)) {\n date = result[0];\n Object.assign(flags, result[1]);\n // Result is date\n } else {\n date = result;\n }\n }\n\n return date;\n}\n\nfunction cleanEscapedString(input) {\n return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default parse;\n","import { createContext, use } from \"react\";\nimport type { SubscriptionsApi } from \"./subscriptions-api\";\n\nconst SubscriptionsApiContext = createContext<SubscriptionsApi | null>(null);\n\nexport const SubscriptionsApiProvider = SubscriptionsApiContext.Provider;\n\nexport function useSubscriptionsApi(): SubscriptionsApi {\n const api = use(SubscriptionsApiContext);\n if (!api) {\n throw new Error(\n \"useSubscriptionsApi must be used within a SubscriptionsCoreProvider\",\n );\n }\n return api;\n}\n","import type { JSX } from \"react\";\nimport type { SubscriptionsApi } from \"./subscriptions-api\";\nimport { SubscriptionsApiProvider } from \"./subscriptions-api-context\";\n\nexport interface SubscriptionsCoreProviderProps {\n api: SubscriptionsApi;\n children: React.ReactNode;\n}\n\nexport function SubscriptionsCoreProvider({\n api,\n children,\n}: SubscriptionsCoreProviderProps): JSX.Element {\n return (\n <SubscriptionsApiProvider value={api}>{children}</SubscriptionsApiProvider>\n );\n}\n","import type { subscriptions } from \"./types\";\n\nexport const subscriptionsKeys = {\n all: [\"subscriptions\"] as const,\n list: (params?: subscriptions.FetchSubscriptionsParams) =>\n [...subscriptionsKeys.all, \"list\", params] as const,\n detail: (token: string) =>\n [...subscriptionsKeys.all, \"detail\", token] as const,\n} as const;\n\nexport const bundlesKeys = {\n all: [\"subscription_bundles\"] as const,\n list: () => [...bundlesKeys.all, \"list\"] as const,\n} as const;\n","import { createContext, use } from \"react\";\nimport type { BundlesApi } from \"./bundles-api\";\n\nconst BundlesApiContext = createContext<BundlesApi | null>(null);\n\nexport const BundlesApiProvider = BundlesApiContext.Provider;\n\nexport function useBundlesApi(): BundlesApi {\n const api = use(BundlesApiContext);\n if (!api) {\n throw new Error(\"useBundlesApi must be used within a BundlesCoreProvider\");\n }\n return api;\n}\n","import type { JSX } from \"react\";\nimport type { BundlesApi } from \"./bundles-api\";\nimport { BundlesApiProvider } from \"./bundles-api-context\";\n\nexport interface BundlesCoreProviderProps {\n api: BundlesApi;\n children: React.ReactNode;\n}\n\nexport function BundlesCoreProvider({\n api,\n children,\n}: BundlesCoreProviderProps): JSX.Element {\n return <BundlesApiProvider value={api}>{children}</BundlesApiProvider>;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useSubscriptions(\n params: subscriptions.FetchSubscriptionsParams,\n options?: { enabled?: boolean },\n) {\n const api = useSubscriptionsApi();\n return useQuery({\n queryKey: subscriptionsKeys.list(params),\n queryFn: () => api.fetchCustomerSubscriptions(params),\n enabled: options?.enabled ?? !!params.customerId,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useInfiniteSubscriptions(\n params: Omit<subscriptions.FetchSubscriptionsParams, \"cursor\" | \"page\">,\n options?: { enabled?: boolean },\n) {\n const api = useSubscriptionsApi();\n return useInfiniteQuery({\n queryKey: [...subscriptionsKeys.all, \"infinite-list\", params],\n queryFn: ({ pageParam }) =>\n api.fetchCustomerSubscriptions({\n ...params,\n cursor: pageParam,\n limit: params.limit ?? params.perPage,\n }),\n getNextPageParam: (lastPage) =>\n lastPage.meta?.pagination?.next_cursor ?? undefined,\n initialPageParam: undefined as string | undefined,\n enabled: options?.enabled ?? !!params.customerId,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useSubscription(\n token: string,\n options?: { enabled?: boolean },\n) {\n const api = useSubscriptionsApi();\n return useQuery({\n queryKey: subscriptionsKeys.detail(token),\n queryFn: () => api.fetchSubscription(token),\n enabled: (options?.enabled ?? true) && !!token,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function usePauseSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n pauseParams: subscriptions.PauseSubscriptionParams;\n }) => api.pauseSubscription(params.subscriptionToken, params.pauseParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useResumeSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n resumeParams: subscriptions.ResumeSubscriptionParams;\n }) => api.resumeSubscription(params.subscriptionToken, params.resumeParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useSkipSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n skipParams: subscriptions.SkipSubscriptionParams;\n }) => api.skipSubscription(params.subscriptionToken, params.skipParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useCancelSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: { subscriptionToken: string; customerId?: number }) =>\n api.cancelSubscription(params.subscriptionToken, params.customerId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useReactivateSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n reactivateParams: subscriptions.ReactivateSubscriptionParams;\n }) =>\n api.reactivateSubscription(\n params.subscriptionToken,\n params.reactivateParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\n// Wraps the explicit retry endpoint. The customer-facing UI calls this\n// after a successful payment-method update so the retry is opt-in\n// (vs. a side-effect of the update). See SubscriptionsApi#retrySubscription.\nexport function useRetrySubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: { subscriptionToken: string }) =>\n api.retrySubscription(params.subscriptionToken),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useUpdateSubscriptionInfo(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n // Opt out of the hook's auto-invalidation when the consumer needs\n // to chain another mutation (e.g. payment-method update → retry).\n // Without this, the auto-invalidate fires immediately on update\n // success and the chained mutation triggers a second refetch later\n // — two round-trips for one orchestrated flow. Consumers that opt\n // out are responsible for calling invalidateQueries themselves\n // after their orchestration completes.\n skipAutoInvalidate?: boolean;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n body: Partial<\n Pick<\n subscriptions.UpdateSubscriptionInfoBody,\n \"payment_method_id\" | \"quantity\" | \"address_id\" | \"next_bill_date\"\n >\n >;\n }) => api.updateSubscriptionInfo(params.subscriptionToken, params.body),\n onSuccess: () => {\n if (!options?.skipAutoInvalidate) {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n }\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { bundlesKeys } from \"../query-keys\";\nimport { useBundlesApi } from \"../bundles-api-context\";\n\nexport function useBundles(options?: { enabled?: boolean }) {\n const api = useBundlesApi();\n return useQuery({\n queryKey: bundlesKeys.list(),\n queryFn: () => api.fetchBundles(),\n enabled: options?.enabled ?? true,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { bundlesKeys, subscriptionsKeys } from \"../query-keys\";\nimport { useBundlesApi } from \"../bundles-api-context\";\n\nexport function useCreateBundle(options?: {\n onSuccess?: (bundle: subscriptions.Bundle) => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useBundlesApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: subscriptions.CreateBundleParams) =>\n api.createBundle(params),\n onSuccess: (bundle) => {\n queryClient.invalidateQueries({ queryKey: bundlesKeys.all });\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.(bundle);\n },\n onError: options?.onError,\n });\n}\n","interface SubscriptionPriceItem {\n allow_subscription: boolean;\n subscription_interval: number | null;\n subscription_price_in_currency: string | null;\n}\n\nexport function getSubscriptionPrice(\n item: SubscriptionPriceItem,\n): string | null {\n if (!item.allow_subscription) return null;\n const intervalText =\n item.subscription_interval === 1\n ? \"month\"\n : `${item.subscription_interval} mo.`;\n return `${item.subscription_price_in_currency}/${intervalText}`;\n}\n\nexport function formatSubscriptionFrequency(frequency: string): string {\n if (frequency === \"day\") return \"Daily\";\n if (frequency === \"week\") return \"Weekly\";\n if (frequency === \"month\") return \"Monthly\";\n if (frequency === \"year\") return \"Yearly\";\n return frequency;\n}\n\nexport function calculateResumeDate(\n billingInterval: number,\n billingIntervalUnit: string,\n orderCount: number,\n fromDate?: string | Date | null,\n): Date {\n let startDate: Date;\n\n if (fromDate) {\n if (typeof fromDate === \"string\") {\n startDate = new Date(\n fromDate + (fromDate.includes(\"T\") ? \"\" : \"T12:00:00.000Z\"),\n );\n } else {\n startDate = new Date(\n Date.UTC(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n } else {\n const now = new Date();\n startDate = new Date(\n Date.UTC(\n now.getUTCFullYear(),\n now.getUTCMonth(),\n now.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n\n const baseDate = new Date(startDate.getTime());\n const totalIntervals = billingInterval * orderCount;\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals);\n break;\n case \"week\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals * 7);\n break;\n case \"month\": {\n const currentMonth = baseDate.getUTCMonth();\n const currentDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(currentMonth + totalIntervals);\n if (baseDate.getUTCDate() !== currentDay) {\n baseDate.setUTCDate(0);\n }\n break;\n }\n case \"year\":\n baseDate.setUTCFullYear(baseDate.getUTCFullYear() + totalIntervals);\n break;\n default: {\n const defaultMonth = baseDate.getUTCMonth();\n const defaultDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(defaultMonth + totalIntervals);\n if (baseDate.getUTCDate() !== defaultDay) {\n baseDate.setUTCDate(0);\n }\n }\n }\n\n return baseDate;\n}\n\nexport function calculateNextBillDate(\n billingInterval: number = 1,\n billingIntervalUnit: string = \"month\",\n): string {\n const now = new Date();\n const nextBillDate = new Date(now);\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n nextBillDate.setDate(now.getDate() + billingInterval);\n break;\n case \"week\":\n nextBillDate.setDate(now.getDate() + billingInterval * 7);\n break;\n case \"month\":\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n break;\n case \"year\":\n nextBillDate.setFullYear(now.getFullYear() + billingInterval);\n break;\n default:\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n }\n\n return nextBillDate.toISOString().split(\"T\")[0] || \"\";\n}\n\nexport function formatDate(\n dateString: string,\n isCancelled: boolean = false,\n): string {\n if (isCancelled) return \"Cancelled\";\n if (!dateString) return \"Paused\";\n\n const datePortion = dateString.split(\"T\")[0] ?? dateString;\n const parts = datePortion.split(\"-\");\n if (parts.length !== 3) return \"Invalid date\";\n\n const [year, month, day] = parts.map(Number);\n if (!year || !month || !day) return \"Invalid date\";\n const date = new Date(year, month - 1, day);\n\n const monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n\n const dayNum = date.getDate();\n const monthName = monthNames[date.getMonth()];\n const yearNum = date.getFullYear();\n\n const ordinalSuffix = (d: number) => {\n if (d > 3 && d < 21) return \"th\";\n switch (d % 10) {\n case 1:\n return \"st\";\n case 2:\n return \"nd\";\n case 3:\n return \"rd\";\n default:\n return \"th\";\n }\n };\n\n return `${monthName} ${dayNum}${ordinalSuffix(dayNum)}, ${yearNum}`;\n}\n\n// Formats the time-of-day portion of an ISO timestamp in the given IANA\n// timezone. Returns \"\" when no timezone is supplied — the next-order display\n// intentionally omits the time line in that case (the BFF can't promise the\n// stored time-of-day is meaningful without a zone to interpret it in).\nexport function formatTime(\n dateString: string | null | undefined,\n timezone: string | null | undefined,\n): string {\n if (!dateString || !timezone) return \"\";\n const date = new Date(dateString);\n if (Number.isNaN(date.getTime())) return \"\";\n try {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n timeZone: timezone,\n }).format(date);\n } catch {\n // Intl throws on unknown IANA identifiers — fall back to no time rather\n // than crashing the row.\n return \"\";\n }\n}\n\nexport function getNextBillDisplay<\n T extends { status?: string; next_bill_date?: string | null },\n>(subscription: T | null | undefined): string {\n if (subscription?.status === \"cancelled\") return \"Cancelled\";\n if (subscription?.next_bill_date)\n return formatDate(subscription.next_bill_date);\n if (subscription?.status === \"paused\") return \"Paused\";\n return \"N/A\";\n}\n\nexport function calculateSubscriptionPrice(\n totalPrice: number,\n subscribeAndSave: string | null | undefined,\n quantity: number,\n): string {\n if (!subscribeAndSave) return totalPrice.toFixed(2);\n\n const unitDiscountAmount = parseFloat(subscribeAndSave);\n if (isNaN(unitDiscountAmount)) return totalPrice.toFixed(2);\n\n const subscriptionAmount = totalPrice - unitDiscountAmount * quantity;\n return subscriptionAmount.toFixed(2);\n}\n","import type { SubscriptionsApi } from \"@fluid-app/subscriptions-core\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Maps the BFF meta envelope to the port's expected shape.\n */\nfunction mapMeta(raw: { request_id?: string | null; timestamp?: string }): {\n request_id: string;\n timestamp: string;\n} {\n return {\n request_id: raw.request_id ?? \"\",\n timestamp: raw.timestamp ?? \"\",\n };\n}\n\ntype BffSubscriptionResponse = Awaited<\n ReturnType<typeof portalTenant.subscriptions_show>\n>;\n\ntype BffListResponse = Awaited<\n ReturnType<typeof portalTenant.subscriptions_list>\n>;\n\ntype BffSubscription = NonNullable<BffSubscriptionResponse[\"subscription\"]>;\n\n/**\n * Safely parses a price string to a number, returning the fallback if the\n * result is NaN (e.g. non-numeric strings from a malformed BFF response).\n */\nfunction safeParsePrice(\n value: string | null | undefined,\n fallback = 0,\n): number {\n if (!value) return fallback;\n const parsed = parseFloat(value);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\n/**\n * Maps a BFF subscription detail response to the port's SubscriptionDetail.\n *\n * The BFF returns a flat Subscription schema (plan_name, product, etc.) while\n * the port expects richly nested objects (subscription_plan, variant.product).\n * This explicitly maps every field the UI accesses so undefined-property crashes\n * are caught here at the adapter boundary rather than deep in the component tree.\n */\nexport function mapDetailSubscription(\n bff: BffSubscription,\n): subscriptions.SubscriptionDetailSubscription {\n const price = safeParsePrice(bff.total);\n\n return {\n id: bff.id ?? 0,\n subscription_token: bff.token ?? \"\",\n status: bff.status ?? \"\",\n quantity: bff.quantity ?? 1,\n price,\n original_price: safeParsePrice(bff.original_price, price),\n next_bill_date: bff.next_billing_date ?? null,\n last_bill_date: bff.last_billing_date ?? null,\n timezone: bff.timezone ?? null,\n next_ship_date: null,\n last_ship_date: bff.last_shipping_date ?? null,\n disabled: false,\n attempts: 0,\n // The portal-tenant OpenAPI schema dropped last_failed_at/next_retry_at\n // from the Subscription response, but the BFF still returns them at runtime\n // and downstream components (past-due-banner, subscription-detail) rely on\n // them. Read through a cast until the schema is restored. Tracked in\n // CURRENT-1069.\n last_failed_at:\n ((bff as Record<string, unknown>).last_failed_at as\n | string\n | null\n | undefined) ?? null,\n next_retry_at:\n ((bff as Record<string, unknown>).next_retry_at as\n | string\n | null\n | undefined) ?? null,\n skipped_count: 0,\n max_skips: null,\n cancelled_at: null,\n created_at: bff.created_at ?? \"\",\n updated_at: bff.updated_at ?? \"\",\n notes: null,\n subscription_plan: {\n id: bff.plan?.id ?? 0,\n name: bff.plan?.name ?? bff.plan_name ?? \"\",\n billing_interval: bff.plan?.billing_interval ?? 1,\n billing_interval_unit:\n bff.plan?.billing_interval_unit ?? bff.interval ?? \"month\",\n billing_frequency_in_words: bff.plan?.billing_interval_unit\n ? `Every ${bff.plan.billing_interval ?? 1} ${bff.plan.billing_interval_unit}`\n : \"\",\n shipping_interval: 1,\n shipping_interval_unit:\n bff.plan?.billing_interval_unit ?? bff.interval ?? \"month\",\n trial_period: null,\n trial_period_unit: null,\n split_volume: false,\n allow_skipping: bff.plan?.allow_skipping ?? false,\n max_skips: bff.plan?.max_skips ?? null,\n price_adjustment_type: null,\n price_adjustment_amount: null,\n // Variant-level cap exposed via `bff.product.max_quantity` (the BFF\n // sources it from `variants.subscription_max_qty` gated on\n // `limit_subscription`). The FE port still keys it under\n // `subscription_plan` for back-compat with the existing UI consumer.\n max_quantity: bff.product?.max_quantity ?? null,\n active: true,\n company_default: null,\n created_at: \"\",\n updated_at: \"\",\n products_count: null,\n subscribers_count: null,\n },\n customer: {\n id: 0,\n account_id: null,\n first_name: null,\n last_name: null,\n full_name: bff.customer_name ?? \"\",\n email: \"\",\n verified_email: null,\n phone: null,\n orders_count: null,\n created_at: \"\",\n display_total_spent: \"0\",\n metadata: {},\n user_company_id: null,\n external_id: null,\n last_order_id: null,\n notes: null,\n active: true,\n total_spent: 0,\n customer_notes: [],\n default_address: null,\n addresses: [],\n active_subscriptions_count: 0,\n inactive_subscriptions_count: 0,\n is_rep: false,\n },\n variant: {\n id: bff.product?.id ?? 0,\n title: bff.product?.variant_name ?? \"\",\n image_url: bff.product?.image_url ?? null,\n image_path: null,\n sku: null,\n primary_image: bff.product?.image_url ?? null,\n price: bff.total ? safeParsePrice(bff.total) : null,\n price_in_currency: bff.total ?? \"0\",\n options: [],\n product: {\n id: bff.product?.id ?? 0,\n title: bff.product?.name ?? \"\",\n image_url: bff.product?.image_url ?? null,\n image_path: null,\n price: bff.total ? safeParsePrice(bff.total) : null,\n cv: null,\n tax: null,\n sku: null,\n price_in_currency: bff.total ?? \"0\",\n tax_in_currency: \"0\",\n cv_in_currency: \"0\",\n },\n },\n address: bff.address\n ? {\n id: bff.address.id ?? 0,\n name: bff.address.name ?? null,\n address1: bff.address.address1 ?? \"\",\n address2: bff.address.address2 ?? null,\n city: bff.address.city ?? \"\",\n state: bff.address.state ?? \"\",\n subdivision_code: null,\n postal_code: bff.address.postal_code ?? \"\",\n country_code: bff.address.country_code ?? null,\n default: false,\n }\n : {\n id: 0,\n name: null,\n address1: \"\",\n address2: null,\n city: \"\",\n state: \"\",\n subdivision_code: null,\n postal_code: \"\",\n country_code: null,\n default: false,\n },\n payment_method: bff.payment_method\n ? {\n id: bff.payment_method.id ?? 0,\n source: bff.payment_method.source ?? \"\",\n payment_type:\n bff.payment_method.payment_type ?? bff.payment_method.source ?? \"\",\n created_at: \"\",\n updated_at: \"\",\n default: false,\n details: {\n card_type: bff.payment_method.card_type ?? undefined,\n last4: bff.payment_method.last4 ?? undefined,\n },\n }\n : {\n id: 0,\n source: \"\",\n payment_type: \"\",\n created_at: \"\",\n updated_at: \"\",\n default: false,\n details: {},\n },\n currency: {\n id: 0,\n name: bff.currency ?? null,\n code: bff.currency ?? \"USD\",\n rate: null,\n active: true,\n symbol: null,\n },\n country: { id: 0, name: \"\", iso: \"\" },\n company: { id: 0, name: \"\" },\n subscription_skips: [],\n orders: [],\n bundled_items: bff.bundled_items\n ? bff.bundled_items.map((item) => ({\n quantity: item.quantity ?? 0,\n product_id: item.product_id ?? 0,\n variant_id: item.variant_id ?? 0,\n option_titles: item.option_titles ?? [],\n product_title: item.product_title ?? \"\",\n variant_title: item.variant_title ?? \"\",\n display_to_customer: item.display_to_customer ?? true,\n }))\n : undefined,\n bundled_subscriptions: bff.bundled_subscriptions\n ? bff.bundled_subscriptions.map((sib) => ({\n subscription_token: sib.subscription_token ?? \"\",\n product_title: sib.product_title ?? \"\",\n variant_title: sib.variant_title ?? null,\n price: sib.price ?? 0,\n image_url: sib.image_url ?? null,\n }))\n : undefined,\n };\n}\n\nfunction mapSubscriptionDetail(\n response: BffSubscriptionResponse,\n): subscriptions.SubscriptionDetail {\n const bff = response.subscription;\n if (!bff) {\n throw new Error(\n \"BFF returned a successful response but subscription data was missing\",\n );\n }\n return {\n subscription: mapDetailSubscription(bff),\n meta: response.meta ? mapMeta(response.meta) : undefined,\n };\n}\n\n/**\n * Maps a BFF list subscription to the port's SubscriptionListItem.\n *\n * The BFF returns a flat shape with `product` and `quantity` while the port\n * expects nested `variant.product` (from the admin API). This bridges the two\n * so the UI layer sees a consistent shape regardless of which API backs it.\n */\nfunction mapListItem(\n bff: NonNullable<BffListResponse[\"subscriptions\"]>[number],\n): subscriptions.SubscriptionListItem {\n return {\n id: bff.id ?? 0,\n subscription_token: bff.token ?? \"\",\n created_at: bff.created_at ?? \"\",\n customer: {\n id: 0,\n account_id: \"\",\n active: true,\n display_total_spent: \"0\",\n email: \"\",\n first_name: \"\",\n full_name: bff.customer_name ?? \"\",\n is_rep: false,\n last_name: \"\",\n orders_count: 0,\n phone: null,\n total_spent: \"0\",\n user_company_id: null,\n },\n last_bill_date: null,\n next_bill_date: bff.next_billing_date ?? null,\n price: safeParsePrice(bff.total),\n quantity: bff.quantity ?? 1,\n status: bff.status ?? \"\",\n subscription_plan: {\n // The flat top-level `bff.interval` is a denormalized convenience that\n // does NOT carry a numeric interval — it's a single descriptor like\n // \"monthly\". The accurate fields are on `bff.plan` (number + unit), so\n // a quarterly subscription returns interval=3 / unit=\"month\" there.\n id: bff.plan?.id ?? 0,\n active: true,\n billing_interval: bff.plan?.billing_interval ?? 1,\n billing_interval_unit: bff.plan?.billing_interval_unit ?? \"\",\n shipping_interval: bff.plan?.billing_interval ?? 1,\n shipping_interval_unit: bff.plan?.billing_interval_unit ?? \"\",\n },\n variant: {\n id: bff.product?.id ?? 0,\n title: bff.product?.variant_name ?? \"\",\n product: {\n id: bff.product?.id ?? 0,\n title: bff.product?.name ?? \"\",\n image_url: bff.product?.image_url ?? \"\",\n price_in_currency: bff.total ?? \"0\",\n },\n },\n bundled_subscriptions: (bff.bundled_subscriptions ?? []).map((b) => ({\n subscription_token: b.subscription_token ?? \"\",\n product_title: b.product_title ?? \"\",\n variant_title: b.variant_title ?? null,\n price: b.price ?? 0,\n image_url: b.image_url ?? null,\n })),\n };\n}\n\nfunction mapSubscriptionList(\n response: BffListResponse,\n): subscriptions.SubscriptionsResponse {\n const raw = response.meta ?? {};\n return {\n subscriptions: (response.subscriptions ?? []).map(mapListItem),\n meta: {\n ...mapMeta(raw),\n pagination: raw.pagination\n ? {\n cursor: raw.pagination.cursor ?? null,\n limit: raw.pagination.limit,\n next_cursor: raw.pagination.next_cursor ?? null,\n prev_cursor: raw.pagination.prev_cursor ?? null,\n }\n : undefined,\n },\n };\n}\n\n/**\n * Creates a SubscriptionsApi-compatible adapter backed by the portal-tenant BFF.\n *\n * Uses async/await with explicit field mapping. The BFF returns simplified\n * subscription types compared to the full admin API; the adapter maps the\n * response envelope and provides runtime defaults for optional fields.\n */\nexport function createPortalSubscriptionsAdapter(\n client: FetchClient,\n): SubscriptionsApi {\n return {\n fetchCustomerSubscriptions: async (\n params: subscriptions.FetchSubscriptionsParams,\n ) => {\n const rawStatus = params.status;\n const status =\n rawStatus === \"active\" || rawStatus === \"inactive\"\n ? rawStatus\n : undefined;\n const response = await portalTenant.subscriptions_list(client, {\n \"page[cursor]\": params.cursor,\n \"page[limit]\": params.limit ?? params.perPage,\n status,\n q: params.search ?? undefined,\n });\n return mapSubscriptionList(response);\n },\n\n fetchSubscription: async (subscriptionToken: string) => {\n const response = await portalTenant.subscriptions_show(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n pauseSubscription: async (\n subscriptionToken: string,\n params: subscriptions.PauseSubscriptionParams,\n ) => {\n const body: {\n next_bill_date?: string;\n number_of_orders?: number;\n } = {};\n if (params.nextBillDate != null)\n body.next_bill_date = params.nextBillDate;\n if (params.numberOfOrders != null)\n body.number_of_orders = params.numberOfOrders;\n const response = await portalTenant.subscriptions_pause(\n client,\n subscriptionToken,\n body,\n );\n return mapSubscriptionDetail(response);\n },\n\n resumeSubscription: async (\n subscriptionToken: string,\n params: subscriptions.ResumeSubscriptionParams,\n ) => {\n const response = await portalTenant.subscriptions_resume(\n client,\n subscriptionToken,\n { next_bill_date: params.nextBillDate },\n );\n return mapSubscriptionDetail(response);\n },\n\n skipSubscription: async (\n subscriptionToken: string,\n _params: subscriptions.SkipSubscriptionParams,\n ) => {\n const response = await portalTenant.subscriptions_skip(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n cancelSubscription: async (\n subscriptionToken: string,\n _customerId?: number,\n ) => {\n const response = await portalTenant.subscriptions_cancel(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n reactivateSubscription: async (\n subscriptionToken: string,\n _params: subscriptions.ReactivateSubscriptionParams,\n ) => {\n const response = await portalTenant.subscriptions_reactivate(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n retrySubscription: async (subscriptionToken: string) => {\n const response = await portalTenant.subscriptions_retry(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n updateSubscriptionInfo: async (\n subscriptionToken: string,\n body: Partial<\n Pick<\n subscriptions.UpdateSubscriptionInfoBody,\n \"payment_method_id\" | \"quantity\" | \"address_id\" | \"next_bill_date\"\n >\n >,\n ) => {\n const subscription: {\n payment_method_id?: number;\n quantity?: number;\n address_id?: number;\n next_bill_date?: string;\n } = {};\n if (body.payment_method_id != null) {\n subscription.payment_method_id = body.payment_method_id;\n }\n if (body.quantity != null) {\n subscription.quantity = body.quantity;\n }\n if (body.address_id != null) {\n subscription.address_id = body.address_id;\n }\n if (body.next_bill_date != null) {\n subscription.next_bill_date = body.next_bill_date;\n }\n const response = await portalTenant.subscriptions_update(\n client,\n subscriptionToken,\n { subscription },\n );\n return mapSubscriptionDetail(response);\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { SubscriptionsCoreProvider } from \"@fluid-app/subscriptions-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalSubscriptionsAdapter } from \"../adapters/subscriptions-api-adapter\";\n\nexport function PortalSubscriptionsApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalSubscriptionsAdapter(client), [client]);\n\n return (\n <SubscriptionsCoreProvider api={api}>{children}</SubscriptionsCoreProvider>\n );\n}\n","import type { BundlesApi } from \"@fluid-app/subscriptions-core\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\nimport { mapDetailSubscription } from \"./subscriptions-api-adapter\";\n\ntype BffBundleListResponse = Awaited<\n ReturnType<typeof portalTenant.subscription_bundles_list>\n>;\ntype BffBundle = NonNullable<\n BffBundleListResponse[\"subscription_bundles\"]\n>[number];\n\ntype BffSubscriptionInBundle = NonNullable<BffBundle[\"subscriptions\"]>[number];\n\nfunction mapAddress(\n bff: BffBundle[\"address\"],\n): subscriptions.SubscriptionDetailAddress | null {\n if (!bff) return null;\n return {\n id: bff.id ?? 0,\n name: bff.name ?? null,\n address1: bff.address1 ?? \"\",\n address2: bff.address2 ?? null,\n city: bff.city ?? \"\",\n state: bff.state ?? \"\",\n subdivision_code: null,\n postal_code: bff.postal_code ?? \"\",\n country_code: bff.country_code ?? null,\n default: false,\n };\n}\n\nfunction mapVolumeRep(\n bff: BffBundle[\"volume_rep\"],\n): subscriptions.BundleVolumeRep | null {\n if (!bff) return null;\n return {\n id: bff.id ?? 0,\n email: bff.email ?? null,\n full_name: bff.full_name ?? null,\n image_url: bff.image_url ?? null,\n };\n}\n\nfunction mapBundle(bff: BffBundle): subscriptions.Bundle {\n return {\n next_bill_date: bff.next_bill_date ?? null,\n subscription_count: bff.subscription_count ?? 0,\n address: mapAddress(bff.address),\n volume_rep: mapVolumeRep(bff.volume_rep),\n subscriptions: (bff.subscriptions ?? []).map((s) =>\n // The bundle's subscriptions field uses the same Subscription schema as\n // the subscriptions_show endpoint, so the existing detail mapper works\n // unchanged.\n mapDetailSubscription(s as BffSubscriptionInBundle),\n ),\n };\n}\n\nexport function createPortalBundlesAdapter(client: FetchClient): BundlesApi {\n return {\n fetchBundles: async () => {\n const response = await portalTenant.subscription_bundles_list(client);\n return (response.subscription_bundles ?? []).map(mapBundle);\n },\n\n createBundle: async (params: subscriptions.CreateBundleParams) => {\n const bundle: {\n subscription_tokens: string[];\n next_bill_date: string;\n address_id?: number | null;\n volume_rep_id?: number | null;\n } = {\n subscription_tokens: params.subscription_tokens,\n next_bill_date: params.next_bill_date,\n };\n if (params.address_id !== undefined)\n bundle.address_id = params.address_id;\n if (params.volume_rep_id !== undefined)\n bundle.volume_rep_id = params.volume_rep_id;\n\n const response = await portalTenant.subscription_bundles_create(client, {\n bundle,\n });\n const bff = response.subscription_bundle;\n if (!bff) {\n throw new Error(\n \"BFF returned a successful response but bundle data was missing\",\n );\n }\n return mapBundle(bff);\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { BundlesCoreProvider } from \"@fluid-app/subscriptions-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalBundlesAdapter } from \"../adapters/bundles-api-adapter\";\n\nexport function PortalBundlesApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n const api = useMemo(() => createPortalBundlesAdapter(client), [client]);\n return <BundlesCoreProvider api={api}>{children}</BundlesCoreProvider>;\n}\n","import type { Provider } from \"react\";\nimport { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport type { SubscriptionsDict } from \"./translation-dictionary\";\n\nconst { Provider: SubscriptionsProvider, useTranslation } =\n createTranslationContext<SubscriptionsDict>(\"Subscriptions\");\n\nexport const SubscriptionsTranslationProvider: Provider<TranslationApi<SubscriptionsDict> | null> =\n SubscriptionsProvider;\nexport const useSubscriptionsTranslation = useTranslation;\n","export const subscriptionsEn = {\n // Breadcrumbs & navigation\n breadcrumb: \"Subscriptions\",\n breadcrumb_detail: \"Subscription #{{token}}\",\n\n // Filter tabs\n all: \"All\",\n active: \"Active\",\n inactive: \"Inactive\",\n\n // Search\n search_placeholder: \"Search subscriptions...\",\n\n // Table columns\n product: \"Product\",\n next_bill_date: \"Next Bill Date\",\n price: \"Price\",\n status: \"Status\",\n\n // Empty / unknown states\n no_subscriptions_found: \"No subscriptions found\",\n unknown_status: \"Unknown\",\n\n // Pagination (used by subscriptions-list)\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n\n // Subscription detail — upcoming order\n your_upcoming_order: \"Your Upcoming Order\",\n next_order_date: \"Next Order Date\",\n next_bill_amount: \"Next Bill Amount\",\n payment_failed_on: \"Payment failed on\",\n\n // Product row\n product_image_alt: \"Product image\",\n no_image: \"No image\",\n quantity_label: \"Quantity\",\n quantity_aria: \"Quantity\",\n decrease_quantity_aria: \"Decrease quantity\",\n increase_quantity_aria: \"Increase quantity\",\n\n // Pricing summary\n subtotal: \"Subtotal\",\n discount: \"Discount\",\n total_label: \"Total\",\n tax_shipping_note:\n \"*Tax and shipping will be calculated when the subscription processes\",\n\n // Order actions\n order_actions: \"Order Actions\",\n skip_next_order: \"Skip Next Order\",\n edit_bill_date: \"Edit Bill Date\",\n pause_subscription: \"Pause Subscription\",\n cancel_subscription: \"Cancel Subscription\",\n cancelled_subscription: \"Cancelled Subscription\",\n resume_subscription: \"Resume Subscription\",\n reactivate_subscription: \"Reactivate Subscription\",\n update_payment_method_action: \"Update Payment Method\",\n\n // Short action labels (SubscriptionActions)\n skip_next: \"Skip Next\",\n pause: \"Pause\",\n cancel: \"Cancel\",\n resume: \"Resume\",\n reactivate: \"Reactivate\",\n\n // Subscription details section\n subscription_details: \"Subscription Details\",\n order_frequency: \"Order Frequency\",\n next_payment: \"Next Payment\",\n last_billed: \"Last Billed\",\n last_shipped: \"Last Shipped\",\n last_bill_amount: \"Last Bill Amount\",\n\n // Payment & shipping\n payment_and_shipping: \"Payment & Shipping\",\n shipping_address: \"Shipping Address\",\n payment_method: \"Payment Method\",\n card_fallback: \"Card\",\n ending_in: \"ending in {{last4}}\",\n no_payment_method: \"No payment method\",\n no_shipping_address: \"No shipping address available\",\n\n // Order history\n subscription_order_history: \"Subscription Order History\",\n order: \"Order\",\n date: \"Date\",\n amount: \"Amount\",\n not_available: \"N/A\",\n\n // Cancel dialog\n cancel_dialog_title: \"Cancel Subscription\",\n cancel_dialog_description:\n \"Are you sure you want to cancel this subscription? You can reactivate it later.\",\n cancel_dialog_pause_question:\n \"Would you like to pause your subscription instead?\",\n cancel_dialog_pause_button: \"Pause Subscription\",\n cancel_dialog_cancel_button: \"Cancel\",\n cancel_dialog_confirm_button: \"Cancel Subscription\",\n pause_for: \"Pause for\",\n select_duration: \"Select duration\",\n month_singular: \"{{count}} month\",\n month_plural: \"{{count}} months\",\n\n // Pause dialog\n pause_dialog_title: \"Pause subscription\",\n pause_dialog_description: \"Are you sure you want to pause subscription?\",\n pause_dialog_action: \"Pause\",\n pause_indefinitely: \"Pause indefinitely\",\n pause_for_orders: \"Pause for a number of upcoming orders\",\n choose_orders_to_skip: \"Choose how many orders to skip\",\n select: \"Select\",\n pause_dialog_cancel: \"Cancel\",\n pause_indefinite_message_prefix:\n \"If you pause indefinitely no further charges will occur. To restart, simply select\",\n pause_indefinite_message_resume: \"Resume\",\n pause_indefinite_message_suffix: \"from your account.\",\n pause_resume_message_prefix:\n \"You won't be charged until your subscription resumes on\",\n pause_resume_message_suffix: \".\",\n\n // Resume dialog\n resume_dialog_title: \"Resume subscription\",\n resume_dialog_description: \"Choose the date your subscription should resume.\",\n resume_dialog_action: \"Resume\",\n resume_date: \"Resume date\",\n date_placeholder: \"mm/dd/yyyy\",\n resume_dialog_cancel: \"Cancel\",\n resume_charge_message_prefix:\n \"Your subscription will resume and you'll be charged on\",\n resume_charge_message_suffix: \".\",\n\n // Edit bill date dialog\n edit_bill_date_title: \"Edit bill date\",\n edit_bill_date_description: \"Select a new date for your next bill.\",\n edit_bill_date_action: \"Save\",\n next_bill_date_label: \"Next bill date\",\n edit_bill_date_cancel: \"Cancel\",\n bill_date_preview_prefix: \"Your next bill will be on\",\n bill_date_preview_suffix: \".\",\n your_other_subscriptions: \"Your other subscriptions\",\n other_subs_product: \"Product\",\n other_subs_bill_date: \"Bill Date\",\n\n // Toast / mutation messages\n subscription_paused: \"Subscription paused\",\n failed_to_pause: \"Failed to pause subscription\",\n subscription_resumed: \"Subscription resumed\",\n failed_to_resume: \"Failed to resume subscription\",\n next_billing_skipped: \"Next billing skipped\",\n failed_to_skip: \"Failed to skip billing\",\n subscription_cancelled: \"Subscription cancelled\",\n failed_to_cancel: \"Failed to cancel subscription\",\n subscription_reactivated: \"Subscription reactivated\",\n failed_to_reactivate: \"Failed to reactivate subscription\",\n quantity_updated: \"Quantity updated\",\n failed_to_update_quantity: \"Failed to update quantity\",\n bill_date_updated: \"Bill date updated\",\n failed_to_update_bill_date: \"Failed to update bill date\",\n bill_date_error:\n \"Could not update the bill date. Please try a different date.\",\n generic_error: \"Something went wrong. Please try again.\",\n\n // Account error\n account_load_error: \"Unable to load account data. Please try again later.\",\n\n // Detail screen errors (portal)\n subscription_not_found: \"Subscription not found\",\n error_occurred: \"An error occurred\",\n failed_to_load_subscription: \"Failed to load subscription: {{message}}\",\n\n // ─── List screen (portal) ──────────────────────────────────────────────\n\n // Page chrome\n list_title: \"Your subscriptions\",\n list_loading: \"Loading...\",\n list_load_more: \"Load more\",\n list_product_fallback: \"Product\",\n\n // Filter pills\n list_filter_paused: \"Paused\",\n list_filter_cancelled: \"Cancelled\",\n\n // Status labels\n list_status_active: \"Active\",\n list_status_paused: \"Paused\",\n list_status_cancelled: \"Cancelled\",\n list_status_past_due: \"Payment issue\",\n list_status_pending: \"Pending\",\n\n // Cadence\n list_cadence_monthly: \"Monthly\",\n list_cadence_weekly: \"Weekly\",\n list_cadence_yearly: \"Yearly\",\n list_cadence_quarterly: \"Quarterly\",\n list_cadence_every_n_units: \"Every {{n}} {{unit}}\",\n list_cadence_every_unit: \"Every {{unit}}\",\n\n // Pricing suffix\n list_price_per_month: \"per month\",\n list_price_per_week: \"per week\",\n list_price_per_year: \"per year\",\n list_price_per_day: \"per day\",\n list_price_every_n_units: \"every {{n}} {{unit}}\",\n\n // Bill summary card\n list_next_bill_label: \"Your next bill\",\n list_last_bill_label: \"Last bill\",\n list_bill_overdue: \"Bill overdue\",\n list_bill_due_1_day_ago: \"Bill was due 1 day ago\",\n list_bill_due_n_days_ago: \"Bill was due {{n}} days ago\",\n list_bill_date: \"Bill date\",\n list_bill_amount: \"Bill amount\",\n list_last_bill_date: \"Last bill date\",\n list_last_bill_amount: \"Last bill amount\",\n\n // Cycle progress\n list_last_bill_today: \"Last bill today\",\n list_last_bill_yesterday: \"Last bill yesterday\",\n list_last_bill_n_days_ago: \"Last bill {{n}} days ago\",\n list_bills_today: \"Bills today\",\n list_bills_tomorrow: \"Bills tomorrow\",\n list_bills_in_n_days: \"Bills in {{n}} days\",\n list_bill_overdue_n_days: \"Bill overdue by {{n}} days\",\n\n // Sections / actions\n list_cancelled_section_label: \"Cancelled · {{n}}\",\n list_resume_cta: \"Resume subscription\",\n list_recurring_badge: \"Recurring delivery\",\n\n // Empty / error / retry\n list_no_in_view: \"No subscriptions in this view\",\n list_none_yet: \"No subscriptions yet\",\n list_filtered_hint: \"Try a different filter to see your other subscriptions.\",\n list_empty_hint: \"When you subscribe to a product, it'll show up here.\",\n list_load_failed_title: \"Couldn't load your subscriptions\",\n list_load_failed_hint: \"Something went wrong on our end. Please try again.\",\n list_try_again: \"Try again\",\n\n // ─── Bundling (CURRENT-848) ────────────────────────────────────────────\n\n // List screen — bundle CTA + card\n list_bundle_cta: \"Bundle\",\n list_bundle_card_label: \"Bundle · {{n}} subscriptions\",\n list_bundle_more_count: \"+{{n}} more\",\n list_bundle_members_title: \"Bundle members\",\n\n // Bundle drawer — chrome\n bundle_subscriptions: \"Bundle subscriptions\",\n bundle_back: \"Back\",\n bundle_done: \"Done\",\n bundle_create: \"Create bundle\",\n bundle_step_select: \"Select\",\n bundle_step_date: \"Date\",\n bundle_step_address: \"Address\",\n bundle_step_payment: \"Payment\",\n\n // Bundle drawer — step 1\n bundle_and_save: \"Bundle and save\",\n bundle_select_subs:\n \"Select 2 or more subscriptions to bundle them onto one bill date and shipment.\",\n bundle_no_bundleable_subs:\n \"You don't have any subscriptions that can be bundled right now. Bundling requires 2 or more active subscriptions that aren't already bundled.\",\n bundle_step1_message: \"✨ Bundle and save on shipping\",\n\n // Bundle drawer — step 2\n bundle_select_new_bill_date: \"Select a new bill date\",\n bundle_select_new_bill_date_description:\n \"All bundled subscriptions will share this bill date.\",\n bundle_year: \"Year\",\n bundle_month: \"Month\",\n bundle_day: \"Day\",\n bundle_step2_message: \"📅 Choose when they ship together\",\n\n // Bundle drawer — step 3\n bundle_select_address: \"Select shipping address\",\n bundle_select_address_description:\n \"All bundled subscriptions will ship to this address.\",\n bundle_selected_bill_date: \"Selected bill date:\",\n bundle_add_new_address: \"Add new address\",\n bundle_default_badge: \"Default\",\n bundle_step3_message: \"🎁 Almost there — pick delivery\",\n\n // Bundle drawer — step 4\n bundle_select_payment: \"Select payment method\",\n bundle_select_payment_description:\n \"All bundled subscriptions will be charged to this payment method.\",\n bundle_no_usable_payment_methods:\n \"No usable payment methods. Add one in your profile.\",\n bundle_card_expires: \"Expires\",\n bundle_add_new_card: \"Add new card\",\n bundle_step4_message: \"💳 Last step — choose payment method\",\n\n // Bundle drawer — toasts\n bundle_succeeded: \"Subscriptions bundled successfully.\",\n bundle_partial_payment_failure:\n \"Bundle created but payment method failed for {{n}} subscription(s).\",\n bundle_failed: \"Couldn't bundle subscriptions. Please try again.\",\n\n // Past-due banner — default state (payment failed, no retry queued)\n past_due_banner_heading: \"We couldn't process your payment\",\n past_due_banner_heading_for_product:\n \"We couldn't process your payment for {{product}}\",\n past_due_banner_body:\n \"Your payment method may have expired or been declined. Update your card to continue your subscription and avoid interruptions.\",\n\n // Past-due banner — retry-scheduled state (next_retry_at is set, e.g. after\n // the customer just updated their card and CURRENT-882's auto-retry queued\n // a billing attempt, or after an admin manual reprocess in CURRENT-883).\n // Two sub-states based on whether last_failed_at is also set: just-queued\n // (immediate retry, no failure since the last reset) vs. retry-failed\n // (a previous attempt failed and the next one is pending after a backoff).\n past_due_banner_heading_retry_scheduled: \"Payment retry scheduled\",\n past_due_banner_heading_retry_scheduled_for_product:\n \"Payment retry scheduled for {{product}}\",\n past_due_banner_body_retry_scheduled:\n \"We're trying your payment again now. We'll update once it's processed.\",\n past_due_banner_body_retry_failed:\n \"The last retry didn't go through. We'll try again automatically {{when}}. You can also update your card to use a different one.\",\n update_your_card: \"Update your card\",\n dismiss: \"Dismiss\",\n\n // Time-bucket strings used in {{when}} interpolation for the\n // retry-failed body. Bucketed (instead of formatDistanceToNow) so the\n // displayed range absorbs the up-to-6h RetryFailedPaymentsJob cron\n // lag — showing \"in 2 hours\" would lie when the cron only ticks\n // every 6 hours.\n past_due_retry_when_shortly: \"shortly\",\n past_due_retry_when_few_hours: \"in the next few hours\",\n past_due_retry_when_within_day: \"within a day\",\n} as const satisfies Record<string, string>;\n\nexport type SubscriptionsDict = typeof subscriptionsEn;\n","import {\n createDomainTranslations,\n type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport {\n subscriptionsEn,\n type SubscriptionsDict,\n} from \"./translation-dictionary\";\n\nexport const subscriptionsDomain: DomainTranslations<SubscriptionsDict> =\n createDomainTranslations<SubscriptionsDict>({\n fallback: subscriptionsEn,\n loaders: {\n de: () =>\n import(\"./locale/de.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n el: () =>\n import(\"./locale/el.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n es: () =>\n import(\"./locale/es.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n fr: () =>\n import(\"./locale/fr.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n he: () =>\n import(\"./locale/he.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n hu: () =>\n import(\"./locale/hu.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n id: () =>\n import(\"./locale/id.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n it: () =>\n import(\"./locale/it.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ja: () =>\n import(\"./locale/ja.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ko: () =>\n import(\"./locale/ko.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n nl: () =>\n import(\"./locale/nl.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n pl: () =>\n import(\"./locale/pl.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n pt: () =>\n import(\"./locale/pt.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ro: () =>\n import(\"./locale/ro.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ru: () =>\n import(\"./locale/ru.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n th: () =>\n import(\"./locale/th.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n tl: () =>\n import(\"./locale/tl.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n tr: () =>\n import(\"./locale/tr.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n zh_CN: () =>\n import(\"./locale/zh_CN.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n zh_TW: () =>\n import(\"./locale/zh_TW.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n },\n });\n\nexport function createSubscriptionsTranslationAdapter(\n locale: string,\n dict: SubscriptionsDict,\n): TranslationApi<SubscriptionsDict> {\n return createStaticDictAdapter(locale, dict);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n subscriptionsDomain,\n createSubscriptionsTranslationAdapter,\n} from \"@fluid-app/subscriptions-core/translation-adapter\";\nimport { SubscriptionsTranslationProvider } from \"@fluid-app/subscriptions-core/translation-api-context\";\n\nexport function SubscriptionsTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(subscriptionsDomain, locale);\n const api = useMemo(\n () => createSubscriptionsTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <SubscriptionsTranslationProvider value={api}>\n {children}\n </SubscriptionsTranslationProvider>\n );\n}\n","import type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport type { SubscriptionsDict } from \"@fluid-app/subscriptions-core/translation-dictionary\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\n\nexport type T = TranslationApi<SubscriptionsDict>[\"t\"];\n\nexport type FilterKey = \"all\" | \"active\" | \"paused\" | \"cancelled\";\n\nexport type StatusKind =\n | \"active\"\n | \"paused\"\n | \"cancelled\"\n | \"pending\"\n | \"past_due\";\n\nexport interface MappedStatus {\n kind: StatusKind;\n label: string;\n}\n\n/** Status label keys — all non-parameterized so they can be passed to `t()` with no args. */\ntype StatusLabelKey =\n | \"list_status_active\"\n | \"list_status_paused\"\n | \"list_status_cancelled\"\n | \"list_status_past_due\"\n | \"list_status_pending\";\n\n// US `canceled` and UK `cancelled` fold together; `past_due`/`past-due` too.\nconst STATUS_LOOKUP: Record<\n string,\n { kind: StatusKind; labelKey: StatusLabelKey }\n> = {\n active: { kind: \"active\", labelKey: \"list_status_active\" },\n paused: { kind: \"paused\", labelKey: \"list_status_paused\" },\n cancelled: { kind: \"cancelled\", labelKey: \"list_status_cancelled\" },\n canceled: { kind: \"cancelled\", labelKey: \"list_status_cancelled\" },\n past_due: { kind: \"past_due\", labelKey: \"list_status_past_due\" },\n \"past-due\": { kind: \"past_due\", labelKey: \"list_status_past_due\" },\n pending: { kind: \"pending\", labelKey: \"list_status_pending\" },\n};\n\n/**\n * Map a raw subscription `status` string from the BFF onto our internal\n * status vocabulary. Unknown statuses pass through with `kind: \"pending\"`\n * and a capitalized raw label — never synthesize a colored pill that\n * pretends to be real status data.\n */\nexport function mapStatus(status: string, t: T): MappedStatus {\n const entry = STATUS_LOOKUP[(status || \"\").toLowerCase()];\n if (entry) return { kind: entry.kind, label: t(entry.labelKey) };\n return {\n kind: \"pending\",\n label: status ? status.charAt(0).toUpperCase() + status.slice(1) : \"—\",\n };\n}\n\n/**\n * Sort priority — past-due first (urgent), cancelled last. Used to order\n * subscriptions within the active grid before the cancelled section.\n */\nexport const STATUS_PRIORITY: Record<StatusKind, number> = {\n past_due: 0,\n active: 1,\n pending: 2,\n paused: 3,\n cancelled: 4,\n};\n\n/**\n * \"Active\" group = anything still actionable, including paused (can be\n * resumed). The cancelled section is reserved for cancelled subs only —\n * those are truly done and can't be acted on beyond viewing.\n */\nexport function isActiveKind(kind: StatusKind): boolean {\n return (\n kind === \"active\" ||\n kind === \"past_due\" ||\n kind === \"pending\" ||\n kind === \"paused\"\n );\n}\n\n/**\n * Filter predicate — status-only, does not need translation so we use a\n * stripped-down identity helper that satisfies the `T` signature.\n */\nexport function filterPredicate(\n filter: FilterKey,\n sub: subscriptions.SubscriptionListItem,\n): boolean {\n if (filter === \"all\") return true;\n // We only need the `kind` for filter classification — mapStatus's `t`\n // call for the label is irrelevant here. Cast a no-op identity so this\n // stays a pure filter without a translation dependency.\n const kind = mapStatusKindOnly(sub.status);\n // past_due belongs in Active — it's still actionable (user needs to fix\n // payment) and renders in the active grid by default. Excluding it here\n // would make the most-urgent subs vanish when the Active pill is selected.\n if (filter === \"active\")\n return kind === \"active\" || kind === \"pending\" || kind === \"past_due\";\n if (filter === \"paused\") return kind === \"paused\";\n if (filter === \"cancelled\") return kind === \"cancelled\";\n return true;\n}\n\n/** Lightweight status-kind lookup that doesn't need `t`. */\nexport function mapStatusKindOnly(status: string): StatusKind {\n const entry = STATUS_LOOKUP[(status || \"\").toLowerCase()];\n return entry?.kind ?? \"pending\";\n}\n\nexport function countByFilter(\n list: subscriptions.SubscriptionListItem[],\n): Record<FilterKey, number> {\n return {\n all: list.length,\n active: list.filter((s) => filterPredicate(\"active\", s)).length,\n paused: list.filter((s) => filterPredicate(\"paused\", s)).length,\n cancelled: list.filter((s) => filterPredicate(\"cancelled\", s)).length,\n };\n}\n\nexport function formatCadence(\n plan: subscriptions.SubscriptionListPlan,\n t: T,\n): string {\n const interval = plan.billing_interval;\n const unit = plan.billing_interval_unit;\n if (interval === 1 && unit === \"month\") return t(\"list_cadence_monthly\");\n if (interval === 1 && unit === \"week\") return t(\"list_cadence_weekly\");\n if (interval === 1 && unit === \"year\") return t(\"list_cadence_yearly\");\n if (interval === 3 && unit === \"month\") return t(\"list_cadence_quarterly\");\n // Generic fallback uses the BFF-provided unit string verbatim — units\n // like \"day\"/\"week\"/\"month\"/\"year\" come from the API and aren't part of\n // the translation dictionary. The wrapping template IS translated.\n if (interval > 1) {\n return t(\"list_cadence_every_n_units\", {\n n: String(interval),\n unit: unit + \"s\",\n });\n }\n return t(\"list_cadence_every_unit\", { unit });\n}\n\nexport function pricingSuffix(\n plan: subscriptions.SubscriptionListPlan,\n t: T,\n): string {\n const unit = plan.billing_interval_unit;\n const interval = plan.billing_interval;\n if (interval === 1) {\n if (unit === \"month\") return t(\"list_price_per_month\");\n if (unit === \"week\") return t(\"list_price_per_week\");\n if (unit === \"year\") return t(\"list_price_per_year\");\n if (unit === \"day\") return t(\"list_price_per_day\");\n }\n return t(\"list_price_every_n_units\", {\n n: String(interval),\n unit: unit + (interval > 1 ? \"s\" : \"\"),\n });\n}\n\nexport function formatLongDate(iso: string): string {\n // BFF date fields come in two shapes: pure calendar dates (\"2026-05-10\",\n // e.g. Bundle.next_bill_date) and datetimes (\"2026-05-10T07:00:00Z\", e.g.\n // Subscription.next_billing_date). For both we want to render the calendar\n // date the API meant, NOT shift it via timezone math — `new Date(...)` +\n // `toLocaleDateString()` would render UTC-midnight calendar dates as the\n // previous day for any user west of UTC. Pull Y/M/D from the front of the\n // string and format in UTC to keep the date stable across timezones.\n try {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(iso);\n if (!match) return iso;\n const y = Number(match[1]);\n const m = Number(match[2]);\n const d = Number(match[3]);\n if (!y || !m || !d) return iso;\n const date = new Date(Date.UTC(y, m - 1, d));\n return date.toLocaleDateString(undefined, {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n timeZone: \"UTC\",\n });\n } catch {\n return iso;\n }\n}\n\n/**\n * Render the per-cycle subscription bill amount (`price × quantity`).\n *\n * `sub.price` (mapped from the BFF's `total`) is the per-unit price, not the\n * line total — the variant column it ultimately reads from is a plain\n * decimal column, and the detail page also computes `price * quantity` for\n * its bill rows. At qty=1 the multiplication is a no-op so the bug stayed\n * hidden until qty>1 surfaced the mismatch with the detail view.\n */\nexport function formatPrice(sub: subscriptions.SubscriptionListItem): string {\n return (sub.price * (sub.quantity ?? 1)).toFixed(2);\n}\n\n/** Detail-shape counterpart for bundle member rows. */\nexport function formatDetailPrice(\n sub: subscriptions.SubscriptionDetailSubscription,\n): string {\n return (sub.price * (sub.quantity ?? 1)).toFixed(2);\n}\n\nexport interface CycleProgress {\n /** 0..1 fraction of the cycle that has elapsed. */\n progress: number;\n /** \"Last bill 18 days ago\" — friendly label for the start of the cycle. */\n startLabel: string;\n /** \"Bills in 12 days\" — friendly label for the end of the cycle. */\n endLabel: string;\n}\n\n/**\n * Compute progress through a billing cycle. Returns `null` when either\n * date is missing, unparseable, or `end <= start`. `now` is injectable\n * for tests.\n */\nexport function computeCycleProgress(\n last: string | null,\n next: string | null,\n t: T,\n now: number = Date.now(),\n): CycleProgress | null {\n if (!last || !next) return null;\n const start = new Date(last).getTime();\n const end = new Date(next).getTime();\n if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start) {\n return null;\n }\n const raw = (now - start) / (end - start);\n const progress = Math.max(0, Math.min(1, raw));\n return {\n progress,\n startLabel: friendlyDaysAgo(start, t, now),\n endLabel: friendlyDaysAhead(end, t, now),\n };\n}\n\nexport function friendlyDaysAgo(\n start: number,\n t: T,\n now: number = Date.now(),\n): string {\n const days = Math.max(0, Math.round((now - start) / (1000 * 60 * 60 * 24)));\n if (days === 0) return t(\"list_last_bill_today\");\n if (days === 1) return t(\"list_last_bill_yesterday\");\n return t(\"list_last_bill_n_days_ago\", { n: String(days) });\n}\n\nexport function friendlyDaysAhead(\n end: number,\n t: T,\n now: number = Date.now(),\n): string {\n const days = Math.round((end - now) / (1000 * 60 * 60 * 24));\n if (days < 0)\n return t(\"list_bill_overdue_n_days\", { n: String(Math.abs(days)) });\n if (days === 0) return t(\"list_bills_today\");\n if (days === 1) return t(\"list_bills_tomorrow\");\n return t(\"list_bills_in_n_days\", { n: String(days) });\n}\n","import { type JSX, useMemo, useState } from \"react\";\nimport {\n type subscriptions,\n useInfiniteSubscriptions,\n} from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { ImageOff, Package, Play, Repeat, AlertCircle } from \"lucide-react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport {\n type CycleProgress as CycleProgressData,\n type FilterKey,\n type T,\n STATUS_PRIORITY,\n computeCycleProgress,\n countByFilter,\n filterPredicate,\n formatCadence,\n formatDetailPrice,\n formatLongDate,\n formatPrice,\n isActiveKind,\n mapStatus,\n pricingSuffix,\n} from \"./portal-subscriptions-list-helpers\";\n\nexport type { FilterKey } from \"./portal-subscriptions-list-helpers\";\n\ninterface PortalSubscriptionsListProps {\n customerId: number | undefined;\n isLoadingCustomer?: boolean;\n onSubscriptionClick: (token: string) => void;\n onResume?: (sub: subscriptions.SubscriptionListItem) => void;\n onBundleClick?: () => void;\n bundles?: subscriptions.Bundle[];\n}\n\nconst EMPTY_BUNDLES: subscriptions.Bundle[] = [];\n\nexport function PortalSubscriptionsList({\n customerId,\n isLoadingCustomer,\n onSubscriptionClick,\n onResume,\n onBundleClick,\n bundles = EMPTY_BUNDLES,\n}: PortalSubscriptionsListProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n const [filter, setFilter] = useState<FilterKey>(\"all\");\n const {\n data,\n isLoading,\n isError,\n refetch,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n } = useInfiniteSubscriptions(\n { customerId, limit: 12 },\n { enabled: !!customerId && !isLoadingCustomer },\n );\n\n const list = useMemo(\n () => data?.pages.flatMap((p) => p.subscriptions) ?? [],\n [data],\n );\n const counts = useMemo(() => countByFilter(list), [list]);\n const filteredList = useMemo(\n () => list.filter((s) => filterPredicate(filter, s)),\n [list, filter],\n );\n\n // Real bundles only — singletons (size 1) come back from the bundles\n // endpoint too but they aren't \"bundled\" from the user's perspective.\n const relevantBundles = useMemo(\n () => bundles.filter((b) => b.subscription_count > 1),\n [bundles],\n );\n const bundledTokens = useMemo(() => {\n const tokens = new Set<string>();\n for (const bundle of relevantBundles) {\n for (const sub of bundle.subscriptions) {\n if (sub.subscription_token) tokens.add(sub.subscription_token);\n }\n }\n return tokens;\n }, [relevantBundles]);\n\n // Bundle cards only render in the \"all\" view because a bundle is a\n // billing-time grouping, not a status. Status-filtered views (active /\n // paused / cancelled) show every member sub as an individual card so the\n // filter answer stays direct.\n const showBundleSection = filter === \"all\" && relevantBundles.length > 0;\n\n const { activeSubs, inactiveSubs } = useMemo(() => {\n const sorted = filteredList\n .slice()\n .sort(\n (a, b) =>\n STATUS_PRIORITY[mapStatus(a.status, t).kind] -\n STATUS_PRIORITY[mapStatus(b.status, t).kind],\n );\n const activeCandidates = sorted.filter((s) =>\n isActiveKind(mapStatus(s.status, t).kind),\n );\n return {\n activeSubs: showBundleSection\n ? activeCandidates.filter(\n (s) => !bundledTokens.has(s.subscription_token),\n )\n : activeCandidates,\n inactiveSubs: sorted.filter(\n (s) => !isActiveKind(mapStatus(s.status, t).kind),\n ),\n };\n }, [filteredList, t, showBundleSection, bundledTokens]);\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div className=\"relative\">\n <div className=\"relative mx-auto max-w-4xl px-5 pt-8 pb-20 md:px-8\">\n <h1 className=\"text-foreground text-xl font-bold tracking-tight md:text-2xl\">\n {t(\"list_title\")}\n </h1>\n\n {list.length > 0 && (\n <FilterPills\n active={filter}\n counts={counts}\n onChange={setFilter}\n onBundleClick={onBundleClick}\n t={t}\n />\n )}\n\n {isLoading || isLoadingCustomer ? (\n <div className=\"mt-8 grid grid-cols-1 gap-5 md:grid-cols-2\">\n {Array(4)\n .fill(0)\n .map((_, i) => (\n <SubscriptionCardSkeleton key={i} />\n ))}\n </div>\n ) : isError ? (\n <ErrorState onRetry={() => refetch()} t={t} />\n ) : filteredList.length === 0 ? (\n <EmptyState filtered={filter !== \"all\" && list.length > 0} t={t} />\n ) : (\n <>\n {(showBundleSection || activeSubs.length > 0) && (\n // Single grid for bundle cards + regular subscription cards so\n // they share rows. CSS Grid's default `align-items: stretch`\n // makes every cell in the same row match heights, which is\n // what we want — the tallest card in a row sets the row\n // height and the others stretch to match.\n <div className=\"mt-6 grid grid-cols-1 gap-5 md:grid-cols-2\">\n {showBundleSection &&\n relevantBundles.map((bundle, i) => (\n <BundleCard\n key={`bundle-${i}-${bundle.next_bill_date}`}\n bundle={bundle}\n onSubscriptionClick={onSubscriptionClick}\n t={t}\n />\n ))}\n {activeSubs.map((sub) => (\n <SubscriptionCard\n key={sub.id}\n sub={sub}\n onClick={() =>\n onSubscriptionClick(sub.subscription_token)\n }\n onResume={onResume ? () => onResume(sub) : undefined}\n t={t}\n />\n ))}\n </div>\n )}\n\n {inactiveSubs.length > 0 && (\n <div className={activeSubs.length > 0 ? \"mt-10\" : \"mt-6\"}>\n <div className=\"text-muted-foreground mb-2 px-1 text-xs font-semibold\">\n {t(\"list_cancelled_section_label\", {\n n: String(inactiveSubs.length),\n })}\n </div>\n <div className=\"space-y-3\">\n {inactiveSubs.map((sub) => (\n <InactiveSubscriptionRow\n key={sub.id}\n sub={sub}\n onClick={() =>\n onSubscriptionClick(sub.subscription_token)\n }\n t={t}\n />\n ))}\n </div>\n </div>\n )}\n </>\n )}\n\n {hasNextPage && (\n <div className=\"mt-6 flex justify-center\">\n <button\n type=\"button\"\n onClick={() => fetchNextPage()}\n disabled={isFetchingNextPage}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {isFetchingNextPage ? t(\"list_loading\") : t(\"list_load_more\")}\n </button>\n </div>\n )}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Filter pills ─────────────────────────────────────────────────────────\n\nconst FILTER_KEYS: ReadonlyArray<{\n key: FilterKey;\n labelKey: \"all\" | \"active\" | \"list_filter_paused\" | \"list_filter_cancelled\";\n}> = [\n { key: \"all\", labelKey: \"all\" },\n { key: \"active\", labelKey: \"active\" },\n { key: \"paused\", labelKey: \"list_filter_paused\" },\n { key: \"cancelled\", labelKey: \"list_filter_cancelled\" },\n];\n\nfunction FilterPills({\n active,\n counts,\n onChange,\n onBundleClick,\n t,\n}: {\n active: FilterKey;\n counts: Record<FilterKey, number>;\n onChange: (k: FilterKey) => void;\n onBundleClick?: () => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"-mx-1 mt-5 flex flex-wrap items-center gap-1.5 px-1\">\n {FILTER_KEYS.map((f) => {\n const isActive = f.key === active;\n const count = counts[f.key];\n return (\n <button\n key={f.key}\n type=\"button\"\n onClick={() => onChange(f.key)}\n className={`inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-bold transition-all ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"ring-border text-foreground hover:bg-muted bg-transparent ring-1\"\n }`}\n >\n {t(f.labelKey)}\n <span\n className={`text-xs tabular-nums ${\n isActive\n ? \"text-primary-foreground/70\"\n : \"text-muted-foreground\"\n }`}\n >\n {count}\n </span>\n </button>\n );\n })}\n {/* Bundling requires at least 2 subscriptions to merge — hide the\n button when the user has zero or one so they can't reach a step 1\n where the Next button is permanently disabled. Also hide when the\n tenant company has bundling disabled (the screen passes\n onBundleClick=undefined in that case). */}\n {counts.all >= 2 && onBundleClick && (\n <button\n type=\"button\"\n onClick={onBundleClick}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 ml-auto inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-bold transition-all\"\n >\n {t(\"list_bundle_cta\")}\n </button>\n )}\n </div>\n );\n}\n\n// ─── Bundle card ───────────────────────────────────────────────────────────\n// Renders a runtime bundle (a customer + address + bill date grouping) as a\n// single card containing each member subscription as a clickable row plus a\n// shared bill summary (date + summed amount). Members navigate to their\n// individual detail screens — bundle-level edit is a future affordance.\n\n// Cap inline member rows so every bundle card has the same height regardless\n// of how many subscriptions are in the bundle. Overflow lives behind a\n// \"+N more\" popover anchored to the card.\nconst BUNDLE_INLINE_LIMIT = 2;\n\nfunction BundleCard({\n bundle,\n onSubscriptionClick,\n t,\n}: {\n bundle: subscriptions.Bundle;\n onSubscriptionClick: (token: string) => void;\n t: T;\n}): JSX.Element {\n const [popoverOpen, setPopoverOpen] = useState(false);\n const total = bundle.subscriptions.reduce(\n (sum, s) => sum + s.price * (s.quantity ?? 1),\n 0,\n );\n const nextBillLong = bundle.next_bill_date\n ? formatLongDate(bundle.next_bill_date)\n : null;\n\n const inlineMembers = bundle.subscriptions.slice(0, BUNDLE_INLINE_LIMIT);\n const overflowCount = bundle.subscriptions.length - inlineMembers.length;\n\n const handleMemberClick = (token: string) => {\n onSubscriptionClick(token);\n setPopoverOpen(false);\n };\n\n return (\n <div className=\"ring-border hover:ring-foreground/10 relative flex flex-col gap-4 rounded-2xl bg-transparent p-5 shadow-sm ring-1 transition-all duration-300 hover:shadow-lg\">\n {/* Bundle header */}\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-muted flex size-7 items-center justify-center rounded-full\">\n <Package className=\"text-foreground size-4\" strokeWidth={2} />\n </div>\n <div className=\"text-foreground text-xs font-bold\">\n {t(\"list_bundle_card_label\", {\n n: String(bundle.subscription_count),\n })}\n </div>\n </div>\n\n {/* Inline member rows (capped) */}\n <div className=\"flex flex-col\">\n {inlineMembers.map((sub) => (\n <BundleMemberRow\n key={sub.subscription_token}\n sub={sub}\n onClick={() => handleMemberClick(sub.subscription_token)}\n t={t}\n />\n ))}\n\n {overflowCount > 0 && (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground focus-visible:ring-foreground/30 mt-1 inline-flex w-fit cursor-pointer items-center rounded-md px-2 py-1 text-xs font-bold transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n >\n {t(\"list_bundle_more_count\", { n: String(overflowCount) })}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"bg-background ring-border w-80 rounded-2xl p-3 shadow-lg ring-1\"\n >\n <div className=\"text-muted-foreground px-2 pt-1 pb-2 text-xs font-bold uppercase\">\n {t(\"list_bundle_members_title\")}\n </div>\n <div className=\"flex max-h-80 flex-col overflow-y-auto\">\n {bundle.subscriptions.map((sub) => (\n <BundleMemberRow\n key={sub.subscription_token}\n sub={sub}\n onClick={() => handleMemberClick(sub.subscription_token)}\n t={t}\n />\n ))}\n </div>\n </PopoverContent>\n </Popover>\n )}\n </div>\n\n {/* Shared bill summary — pushed to the bottom so the card height\n can stretch (auto-rows-fr) without the summary floating mid-card. */}\n <div className=\"bg-muted mt-auto rounded-xl px-4 py-3.5\">\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"list_next_bill_label\")}\n </div>\n <div className=\"mt-3 grid grid-cols-2\">\n <div className=\"pr-4\">\n <div className=\"text-muted-foreground text-xs\">\n {t(\"list_bill_date\")}\n </div>\n <div className=\"text-foreground mt-1 text-base font-bold tracking-tight tabular-nums\">\n {nextBillLong ?? \"—\"}\n </div>\n </div>\n <div className=\"border-border border-l pl-4\">\n <div className=\"text-muted-foreground text-xs\">\n {t(\"list_bill_amount\")}\n </div>\n <div className=\"text-foreground mt-1 text-base font-bold tracking-tight tabular-nums\">\n {total.toFixed(2)}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction BundleMemberRow({\n sub,\n onClick,\n t,\n}: {\n sub: subscriptions.SubscriptionDetailSubscription;\n onClick: () => void;\n t: T;\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"hover:bg-muted/60 focus-visible:ring-foreground/30 -mx-2 flex cursor-pointer items-center gap-3 rounded-lg p-2 text-left transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n >\n <div className=\"relative size-12 shrink-0\">\n {sub.variant.product.image_url ? (\n <img\n src={sub.variant.product.image_url}\n alt=\"\"\n className=\"ring-background size-12 rounded-lg bg-transparent object-cover ring-2\"\n />\n ) : (\n <div className=\"bg-muted ring-background text-muted-foreground flex size-12 items-center justify-center rounded-lg ring-2\">\n <ImageOff className=\"size-4\" strokeWidth={1.75} />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground truncate text-xs font-bold\">\n {sub.variant.product.title || t(\"list_product_fallback\")}\n </div>\n <div className=\"text-muted-foreground truncate text-xs\">\n {bundleMemberCadence(sub.subscription_plan, t)}\n </div>\n </div>\n <div className=\"text-foreground shrink-0 text-xs font-bold tabular-nums\">\n {formatDetailPrice(sub)}\n </div>\n </button>\n );\n}\n\n// `formatCadence` types its input to SubscriptionListPlan; bundle members are\n// SubscriptionDetailPlan which carries the same billing_interval fields.\n// Avoid an unsafe cast by re-implementing the small subset we need.\nfunction bundleMemberCadence(\n plan: { billing_interval: number; billing_interval_unit: string },\n t: T,\n): string {\n const { billing_interval: interval, billing_interval_unit: unit } = plan;\n if (interval === 1 && unit === \"month\") return t(\"list_cadence_monthly\");\n if (interval === 1 && unit === \"week\") return t(\"list_cadence_weekly\");\n if (interval === 1 && unit === \"year\") return t(\"list_cadence_yearly\");\n if (interval === 3 && unit === \"month\") return t(\"list_cadence_quarterly\");\n if (interval > 1) {\n return t(\"list_cadence_every_n_units\", {\n n: String(interval),\n unit: unit + \"s\",\n });\n }\n return t(\"list_cadence_every_unit\", { unit });\n}\n\n// ─── Card ──────────────────────────────────────────────────────────────────\n\nfunction SubscriptionCard({\n sub,\n onClick,\n onResume,\n t,\n}: {\n sub: subscriptions.SubscriptionListItem;\n onClick: () => void;\n onResume?: () => void;\n t: T;\n}): JSX.Element {\n const status = mapStatus(sub.status, t);\n const isPaused = status.kind === \"paused\";\n const isCancelled = status.kind === \"cancelled\";\n const isPastDue = status.kind === \"past_due\";\n const cadence = formatCadence(sub.subscription_plan, t);\n const nextBillLong = sub.next_bill_date\n ? formatLongDate(sub.next_bill_date)\n : null;\n const lastBillLong = sub.last_bill_date\n ? formatLongDate(sub.last_bill_date)\n : null;\n const daysOverdue =\n isPastDue && sub.next_bill_date\n ? Math.max(\n 0,\n Math.round(\n (Date.now() - new Date(sub.next_bill_date).getTime()) /\n (1000 * 60 * 60 * 24),\n ),\n )\n : 0;\n const cycle = computeCycleProgress(sub.last_bill_date, sub.next_bill_date, t);\n const showCycle = cycle != null && !isPaused && !isCancelled && !isPastDue;\n\n return (\n <div\n className={`group has-[:focus-visible]:ring-foreground/30 relative flex flex-col gap-5 rounded-2xl p-5 ring-1 transition-all duration-300 hover:-translate-y-0.5 has-[:focus-visible]:ring-2 ${\n isPastDue\n ? \"from-destructive/10 via-destructive/[0.03] ring-destructive/15 hover:ring-destructive/30 bg-transparent bg-gradient-to-br to-transparent shadow-sm hover:shadow-lg\"\n : \"ring-foreground/5 hover:ring-foreground/10 bg-transparent shadow-sm hover:shadow-lg\"\n } ${isPaused || isCancelled ? \"opacity-90\" : \"\"}`}\n >\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex flex-1 cursor-pointer flex-col gap-5 text-left focus:outline-none\"\n >\n {/* Top: image + title */}\n <div className=\"flex items-start gap-4\">\n <Thumbnail\n product={sub.variant.product}\n muted={isPaused || isCancelled}\n t={t}\n />\n <div className=\"min-w-0 flex-1 pt-1\">\n <div className=\"text-foreground truncate text-base font-bold\">\n {sub.variant.product.title || t(\"list_product_fallback\")}\n </div>\n <div className=\"text-muted-foreground mt-0.5 text-sm\">\n {cadence}\n </div>\n {(isPaused || isCancelled || isPastDue) && (\n <div\n className={`mt-2 inline-flex items-center gap-1.5 text-xs font-semibold ${\n isPastDue ? \"text-destructive\" : \"text-muted-foreground/75\"\n }`}\n >\n <span\n className={`size-1.5 rounded-full ${\n isCancelled || isPastDue\n ? \"bg-destructive\"\n : \"bg-muted-foreground\"\n }`}\n />\n {status.label}\n </div>\n )}\n </div>\n </div>\n\n {/* Bill summary pinned to the bottom of the click area via mt-auto\n so when the card stretches (e.g. when a bundle in the same grid\n row is taller), empty space grows between the title and summary\n instead of below them. */}\n {isCancelled ? (\n <div className=\"bg-muted text-muted-foreground mt-auto rounded-xl px-4 py-3 text-sm font-semibold\">\n {status.label}\n </div>\n ) : (\n <div className=\"bg-muted mt-auto rounded-xl px-4 py-3.5\">\n <div\n className={`text-sm font-bold ${isPastDue ? \"text-destructive\" : \"text-foreground\"}`}\n >\n {isPastDue\n ? daysOverdue === 1\n ? t(\"list_bill_due_1_day_ago\")\n : daysOverdue > 0\n ? t(\"list_bill_due_n_days_ago\", {\n n: String(daysOverdue),\n })\n : t(\"list_bill_overdue\")\n : isPaused\n ? t(\"list_last_bill_label\")\n : t(\"list_next_bill_label\")}\n </div>\n <div className=\"mt-3 grid grid-cols-2\">\n <div className=\"pr-4\">\n <div className=\"text-muted-foreground text-xs\">\n {isPaused ? t(\"list_last_bill_date\") : t(\"list_bill_date\")}\n </div>\n <div\n className={`mt-1 text-base font-bold tracking-tight tabular-nums ${isPastDue ? \"text-destructive\" : \"text-foreground\"}`}\n >\n {(isPaused ? lastBillLong : nextBillLong) ?? \"—\"}\n </div>\n </div>\n <div className=\"border-border border-l pl-4\">\n <div className=\"text-muted-foreground text-xs\">\n {isPaused\n ? t(\"list_last_bill_amount\")\n : t(\"list_bill_amount\")}\n </div>\n <div className=\"text-foreground mt-1 text-base font-bold tracking-tight tabular-nums\">\n {formatPrice(sub)}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {pricingSuffix(sub.subscription_plan, t)}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Cycle progress bar */}\n {showCycle && cycle && <CycleProgress cycle={cycle} />}\n </button>\n\n {/* Resume CTA */}\n {isPaused && (\n <button\n type=\"button\"\n onClick={onResume}\n disabled={!onResume}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 inline-flex w-full items-center justify-center gap-1.5 rounded-md py-2.5 text-xs font-bold transition-colors focus:outline-none disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Play className=\"size-3 fill-current\" strokeWidth={2.25} />\n {t(\"list_resume_cta\")}\n </button>\n )}\n </div>\n );\n}\n\n// ─── Cycle progress ───────────────────────────────────────────────────────\n\nfunction CycleProgress({ cycle }: { cycle: CycleProgressData }): JSX.Element {\n const pct = Math.round(cycle.progress * 100);\n return (\n <div>\n <div className=\"bg-muted relative h-1.5 overflow-hidden rounded-full\">\n <div\n className=\"bg-foreground absolute top-0 left-0 h-full rounded-full transition-all duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"text-muted-foreground mt-2 flex items-center justify-between text-xs font-medium\">\n <span>{cycle.startLabel}</span>\n <span>{cycle.endLabel}</span>\n </div>\n </div>\n );\n}\n\n// ─── Inactive (condensed) row ─────────────────────────────────────────────\n\nfunction InactiveSubscriptionRow({\n sub,\n onClick,\n t,\n}: {\n sub: subscriptions.SubscriptionListItem;\n onClick: () => void;\n t: T;\n}): JSX.Element {\n const status = mapStatus(sub.status, t);\n const cadence = formatCadence(sub.subscription_plan, t);\n const detail = `${cadence} · ${status.label}`;\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-foreground/5 hover:ring-foreground/10 focus-visible:ring-foreground/30 flex w-full cursor-pointer items-center gap-3 rounded-2xl bg-transparent px-4 py-3 text-left shadow-sm ring-1 transition-all duration-300 hover:-translate-y-0.5 hover:shadow-lg focus-visible:ring-2 focus-visible:outline-none\"\n >\n <div className=\"relative size-10 shrink-0 opacity-60 saturate-50\">\n {sub.variant.product.image_url ? (\n <img\n src={sub.variant.product.image_url}\n alt=\"\"\n className=\"ring-background size-10 rounded-xl bg-transparent object-cover ring-[3px]\"\n />\n ) : (\n <div className=\"bg-muted ring-background text-muted-foreground flex size-10 items-center justify-center rounded-xl ring-[3px]\">\n <ImageOff className=\"size-4\" strokeWidth={1.75} />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground truncate text-sm font-bold\">\n {sub.variant.product.title || t(\"list_product_fallback\")}\n </div>\n <div className=\"text-muted-foreground truncate text-xs\">{detail}</div>\n </div>\n </button>\n );\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction Thumbnail({\n product,\n muted,\n t,\n}: {\n product: subscriptions.SubscriptionListVariantProduct;\n muted?: boolean;\n t: T;\n}): JSX.Element {\n const wrapperClass = `relative size-24 shrink-0 transition-all ${muted ? \"saturate-50 opacity-60\" : \"\"}`;\n const imgClass =\n \"bg-transparent ring-background size-24 rounded-2xl object-cover ring-[3px] shadow-sm\";\n return (\n <div className={wrapperClass}>\n {product.image_url ? (\n <img src={product.image_url} alt=\"\" className={imgClass} />\n ) : (\n <div className=\"bg-muted ring-background text-muted-foreground flex size-24 items-center justify-center rounded-2xl shadow-sm ring-[3px]\">\n <ImageOff className=\"size-7\" strokeWidth={1.75} />\n </div>\n )}\n <div\n className=\"bg-primary text-primary-foreground ring-background absolute -top-1 -right-1 z-40 flex size-6 items-center justify-center rounded-full ring-2\"\n title={t(\"list_recurring_badge\")}\n >\n <Repeat className=\"size-3\" strokeWidth={2.75} />\n </div>\n </div>\n );\n}\n\n// ─── Empty / loading ───────────────────────────────────────────────────────\n\nfunction SubscriptionCardSkeleton(): JSX.Element {\n return (\n <div className=\"ring-border flex flex-col gap-5 rounded-2xl bg-transparent p-5 ring-1\">\n <div className=\"flex items-start gap-4\">\n <div className=\"bg-muted size-20 shrink-0 animate-pulse rounded-2xl\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"bg-muted h-5 w-2/3 animate-pulse rounded\" />\n <div className=\"bg-muted h-4 w-1/2 animate-pulse rounded\" />\n </div>\n </div>\n <div className=\"bg-muted h-12 animate-pulse rounded\" />\n <div className=\"bg-muted h-6 animate-pulse rounded\" />\n </div>\n );\n}\n\nfunction EmptyState({\n filtered,\n t,\n}: {\n filtered?: boolean;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"ring-border mx-auto mt-12 flex max-w-md flex-col items-center gap-2 rounded-2xl bg-transparent px-6 py-12 text-center ring-1\">\n <div className=\"text-foreground text-sm font-bold\">\n {filtered ? t(\"list_no_in_view\") : t(\"list_none_yet\")}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {filtered ? t(\"list_filtered_hint\") : t(\"list_empty_hint\")}\n </div>\n </div>\n );\n}\n\nfunction ErrorState({\n onRetry,\n t,\n}: {\n onRetry: () => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"ring-border mx-auto mt-12 flex max-w-md flex-col items-center gap-2 rounded-2xl bg-transparent px-6 py-12 text-center ring-1\">\n <div className=\"bg-muted flex size-12 items-center justify-center rounded-full\">\n <AlertCircle className=\"text-muted-foreground size-5\" strokeWidth={2} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"list_load_failed_title\")}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"list_load_failed_hint\")}\n </div>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 mt-2 inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-xs font-bold transition-all\"\n >\n {t(\"list_try_again\")}\n </button>\n </div>\n );\n}\n","import type { fluidPay } from \"@fluid-app/fluid-pay-core\";\n\n/**\n * Mirrors fluid-checkout's `isPaymentMethodUsable`. A payment method is only\n * eligible for bundle attachment when it has a complete billing address.\n *\n * Note: the portal's `fluidPay.CustomerPaymentMethod` does not surface the\n * checkout-only `au_status` field, so we only check billing-address completeness.\n */\nexport function isPaymentMethodUsable(\n pm: fluidPay.CustomerPaymentMethod,\n): boolean {\n const addr = pm.billing_address;\n if (!addr) return false;\n return Boolean(\n addr.address1 && addr.city && addr.state && addr.zip && addr.country_code,\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { isPaymentMethodUsable } from \"./payment-utils\";\nimport type { Step } from \"./types\";\n\ninterface UseBundleFormArgs {\n addresses: fluidPay.CustomerAddress[];\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n defaultAddressId?: number | null;\n defaultPaymentMethodId?: number | null;\n}\n\nexport interface BundleForm {\n step: Step;\n setStep: (s: Step) => void;\n selectedTokens: Set<string>;\n toggleToken: (token: string) => void;\n\n selectedYear: number;\n selectedMonth: number | null;\n selectedDay: number | null;\n setYear: (y: number) => void;\n setMonth: (m: number) => void;\n setDay: (d: number) => void;\n\n selectedAddressId: number | null;\n setSelectedAddressId: (id: number | null) => void;\n\n selectedPaymentMethodId: number | null;\n setSelectedPaymentMethodId: (id: number | null) => void;\n\n canProceedFromStep1: boolean;\n canProceedFromStep2: boolean;\n canProceedFromStep3: boolean;\n canProceedFromStep4: boolean;\n\n /** \"YYYY-MM-DD\" or null when month/day not yet selected. */\n formattedDate: string | null;\n}\n\nfunction pickDefaultAddressId(\n addresses: fluidPay.CustomerAddress[],\n defaultAddressId: number | null | undefined,\n): number | null {\n if (defaultAddressId != null) {\n const match = addresses.find((a) => a.id === defaultAddressId);\n if (match) return match.id;\n }\n const flagged = addresses.find((a) => a.default);\n if (flagged) return flagged.id;\n return addresses[0]?.id ?? null;\n}\n\nfunction pickDefaultPaymentMethodId(\n paymentMethods: fluidPay.CustomerPaymentMethod[],\n defaultPaymentMethodId: number | null | undefined,\n): number | null {\n const usable = paymentMethods.filter(isPaymentMethodUsable);\n if (defaultPaymentMethodId != null) {\n const match = usable.find((pm) => pm.id === defaultPaymentMethodId);\n if (match) return match.id;\n }\n const flagged = usable.find((pm) => pm.default);\n if (flagged) return flagged.id;\n return usable[0]?.id ?? null;\n}\n\nexport function useBundleForm({\n addresses,\n paymentMethods,\n defaultAddressId,\n defaultPaymentMethodId,\n}: UseBundleFormArgs): BundleForm {\n const [step, setStep] = useState<Step>(1);\n const [selectedTokens, setSelectedTokens] = useState<Set<string>>(\n () => new Set(),\n );\n const today = useMemo(() => new Date(), []);\n const [selectedYear, setYearState] = useState<number>(today.getUTCFullYear());\n const [selectedMonth, setMonthState] = useState<number | null>(null);\n const [selectedDay, setDayState] = useState<number | null>(null);\n const [selectedAddressId, setSelectedAddressId] = useState<number | null>(\n () => pickDefaultAddressId(addresses, defaultAddressId),\n );\n const [selectedPaymentMethodId, setSelectedPaymentMethodId] = useState<\n number | null\n >(() => pickDefaultPaymentMethodId(paymentMethods, defaultPaymentMethodId));\n\n // When the user opens the drawer with an empty address book, then adds an\n // address inline (AddressFormDialog → query invalidates → `addresses` prop\n // refreshes), auto-select the new address so step 3's Next button enables\n // without requiring a manual tap. The lazy useState initializer above only\n // runs once at mount and would otherwise leave `selectedAddressId === null`\n // forever. Mirror logic for payment methods.\n useEffect(() => {\n if (selectedAddressId == null && addresses.length > 0) {\n setSelectedAddressId(pickDefaultAddressId(addresses, defaultAddressId));\n }\n }, [selectedAddressId, addresses, defaultAddressId]);\n\n useEffect(() => {\n if (\n selectedPaymentMethodId == null &&\n paymentMethods.some(isPaymentMethodUsable)\n ) {\n setSelectedPaymentMethodId(\n pickDefaultPaymentMethodId(paymentMethods, defaultPaymentMethodId),\n );\n }\n }, [selectedPaymentMethodId, paymentMethods, defaultPaymentMethodId]);\n\n const toggleToken = useCallback((token: string) => {\n setSelectedTokens((prev) => {\n const next = new Set(prev);\n if (next.has(token)) next.delete(token);\n else next.add(token);\n return next;\n });\n }, []);\n\n // Cascade-clear month/day when year changes if month/day become invalid.\n const setYear = useCallback(\n (y: number) => {\n setYearState(y);\n if (selectedMonth != null) {\n const isPastMonth =\n y < today.getUTCFullYear() ||\n (y === today.getUTCFullYear() && selectedMonth < today.getUTCMonth());\n // Same-month edge case: switching back to the current year while a\n // day from the current month is selected can leave the day in the\n // past (e.g. selectedDay=3 when today=May 7). Clear the day in that\n // case so the user doesn't unknowingly submit a past date and trip\n // the BFF's `next_bill_date_in_past` validator.\n const isPastDay =\n y === today.getUTCFullYear() &&\n selectedMonth === today.getUTCMonth() &&\n selectedDay != null &&\n selectedDay < today.getUTCDate();\n if (isPastMonth) {\n setMonthState(null);\n setDayState(null);\n } else if (isPastDay) {\n setDayState(null);\n }\n }\n },\n [selectedMonth, selectedDay, today],\n );\n\n // Clear day when month changes if day exceeds the new month's day count OR\n // becomes past-dated. Past-dated example: today is May 7; user selected\n // year=2026 / month=July / day=3 (valid), then switches month back to May\n // — selectedDay=3 fits in May (3 <= 31) but is past today, so it would\n // submit as 2026-05-03 and trip the BFF's `next_bill_date_in_past`\n // validator with no inline explanation.\n const setMonth = useCallback(\n (m: number) => {\n setMonthState(m);\n if (selectedDay != null) {\n const daysInNewMonth = new Date(\n Date.UTC(selectedYear, m + 1, 0),\n ).getUTCDate();\n const isPastDay =\n selectedYear === today.getUTCFullYear() &&\n m === today.getUTCMonth() &&\n selectedDay < today.getUTCDate();\n if (selectedDay > daysInNewMonth || isPastDay) setDayState(null);\n }\n },\n [selectedDay, selectedYear, today],\n );\n\n const setDay = useCallback((d: number) => setDayState(d), []);\n\n const canProceedFromStep1 = selectedTokens.size >= 2;\n const canProceedFromStep2 = selectedMonth !== null && selectedDay !== null;\n const canProceedFromStep3 = selectedAddressId != null;\n const canProceedFromStep4 = selectedPaymentMethodId != null;\n\n const formattedDate = useMemo(() => {\n if (selectedMonth == null || selectedDay == null) return null;\n const mm = String(selectedMonth + 1).padStart(2, \"0\");\n const dd = String(selectedDay).padStart(2, \"0\");\n return `${selectedYear}-${mm}-${dd}`;\n }, [selectedYear, selectedMonth, selectedDay]);\n\n return {\n step,\n setStep,\n selectedTokens,\n toggleToken,\n selectedYear,\n selectedMonth,\n selectedDay,\n setYear,\n setMonth,\n setDay,\n selectedAddressId,\n setSelectedAddressId,\n selectedPaymentMethodId,\n setSelectedPaymentMethodId,\n canProceedFromStep1,\n canProceedFromStep2,\n canProceedFromStep3,\n canProceedFromStep4,\n formattedDate,\n };\n}\n","import type { JSX } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport type { Step } from \"./types\";\n\ninterface DrawerStepTabsProps {\n step: Step;\n onStepClick: (step: Step) => void;\n canProceedFromStep1: boolean;\n canProceedFromStep2: boolean;\n canProceedFromStep3: boolean;\n}\n\ntype TabLabelKey =\n | \"bundle_step_select\"\n | \"bundle_step_date\"\n | \"bundle_step_address\"\n | \"bundle_step_payment\";\n\nconst TABS: ReadonlyArray<{ id: Step; labelKey: TabLabelKey }> = [\n { id: 1, labelKey: \"bundle_step_select\" },\n { id: 2, labelKey: \"bundle_step_date\" },\n { id: 3, labelKey: \"bundle_step_address\" },\n { id: 4, labelKey: \"bundle_step_payment\" },\n];\n\nconst PROGRESS_BY_STEP: Record<Step, string> = {\n 1: \"0%\",\n 2: \"33%\",\n 3: \"66%\",\n 4: \"100%\",\n};\n\ntype StepMessageKey =\n | \"bundle_step1_message\"\n | \"bundle_step2_message\"\n | \"bundle_step3_message\"\n | \"bundle_step4_message\";\n\nexport function DrawerStepTabs({\n step,\n onStepClick,\n canProceedFromStep1,\n canProceedFromStep2,\n canProceedFromStep3,\n}: DrawerStepTabsProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n\n const handleClick = (target: Step) => {\n if (target < step) {\n onStepClick(target);\n } else if (target === 2 && canProceedFromStep1) {\n onStepClick(2);\n } else if (target === 3 && canProceedFromStep1 && canProceedFromStep2) {\n onStepClick(3);\n } else if (\n target === 4 &&\n canProceedFromStep1 &&\n canProceedFromStep2 &&\n canProceedFromStep3\n ) {\n onStepClick(4);\n }\n };\n\n const messageKey: StepMessageKey =\n step === 1\n ? \"bundle_step1_message\"\n : step === 2\n ? \"bundle_step2_message\"\n : step === 3\n ? \"bundle_step3_message\"\n : \"bundle_step4_message\";\n\n return (\n <div className=\"px-6 pt-4\">\n <div className=\"mb-2 flex items-center justify-between\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => handleClick(tab.id)}\n className={`text-xs font-bold transition-colors ${\n step === tab.id\n ? \"text-foreground\"\n : step > tab.id\n ? \"text-muted-foreground cursor-pointer\"\n : \"text-muted-foreground/75\"\n }`}\n >\n {t(tab.labelKey)}\n </button>\n ))}\n </div>\n\n <div className=\"bg-muted relative h-1 rounded-full\">\n <div\n className=\"bg-primary absolute h-1 rounded-full transition-all duration-300\"\n style={{ width: PROGRESS_BY_STEP[step] }}\n />\n {TABS.map((tab, index) => (\n <div\n key={tab.id}\n className={`absolute top-1/2 size-3 rounded-full transition-colors ${\n step >= tab.id ? \"bg-primary\" : \"bg-muted ring-border ring-1\"\n }`}\n style={\n index === 0\n ? { left: 0, transform: \"translateY(-50%)\" }\n : index === TABS.length - 1\n ? { right: 0, transform: \"translateY(-50%)\" }\n : {\n left: `${(index / (TABS.length - 1)) * 100}%`,\n transform: \"translate(-50%, -50%)\",\n }\n }\n />\n ))}\n </div>\n\n <div className=\"text-muted-foreground mt-3 flex items-center justify-center text-xs\">\n <span>{t(messageKey)}</span>\n </div>\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { Check, Package, Repeat, Truck } from \"lucide-react\";\nimport {\n formatCadence,\n formatPrice,\n} from \"../portal-subscriptions-list-helpers\";\n\ninterface DrawerStepSelectProps {\n subscriptions: subscriptions.SubscriptionListItem[];\n selectedTokens: Set<string>;\n onToggle: (token: string) => void;\n}\n\nfunction formatBillDate(value: string | null): string {\n if (!value) return \"—\";\n // Mirror the calendar-date-from-the-front parse in `formatLongDate` so a\n // pure date string like \"2026-05-10\" doesn't get shifted to May 9 for\n // anyone west of UTC. Subscription.next_billing_date is a datetime; the\n // date prefix matches the same regex.\n try {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(value);\n if (!match) return \"—\";\n const y = Number(match[1]);\n const m = Number(match[2]);\n const d = Number(match[3]);\n if (!y || !m || !d) return \"—\";\n const date = new Date(Date.UTC(y, m - 1, d));\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n timeZone: \"UTC\",\n });\n } catch {\n return \"—\";\n }\n}\n\nexport function DrawerStepSelect({\n subscriptions,\n selectedTokens,\n onToggle,\n}: DrawerStepSelectProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n return (\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n <div className=\"bg-muted mt-2 rounded-2xl p-6 text-center\">\n <div className=\"mx-auto mb-3 flex size-14 items-center justify-center rounded-2xl bg-transparent shadow-sm\">\n <Truck className=\"text-foreground size-7\" strokeWidth={2} />\n </div>\n <h3 className=\"text-foreground text-sm font-bold\">\n {t(\"bundle_and_save\")}\n </h3>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n {t(\"bundle_select_subs\")}\n </p>\n </div>\n\n {subscriptions.length < 2 && (\n <div className=\"ring-border mt-4 rounded-2xl p-6 text-center ring-1\">\n <p className=\"text-muted-foreground text-xs\">\n {t(\"bundle_no_bundleable_subs\")}\n </p>\n </div>\n )}\n\n <div className=\"mt-4 space-y-2\">\n {subscriptions.length >= 2 &&\n subscriptions.map((sub) => {\n const isSelected = selectedTokens.has(sub.subscription_token);\n return (\n <div\n key={sub.subscription_token}\n role=\"checkbox\"\n aria-checked={isSelected}\n tabIndex={0}\n onClick={() => onToggle(sub.subscription_token)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onToggle(sub.subscription_token);\n }\n }}\n className={`flex cursor-pointer items-start gap-3 rounded-2xl p-4 transition-all ${\n isSelected\n ? \"ring-primary bg-muted ring-2\"\n : \"ring-border hover:ring-foreground/20 ring-1\"\n }`}\n >\n <div className=\"pt-1\">\n <div\n className={`flex size-5 items-center justify-center rounded-full transition-colors ${\n isSelected ? \"bg-primary\" : \"ring-foreground/30 ring-2\"\n }`}\n >\n {isSelected && (\n <Check\n className=\"text-primary-foreground size-3\"\n strokeWidth={3}\n />\n )}\n </div>\n </div>\n\n {sub.variant?.product?.image_url ? (\n <img\n src={sub.variant.product.image_url}\n alt={sub.variant.product.title ?? \"\"}\n className=\"size-12 shrink-0 rounded-lg object-cover\"\n />\n ) : (\n <div className=\"bg-muted flex size-12 shrink-0 items-center justify-center rounded-lg\">\n <Package\n className=\"text-muted-foreground size-6\"\n strokeWidth={1.75}\n />\n </div>\n )}\n\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-foreground truncate text-xs font-bold\">\n {sub.variant?.product?.title ?? t(\"list_product_fallback\")}\n </p>\n <p className=\"text-foreground mt-0.5 text-xs\">\n {formatPrice(sub)}\n </p>\n {sub.customer?.full_name && (\n <p className=\"text-muted-foreground mt-0.5 truncate text-xs\">\n {sub.customer.full_name}\n </p>\n )}\n </div>\n\n <div className=\"shrink-0 text-right\">\n <div className=\"text-muted-foreground inline-flex items-center gap-1 text-xs\">\n <Repeat className=\"size-3\" strokeWidth={2} />\n {formatCadence(sub.subscription_plan, t)}\n </div>\n <p className=\"text-muted-foreground/75 mt-1 text-xs\">\n {formatBillDate(sub.next_bill_date)}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useMemo, type JSX } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\n\ninterface DrawerStepDateProps {\n selectedYear: number;\n selectedMonth: number | null;\n selectedDay: number | null;\n onYearChange: (year: number) => void;\n onMonthChange: (month: number) => void;\n onDayChange: (day: number) => void;\n}\n\nconst MONTHS = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n}\n\nexport function DrawerStepDate({\n selectedYear,\n selectedMonth,\n selectedDay,\n onYearChange,\n onMonthChange,\n onDayChange,\n}: DrawerStepDateProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n const today = useMemo(() => new Date(), []);\n const currentYear = today.getUTCFullYear();\n const currentMonth = today.getUTCMonth();\n const currentDay = today.getUTCDate();\n const availableYears = useMemo(\n () => [currentYear, currentYear + 1, currentYear + 2],\n [currentYear],\n );\n\n const isMonthDisabled = (monthIndex: number): boolean => {\n if (selectedYear < currentYear) return true;\n if (selectedYear > currentYear) return false;\n return monthIndex < currentMonth;\n };\n\n const daysInSelectedMonth =\n selectedMonth == null ? 31 : getDaysInMonth(selectedYear, selectedMonth);\n\n const isDayDisabled = (day: number): boolean => {\n if (selectedMonth == null) return true;\n if (day > getDaysInMonth(selectedYear, selectedMonth)) return true;\n if (selectedYear < currentYear) return true;\n if (selectedYear > currentYear) return false;\n if (selectedMonth > currentMonth) return false;\n if (selectedMonth < currentMonth) return true;\n return day < currentDay;\n };\n\n return (\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n <div className=\"mt-2\">\n <h3 className=\"text-foreground text-sm font-bold\">\n {t(\"bundle_select_new_bill_date\")}\n </h3>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n {t(\"bundle_select_new_bill_date_description\")}\n </p>\n </div>\n\n <div className=\"mt-6\">\n <h4 className=\"text-foreground mb-3 text-xs font-bold\">\n {t(\"bundle_year\")}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {availableYears.map((year) => {\n const isActive = selectedYear === year;\n return (\n <button\n key={year}\n type=\"button\"\n onClick={() => onYearChange(year)}\n className={`rounded-lg px-3 py-2.5 text-xs font-semibold transition-all ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"text-foreground ring-border hover:ring-foreground/20 bg-transparent ring-1\"\n }`}\n >\n {year}\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"mt-6\">\n <h4 className=\"text-foreground mb-3 text-xs font-bold\">\n {t(\"bundle_month\")}\n </h4>\n <div className=\"grid grid-cols-4 gap-2\">\n {MONTHS.map((month, index) => {\n const isActive = selectedMonth === index;\n const disabled = isMonthDisabled(index);\n return (\n <button\n key={month}\n type=\"button\"\n disabled={disabled}\n onClick={() => onMonthChange(index)}\n className={`rounded-lg px-3 py-2.5 text-xs font-semibold transition-all ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"text-foreground ring-border hover:ring-foreground/20 bg-transparent ring-1\"\n } ${disabled ? \"cursor-not-allowed opacity-40\" : \"\"}`}\n >\n {month}\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"mt-6\">\n <h4 className=\"text-foreground mb-3 text-xs font-bold\">\n {t(\"bundle_day\")}\n </h4>\n <div className=\"grid grid-cols-8 gap-1.5\">\n {Array.from({ length: daysInSelectedMonth }, (_, i) => i + 1).map(\n (day) => {\n const isActive = selectedDay === day;\n const disabled = isDayDisabled(day);\n return (\n <button\n key={day}\n type=\"button\"\n disabled={disabled}\n onClick={() => onDayChange(day)}\n className={`rounded-lg py-2 text-xs font-semibold transition-all ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"text-foreground ring-border hover:ring-foreground/20 bg-transparent ring-1\"\n } ${disabled ? \"cursor-not-allowed opacity-40\" : \"\"}`}\n >\n {day}\n </button>\n );\n },\n )}\n </div>\n </div>\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport { Check } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { formatLongDate } from \"../portal-subscriptions-list-helpers\";\n\ninterface DrawerStepAddressProps {\n addresses: fluidPay.CustomerAddress[];\n selectedAddressId: number | null;\n onAddressSelect: (id: number) => void;\n onAddAddress: () => void;\n formattedSelectedDate: string | null;\n}\n\nexport function DrawerStepAddress({\n addresses,\n selectedAddressId,\n onAddressSelect,\n onAddAddress,\n formattedSelectedDate,\n}: DrawerStepAddressProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n const hasFlaggedDefault = addresses.some((a) => a.default);\n return (\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n <div className=\"mt-2\">\n <h3 className=\"text-foreground text-sm font-bold\">\n {t(\"bundle_select_address\")}\n </h3>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n {t(\"bundle_select_address_description\")}\n </p>\n </div>\n\n {formattedSelectedDate && (\n <div className=\"bg-muted text-muted-foreground mt-4 rounded-lg px-4 py-2.5 text-xs\">\n {t(\"bundle_selected_bill_date\")}{\" \"}\n <span className=\"text-foreground font-semibold\">\n {formatLongDate(formattedSelectedDate)}\n </span>\n </div>\n )}\n\n <div className=\"mt-4 space-y-2\" role=\"radiogroup\">\n {addresses.map((address, index) => {\n const isSelected = selectedAddressId === address.id;\n const isDefault =\n address.default || (!hasFlaggedDefault && index === 0);\n return (\n <button\n key={address.id}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => onAddressSelect(address.id)}\n className={`flex h-auto w-full cursor-pointer items-start gap-3 rounded-2xl p-4 text-left transition-all ${\n isSelected\n ? \"ring-primary bg-muted ring-2\"\n : \"ring-border hover:ring-foreground/20 ring-1\"\n }`}\n >\n <div className=\"pt-0.5\">\n <div\n className={`flex size-5 items-center justify-center rounded-full transition-colors ${\n isSelected ? \"bg-primary\" : \"ring-foreground/30 ring-2\"\n }`}\n >\n {isSelected && (\n <Check\n className=\"text-primary-foreground size-3\"\n strokeWidth={3}\n />\n )}\n </div>\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {address.name && (\n <p className=\"text-foreground truncate text-xs font-bold\">\n {address.name}\n </p>\n )}\n {isDefault && (\n <span className=\"text-foreground ring-border rounded-full bg-transparent px-2 py-0.5 text-xs font-bold ring-1\">\n {t(\"bundle_default_badge\")}\n </span>\n )}\n </div>\n <p className=\"text-muted-foreground mt-0.5 truncate text-xs\">\n {address.address1}\n </p>\n <p className=\"text-muted-foreground truncate text-xs\">\n {[address.city, address.state].filter(Boolean).join(\", \")}{\" \"}\n {address.postal_code}\n </p>\n </div>\n </button>\n );\n })}\n </div>\n\n <div className=\"mt-4 text-right\">\n <button\n type=\"button\"\n onClick={onAddAddress}\n className=\"text-foreground inline-flex items-center text-xs font-bold underline-offset-2 hover:underline\"\n >\n {t(\"bundle_add_new_address\")}\n </button>\n </div>\n </div>\n );\n}\n","import { useMemo, type JSX } from \"react\";\nimport { Check, CreditCard } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { isPaymentMethodUsable } from \"./payment-utils\";\n\ninterface DrawerStepPaymentProps {\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n selectedPaymentMethodId: number | null;\n onPaymentMethodSelect: (id: number) => void;\n onAddPaymentMethod: () => void;\n}\n\nexport function DrawerStepPayment({\n paymentMethods,\n selectedPaymentMethodId,\n onPaymentMethodSelect,\n onAddPaymentMethod,\n}: DrawerStepPaymentProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n // Filter to usable + sort default-first.\n const usable = useMemo(() => {\n const filtered = paymentMethods.filter(isPaymentMethodUsable);\n const defaultIdx = filtered.findIndex((pm) => pm.default);\n if (defaultIdx <= 0) return filtered;\n const defaultCard = filtered[defaultIdx];\n if (!defaultCard) return filtered;\n return [defaultCard, ...filtered.filter((_, i) => i !== defaultIdx)];\n }, [paymentMethods]);\n\n return (\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n <div className=\"mt-2\">\n <h3 className=\"text-foreground text-sm font-bold\">\n {t(\"bundle_select_payment\")}\n </h3>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n {t(\"bundle_select_payment_description\")}\n </p>\n </div>\n\n {usable.length === 0 && (\n <div className=\"bg-muted text-muted-foreground mt-4 rounded-lg px-4 py-3 text-xs\">\n {t(\"bundle_no_usable_payment_methods\")}\n </div>\n )}\n\n <div className=\"mt-4 space-y-2\" role=\"radiogroup\">\n {usable.map((pm) => {\n const isSelected = selectedPaymentMethodId === pm.id;\n const brand =\n pm.details.card_brand ??\n pm.details.card_type ??\n pm.payment_type ??\n \"Card\";\n const lastFour = pm.details.last_four ?? \"••••\";\n const expiry =\n pm.details.exp_month != null && pm.details.exp_year != null\n ? `${t(\"bundle_card_expires\")} ${pm.details.exp_month}/${pm.details.exp_year}`\n : null;\n return (\n <button\n key={pm.id}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => onPaymentMethodSelect(pm.id)}\n className={`flex h-auto w-full cursor-pointer items-start gap-3 rounded-2xl p-4 text-left transition-all ${\n isSelected\n ? \"ring-primary bg-muted ring-2\"\n : \"ring-border hover:ring-foreground/20 ring-1\"\n }`}\n >\n <div className=\"pt-0.5\">\n <div\n className={`flex size-5 items-center justify-center rounded-full transition-colors ${\n isSelected ? \"bg-primary\" : \"ring-foreground/30 ring-2\"\n }`}\n >\n {isSelected && (\n <Check\n className=\"text-primary-foreground size-3\"\n strokeWidth={3}\n />\n )}\n </div>\n </div>\n\n {pm.details.logo_url ? (\n <img\n src={pm.details.logo_url}\n alt={brand}\n className=\"h-6 w-10 shrink-0 object-contain\"\n />\n ) : (\n <div className=\"bg-muted text-muted-foreground flex h-6 w-10 shrink-0 items-center justify-center rounded\">\n <CreditCard className=\"size-4\" strokeWidth={1.75} />\n </div>\n )}\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"text-foreground text-xs font-bold\">\n {brand} •••• {lastFour}\n </p>\n {pm.default && (\n <span className=\"text-foreground ring-border rounded-full bg-transparent px-2 py-0.5 text-xs font-bold ring-1\">\n {t(\"bundle_default_badge\")}\n </span>\n )}\n </div>\n {expiry && (\n <p className=\"text-muted-foreground mt-0.5 text-xs\">\n {expiry}\n </p>\n )}\n </div>\n </button>\n );\n })}\n </div>\n\n <div className=\"mt-4 text-right\">\n <button\n type=\"button\"\n onClick={onAddPaymentMethod}\n className=\"text-foreground inline-flex items-center text-xs font-bold underline-offset-2 hover:underline\"\n >\n {t(\"bundle_add_new_card\")}\n </button>\n </div>\n </div>\n );\n}\n","import { type JSX } from \"react\";\nimport { Sheet, SheetContent, SheetTitle } from \"@fluid-app/ui-primitives\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useBundleForm } from \"./use-bundle-form\";\nimport { DrawerStepTabs } from \"./DrawerStepTabs\";\nimport { DrawerStepSelect } from \"./DrawerStepSelect\";\nimport { DrawerStepDate } from \"./DrawerStepDate\";\nimport { DrawerStepAddress } from \"./DrawerStepAddress\";\nimport { DrawerStepPayment } from \"./DrawerStepPayment\";\nimport type { Step } from \"./types\";\n\nexport interface BundleSubscriptionsDrawerProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n subscriptions: subscriptions.SubscriptionListItem[];\n addresses: fluidPay.CustomerAddress[];\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n defaultAddressId?: number | null;\n defaultPaymentMethodId?: number | null;\n onAddAddress: () => void;\n onAddPaymentMethod: () => void;\n onSubmit: (params: {\n subscription_tokens: string[];\n next_bill_date: string;\n address_id: number;\n payment_method_id: number;\n }) => Promise<void>;\n isSubmitting?: boolean;\n}\n\nexport function BundleSubscriptionsDrawer({\n open,\n onOpenChange,\n subscriptions: subscriptionList,\n addresses,\n paymentMethods,\n defaultAddressId,\n defaultPaymentMethodId,\n onAddAddress,\n onAddPaymentMethod,\n onSubmit,\n isSubmitting,\n}: BundleSubscriptionsDrawerProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n const form = useBundleForm({\n addresses,\n paymentMethods,\n defaultAddressId,\n defaultPaymentMethodId,\n });\n\n const handleClose = () => onOpenChange(false);\n\n const handleNext = () => {\n if (form.step < 4) form.setStep((form.step + 1) as Step);\n };\n\n const handleBack = () => {\n if (form.step === 1) handleClose();\n else form.setStep((form.step - 1) as Step);\n };\n\n const handleSubmit = async () => {\n if (\n !form.canProceedFromStep1 ||\n !form.canProceedFromStep2 ||\n !form.canProceedFromStep3 ||\n !form.canProceedFromStep4 ||\n form.formattedDate == null ||\n form.selectedAddressId == null ||\n form.selectedPaymentMethodId == null\n ) {\n return;\n }\n await onSubmit({\n subscription_tokens: Array.from(form.selectedTokens),\n next_bill_date: form.formattedDate,\n address_id: form.selectedAddressId,\n payment_method_id: form.selectedPaymentMethodId,\n });\n };\n\n const nextDisabled =\n (form.step === 1 && !form.canProceedFromStep1) ||\n (form.step === 2 && !form.canProceedFromStep2) ||\n (form.step === 3 && !form.canProceedFromStep3);\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent\n side=\"right\"\n className=\"bg-background flex h-full w-full flex-col gap-0 p-0 sm:max-w-md\"\n >\n {/* Header */}\n <div className=\"border-border flex items-center justify-between border-b px-6 py-4\">\n <SheetTitle className=\"text-foreground text-base font-bold\">\n {t(\"bundle_subscriptions\")}\n </SheetTitle>\n {/* SheetContent already renders its own close (X) button via the shadcn primitive. */}\n </div>\n\n {/* Step indicator */}\n <DrawerStepTabs\n step={form.step}\n onStepClick={form.setStep}\n canProceedFromStep1={form.canProceedFromStep1}\n canProceedFromStep2={form.canProceedFromStep2}\n canProceedFromStep3={form.canProceedFromStep3}\n />\n\n {/* Active step body */}\n {form.step === 1 && (\n <DrawerStepSelect\n subscriptions={subscriptionList}\n selectedTokens={form.selectedTokens}\n onToggle={form.toggleToken}\n />\n )}\n {form.step === 2 && (\n <DrawerStepDate\n selectedYear={form.selectedYear}\n selectedMonth={form.selectedMonth}\n selectedDay={form.selectedDay}\n onYearChange={form.setYear}\n onMonthChange={form.setMonth}\n onDayChange={form.setDay}\n />\n )}\n {form.step === 3 && (\n <DrawerStepAddress\n addresses={addresses}\n selectedAddressId={form.selectedAddressId}\n onAddressSelect={form.setSelectedAddressId}\n onAddAddress={onAddAddress}\n formattedSelectedDate={form.formattedDate}\n />\n )}\n {form.step === 4 && (\n <DrawerStepPayment\n paymentMethods={paymentMethods}\n selectedPaymentMethodId={form.selectedPaymentMethodId}\n onPaymentMethodSelect={form.setSelectedPaymentMethodId}\n onAddPaymentMethod={onAddPaymentMethod}\n />\n )}\n\n {/* Footer */}\n <div className=\"border-border flex items-center justify-between gap-3 border-t px-6 py-4\">\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"text-foreground ring-border hover:bg-muted rounded-lg bg-transparent px-6 py-2.5 text-xs font-bold ring-1 transition-all\"\n >\n {form.step === 1 ? t(\"bundle_done\") : t(\"bundle_back\")}\n </button>\n {form.step < 4 ? (\n <button\n type=\"button\"\n onClick={handleNext}\n disabled={nextDisabled}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 rounded-lg px-6 py-2.5 text-xs font-bold transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {t(\"next\")}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!form.canProceedFromStep4 || isSubmitting}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 inline-flex min-w-[140px] items-center justify-center rounded-lg px-6 py-2.5 text-xs font-bold transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {isSubmitting ? (\n <span className=\"border-primary-foreground size-5 animate-spin rounded-full border-2 border-t-transparent\" />\n ) : (\n t(\"bundle_create\")\n )}\n </button>\n )}\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport { isApiError } from \"@fluid-app/api-client-core\";\nimport {\n AddressFormDialog,\n CreditCardFormDialog,\n type CreditCardFormSubmitData,\n} from \"@fluid-app/profile-ui\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport {\n useBundles,\n useCreateBundle,\n useInfiniteSubscriptions,\n useUpdateSubscriptionInfo,\n} from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { TOKEN_PROVIDER_VGS } from \"@fluid-app/portal-core/pay-types\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { payKeys, storeKeys } from \"../account/query-keys\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport { PortalSubscriptionsList } from \"./subscriptions/PortalSubscriptionsList\";\nimport { BundleSubscriptionsDrawer } from \"./subscriptions/bundle-drawer/BundleSubscriptionsDrawer\";\nimport { mapStatusKindOnly } from \"./subscriptions/portal-subscriptions-list-helpers\";\nimport { useStore } from \"../hooks/use-store\";\n\ninterface SubscriptionsListScreenProps {\n customerId: number | undefined;\n isLoadingCustomer: boolean;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\n// AddressFormDialog and CreditCardFormDialog accept their own free-form\n// translation function. Their label set is closed and not part of the\n// subscriptions dictionary, so we inline a small map and Title-Case any\n// unknown key (mirrors the pattern in PortalSubscriptionShippingAddressSection).\nconst ADDRESS_DIALOG_LABELS: Record<string, string> = {\n add_an_address: \"Add an Address\",\n add_address: \"Add Address\",\n edit_address: \"Edit Address\",\n delete_address: \"Delete Address\",\n delete_address_message:\n \"Are you sure you want to delete this address? This action cannot be undone.\",\n delete: \"Delete\",\n cancel: \"Cancel\",\n country: \"Country\",\n name: \"Name\",\n address_line_1: \"Address Line 1\",\n address_line_2: \"Apartment, suite, etc.\",\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 select_an_option: \"Select an option\",\n set_as_default_address: \"Set as default address\",\n save_address: \"Save Address\",\n deleting: \"Deleting…\",\n tap_to_confirm: \"Tap to confirm\",\n add_credit_card: \"Add Credit Card\",\n add_billing_address: \"Add billing address\",\n billing_address: \"Billing Address\",\n same_as_shipping: \"Same as shipping address\",\n use_a_different_address: \"Use a different address\",\n set_as_default_payment_method: \"Set as default payment method\",\n save_card: \"Save Card\",\n saving: \"Saving...\",\n securing: \"Loading secure form...\",\n};\n\nfunction addressDialogT(key: string): string {\n return (\n ADDRESS_DIALOG_LABELS[key] ??\n key\n .split(\"_\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \")\n );\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\nfunction SubscriptionsListScreenInner({\n customerId,\n isLoadingCustomer,\n onToast,\n}: SubscriptionsListScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n const queryClient = useQueryClient();\n const payApi = usePayApi();\n const countriesApi = useCountriesApi();\n const { t } = useSubscriptionsTranslation();\n const { t: profileT } = useProfileTranslation();\n const { config } = useFluidContext();\n const { locale } = useActiveLocale();\n\n // Company-level bundling feature flag from the portal-tenant store endpoint.\n // The Rails BFF returns 422 on bundle endpoints when this is false, so we\n // hide every bundle entry point (CTA, drawer, list cards) rather than show\n // controls that are guaranteed to fail.\n const { data: store } = useStore();\n const bundlingEnabled = !!store?.bundle_subscriptions_enabled;\n\n const { data: addresses = [] } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: !!customerId && !isLoadingCustomer,\n });\n\n const { data: paymentMethods = [] } = 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: !!customerId && !isLoadingCustomer,\n });\n\n // Re-call useInfiniteSubscriptions here so the drawer can see the same flat\n // list without prop-drilling. TanStack Query dedupes the network request,\n // so this is just a cache-read after PortalSubscriptionsList has fetched.\n const { data: subscriptionsData } = useInfiniteSubscriptions(\n { customerId, limit: 12 },\n { enabled: !!customerId && !isLoadingCustomer },\n );\n const subscriptionsList = useMemo(\n () => subscriptionsData?.pages.flatMap((p) => p.subscriptions) ?? [],\n [subscriptionsData],\n );\n\n // Only active/paused/pending/past-due, currently un-bundled subs can be\n // bundled. Cancelled subs have no future billing for the bundler to align,\n // and already-bundled subs would re-trigger bundler.rb's composite-key\n // grouping rather than create a fresh group.\n const bundleableSubscriptions = useMemo(\n () =>\n subscriptionsList.filter(\n (s) =>\n mapStatusKindOnly(s.status) !== \"cancelled\" &&\n (s.bundled_subscriptions?.length ?? 0) === 0,\n ),\n [subscriptionsList],\n );\n\n // Authoritative source for runtime bundle groupings — the backend recomputes\n // group membership at request time from `bundler.rb`'s composite key\n // (customer + address + volume_rep + next_bill_date + digital). The list\n // component picks out `subscription_count > 1` for actual bundle cards.\n const { data: bundlesData } = useBundles({\n enabled: !!customerId && !isLoadingCustomer && bundlingEnabled,\n });\n\n // Drawer + dialog state.\n const [bundleDrawerOpen, setBundleDrawerOpen] = useState(false);\n const [bundleDrawerKey, setBundleDrawerKey] = useState(0);\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 // `isBundling` covers the FULL handleBundle async span (createBundle +\n // per-token payment-method PUT loop), not just createBundle.isPending.\n // Without this, the submit button would re-enable after createBundle\n // resolved while the PUT loop was still in flight, allowing a duplicate\n // bundle creation request.\n const [isBundling, setIsBundling] = useState(false);\n\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(),\n queryFn: () => countriesApi.listCountries(),\n enabled: addressDialog.open || isAddCardOpen,\n });\n const countryOptions = useMemo(\n () =>\n [...(countriesData?.countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countriesData?.countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countriesData]);\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n const createAddressMutation = useMutation({\n // Detect a server-side dedupe (POST /api/pay/addresses returns the existing\n // record when an identical address already exists, ignoring `name`). Snapshot\n // the current id set before the request and compare against the returned id.\n mutationFn: async (body: fluidPay.CreateAddressBody) => {\n const existingIds = new Set(addresses.map((a) => a.id));\n const address = await payApi.createAddress({\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n default: body.address.default,\n },\n });\n return { address, deduped: existingIds.has(address.id) };\n },\n onSuccess: ({ deduped }) => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n if (deduped) {\n onToast?.(profileT(\"address_already_exists\"), \"warning\");\n } else {\n onToast?.(profileT(\"address_created\"), \"success\");\n }\n },\n onError: () => onToast?.(profileT(\"failed_to_create_address\"), \"error\"),\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: CreditCardFormSubmitData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n token_provider: TOKEN_PROVIDER_VGS,\n exp_month: data.payment_method.exp_month,\n exp_year: data.payment_method.exp_year,\n cvv_token: data.payment_method.cvv_token,\n card_holder: data.payment_method.card_holder,\n default: data.set_as_default,\n },\n billing_address_id: data.billing_address_id,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.paymentMethods.all });\n onToast?.(\"Payment method added\", \"success\");\n },\n onError: () => onToast?.(\"Failed to add payment method\", \"error\"),\n });\n\n const createBundle = useCreateBundle();\n const updateSubscription = useUpdateSubscriptionInfo();\n\n const handleBundleClick = () => {\n setBundleDrawerKey((k) => k + 1);\n setBundleDrawerOpen(true);\n };\n\n const handleBundle = async (params: {\n subscription_tokens: string[];\n next_bill_date: string;\n address_id: number;\n payment_method_id: number;\n }) => {\n if (isBundling) return;\n setIsBundling(true);\n try {\n await createBundle.mutateAsync({\n subscription_tokens: params.subscription_tokens,\n next_bill_date: params.next_bill_date,\n address_id: params.address_id,\n });\n } catch (err) {\n // Surface the BFF's validation message (e.g. \"cannot bundle a cancelled\n // subscription\") instead of a generic \"Please try again\" — FetchClient\n // already extracts `data.message` from the JSON body into ApiError.\n // Only trust the message when it's a 4xx ApiError (real validation); on\n // 5xx or non-ApiError throws, fall through to the localized fallback so\n // users never see FetchClient's \"POST request failed\" default.\n const bffMessage =\n isApiError(err) && err.status >= 400 && err.status < 500\n ? err.message\n : undefined;\n const message = bffMessage ?? t(\"bundle_failed\");\n onToast?.(message, \"error\");\n setIsBundling(false);\n return;\n }\n\n // PUT-loop workaround: the BFF create endpoint accepts subscription_tokens,\n // next_bill_date, address_id, and volume_rep_id only — it does NOT honor\n // payment_method_id. Push the chosen payment method onto each member sub\n // via the existing per-subscription update endpoint. Settle all in\n // parallel so a single 4xx doesn't block the others.\n const results = await Promise.allSettled(\n params.subscription_tokens.map((token) =>\n updateSubscription.mutateAsync({\n subscriptionToken: token,\n body: { payment_method_id: params.payment_method_id },\n }),\n ),\n );\n const failedCount = results.filter((r) => r.status === \"rejected\").length;\n if (failedCount === 0) {\n onToast?.(t(\"bundle_succeeded\"), \"success\");\n } else {\n onToast?.(\n t(\"bundle_partial_payment_failure\", { n: String(failedCount) }),\n \"warning\",\n );\n }\n setBundleDrawerOpen(false);\n setIsBundling(false);\n };\n\n const goToDetail = (token: string) => navigate(`subscriptions/${token}`);\n\n return (\n <>\n <PortalSubscriptionsList\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n onSubscriptionClick={goToDetail}\n onResume={(sub) => goToDetail(sub.subscription_token)}\n onBundleClick={\n bundlingEnabled && bundleableSubscriptions.length >= 2\n ? handleBundleClick\n : undefined\n }\n bundles={bundlingEnabled ? bundlesData : undefined}\n />\n\n {bundlingEnabled && (\n <BundleSubscriptionsDrawer\n key={bundleDrawerKey}\n open={bundleDrawerOpen}\n onOpenChange={setBundleDrawerOpen}\n subscriptions={bundleableSubscriptions}\n addresses={addresses}\n paymentMethods={paymentMethods}\n defaultAddressId={\n addresses.find((a) => a.default)?.id ?? addresses[0]?.id ?? null\n }\n defaultPaymentMethodId={\n paymentMethods.find((pm) => pm.default)?.id ??\n paymentMethods[0]?.id ??\n null\n }\n onAddAddress={() => setAddressDialog({ open: true, selected: null })}\n onAddPaymentMethod={() => setIsAddCardOpen(true)}\n onSubmit={handleBundle}\n isSubmitting={isBundling}\n />\n )}\n\n <AddressFormDialog\n isOpen={addressDialog.open}\n onClose={() => setAddressDialog({ open: false, selected: null })}\n selectedAddress={addressDialog.selected}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ??\n config.countryIso ??\n \"US\"\n }\n languageIso={locale}\n t={addressDialogT}\n onSubmit={async (formData) => {\n try {\n await createAddressMutation.mutateAsync(formData);\n setAddressDialog({ open: false, selected: null });\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={createAddressMutation.isPending}\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={addressDialogT(\"address_line_1\")}\n />\n )}\n />\n\n <CreditCardFormDialog\n isOpen={isAddCardOpen}\n onClose={() => setIsAddCardOpen(false)}\n t={addressDialogT}\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 jwt=\"\"\n savedAddresses={addresses}\n defaultBillingAddressId={addresses.find((a) => a.default)?.id}\n renderAddressFormDialog={({ isOpen, onClose, onAddressCreated }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={null}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ??\n config.countryIso ??\n \"US\"\n }\n languageIso={locale}\n t={addressDialogT}\n onSubmit={async (formData) => {\n try {\n const { address } =\n await createAddressMutation.mutateAsync(formData);\n onAddressCreated(mapToFluidPayAddress(address));\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={createAddressMutation.isPending}\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={addressDialogT(\"address_line_1\")}\n />\n )}\n />\n )}\n />\n </>\n );\n}\n\nexport function SubscriptionsListScreen(\n props: SubscriptionsListScreenProps,\n): React.JSX.Element {\n const payApi = usePayApi();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileTranslationBridge>\n <SubscriptionsListScreenInner {...props} />\n </ProfileTranslationBridge>\n </FluidPayCoreProvider>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n AlertDialog,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@fluid-app/ui-primitives\";\n\nconst PAUSE_MONTH_OPTIONS = [1, 2, 3] as const;\nexport type PauseMonths = (typeof PAUSE_MONTH_OPTIONS)[number];\n\nexport interface CancelSubscriptionDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: () => void | Promise<unknown>;\n onPauseInstead: (months: PauseMonths) => void;\n errorMessage?: string;\n}\n\nexport function CancelSubscriptionDialog({\n open,\n onOpenChange,\n onConfirm,\n onPauseInstead,\n errorMessage,\n}: CancelSubscriptionDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [isPending, setIsPending] = useState(false);\n const [selectedMonths, setSelectedMonths] = useState<PauseMonths | null>(\n null,\n );\n\n useEffect(() => {\n if (!open) setSelectedMonths(null);\n }, [open]);\n\n const handleConfirm = async () => {\n const result = onConfirm();\n if (!(result instanceof Promise)) {\n onOpenChange(false);\n return;\n }\n setIsPending(true);\n try {\n await result;\n onOpenChange(false);\n } catch (error) {\n // Leave the dialog open so the parent can surface errorMessage inline.\n console.error(\"CancelSubscriptionDialog: action rejected\", error);\n } finally {\n setIsPending(false);\n }\n };\n\n const handlePause = () => {\n if (!selectedMonths) return;\n onPauseInstead(selectedMonths);\n };\n\n return (\n <AlertDialog\n open={open}\n onOpenChange={(v) => !isPending && onOpenChange(v)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{t(\"cancel_dialog_title\")}</AlertDialogTitle>\n <AlertDialogDescription>\n {t(\"cancel_dialog_description\")}\n </AlertDialogDescription>\n </AlertDialogHeader>\n\n <div className=\"border-border space-y-2 rounded-md border p-3\">\n <p className=\"text-foreground text-sm font-medium\">\n {t(\"cancel_dialog_pause_question\")}\n </p>\n <Label\n htmlFor=\"cancel-pause-months\"\n className=\"text-foreground text-sm font-semibold\"\n >\n {t(\"pause_for\")}\n </Label>\n <Select\n value={selectedMonths ? String(selectedMonths) : undefined}\n onValueChange={(value) =>\n setSelectedMonths(value ? (Number(value) as PauseMonths) : null)\n }\n disabled={isPending}\n >\n <SelectTrigger id=\"cancel-pause-months\" className=\"w-full\">\n <SelectValue placeholder={t(\"select_duration\")} />\n </SelectTrigger>\n <SelectContent>\n {PAUSE_MONTH_OPTIONS.map((months) => (\n <SelectItem key={months} value={String(months)}>\n {months === 1\n ? t(\"month_singular\", { count: String(months) })\n : t(\"month_plural\", { count: String(months) })}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"outline\"\n onClick={handlePause}\n disabled={isPending || !selectedMonths}\n className=\"w-full\"\n >\n {t(\"cancel_dialog_pause_button\")}\n </Button>\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <AlertDialogFooter className=\"flex-col gap-2 sm:flex-row sm:justify-end\">\n <AlertDialogCancel disabled={isPending}>\n {t(\"cancel_dialog_cancel_button\")}\n </AlertDialogCancel>\n {/*\n Plain Button rather than AlertDialogAction: Action auto-closes\n the dialog after onClick, which races handleConfirm's async\n path — the dialog would dismiss before the mutation settled,\n the spinner would never show, and an inline errorMessage would\n never be visible. handleConfirm calls onOpenChange itself on\n success and intentionally leaves the dialog open on rejection.\n */}\n <Button\n variant=\"destructive\"\n onClick={handleConfirm}\n disabled={isPending}\n autoFocus\n >\n {isPending ? \"...\" : t(\"cancel_dialog_confirm_button\")}\n </Button>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { calculateResumeDate } from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Label,\n} from \"@fluid-app/ui-primitives\";\nimport { format } from \"date-fns\";\n\ntype PauseType = \"indefinite\" | \"order_count\";\n\nexport type PauseSubscriptionSelection =\n | { type: \"indefinite\" }\n | { type: \"order_count\"; numberOfOrders: number };\n\nexport interface PauseSubscriptionDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: (selection: PauseSubscriptionSelection) => void;\n isLoading?: boolean;\n errorMessage?: string;\n currentNextBillDate?: string | null;\n billingInterval?: number;\n billingIntervalUnit?: string;\n}\n\nexport function PauseSubscriptionDialog({\n open,\n onOpenChange,\n onConfirm,\n isLoading,\n errorMessage,\n currentNextBillDate,\n billingInterval = 1,\n billingIntervalUnit = \"month\",\n}: PauseSubscriptionDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [pauseType, setPauseType] = useState<PauseType>(\"indefinite\");\n const [selectedOrderCount, setSelectedOrderCount] = useState<number | null>(\n null,\n );\n\n const orderCountOptions = Array.from({ length: 99 }, (_, i) => i + 1);\n\n const calculatedResumeDate =\n selectedOrderCount && currentNextBillDate\n ? calculateResumeDate(\n billingInterval,\n billingIntervalUnit,\n selectedOrderCount,\n currentNextBillDate,\n )\n : null;\n\n // Reset selections whenever the dialog opens so stale state doesn't\n // leak across invocations.\n useEffect(() => {\n if (!open) return;\n setPauseType(\"indefinite\");\n setSelectedOrderCount(null);\n }, [open]);\n\n const handleConfirm = () => {\n if (pauseType === \"indefinite\") {\n onConfirm({ type: \"indefinite\" });\n return;\n }\n if (pauseType === \"order_count\" && selectedOrderCount) {\n onConfirm({\n type: \"order_count\",\n numberOfOrders: selectedOrderCount,\n });\n }\n };\n\n const handleDismiss = (next: boolean) => {\n if (!next) {\n setPauseType(\"indefinite\");\n setSelectedOrderCount(null);\n }\n onOpenChange(next);\n };\n\n const statusMessage = (() => {\n if (pauseType === \"indefinite\") {\n return (\n <>\n {t(\"pause_indefinite_message_prefix\")}{\" \"}\n <strong>{t(\"pause_indefinite_message_resume\")}</strong>{\" \"}\n {t(\"pause_indefinite_message_suffix\")}\n </>\n );\n }\n if (!selectedOrderCount) return null;\n const displayDate = calculatedResumeDate\n ? format(calculatedResumeDate, \"MMMM d, yyyy\")\n : \"a future date\";\n return (\n <>\n {t(\"pause_resume_message_prefix\")}{\" \"}\n <span className=\"font-semibold\">{displayDate}</span>\n {t(\"pause_resume_message_suffix\")}\n </>\n );\n })();\n\n const isActionDisabled = pauseType === \"order_count\" && !selectedOrderCount;\n\n return (\n <Dialog open={open} onOpenChange={handleDismiss}>\n <DialogContent\n aria-describedby=\"pause-subscription-dialog-description\"\n className=\"rounded\"\n >\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {t(\"pause_dialog_title\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p\n id=\"pause-subscription-dialog-description\"\n className=\"text-muted-foreground text-sm\"\n >\n {t(\"pause_dialog_description\")}\n </p>\n\n <div className=\"space-y-4\">\n {/* Pause Indefinitely */}\n <div className=\"flex items-center gap-x-2\">\n <input\n id=\"pause-indefinitely\"\n type=\"radio\"\n checked={pauseType === \"indefinite\"}\n onChange={() => setPauseType(\"indefinite\")}\n className=\"border-border accent-primary size-4 focus:ring-0\"\n />\n <Label\n htmlFor=\"pause-indefinitely\"\n className=\"text-foreground cursor-pointer text-sm font-medium\"\n >\n {t(\"pause_indefinitely\")}\n </Label>\n </div>\n\n {/* Pause for Number of Orders */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-x-2\">\n <input\n id=\"pause-order-count\"\n type=\"radio\"\n checked={pauseType === \"order_count\"}\n onChange={() => setPauseType(\"order_count\")}\n className=\"border-border accent-primary size-4 focus:ring-0\"\n />\n <Label\n htmlFor=\"pause-order-count\"\n className=\"text-foreground cursor-pointer text-sm font-medium\"\n >\n {t(\"pause_for_orders\")}\n </Label>\n </div>\n\n {pauseType === \"order_count\" && (\n <div className=\"ml-6 space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"choose_orders_to_skip\")}\n </Label>\n <select\n value={selectedOrderCount ?? \"\"}\n onChange={(e) =>\n setSelectedOrderCount(Number(e.target.value))\n }\n className=\"border-input bg-background focus:border-ring focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-hidden\"\n >\n <option value=\"\" disabled>\n {t(\"select\")}\n </option>\n {orderCountOptions.map((count) => (\n <option key={count} value={count}>\n {count}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n\n {/* Status Message */}\n {statusMessage && (\n <div className=\"text-muted-foreground text-xs\">\n {statusMessage}\n </div>\n )}\n </div>\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between gap-x-2\">\n <Button\n variant=\"outline\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={() => handleDismiss(false)}\n >\n {t(\"pause_dialog_cancel\")}\n </Button>\n <Button\n type=\"button\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={handleConfirm}\n disabled={isActionDisabled || isLoading}\n >\n {isLoading ? (\n <div className=\"border-primary-foreground size-5 animate-spin rounded-full border-4 border-t-4 border-t-transparent\" />\n ) : (\n t(\"pause_dialog_action\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { parse } from \"date-fns\";\n\nconst ISO_DATE = \"yyyy-MM-dd\";\n\n/**\n * Parse an ISO date string as local midnight. Accepts either a bare\n * \"yyyy-MM-dd\" or a full ISO timestamp — both are sliced to the date\n * portion first so the result lands on the intended calendar day\n * regardless of the viewer's timezone.\n */\nexport function parseIsoDate(value: string): Date {\n return parse(value.slice(0, 10), ISO_DATE, new Date());\n}\n","import { useEffect, useState } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Button,\n Calendar,\n cn,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport { addDays, format } from \"date-fns\";\nimport { CalendarIcon } from \"lucide-react\";\nimport { parseIsoDate } from \"../lib/parse-iso-date\";\n\nexport interface ResumeSubscriptionDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: (nextBillDate: string) => void;\n isLoading?: boolean;\n errorMessage?: string;\n /** Seeds the calendar; must be in the future. Defaults to tomorrow. */\n defaultNextBillDate?: string | null;\n}\n\nexport function ResumeSubscriptionDialog({\n open,\n onOpenChange,\n onConfirm,\n isLoading,\n errorMessage,\n defaultNextBillDate,\n}: ResumeSubscriptionDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [selectedDate, setSelectedDate] = useState<Date | undefined>(undefined);\n const [calendarOpen, setCalendarOpen] = useState(false);\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const minDate = addDays(today, 1);\n\n // Seed selected date when the dialog opens.\n useEffect(() => {\n if (!open) return;\n if (defaultNextBillDate) {\n const seeded = parseIsoDate(defaultNextBillDate);\n setSelectedDate(seeded < minDate ? minDate : seeded);\n } else {\n setSelectedDate(minDate);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, defaultNextBillDate]);\n\n const handleConfirm = () => {\n if (!selectedDate) return;\n onConfirm(format(selectedDate, \"yyyy-MM-dd\"));\n };\n\n const handleDismiss = (next: boolean) => {\n if (!next) setSelectedDate(undefined);\n onOpenChange(next);\n };\n\n return (\n <Dialog open={open} onOpenChange={handleDismiss}>\n <DialogContent\n aria-describedby=\"resume-subscription-dialog-description\"\n className=\"rounded\"\n >\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {t(\"resume_dialog_title\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p\n id=\"resume-subscription-dialog-description\"\n className=\"text-muted-foreground text-left text-sm\"\n >\n {t(\"resume_dialog_description\")}\n </p>\n\n <div className=\"space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"resume_date\")}\n </Label>\n <Popover open={calendarOpen} onOpenChange={setCalendarOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground h-9 w-full justify-start border px-3 py-2 text-left font-normal\",\n !selectedDate &&\n \"text-muted-foreground hover:text-muted-foreground\",\n )}\n >\n {selectedDate ? (\n format(selectedDate, \"MM/dd/yyyy\")\n ) : (\n <span>{t(\"date_placeholder\")}</span>\n )}\n <CalendarIcon className=\"text-muted-foreground ml-auto size-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"bg-popover w-auto rounded-md border p-0 shadow-lg\"\n align=\"start\"\n sideOffset={4}\n style={{ zIndex: 9999 }}\n >\n <Calendar\n mode=\"single\"\n selected={selectedDate}\n onSelect={(date) => {\n setSelectedDate(date);\n setCalendarOpen(false);\n }}\n disabled={(date) => date < minDate}\n defaultMonth={selectedDate}\n modifiersStyles={{\n selected: {\n backgroundColor: \"var(--primary)\",\n color: \"var(--primary-foreground)\",\n },\n }}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n {selectedDate && (\n <p className=\"text-muted-foreground text-xs\">\n {t(\"resume_charge_message_prefix\")}{\" \"}\n <span className=\"font-semibold\">\n {format(selectedDate, \"MMMM d, yyyy\")}\n </span>\n {t(\"resume_charge_message_suffix\")}\n </p>\n )}\n </div>\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between gap-x-2\">\n <Button\n className=\"bg-muted text-foreground ring-border hover:bg-muted/80 h-10 min-w-[70px] rounded p-3 ring-1\"\n onClick={() => handleDismiss(false)}\n >\n {t(\"resume_dialog_cancel\")}\n </Button>\n <Button\n type=\"button\"\n className=\"bg-primary text-primary-foreground h-10 min-w-[70px] rounded p-3 hover:opacity-90 disabled:opacity-50\"\n onClick={handleConfirm}\n disabled={!selectedDate || isLoading}\n >\n {isLoading ? (\n <div className=\"border-primary-foreground size-5 animate-spin rounded-full border-4 border-t-4 border-t-transparent\" />\n ) : (\n t(\"resume_dialog_action\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Button,\n Calendar,\n cn,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n PortalContainerProvider,\n} from \"@fluid-app/ui-primitives\";\nimport {\n addDays,\n addMonths,\n addWeeks,\n addYears,\n format,\n isAfter,\n} from \"date-fns\";\nimport { CalendarIcon, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { parseIsoDate } from \"../lib/parse-iso-date\";\n\nexport interface OtherSubscriptionForBillDate {\n token: string;\n productTitle: string;\n nextBillDate: string | null;\n billingInterval: number;\n billingIntervalUnit: string;\n}\n\nfunction advanceByInterval(date: Date, interval: number, unit: string): Date {\n const step = Math.max(1, interval);\n switch (unit.toLowerCase()) {\n case \"day\":\n return addDays(date, step);\n case \"week\":\n return addWeeks(date, step);\n case \"year\":\n return addYears(date, step);\n case \"month\":\n default:\n return addMonths(date, step);\n }\n}\n\nconst SUBSCRIPTION_COLORS = [\n \"#3b82f6\",\n \"#f97316\",\n \"#10b981\",\n \"#a855f7\",\n \"#ec4899\",\n \"#eab308\",\n \"#14b8a6\",\n \"#ef4444\",\n \"#0ea5e9\",\n \"#84cc16\",\n];\n\n// Cap projection iterations per subscription so a daily-interval row can't\n// run away tens of thousands of times across the 2-year horizon. Sized for\n// a weekly cycle (~104 over two years) — covers the longest realistic\n// non-daily case without truncating dots for the rep.\nconst MAX_PROJECTIONS_PER_SUB = 104;\n\nexport interface EditBillDateDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: (nextBillDate: string) => void;\n isLoading?: boolean;\n errorMessage?: string;\n currentNextBillDate?: string | null;\n otherSubscriptions?: OtherSubscriptionForBillDate[];\n onNavigateToSubscription?: (token: string) => void;\n}\n\nexport function EditBillDateDialog({\n open,\n onOpenChange,\n onConfirm,\n isLoading,\n errorMessage,\n currentNextBillDate,\n otherSubscriptions,\n onNavigateToSubscription,\n}: EditBillDateDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [selectedDate, setSelectedDate] = useState<Date | undefined>(undefined);\n const [calendarOpen, setCalendarOpen] = useState(false);\n // Anchor the popover's portal inside the dialog so Safari doesn't\n // swallow clicks on the calendar — Radix renders the popover into\n // document.body by default, but Dialog applies pointer-events: none\n // to the body while open, which kills clicks on a body-portaled\n // popover in Safari/WebKit specifically.\n const [popoverContainer, setPopoverContainer] =\n useState<HTMLDivElement | null>(null);\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const minDate = addDays(today, 1);\n\n const subscriptionsWithColor = useMemo(\n () =>\n (otherSubscriptions ?? []).map((sub, idx) => ({\n ...sub,\n color: SUBSCRIPTION_COLORS[idx % SUBSCRIPTION_COLORS.length] as string,\n })),\n [otherSubscriptions],\n );\n\n const billingColorsByDate = useMemo<Map<string, string[]>>(() => {\n const m = new Map<string, string[]>();\n const horizon = addYears(new Date(), 2);\n for (const sub of subscriptionsWithColor) {\n if (!sub.nextBillDate) continue;\n let d = parseIsoDate(sub.nextBillDate);\n let count = 0;\n while (!isAfter(d, horizon) && count < MAX_PROJECTIONS_PER_SUB) {\n const key = format(d, \"yyyy-MM-dd\");\n const arr = m.get(key) ?? [];\n arr.push(sub.color);\n m.set(key, arr);\n d = advanceByInterval(d, sub.billingInterval, sub.billingIntervalUnit);\n count++;\n }\n }\n return m;\n }, [subscriptionsWithColor]);\n\n // Memoize the components map: react-day-picker uses each entry's identity\n // as the React element type for every day cell, so a fresh object every\n // render unmounts/remounts all visible cells (visible flicker, lost cell\n // state).\n const calendarComponents = useMemo(\n () => ({\n DayContent: ({ date }: { date: Date }) => {\n const key = format(date, \"yyyy-MM-dd\");\n const colors = billingColorsByDate.get(key) ?? [];\n return (\n <div className=\"flex h-full w-full flex-col items-center justify-center\">\n <span className=\"leading-none\">{date.getDate()}</span>\n {colors.length > 0 && (\n <div className=\"mt-0.5 flex items-center justify-center gap-0.5\">\n {colors.map((c, i) => (\n <span\n key={`${key}-${i}`}\n className=\"size-1 rounded-[1px]\"\n style={{ backgroundColor: c }}\n />\n ))}\n </div>\n )}\n </div>\n );\n },\n IconLeft: ({\n className: iconClassName,\n ...iconProps\n }: React.ComponentProps<typeof ChevronLeft>) => (\n <ChevronLeft className={cn(\"h-4 w-4\", iconClassName)} {...iconProps} />\n ),\n IconRight: ({\n className: iconClassName,\n ...iconProps\n }: React.ComponentProps<typeof ChevronRight>) => (\n <ChevronRight className={cn(\"h-4 w-4\", iconClassName)} {...iconProps} />\n ),\n }),\n [billingColorsByDate],\n );\n\n useEffect(() => {\n if (!open) return;\n if (currentNextBillDate) {\n const initial = parseIsoDate(currentNextBillDate);\n setSelectedDate(initial < minDate ? minDate : initial);\n } else {\n setSelectedDate(undefined);\n }\n // minDate derives from `new Date()` — intentionally excluded so this\n // only runs on open transitions.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, currentNextBillDate]);\n\n const handleConfirm = () => {\n if (!selectedDate) return;\n onConfirm(format(selectedDate, \"yyyy-MM-dd\"));\n };\n\n const handleDismiss = (next: boolean) => {\n if (!next) {\n setSelectedDate(undefined);\n }\n onOpenChange(next);\n };\n\n const previewDate = selectedDate\n ? format(selectedDate, \"MMMM d, yyyy\")\n : currentNextBillDate\n ? format(parseIsoDate(currentNextBillDate), \"MMMM d, yyyy\")\n : \"a future date\";\n\n return (\n <Dialog open={open} onOpenChange={handleDismiss}>\n <DialogContent\n aria-describedby=\"edit-bill-date-dialog-description\"\n className=\"rounded\"\n >\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {t(\"edit_bill_date_title\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p\n id=\"edit-bill-date-dialog-description\"\n className=\"text-muted-foreground text-sm\"\n >\n {t(\"edit_bill_date_description\")}\n </p>\n\n <div className=\"space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"next_bill_date_label\")}\n </Label>\n {/* Render the popover into a fixed-positioned overlay nested\n inside the dialog rather than document.body. This sidesteps\n the WebKit/Safari issue where Dialog's body-level\n pointer-events: none silently blocks clicks on a body-\n portaled popover. The fixed overlay is `inset-0` +\n `pointer-events-none` so it doesn't capture stray clicks\n or affect dialog layout — only the popover content\n (which sets its own pointer-events: auto) is interactive. */}\n <PortalContainerProvider container={popoverContainer}>\n <Popover open={calendarOpen} onOpenChange={setCalendarOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground h-9 w-full justify-start border px-3 py-2 text-left font-normal\",\n !selectedDate &&\n \"text-muted-foreground hover:text-muted-foreground\",\n )}\n >\n {selectedDate ? (\n format(selectedDate, \"MM/dd/yyyy\")\n ) : (\n <span>{t(\"date_placeholder\")}</span>\n )}\n <CalendarIcon className=\"text-muted-foreground ml-auto size-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"bg-popover pointer-events-auto z-[9999] w-auto rounded-md border p-0 shadow-lg\"\n align=\"start\"\n sideOffset={4}\n >\n <Calendar\n mode=\"single\"\n selected={selectedDate}\n onSelect={(date) => {\n setSelectedDate(date);\n setCalendarOpen(false);\n }}\n disabled={(date) => date < minDate}\n defaultMonth={\n selectedDate ??\n (currentNextBillDate\n ? parseIsoDate(currentNextBillDate)\n : undefined)\n }\n components={calendarComponents}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n </PortalContainerProvider>\n </div>\n <div\n ref={setPopoverContainer}\n className=\"pointer-events-none fixed inset-0 z-[9998]\"\n aria-hidden={true}\n />\n\n {selectedDate && (\n <div className=\"text-muted-foreground text-xs\">\n {t(\"bill_date_preview_prefix\")}{\" \"}\n <span className=\"font-semibold\">{previewDate}</span>\n {t(\"bill_date_preview_suffix\")}\n </div>\n )}\n\n {subscriptionsWithColor.length > 0 && (\n <div className=\"space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"your_other_subscriptions\")}\n </Label>\n <div className=\"border-border max-h-40 overflow-auto rounded-md border\">\n <table className=\"w-full table-fixed text-sm\">\n <thead className=\"bg-muted text-muted-foreground sticky top-0\">\n <tr>\n <th className=\"w-6 p-2\" aria-label=\"Color\" />\n <th className=\"px-3 py-2 text-left font-medium\">\n {t(\"other_subs_product\")}\n </th>\n <th className=\"w-28 px-3 py-2 text-left font-medium\">\n {t(\"other_subs_bill_date\")}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-border divide-y\">\n {subscriptionsWithColor.map((sub) => (\n <tr key={sub.token}>\n <td className=\"p-2\">\n <span\n aria-hidden\n className=\"inline-block size-2.5 rounded-full\"\n style={{ backgroundColor: sub.color }}\n />\n </td>\n <td\n className=\"overflow-hidden px-3 py-2\"\n title={sub.productTitle}\n >\n {onNavigateToSubscription ? (\n <button\n type=\"button\"\n onClick={() => {\n onNavigateToSubscription(sub.token);\n handleDismiss(false);\n }}\n className=\"text-primary block w-full truncate text-left hover:underline\"\n >\n {sub.productTitle}\n </button>\n ) : (\n <span className=\"text-foreground block truncate\">\n {sub.productTitle}\n </span>\n )}\n </td>\n <td className=\"text-muted-foreground px-3 py-2 whitespace-nowrap\">\n {sub.nextBillDate\n ? format(\n parseIsoDate(sub.nextBillDate),\n \"MMM d, yyyy\",\n )\n : \"—\"}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between gap-x-2\">\n <Button\n variant=\"outline\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={() => handleDismiss(false)}\n >\n {t(\"edit_bill_date_cancel\")}\n </Button>\n <Button\n type=\"button\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={handleConfirm}\n disabled={!selectedDate || isLoading}\n >\n {isLoading ? (\n <div className=\"border-primary-foreground size-5 animate-spin rounded-full border-4 border-t-4 border-t-transparent\" />\n ) : (\n t(\"edit_bill_date_action\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import type { JSX } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nconst STATUS_COLORS: Record<string, string> = {\n active: \"bg-green-100 text-green-800\",\n paused: \"bg-gray-100 text-gray-800\",\n cancelled: \"bg-red-100 text-red-800\",\n pending: \"bg-yellow-100 text-yellow-800\",\n inactive: \"bg-gray-100 text-gray-800\",\n disabled: \"bg-red-100 text-red-800\",\n past_due: \"bg-gray-100 text-gray-800\",\n};\n\nconst STATUS_DOT_COLORS: Record<string, string> = {\n active: \"bg-green-500\",\n paused: \"bg-gray-400\",\n cancelled: \"bg-red-500\",\n pending: \"bg-yellow-500\",\n inactive: \"bg-gray-400\",\n disabled: \"bg-red-500\",\n past_due: \"bg-gray-400\",\n};\n\nexport interface StatusPillProps {\n status: string | undefined | null;\n children: React.ReactNode;\n}\n\nexport function StatusPill({ status, children }: StatusPillProps): JSX.Element {\n const key = status?.toLowerCase() ?? \"\";\n const pillColor = STATUS_COLORS[key] ?? \"bg-gray-100 text-gray-800\";\n const dotColor = STATUS_DOT_COLORS[key] ?? \"bg-gray-400\";\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium\",\n pillColor,\n )}\n >\n <span className={cn(\"h-1.5 w-1.5 rounded-full\", dotColor)} />\n {children}\n </span>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport { Button } from \"@fluid-app/ui-primitives\";\nimport {\n CreditCard,\n Calendar,\n DollarSign,\n BadgeAlert,\n Wallet,\n RefreshCw,\n ShieldCheck,\n Receipt,\n Sparkles,\n CalendarClock,\n CircleDollarSign,\n Banknote,\n PiggyBank,\n X,\n} from \"lucide-react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { cn } from \"../lib/cn\";\n\nexport interface PastDueBannerProps {\n productTitle?: string | null;\n // Body copy is derived from these two fields:\n // next_retry_at null → \"payment failed, update your card\"\n // next_retry_at set, last_failed_at null → just queued (immediate retry, no\n // failure since the last reset)\n // next_retry_at set, last_failed_at set → previous attempt failed, retry\n // pending after the dunning backoff;\n // copy includes a bucketed time\n // estimate that absorbs the up-to-6h\n // RetryFailedPaymentsJob cron lag.\n // The \"Update your card\" button stays visible in all states.\n nextRetryAt?: string | null;\n lastFailedAt?: string | null;\n onUpdatePaymentClick?: () => void;\n // When provided, the parent owns dismiss state. Clicking X calls\n // onDismiss and the banner relies on the parent to unmount it —\n // internal `dismissed` state is skipped so the parent can re-show\n // the banner on a new failure event (different last_failed_at).\n onDismiss?: () => void;\n className?: string;\n}\n\nconst ICON_STROKE = 1.5;\nconst ICON_SCALE = 26; // px\nconst ICON_RIGHT_OFFSET = 23; // % from right edge for the rightmost column\nconst ICON_OPACITY = 0.35;\nconst ICON_VERTICAL_SPACING = 26; // % gap between rows in the same column\nconst COL_SPACING = 18; // % gap between adjacent columns\n\nconst ICONS_BY_COLUMN: Array<{\n icons: Array<typeof CreditCard>;\n offset: boolean;\n}> = [\n {\n icons: [\n CreditCard,\n CircleDollarSign,\n BadgeAlert,\n CalendarClock,\n Sparkles,\n Wallet,\n ],\n offset: false,\n },\n {\n icons: [DollarSign, Receipt, PiggyBank, ShieldCheck, CreditCard],\n offset: true,\n },\n {\n icons: [\n Calendar,\n Banknote,\n RefreshCw,\n DollarSign,\n CircleDollarSign,\n Calendar,\n ],\n offset: false,\n },\n];\n\nexport function PastDueBanner({\n productTitle,\n nextRetryAt,\n lastFailedAt,\n onUpdatePaymentClick,\n onDismiss,\n className,\n}: PastDueBannerProps): JSX.Element | null {\n const { t } = useSubscriptionsTranslation();\n const [internalDismissed, setInternalDismissed] = useState(false);\n const retryScheduled = nextRetryAt != null;\n const previousAttemptFailed = retryScheduled && lastFailedAt != null;\n\n if (!onDismiss && internalDismissed) return null;\n\n const heading = retryScheduled\n ? productTitle\n ? t(\"past_due_banner_heading_retry_scheduled_for_product\", {\n product: productTitle,\n })\n : t(\"past_due_banner_heading_retry_scheduled\")\n : productTitle\n ? t(\"past_due_banner_heading_for_product\", { product: productTitle })\n : t(\"past_due_banner_heading\");\n\n // Bucket the time-until-next-retry to absorb the up-to-6h cron lag.\n // 2h backoff → 2–8h actual wall-clock → \"in the next few hours\"\n // 6h backoff → 6–12h → \"in the next few hours\"\n // 24h backoff → 24–30h → \"within a day\"\n const whenLabel = (() => {\n if (!nextRetryAt) return t(\"past_due_retry_when_shortly\");\n const ms = new Date(nextRetryAt).getTime() - Date.now();\n if (ms < 60_000) return t(\"past_due_retry_when_shortly\");\n if (ms < 12 * 60 * 60 * 1000) return t(\"past_due_retry_when_few_hours\");\n return t(\"past_due_retry_when_within_day\");\n })();\n\n const body = previousAttemptFailed\n ? t(\"past_due_banner_body_retry_failed\", { when: whenLabel })\n : retryScheduled\n ? t(\"past_due_banner_body_retry_scheduled\")\n : t(\"past_due_banner_body\");\n\n return (\n <div\n role=\"status\"\n className={cn(\n \"border-border bg-background relative overflow-hidden rounded-2xl border p-5 sm:p-6\",\n className,\n )}\n >\n <button\n type=\"button\"\n onClick={() => (onDismiss ? onDismiss() : setInternalDismissed(true))}\n aria-label={t(\"dismiss\")}\n className=\"text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-ring absolute top-3 right-3 z-10 flex size-6 items-center justify-center rounded-md transition-colors focus-visible:outline-2 focus-visible:outline-offset-2\"\n >\n <X className=\"size-4\" strokeWidth={2} />\n </button>\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-y-0 right-0 hidden w-1/2 max-w-md sm:block\"\n >\n {ICONS_BY_COLUMN.flatMap((col, colIdx) => {\n const right = `${ICON_RIGHT_OFFSET + colIdx * COL_SPACING}%`;\n const baseTop =\n -ICON_VERTICAL_SPACING * 0.4 +\n (col.offset ? ICON_VERTICAL_SPACING / 2 : 0);\n return col.icons.map((Icon, rowIdx) => {\n const top = `${baseTop + rowIdx * ICON_VERTICAL_SPACING}%`;\n return (\n <Icon\n key={`${colIdx.toString()}-${rowIdx.toString()}`}\n strokeWidth={ICON_STROKE}\n className=\"text-muted-foreground absolute\"\n style={{\n top,\n right,\n width: ICON_SCALE,\n height: ICON_SCALE,\n opacity: ICON_OPACITY,\n }}\n />\n );\n });\n })}\n </div>\n\n <div className=\"relative flex max-w-xl flex-col gap-3.5\">\n <div className=\"flex flex-col gap-1.5\">\n <h3 className=\"text-foreground text-base font-bold tracking-tight sm:text-lg\">\n {heading}\n </h3>\n <p className=\"text-muted-foreground text-sm leading-relaxed\">\n {body}\n </p>\n </div>\n\n {onUpdatePaymentClick && (\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"default\"\n onClick={onUpdatePaymentClick}\n className=\"self-start px-5 active:scale-[0.99]\"\n >\n {t(\"update_your_card\")}\n </Button>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Format a number as currency (USD).\n */\nexport function formatCurrency(value: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(value);\n}\n\n/**\n * Convert a snake_case or lowercase string to Start Case.\n * Replaces lodash startCase for simple status strings.\n */\nexport function startCase(str: string | undefined | null): string {\n if (!str) return \"\";\n return str.replace(/_/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/**\n * Format a next bill date string to M/D/YYYY (UTC).\n */\nexport function formatNextBillDate(nextBillDate: string): string {\n if (!nextBillDate) return \"N/A\";\n const date = new Date(nextBillDate);\n if (isNaN(date.getTime())) return \"N/A\";\n const month = date.getUTCMonth() + 1;\n const day = date.getUTCDate();\n const year = date.getUTCFullYear();\n return `${month}/${day}/${year}`;\n}\n","import {\n useState,\n useEffect,\n useMemo,\n useRef,\n useCallback,\n type JSX,\n} from \"react\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport {\n useSubscription,\n useSubscriptions,\n usePauseSubscription,\n useResumeSubscription,\n useSkipSubscription,\n useCancelSubscription,\n useReactivateSubscription,\n useUpdateSubscriptionInfo,\n formatSubscriptionFrequency,\n formatDate,\n formatTime,\n getNextBillDisplay,\n calculateNextBillDate,\n} from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n SkipForward,\n Pause,\n Play,\n XCircle,\n RotateCcw,\n CalendarDays,\n CreditCard,\n Minus,\n Plus,\n} from \"lucide-react\";\nimport { addMonths, format } from \"date-fns\";\nimport { Skeleton, Button, Input, cn } from \"@fluid-app/ui-primitives\";\nimport {\n CancelSubscriptionDialog,\n type PauseMonths,\n} from \"./cancel-subscription-dialog\";\nimport {\n PauseSubscriptionDialog,\n type PauseSubscriptionSelection,\n} from \"./pause-subscription-dialog\";\nimport { ResumeSubscriptionDialog } from \"./resume-subscription-dialog\";\nimport { EditBillDateDialog } from \"./edit-bill-date-dialog\";\nimport { StatusPill } from \"./status-pill\";\nimport { PastDueBanner } from \"./past-due-banner\";\nimport { startCase, formatCurrency } from \"../lib/format\";\n\nexport interface PaymentMethodSlotContext {\n paymentMethod: subscriptions.SubscriptionDetailPaymentMethod;\n subscriptionToken: string;\n customerId: number;\n countryCode: string;\n}\n\nexport interface ShippingAddressSlotContext {\n address: subscriptions.SubscriptionDetailAddress | null;\n subscriptionToken: string;\n customerId: number;\n countryCode: string;\n}\n\nexport interface SubscriptionDetailProps {\n token: string;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSuccess?: (message: string) => void;\n onMutationError?: (message: string, error: unknown) => void;\n /**\n * Called when the Edit Bill Date dialog wants to navigate the host app to\n * another subscription's detail page (clicking a row in the calendar's\n * \"Your other subscriptions\" list).\n */\n onNavigateToSubscription?: (token: string) => void;\n /**\n * Optional render-prop for the Payment Method block. When provided, replaces\n * the read-only display so consumers can wire change/add UX. Default falls\n * back to a read-only summary.\n */\n renderPaymentMethod?: (ctx: PaymentMethodSlotContext) => JSX.Element;\n /**\n * Optional render-prop for the Shipping Address block. When provided,\n * replaces the read-only display so consumers can wire change/add UX.\n * Default falls back to a read-only summary.\n */\n renderShippingAddress?: (ctx: ShippingAddressSlotContext) => JSX.Element;\n /**\n * Called when the past-due banner's \"Update payment method\" button is\n * clicked. Consumers should open their Add Payment Method dialog. If\n * omitted, the banner falls back to scrolling the payment-method section\n * into view.\n */\n onUpdatePaymentClick?: () => void;\n}\n\nfunction SubscriptionDetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n {/* Left: items skeleton */}\n <div className=\"bg-muted flex flex-col items-center px-8 lg:col-span-4\">\n <div className=\"w-full max-w-lg py-6\">\n <Skeleton className=\"mb-4 h-6 w-48\" />\n <div className=\"grid grid-cols-2 gap-4\">\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n <div className=\"mt-6 flex items-center gap-x-4\">\n <Skeleton className=\"size-24 rounded\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"h-4 w-1/4\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n {/* Right: management skeleton */}\n <div className=\"bg-background col-span-4 px-8 pt-4\">\n <div className=\"mx-auto max-w-lg\">\n <Skeleton className=\"mb-3 h-5 w-32\" />\n <div className=\"grid grid-cols-2 gap-3\">\n <Skeleton className=\"h-10 w-full rounded\" />\n <Skeleton className=\"h-10 w-full rounded\" />\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-12 flex-1 rounded\" />\n <Skeleton className=\"h-12 flex-1 rounded\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Left column: product & order summary ──────────────────────────── */\n\n/* ── Quantity input ─────────────────────────────────────────────────\n The displayed value is local string state so the user can backspace\n a single-digit quantity without React snapping it back. We only\n forward valid positive integers to onQuantityChange; on blur we\n restore the last committed quantity if the field was left empty\n or invalid.\n\n Two focus-retention quirks worth keeping in mind:\n - Toggling `disabled` blurs a focused input (especially WebKit).\n Use `readOnly` while the mutation is in flight instead so the\n user keeps their cursor as they tweak the value.\n - We skip the prop-sync useEffect while the field is focused —\n writing `inputValue` again on a server confirmation doesn't change\n anything visible, but the controlled-input value write is enough\n to drop focus on mobile Safari. The post-blur restore on line ~186\n handles the unfocused case. */\n\nfunction QuantityInput({\n inputId,\n quantity,\n maxQuantity,\n isUpdatingQuantity,\n onQuantityChange,\n quantityAriaLabel,\n decrementAriaLabel,\n incrementAriaLabel,\n}: {\n inputId: string;\n quantity: number;\n maxQuantity: number | null;\n isUpdatingQuantity: boolean;\n onQuantityChange: (next: number) => void;\n quantityAriaLabel: string;\n decrementAriaLabel: string;\n incrementAriaLabel: string;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [inputValue, setInputValue] = useState(String(quantity));\n // Captured the moment focus enters the field. Backspacing from \"12\"\n // through \"1\" to \"\" commits an intermediate quantity of 1 to the\n // parent, so on blur we can't trust the live `quantity` prop as the\n // restore target — use the value the user started with.\n const focusEntryQuantityRef = useRef(quantity);\n // Local debounce on commit. Without this, every keystroke fires\n // onQuantityChange, which the parent uses to update pendingQuantity\n // synchronously — so intermediate values (e.g. the \"1\" mid-way through\n // backspacing \"12\" to retype) flash in the order summary before the\n // user is done typing.\n const commitTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Keep the latest onQuantityChange in a ref so the debounced timer\n // doesn't fire with a stale closure if the parent re-renders within\n // the 500ms window with a new callback identity.\n const onQuantityChangeRef = useRef(onQuantityChange);\n useEffect(() => {\n onQuantityChangeRef.current = onQuantityChange;\n }, [onQuantityChange]);\n\n useEffect(\n () => () => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n },\n [],\n );\n\n useEffect(() => {\n if (\n typeof document !== \"undefined\" &&\n document.activeElement === inputRef.current\n ) {\n return;\n }\n setInputValue(String(quantity));\n }, [quantity]);\n\n const scheduleCommit = (next: number) => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n commitTimerRef.current = setTimeout(() => {\n onQuantityChangeRef.current(next);\n // Move the restore baseline forward — once a value successfully\n // commits, that's what an empty-blur should fall back to, not\n // the value at focus-entry.\n focusEntryQuantityRef.current = next;\n }, 500);\n };\n\n // Drive the +/− disabled state from the in-flight value so the buttons\n // stay in sync with what the user sees mid-edit, instead of lagging\n // 500ms behind the committed quantity.\n const parsedInput = parseInt(inputValue, 10);\n const currentValue =\n Number.isFinite(parsedInput) && parsedInput > 0 ? parsedInput : quantity;\n const decrementDisabled = isUpdatingQuantity || currentValue <= 1;\n const incrementDisabled =\n isUpdatingQuantity || (maxQuantity != null && currentValue >= maxQuantity);\n\n // Single clamp source so the typing path enforces the same min/max\n // window the +/− buttons gate visually — without this, typing 999 with\n // a max_quantity of 10 would commit 999 even though `+` is disabled.\n const clampToBounds = (n: number): number =>\n maxQuantity != null\n ? Math.min(maxQuantity, Math.max(1, n))\n : Math.max(1, n);\n\n const stepBy = (delta: 1 | -1) => {\n const clamped = clampToBounds(currentValue + delta);\n if (clamped === currentValue) return;\n setInputValue(String(clamped));\n scheduleCommit(clamped);\n };\n\n const stepperButtonClass = cn(\n \"text-muted-foreground hover:text-foreground hover:bg-muted flex h-7 w-7 shrink-0 items-center justify-center rounded-full shadow-xs disabled:cursor-not-allowed\",\n );\n\n return (\n <div\n className={cn(\n \"border-border bg-background focus-within:border-ring focus-within:ring-ring/50 flex h-7.5 items-center justify-between rounded-2xl border focus-within:ring-[3px]\",\n isUpdatingQuantity && \"opacity-60\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => stepBy(-1)}\n disabled={decrementDisabled}\n aria-label={decrementAriaLabel}\n aria-controls={inputId}\n className={cn(stepperButtonClass, decrementDisabled && \"opacity-40\")}\n >\n <Minus className=\"size-3\" />\n </button>\n <Input\n ref={inputRef}\n id={inputId}\n type=\"number\"\n min={1}\n max={maxQuantity ?? undefined}\n step={1}\n value={inputValue}\n onFocus={() => {\n // Capture the displayed value, not the committed `quantity` —\n // a + click before focus updates inputValue but its 500ms\n // debounce may not have fired yet, so the committed prop is\n // stale. Without this, an erase-then-blur restores to the\n // pre-+ value and silently discards the click.\n focusEntryQuantityRef.current = currentValue;\n }}\n onChange={(e) => {\n const raw = e.target.value;\n setInputValue(raw);\n if (raw === \"\") {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n return;\n }\n const next = parseInt(raw, 10);\n if (Number.isFinite(next) && next > 0) {\n scheduleCommit(clampToBounds(next));\n }\n }}\n onBlur={() => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n const parsed = parseInt(inputValue, 10);\n if (Number.isFinite(parsed) && parsed > 0) {\n const clamped = clampToBounds(parsed);\n // Snap the displayed value back to the cap on blur so the\n // user sees the bound that was applied to the committed value.\n if (clamped !== parsed) {\n setInputValue(String(clamped));\n }\n if (clamped !== quantity) {\n onQuantityChange(clamped);\n }\n focusEntryQuantityRef.current = clamped;\n } else {\n const restore = focusEntryQuantityRef.current;\n setInputValue(String(restore));\n if (restore !== quantity) {\n onQuantityChange(restore);\n }\n }\n }}\n readOnly={isUpdatingQuantity}\n className=\"text-foreground h-7 w-10 rounded-none border-0 bg-transparent px-0 text-center text-xs font-semibold shadow-none [-moz-appearance:textfield] focus-visible:border-0 focus-visible:ring-0 md:text-xs [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\"\n aria-label={quantityAriaLabel}\n />\n <button\n type=\"button\"\n onClick={() => stepBy(1)}\n disabled={incrementDisabled}\n aria-label={incrementAriaLabel}\n aria-controls={inputId}\n className={cn(stepperButtonClass, incrementDisabled && \"opacity-40\")}\n >\n <Plus className=\"size-3\" />\n </button>\n </div>\n );\n}\n\nfunction SubscriptionItemsSection({\n subscription,\n displayQuantity,\n displayNextBillDate,\n canEditQuantity = false,\n onQuantityChange,\n isUpdatingQuantity = false,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n displayQuantity?: number;\n displayNextBillDate?: string;\n canEditQuantity?: boolean;\n onQuantityChange?: (next: number) => void;\n isUpdatingQuantity?: boolean;\n}) {\n const { t } = useSubscriptionsTranslation();\n const variant = subscription.variant;\n const product = variant?.product;\n const quantity = displayQuantity ?? subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n const quantityInputId = `subscription-${subscription.subscription_token}-quantity`;\n const discount =\n subscription.original_price != null\n ? subscription.original_price - subscription.price\n : 0;\n const subtotal =\n discount > 0\n ? formatCurrency(subscription.original_price * quantity)\n : totalPrice;\n const effectiveNextBillDate =\n displayNextBillDate ?? subscription.next_bill_date;\n const nextOrderTimeOfDay = formatTime(\n effectiveNextBillDate,\n subscription.timezone,\n );\n\n return (\n <section className=\"bg-muted flex w-full flex-col items-center rounded-lg px-8 lg:col-span-4 lg:self-start\">\n <div className=\"flex w-full max-w-lg flex-col\">\n {/* Upcoming order summary */}\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n {t(\"your_upcoming_order\")}\n </h2>\n <div className=\"text-muted-foreground\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"border-border border-r pr-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n {subscription.status === \"past_due\"\n ? t(\"payment_failed_on\")\n : t(\"next_order_date\")}\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {subscription.status === \"past_due\"\n ? subscription.last_failed_at\n ? formatDate(subscription.last_failed_at)\n : \"—\"\n : getNextBillDisplay(\n displayNextBillDate\n ? {\n ...subscription,\n next_bill_date: displayNextBillDate,\n }\n : subscription,\n )}\n </div>\n {nextOrderTimeOfDay && (\n <div className=\"text-muted-foreground mt-1 text-xs\">\n {nextOrderTimeOfDay} ({subscription.timezone})\n </div>\n )}\n </div>\n <div className=\"pl-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n {t(\"next_bill_amount\")}\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </div>\n </div>\n </div>\n <hr className=\"border-border mt-4\" />\n </div>\n </div>\n\n {/* Product row */}\n <div className=\"py-6\">\n <div className=\"flex flex-row items-center gap-x-4\">\n <div className=\"flex min-w-0 flex-1 flex-row gap-x-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted h-24 w-24 overflow-hidden rounded\">\n {product?.image_url ? (\n <img\n src={product.image_url}\n alt={variant?.title || t(\"product_image_alt\")}\n width={96}\n height={96}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground flex size-full items-center justify-center\">\n {t(\"no_image\")}\n </div>\n )}\n {quantity > 1 && (\n <span className=\"bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\">\n {quantity}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex min-w-0 flex-col gap-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={product?.title}\n >\n {product?.title}\n </p>\n {variant?.title && product?.title && (\n <p className=\"text-muted-foreground text-sm\">\n {variant.title}\n </p>\n )}\n <div>\n <p className=\"text-foreground text-sm font-medium\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n </div>\n </div>\n {canEditQuantity && onQuantityChange && (\n <div className=\"flex shrink-0 flex-col items-center\">\n <label\n htmlFor={quantityInputId}\n className=\"text-muted-foreground mb-1 text-xs\"\n >\n {t(\"quantity_label\")}\n </label>\n <QuantityInput\n inputId={quantityInputId}\n quantity={quantity}\n maxQuantity={subscription.subscription_plan.max_quantity}\n isUpdatingQuantity={isUpdatingQuantity}\n onQuantityChange={onQuantityChange}\n quantityAriaLabel={t(\"quantity_aria\")}\n decrementAriaLabel={t(\"decrease_quantity_aria\")}\n incrementAriaLabel={t(\"increase_quantity_aria\")}\n />\n </div>\n )}\n </div>\n </div>\n\n {/* Pricing summary */}\n <div className=\"mb-4\">\n {discount > 0 && (\n <>\n <div className=\"flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"subtotal\")}\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n {subtotal}\n </p>\n </div>\n <div className=\"mt-2 flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"discount\")}\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n -{formatCurrency(discount * quantity)}\n </p>\n </div>\n </>\n )}\n <div className=\"mt-4 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"total_label\")}\n </p>\n <p className=\"text-foreground text-base font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n <span className=\"text-muted-foreground text-xs\">\n {t(\"tax_shipping_note\")}\n </span>\n </div>\n </div>\n </section>\n );\n}\n\n/* ── Right column: actions & details ───────────────────────────────── */\n\nfunction SubscriptionManagementSection({\n subscription,\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n onSkip,\n onPause,\n onResume,\n onCancel,\n onReactivate,\n onEditBillDate,\n onUpdatePaymentClick,\n renderPaymentMethod,\n renderShippingAddress,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n onSkip: () => void;\n onPause: () => void;\n onResume: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n onEditBillDate: () => void;\n onUpdatePaymentClick?: () => void;\n renderPaymentMethod?: (ctx: PaymentMethodSlotContext) => JSX.Element;\n renderShippingAddress?: (ctx: ShippingAddressSlotContext) => JSX.Element;\n}) {\n const { t } = useSubscriptionsTranslation();\n const plan = subscription.subscription_plan;\n const quantity = subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n\n const paymentMethod = subscription.payment_method;\n const paymentDetails = paymentMethod?.details as {\n last4?: string;\n card_type?: string;\n logo_url?: string;\n } | null;\n\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"bg-background col-span-4 flex-auto px-8 pt-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Action Buttons */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h2 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"order_actions\")}\n </h2>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && plan.allow_skipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating || !subscription.next_bill_date}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"skip_next_order\")}</span>\n </Button>\n )}\n {isActive && (\n <Button\n variant=\"outline\"\n onClick={onEditBillDate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <CalendarDays className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"edit_bill_date\")}</span>\n </Button>\n )}\n {isActive && (\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"pause_subscription\")}</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating || isCancelled}\n className={actionButtonClass}\n >\n <XCircle className=\"size-3 shrink-0\" />\n <span className=\"truncate\">\n {isCancelled\n ? t(\"cancelled_subscription\")\n : t(\"cancel_subscription\")}\n </span>\n </Button>\n {subscription.status === \"past_due\" && onUpdatePaymentClick && (\n <Button\n variant=\"outline\"\n onClick={onUpdatePaymentClick}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <CreditCard className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">\n {t(\"update_payment_method_action\")}\n </span>\n </Button>\n )}\n {isPaused && (\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"resume_subscription\")}</span>\n </Button>\n )}\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"reactivate_subscription\")}</span>\n </Button>\n )}\n </div>\n </div>\n\n {/* Subscription Details */}\n <div className=\"border-border mb-4 border-b\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h3 className=\"text-foreground text-sm/6 font-semibold\">\n {t(\"subscription_details\")}\n </h3>\n <StatusPill status={subscription.status}>\n {startCase(subscription.status)}\n </StatusPill>\n </div>\n <div className=\"divide-border mb-4 flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">\n {t(\"order_frequency\")}\n </div>\n <div className=\"text-foreground font-medium\">\n {formatSubscriptionFrequency(plan.billing_interval_unit)}\n </div>\n </div>\n {subscription.last_ship_date && (\n <div className=\"flex-1 px-4\">\n <div className=\"text-muted-foreground text-sm\">\n {t(\"last_shipped\")}\n </div>\n <div className=\"text-foreground font-medium\">\n {formatDate(subscription.last_ship_date)}\n </div>\n </div>\n )}\n {subscription.last_bill_date && (\n <div className=\"flex-1 px-4\">\n <div className=\"text-muted-foreground text-sm\">\n {t(\"last_bill_amount\")}\n </div>\n <div className=\"text-foreground font-medium\">{totalPrice}</div>\n <div className=\"text-muted-foreground text-xs\">\n {formatDate(subscription.last_bill_date)}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Payment & Shipping */}\n <div className=\"pt-2\">\n <h3 className=\"text-foreground mb-4 text-sm/6 font-semibold\">\n {t(\"payment_and_shipping\")}\n </h3>\n <div className=\"flex flex-col\">\n {/* Shipping Address */}\n {renderShippingAddress\n ? renderShippingAddress({\n address: subscription.address ?? null,\n subscriptionToken: subscription.subscription_token,\n customerId: subscription.customer?.id ?? 0,\n countryCode: subscription.address?.country_code ?? \"US\",\n })\n : subscription.address && (\n <div className=\"border-border mb-6 border-b pb-4\">\n <div className=\"text-muted-foreground mt-3 mb-1 text-sm\">\n {t(\"shipping_address\")}\n </div>\n <div className=\"text-foreground text-sm\">\n <p className=\"font-medium\">{subscription.address.name}</p>\n <p>{subscription.address.address1}</p>\n {subscription.address.address2 && (\n <p>{subscription.address.address2}</p>\n )}\n <p>\n {[subscription.address.city, subscription.address.state]\n .filter(Boolean)\n .join(\", \")}{\" \"}\n {subscription.address.postal_code}\n </p>\n {subscription.address.country_code && (\n <p>{subscription.address.country_code}</p>\n )}\n </div>\n </div>\n )}\n\n {/* Payment Method */}\n {paymentMethod &&\n (renderPaymentMethod ? (\n <div\n id=\"subscription-payment-method-section\"\n className=\"scroll-mt-24\"\n >\n {renderPaymentMethod({\n paymentMethod,\n subscriptionToken: subscription.subscription_token,\n customerId: subscription.customer?.id ?? 0,\n countryCode: subscription.address?.country_code ?? \"US\",\n })}\n </div>\n ) : (\n <div\n id=\"subscription-payment-method-section\"\n className=\"border-border mb-6 scroll-mt-24 border-b pb-4\"\n >\n <div className=\"text-muted-foreground mb-1 text-sm\">\n {t(\"payment_method\")}\n </div>\n <div className=\"text-foreground flex items-center gap-2 text-sm\">\n {paymentDetails?.logo_url && (\n <img\n src={paymentDetails.logo_url}\n alt={paymentDetails.card_type ?? t(\"card_fallback\")}\n className=\"h-6\"\n />\n )}\n <span className=\"font-medium\">\n {paymentDetails?.card_type\n ? startCase(paymentDetails.card_type)\n : paymentMethod.payment_type}\n {paymentDetails?.last4\n ? ` ${t(\"ending_in\", { last4: paymentDetails.last4 })}`\n : \"\"}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Order history (own section, full-width below the grid) ────────── */\n\nfunction OrderHistorySection({\n subscription,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n}) {\n const { t } = useSubscriptionsTranslation();\n if (subscription.orders.length === 0) return null;\n return (\n <section className=\"mt-6 px-8 pt-6 pb-8\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"subscription_order_history\")}\n </h3>\n <div className=\"border-border overflow-x-auto rounded-md border\">\n <table className=\"divide-border min-w-full divide-y text-sm\">\n <thead className=\"bg-muted\">\n <tr>\n <th className=\"text-muted-foreground py-2 pr-3 pl-3 text-left font-medium\">\n {t(\"order\")}\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n {t(\"date\")}\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n {t(\"status\")}\n </th>\n <th className=\"text-muted-foreground py-2 pr-3 pl-3 text-right font-medium\">\n {t(\"amount\")}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-border divide-y\">\n {subscription.orders.map((order) => (\n <tr key={order.id}>\n <td className=\"text-foreground py-2 pr-3 pl-3 font-medium\">\n {order.order_number ?? `#${order.id}`}\n </td>\n <td className=\"text-muted-foreground px-3 py-2\">\n {formatDate(order.created_at.split(\"T\")[0] ?? \"\")}\n </td>\n <td className=\"px-3 py-2\">\n <StatusPill status={order.status}>\n {startCase(order.status)}\n </StatusPill>\n </td>\n <td className=\"text-foreground py-2 pr-3 pl-3 text-right\">\n {order.amount != null\n ? formatCurrency(Number(order.amount))\n : t(\"not_available\")}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </section>\n );\n}\n\n/* ── Main component ────────────────────────────────────────────────── */\n\nexport function SubscriptionDetail({\n token,\n onNotFound,\n onError,\n onSuccess,\n onMutationError,\n onNavigateToSubscription,\n renderPaymentMethod,\n renderShippingAddress,\n onUpdatePaymentClick,\n}: SubscriptionDetailProps): JSX.Element | null {\n const { t } = useSubscriptionsTranslation();\n const [showCancelModal, setShowCancelModal] = useState(false);\n const [showPauseModal, setShowPauseModal] = useState(false);\n const [showResumeModal, setShowResumeModal] = useState(false);\n const [showEditBillDateModal, setShowEditBillDateModal] = useState(false);\n const [pendingNextBillDate, setPendingNextBillDate] = useState<string | null>(\n null,\n );\n // Track the last_failed_at value at dismiss time so a fresh failure\n // (different timestamp) re-shows the banner after a recovery+refailure\n // cycle. Gating the whole wrapper on this also keeps the mb-4/lg:mb-6\n // gap from lingering once the banner is closed.\n const [dismissedForFailedAt, setDismissedForFailedAt] = useState<\n string | null | undefined\n >(undefined);\n\n const { data, isLoading, error } = useSubscription(token);\n const subscription = data?.subscription;\n const customerId = subscription?.customer?.id ?? 0;\n\n // Customer's other active subscriptions, only loaded once the bill-date\n // dialog opens — feeds the calendar's color-coded dots. The portal-tenant\n // BFF list endpoint scopes server-side to the member's own customer\n // record (PortalTenant::SubscriptionBrowser), so we don't pass customerId\n // — and we don't gate on it either, since the detail mapper hardcodes\n // customer.id to 0 today.\n //\n // Capped at 100 — a customer with more than 100 subscriptions will be\n // missing some dots from the calendar. Matches the practical ceiling of\n // every other \"list customer's subscriptions\" surface; if/when we have a\n // real-world customer past that, swap to cursor pagination here.\n const customerSubscriptionsQuery = useSubscriptions(\n { perPage: 100 },\n { enabled: showEditBillDateModal },\n );\n const otherSubscriptionsForBillDate = useMemo(\n () =>\n (customerSubscriptionsQuery.data?.subscriptions ?? [])\n .filter((s) => s.subscription_token !== token)\n .map((s) => ({\n token: s.subscription_token,\n productTitle: s.variant?.product?.title ?? t(\"breadcrumb\"),\n nextBillDate: s.next_bill_date,\n billingInterval: s.subscription_plan?.billing_interval ?? 1,\n billingIntervalUnit:\n s.subscription_plan?.billing_interval_unit ?? \"month\",\n })),\n [customerSubscriptionsQuery.data, token, t],\n );\n\n const pauseMutation = usePauseSubscription({\n onSuccess: () => onSuccess?.(t(\"subscription_paused\")),\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_pause\"), err),\n });\n\n const resumeMutation = useResumeSubscription({\n onSuccess: () => onSuccess?.(t(\"subscription_resumed\")),\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_resume\"), err),\n });\n\n const skipMutation = useSkipSubscription({\n onSuccess: () => onSuccess?.(t(\"next_billing_skipped\")),\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_skip\"), err),\n });\n\n const cancelMutation = useCancelSubscription({\n onSuccess: () => {\n onSuccess?.(t(\"subscription_cancelled\"));\n setShowCancelModal(false);\n },\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_cancel\"), err),\n });\n\n const reactivateMutation = useReactivateSubscription({\n onSuccess: () => onSuccess?.(t(\"subscription_reactivated\")),\n onError: (err: unknown) =>\n onMutationError?.(t(\"failed_to_reactivate\"), err),\n });\n\n const [pendingQuantity, setPendingQuantity] = useState<number | null>(null);\n const quantityDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n const quantityMutation = useUpdateSubscriptionInfo({\n onSuccess: () => {\n // Keep pendingQuantity set so the displayed amounts stay on the\n // new value while the invalidated query refetches. The effect\n // below clears it once the refetched subscription carries the\n // same quantity — avoids a flicker back to the old amounts.\n onSuccess?.(t(\"quantity_updated\"));\n },\n onError: (err: unknown) => {\n setPendingQuantity(null);\n onMutationError?.(t(\"failed_to_update_quantity\"), err);\n },\n });\n\n const editBillDateMutation = useUpdateSubscriptionInfo({\n onSuccess: () => {\n onSuccess?.(t(\"bill_date_updated\"));\n setShowEditBillDateModal(false);\n },\n onError: (err: unknown) => {\n setPendingNextBillDate(null);\n onMutationError?.(t(\"failed_to_update_bill_date\"), err);\n },\n });\n\n const serverNextBillDate = data?.subscription.next_bill_date ?? null;\n useEffect(() => {\n if (\n pendingNextBillDate != null &&\n serverNextBillDate != null &&\n serverNextBillDate.startsWith(pendingNextBillDate)\n ) {\n setPendingNextBillDate(null);\n }\n }, [pendingNextBillDate, serverNextBillDate]);\n\n const serverQuantity = data?.subscription.quantity;\n useEffect(() => {\n if (pendingQuantity != null && serverQuantity === pendingQuantity) {\n setPendingQuantity(null);\n }\n }, [pendingQuantity, serverQuantity]);\n\n useEffect(\n () => () => {\n if (quantityDebounceRef.current)\n clearTimeout(quantityDebounceRef.current);\n },\n [],\n );\n\n const quantityMutate = quantityMutation.mutate;\n const handleQuantityChange = useCallback(\n (next: number) => {\n const clamped = Math.max(1, next);\n setPendingQuantity(clamped);\n if (quantityDebounceRef.current)\n clearTimeout(quantityDebounceRef.current);\n quantityDebounceRef.current = setTimeout(() => {\n const current = data?.subscription.quantity;\n if (clamped === current) {\n setPendingQuantity(null);\n return;\n }\n quantityMutate({\n subscriptionToken: token,\n body: { quantity: clamped },\n });\n }, 500);\n },\n [data?.subscription.quantity, quantityMutate, token],\n );\n\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onNotFoundRef = useRef(onNotFound);\n onNotFoundRef.current = onNotFound;\n\n useEffect(() => {\n if (!isLoading && error) {\n onErrorRef.current?.(error as Error);\n }\n }, [isLoading, error]);\n\n useEffect(() => {\n if (!isLoading && !error && !subscription) {\n onNotFoundRef.current?.();\n }\n }, [isLoading, error, subscription]);\n\n if (isLoading) {\n return <SubscriptionDetailSkeleton />;\n }\n\n if (!subscription) {\n return null;\n }\n\n const plan = subscription.subscription_plan;\n const isActive = subscription.status === \"active\";\n const isPaused = subscription.status === \"paused\";\n const isCancelled = subscription.status === \"cancelled\";\n const isMutating =\n pauseMutation.isPending ||\n resumeMutation.isPending ||\n skipMutation.isPending ||\n cancelMutation.isPending ||\n reactivateMutation.isPending ||\n editBillDateMutation.isPending;\n\n const handlePauseConfirm = (selection: PauseSubscriptionSelection) => {\n const pauseParams: subscriptions.PauseSubscriptionParams = { customerId };\n if (selection.type === \"order_count\") {\n pauseParams.numberOfOrders = selection.numberOfOrders;\n }\n pauseMutation.mutate(\n { subscriptionToken: token, pauseParams },\n { onSuccess: () => setShowPauseModal(false) },\n );\n };\n\n const handleResumeConfirm = (nextBillDate: string) => {\n resumeMutation.mutate(\n {\n subscriptionToken: token,\n resumeParams: { customerId, nextBillDate },\n },\n { onSuccess: () => setShowResumeModal(false) },\n );\n };\n\n const handleSkip = () => {\n const nextBillDate = calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n );\n skipMutation.mutate({\n subscriptionToken: token,\n skipParams: { customerId, nextBillDate },\n });\n };\n\n const handleCancel = () => {\n cancelMutation.mutate({ subscriptionToken: token, customerId });\n };\n\n const handleReactivate = () => {\n reactivateMutation.mutate({\n subscriptionToken: token,\n reactivateParams: {},\n });\n };\n\n const bannerDismissed =\n dismissedForFailedAt !== undefined &&\n dismissedForFailedAt === subscription.last_failed_at;\n\n return (\n <>\n {subscription.status === \"past_due\" && !bannerDismissed && (\n <div className=\"mb-4 px-2 sm:px-0 lg:mb-6\">\n <PastDueBanner\n productTitle={subscription.variant?.product?.title ?? null}\n nextRetryAt={subscription.next_retry_at ?? null}\n lastFailedAt={subscription.last_failed_at ?? null}\n onUpdatePaymentClick={\n onUpdatePaymentClick ??\n (() => {\n const el = document.getElementById(\n \"subscription-payment-method-section\",\n );\n if (el) {\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n })\n }\n onDismiss={() =>\n setDismissedForFailedAt(subscription.last_failed_at ?? null)\n }\n />\n </div>\n )}\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <SubscriptionItemsSection\n subscription={subscription}\n displayQuantity={pendingQuantity ?? undefined}\n displayNextBillDate={pendingNextBillDate ?? undefined}\n canEditQuantity={isActive}\n onQuantityChange={handleQuantityChange}\n isUpdatingQuantity={quantityMutation.isPending}\n />\n <SubscriptionManagementSection\n subscription={subscription}\n isActive={isActive}\n isPaused={isPaused}\n isCancelled={isCancelled}\n isMutating={isMutating}\n onSkip={handleSkip}\n onPause={() => setShowPauseModal(true)}\n onResume={() => setShowResumeModal(true)}\n onCancel={() => setShowCancelModal(true)}\n onReactivate={handleReactivate}\n onEditBillDate={() => setShowEditBillDateModal(true)}\n onUpdatePaymentClick={onUpdatePaymentClick}\n renderPaymentMethod={renderPaymentMethod}\n renderShippingAddress={renderShippingAddress}\n />\n </div>\n <OrderHistorySection subscription={subscription} />\n <CancelSubscriptionDialog\n open={showCancelModal}\n onOpenChange={setShowCancelModal}\n onConfirm={handleCancel}\n onPauseInstead={(months: PauseMonths) => {\n setShowCancelModal(false);\n pauseMutation.mutate({\n subscriptionToken: token,\n pauseParams: {\n customerId,\n nextBillDate: format(addMonths(new Date(), months), \"yyyy-MM-dd\"),\n },\n });\n }}\n />\n <EditBillDateDialog\n open={showEditBillDateModal}\n onOpenChange={(next) => {\n if (!next) editBillDateMutation.reset();\n setShowEditBillDateModal(next);\n }}\n onConfirm={(nextBillDate) => {\n setPendingNextBillDate(nextBillDate);\n editBillDateMutation.mutate({\n subscriptionToken: token,\n body: { next_bill_date: nextBillDate },\n });\n }}\n isLoading={editBillDateMutation.isPending}\n errorMessage={\n editBillDateMutation.isError ? t(\"bill_date_error\") : undefined\n }\n currentNextBillDate={subscription.next_bill_date}\n otherSubscriptions={otherSubscriptionsForBillDate}\n onNavigateToSubscription={onNavigateToSubscription}\n />\n <PauseSubscriptionDialog\n open={showPauseModal}\n onOpenChange={(next) => {\n if (!next) pauseMutation.reset();\n setShowPauseModal(next);\n }}\n onConfirm={handlePauseConfirm}\n isLoading={pauseMutation.isPending}\n errorMessage={pauseMutation.isError ? t(\"generic_error\") : undefined}\n currentNextBillDate={subscription.next_bill_date}\n billingInterval={plan.billing_interval}\n billingIntervalUnit={plan.billing_interval_unit}\n />\n <ResumeSubscriptionDialog\n open={showResumeModal}\n onOpenChange={(next) => {\n if (!next) resumeMutation.reset();\n setShowResumeModal(next);\n }}\n onConfirm={handleResumeConfirm}\n isLoading={resumeMutation.isPending}\n errorMessage={resumeMutation.isError ? t(\"generic_error\") : undefined}\n defaultNextBillDate={calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n )}\n />\n </>\n );\n}\n\nexport interface SubscriptionActionsProps {\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n allowSkipping: boolean | null;\n onPause: () => void;\n onResume: () => void;\n onSkip: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n}\n\nexport function SubscriptionActions({\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n allowSkipping,\n onPause,\n onResume,\n onSkip,\n onCancel,\n onReactivate,\n}: SubscriptionActionsProps) {\n const { t } = useSubscriptionsTranslation();\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && (\n <>\n {allowSkipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"skip_next\")}</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"pause\")}</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"cancel\")}</span>\n </Button>\n </>\n )}\n {isPaused && (\n <>\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"resume\")}</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"cancel\")}</span>\n </Button>\n </>\n )}\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"reactivate\")}</span>\n </Button>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { JSX } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport {\n SubscriptionDetail,\n type PaymentMethodSlotContext,\n type ShippingAddressSlotContext,\n} from \"../components/subscription-detail\";\n\nexport interface SubscriptionDetailScreenProps {\n token: string;\n onNavigateToList: () => void;\n onNavigateToSubscription?: (token: string) => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSuccess?: (message: string) => void;\n onMutationError?: (message: string, error: unknown) => void;\n renderPaymentMethod?: (ctx: PaymentMethodSlotContext) => JSX.Element;\n renderShippingAddress?: (ctx: ShippingAddressSlotContext) => JSX.Element;\n onUpdatePaymentClick?: () => void;\n}\n\nexport function SubscriptionDetailScreen({\n token,\n onNavigateToList,\n onNavigateToSubscription,\n onNotFound,\n onError,\n onSuccess,\n onMutationError,\n renderPaymentMethod,\n renderShippingAddress,\n onUpdatePaymentClick,\n}: SubscriptionDetailScreenProps) {\n const { t } = useSubscriptionsTranslation();\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n {t(\"breadcrumb\")}\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb_detail\", { token })}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <SubscriptionDetail\n token={token}\n onNotFound={onNotFound}\n onError={onError}\n onSuccess={onSuccess}\n onMutationError={onMutationError}\n onNavigateToSubscription={onNavigateToSubscription}\n renderPaymentMethod={renderPaymentMethod}\n renderShippingAddress={renderShippingAddress}\n onUpdatePaymentClick={onUpdatePaymentClick}\n />\n </div>\n </>\n );\n}\n","import { useId, useState, type JSX } from \"react\";\nimport { cn, Skeleton } from \"@fluid-app/ui-primitives\";\nimport { ChevronDown } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport {\n PaymentIcon,\n getCardDisplayName,\n getCardExpiry,\n} from \"@fluid-app/profile-ui/components/payment-method-card-internals\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\n\ninterface SelectablePaymentMethodDropdownProps {\n title: string;\n displayPaymentMethod: fluidPay.CustomerPaymentMethod | null;\n paymentMethodList: fluidPay.CustomerPaymentMethod[];\n selectedPaymentMethodId: number;\n onSelectPaymentMethod: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n onAddPaymentMethodClick: () => void;\n onEditPaymentMethod?: (paymentMethod: fluidPay.CustomerPaymentMethod) => void;\n onDeletePaymentMethod?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n onMakeDefaultPaymentMethod?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n addPaymentMethodLabel?: string;\n showAddButton?: boolean;\n isLoading?: boolean;\n /** Disable selection while a parent mutation is in flight. */\n isPending?: boolean;\n className?: string;\n}\n\n/**\n * Selectable variant of profile-ui's PaymentMethodDropdown — same chrome\n * (accordion, collapsed summary, list, add button), with rows that\n * commit a selection through onSelectPaymentMethod when clicked.\n */\nexport function SelectablePaymentMethodDropdown({\n title,\n displayPaymentMethod,\n paymentMethodList,\n selectedPaymentMethodId,\n onSelectPaymentMethod,\n onAddPaymentMethodClick,\n onEditPaymentMethod,\n onDeletePaymentMethod,\n onMakeDefaultPaymentMethod,\n addPaymentMethodLabel: addPaymentMethodLabelProp,\n showAddButton = true,\n isLoading = false,\n isPending = false,\n className = \"\",\n}: SelectablePaymentMethodDropdownProps): JSX.Element {\n const { t } = useProfileTranslation();\n const addPaymentMethodLabel =\n addPaymentMethodLabelProp ?? t(\"add_a_payment_method\");\n const [isOpen, setIsOpen] = useState(false);\n const sectionId = useId();\n const collapsedExpiry = displayPaymentMethod\n ? getCardExpiry(displayPaymentMethod, t(\"card_expires\"))\n : null;\n\n return (\n <div className={cn(\"border-border mb-6 border-b pb-4\", className)}>\n <button\n type=\"button\"\n aria-expanded={isOpen}\n aria-controls={sectionId}\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"flex w-full flex-row items-center justify-between\"\n >\n <span className=\"text-muted-foreground text-sm\">{title}</span>\n <ChevronDown\n className={cn(\n \"text-muted-foreground h-4 w-4 transition-transform duration-200\",\n isOpen && \"rotate-180\",\n )}\n />\n </button>\n\n {/* Collapsed summary — shows the subscription's current payment method\n inline. Clicking expands. Mirrors checkout's payment-method-dropdown\n collapse behavior. */}\n {!isOpen && displayPaymentMethod && (\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n className=\"mt-1 mb-2 flex w-full cursor-pointer flex-row items-center gap-3 text-left\"\n >\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={displayPaymentMethod.details.logo_url}\n brand={displayPaymentMethod.details.card_type}\n alt={\n displayPaymentMethod.details.card_type ??\n t(\"payment_method_alt\")\n }\n />\n </div>\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-foreground text-sm font-medium capitalize\">\n {getCardDisplayName(displayPaymentMethod, t(\"card_fallback\"))}\n </span>\n {collapsedExpiry && (\n <span className=\"text-muted-foreground text-sm\">\n {collapsedExpiry}\n </span>\n )}\n </div>\n </button>\n )}\n\n {isOpen && (\n <div\n id={sectionId}\n role=\"listbox\"\n aria-label={title}\n className=\"mt-5 flex max-h-[400px] flex-col gap-y-4 overflow-y-auto pr-0.5\"\n >\n {isLoading ? (\n <>\n {[1, 2].map((i) => (\n <div\n key={`skeleton-${i}`}\n className=\"bg-muted flex flex-row items-center gap-x-2 rounded-sm p-3\"\n >\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col gap-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n ))}\n </>\n ) : (\n paymentMethodList.map((paymentMethod) => {\n const isSelected = selectedPaymentMethodId === paymentMethod.id;\n const expiry = getCardExpiry(paymentMethod, t(\"card_expires\"));\n const handleSelect = () => {\n if (isPending) return;\n onSelectPaymentMethod(paymentMethod);\n };\n return (\n <div\n key={paymentMethod.id}\n role=\"option\"\n tabIndex={isPending ? -1 : 0}\n aria-selected={isSelected}\n aria-disabled={isPending}\n onClick={handleSelect}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleSelect();\n }\n }}\n className={cn(\n \"text-foreground flex w-full flex-row items-center justify-between gap-3 rounded-sm p-3 text-left transition-colors\",\n \"not-aria-disabled:cursor-pointer aria-disabled:cursor-not-allowed aria-disabled:opacity-60\",\n isSelected\n ? \"bg-background border-border border\"\n : \"bg-muted hover:bg-muted/80 border border-transparent\",\n )}\n >\n <div className=\"flex min-w-0 flex-row items-center gap-3\">\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={paymentMethod.details.logo_url}\n brand={paymentMethod.details.card_type}\n alt={\n paymentMethod.details.card_type ??\n t(\"payment_method_alt\")\n }\n />\n </div>\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-foreground text-sm font-medium capitalize\">\n {getCardDisplayName(paymentMethod)}\n </span>\n {expiry && (\n <span className=\"text-muted-foreground text-sm\">\n {expiry}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex shrink-0 flex-row items-center gap-2\">\n {paymentMethod.default && (\n <span className=\"bg-primary text-primary-foreground rounded px-2 py-0.5 text-xs font-medium\">\n {t(\"default\")}\n </span>\n )}\n {(onEditPaymentMethod ||\n onDeletePaymentMethod ||\n onMakeDefaultPaymentMethod) && (\n <span\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <EllipsesDropdown\n onEdit={\n onEditPaymentMethod\n ? () => onEditPaymentMethod(paymentMethod)\n : undefined\n }\n onDelete={\n onDeletePaymentMethod\n ? () => onDeletePaymentMethod(paymentMethod)\n : undefined\n }\n onMakeDefault={\n !paymentMethod.default && onMakeDefaultPaymentMethod\n ? () => onMakeDefaultPaymentMethod(paymentMethod)\n : undefined\n }\n />\n </span>\n )}\n </div>\n </div>\n );\n })\n )}\n </div>\n )}\n\n {showAddButton && (\n <button\n type=\"button\"\n disabled={isPending}\n className=\"text-foreground mt-3 text-left text-sm disabled:cursor-not-allowed disabled:opacity-60\"\n onClick={onAddPaymentMethodClick}\n >\n {addPaymentMethodLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useCallback, useMemo, useState, type JSX } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { FluidPayCoreProvider, type fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport {\n AddressFormDialog,\n ConfirmActionDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n type CreditCardFormSubmitData,\n type EditPaymentMethodFormData,\n} from \"@fluid-app/profile-ui\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { SelectablePaymentMethodDropdown } from \"./SelectablePaymentMethodDropdown\";\nimport {\n subscriptionsKeys,\n useRetrySubscription,\n useUpdateSubscriptionInfo,\n} from \"@fluid-app/subscriptions-core\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport type { PaymentMethodSlotContext } from \"@fluid-app/subscriptions-ui\";\nimport { TOKEN_PROVIDER_VGS } from \"@fluid-app/portal-core/pay-types\";\nimport type {\n PayAddress,\n UpdatePaymentMethodBody,\n} from \"@fluid-app/portal-core/pay-types\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { payKeys, storeKeys } from \"../account/query-keys\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\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\n// Map the subscription's payment_method shape (which lives on\n// SubscriptionDetail and uses different field names than PayApi) to the\n// fluidPay shape PaymentMethodDropdown consumes.\nfunction subscriptionPaymentMethodToFluidPay(\n raw: subscriptions.SubscriptionDetailPaymentMethod,\n): fluidPay.CustomerPaymentMethod {\n const details = raw.details as {\n last4?: string;\n card_type?: string;\n card_brand?: string;\n logo_url?: string;\n exp_month?: number | string;\n exp_year?: number | string;\n } | null;\n return {\n id: raw.id,\n created_at: raw.created_at,\n default: raw.default,\n details: {\n card_type: details?.card_type ?? null,\n card_brand: details?.card_brand ?? details?.card_type ?? null,\n last_four: details?.last4 ?? \"\",\n exp_month:\n details?.exp_month != null ? Number(details.exp_month) : undefined,\n exp_year:\n details?.exp_year != null ? Number(details.exp_year) : undefined,\n logo_url: details?.logo_url,\n },\n billing_address: null,\n payment_type: raw.payment_type,\n source: raw.source,\n updated_at: raw.updated_at,\n };\n}\n\ntype PaymentMethodSectionProps = PaymentMethodSlotContext & {\n onSuccess?: (message: string) => void;\n onError?: (message: string, error: unknown) => void;\n // Optional controlled props so a parent (e.g. the past-due banner CTA in\n // SubscriptionDetailScreen) can open the Add Payment Method dialog from\n // outside this section. When omitted, the section manages the dialog\n // internally as before.\n addDialogOpen?: boolean;\n onAddDialogOpenChange?: (open: boolean) => void;\n};\n\nexport function PortalSubscriptionPaymentMethodSection(\n props: PaymentMethodSectionProps,\n): JSX.Element {\n return (\n <ProfileTranslationBridge>\n <PortalSubscriptionPaymentMethodSectionInner {...props} />\n </ProfileTranslationBridge>\n );\n}\n\nfunction PortalSubscriptionPaymentMethodSectionInner({\n paymentMethod: currentPaymentMethod,\n subscriptionToken,\n onSuccess,\n onError,\n addDialogOpen,\n onAddDialogOpenChange,\n}: PaymentMethodSectionProps): JSX.Element {\n const { t: profileT } = useProfileTranslation();\n const { t: subsT } = useSubscriptionsTranslation();\n\n // Bridge for fluid-pay-ui dialogs that accept `t: (key: string) => string`.\n // The underlying adapter falls back to `key` for unknown keys, so widening\n // the key type is safe at runtime.\n const tFn = useCallback(\n (key: string): string => profileT(key as never),\n [profileT],\n );\n\n const payApi = usePayApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const [internalAddDialogOpen, setInternalAddDialogOpen] = useState(false);\n const isAddDialogOpen = addDialogOpen ?? internalAddDialogOpen;\n const setIsAddDialogOpen = (next: boolean) => {\n if (onAddDialogOpenChange) onAddDialogOpenChange(next);\n else setInternalAddDialogOpen(next);\n };\n const [editingPaymentMethod, setEditingPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n const [deletingPaymentMethod, setDeletingPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n const [deleteError, setDeleteError] = useState<string | undefined>(undefined);\n\n const { data: paymentMethods = [], isLoading: isLoadingMethods } = useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n });\n\n const { data: addresses = [] } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: isAddDialogOpen,\n });\n\n const countriesApi = useCountriesApi();\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(),\n queryFn: () => countriesApi.listCountries(),\n enabled: isAddDialogOpen || editingPaymentMethod !== null,\n });\n const countryOptions = useMemo(\n () =>\n [...(countriesData?.countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n\n const retrySubscription = useRetrySubscription({\n onError: (err) => onError?.(\"Failed to queue retry\", err),\n });\n\n const updateSubscription = useUpdateSubscriptionInfo({\n // Skip the hook's auto-invalidate so we coalesce into a single\n // refetch — either retrySubscription's onSuccess (past_due path)\n // or the explicit invalidate below (non-past-due path).\n skipAutoInvalidate: true,\n onSuccess: () => {\n onSuccess?.(profileT(\"default_payment_method_updated\"));\n // Explicit retry as a separate request, only when the sub was\n // past_due. Decoupled from the update endpoint per SRP — and\n // gated client-side so non-past-due subs don't fire a redundant\n // request (backend would no-op, but we don't want to ask).\n //\n // Invalidation is deferred to whichever path runs last:\n // - past_due: useRetrySubscription invalidates on its own\n // onSuccess — single refetch covers both update + retry.\n // - non-past_due: invalidate inline since no retry fires.\n const cached = queryClient.getQueryData<subscriptions.SubscriptionDetail>(\n subscriptionsKeys.detail(subscriptionToken),\n );\n if (cached?.subscription?.status === \"past_due\") {\n retrySubscription.mutate({ subscriptionToken });\n } else {\n queryClient.invalidateQueries({\n queryKey: subscriptionsKeys.detail(subscriptionToken),\n });\n }\n },\n onError: (err) =>\n onError?.(profileT(\"failed_to_update_payment_method\"), err),\n });\n\n const addCardMutation = useMutation({\n mutationFn: (data: CreditCardFormSubmitData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n token_provider: TOKEN_PROVIDER_VGS,\n exp_month: data.payment_method.exp_month,\n exp_year: data.payment_method.exp_year,\n cvv_token: data.payment_method.cvv_token,\n card_holder: data.payment_method.card_holder,\n default: data.set_as_default,\n },\n billing_address_id: data.billing_address_id,\n }),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(profileT(\"payment_method_added\"));\n },\n onError: (err) => onError?.(profileT(\"failed_to_add_payment_method\"), err),\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) => {\n return payApi.createAddress({\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n },\n onError: (err) => onError?.(profileT(\"failed_to_create_address\"), err),\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: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(profileT(\"default_payment_method_updated\"));\n },\n onError: (err) =>\n onError?.(profileT(\"failed_to_update_payment_method\"), err),\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(profileT(\"payment_method_deleted\"));\n },\n });\n\n const makeDefaultPaymentMethodMutation = useMutation({\n mutationFn: (pm: fluidPay.CustomerPaymentMethod) => {\n const body: UpdatePaymentMethodBody = {\n payment_method: { default: true },\n };\n if (pm.billing_address) {\n body.payment_method.billing_address = {\n name: pm.billing_address.name,\n street1: pm.billing_address.address1 ?? \"\",\n street2: pm.billing_address.address2 ?? null,\n city: pm.billing_address.city ?? \"\",\n state: pm.billing_address.state ?? \"\",\n zip: pm.billing_address.zip ?? \"\",\n country: pm.billing_address.country_code ?? \"\",\n };\n }\n return payApi.updatePaymentMethod(pm.id, body);\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(profileT(\"default_payment_method_updated\"));\n },\n onError: (err) =>\n onError?.(profileT(\"failed_to_set_default_payment_method\"), err),\n });\n\n // Fall back to the subscription's own payment method when the customer's\n // list doesn't contain it yet (initial load) or no longer contains it (card\n // was removed in another session). Without the fallback the collapsed\n // accordion header would render blank.\n const displayed =\n paymentMethods.find((pm) => pm.id === currentPaymentMethod.id) ??\n subscriptionPaymentMethodToFluidPay(currentPaymentMethod);\n\n const handleConfirmDelete = async () => {\n if (!deletingPaymentMethod) return;\n setDeleteError(undefined);\n try {\n await deletePaymentMethodMutation.mutateAsync(deletingPaymentMethod.id);\n setDeletingPaymentMethod(null);\n } catch (err) {\n setDeleteError(\n err instanceof Error\n ? err.message\n : profileT(\"unable_to_delete_payment_method\"),\n );\n }\n };\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <SelectablePaymentMethodDropdown\n title={subsT(\"payment_method\")}\n displayPaymentMethod={displayed}\n paymentMethodList={paymentMethods}\n onAddPaymentMethodClick={() => setIsAddDialogOpen(true)}\n addPaymentMethodLabel={profileT(\"add_payment_method_action\")}\n showAddButton\n isLoading={isLoadingMethods}\n isPending={\n updateSubscription.isPending ||\n retrySubscription.isPending ||\n addCardMutation.isPending ||\n updatePaymentMethodMutation.isPending ||\n makeDefaultPaymentMethodMutation.isPending\n }\n selectedPaymentMethodId={currentPaymentMethod.id}\n onSelectPaymentMethod={(pm) => {\n if (pm.id === currentPaymentMethod.id) return;\n updateSubscription.mutate({\n subscriptionToken,\n body: { payment_method_id: pm.id },\n });\n }}\n onEditPaymentMethod={(pm) => setEditingPaymentMethod(pm)}\n onDeletePaymentMethod={(pm) => {\n setDeleteError(undefined);\n setDeletingPaymentMethod(pm);\n }}\n onMakeDefaultPaymentMethod={(pm) =>\n makeDefaultPaymentMethodMutation.mutate(pm)\n }\n />\n\n <CreditCardFormDialog\n isOpen={isAddDialogOpen}\n onClose={() => setIsAddDialogOpen(false)}\n t={tFn}\n onSubmit={async (data) => {\n try {\n await addCardMutation.mutateAsync(data);\n setIsAddDialogOpen(false);\n } catch {\n // onError surfaces the toast; swallow here so CreditCardFormDialog\n // doesn't see an unhandled rejection from its onSubmit handler.\n }\n }}\n isSubmitting={addCardMutation.isPending}\n jwt=\"\"\n savedAddresses={addresses}\n defaultBillingAddressId={addresses.find((a) => a.default)?.id}\n renderAddressFormDialog={({ isOpen, onClose, onAddressCreated }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={null}\n t={tFn}\n onSubmit={async (formData) => {\n try {\n const created =\n await createAddressMutation.mutateAsync(formData);\n onAddressCreated(mapToFluidPayAddress(created));\n } catch {\n // onError surfaces the toast.\n }\n }}\n isSubmitting={createAddressMutation.isPending}\n countries={countryOptions}\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={profileT(\"address_line_1\")}\n />\n )}\n />\n )}\n />\n\n <EditPaymentMethodDialog\n isOpen={editingPaymentMethod !== null}\n paymentMethod={editingPaymentMethod}\n billingAddress={editingPaymentMethod?.billing_address ?? null}\n onClose={() => setEditingPaymentMethod(null)}\n onSubmit={async (data) => {\n if (!editingPaymentMethod) return;\n try {\n await updatePaymentMethodMutation.mutateAsync({\n paymentMethodId: editingPaymentMethod.id,\n data,\n });\n setEditingPaymentMethod(null);\n } catch {\n // onError surfaces the toast.\n }\n }}\n isSubmitting={updatePaymentMethodMutation.isPending}\n countries={countryOptions}\n />\n\n <ConfirmActionDialog\n title={profileT(\"delete_credit_card\")}\n description={profileT(\"delete_credit_card_message\")}\n actionText={profileT(\"delete\")}\n openDialog={deletingPaymentMethod !== null}\n setOpenDialog={(open) => {\n if (!open) {\n setDeletingPaymentMethod(null);\n setDeleteError(undefined);\n }\n }}\n onAction={handleConfirmDelete}\n errorMsg={deleteError}\n isLoading={deletePaymentMethodMutation.isPending}\n />\n </FluidPayCoreProvider>\n );\n}\n","import { useId, useState, type JSX } from \"react\";\nimport { cn, Skeleton } from \"@fluid-app/ui-primitives\";\nimport { ChevronDown } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\n\ninterface SelectableAddressDropdownProps {\n title: string;\n displayAddress: fluidPay.CustomerAddress | null;\n addressList: fluidPay.CustomerAddress[];\n selectedAddressId: number;\n onSelectAddress: (address: fluidPay.CustomerAddress) => void;\n onAddAddressClick: () => void;\n onEditAddress?: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress?: (address: fluidPay.CustomerAddress) => void;\n onMakeDefaultAddress?: (address: fluidPay.CustomerAddress) => void;\n addAddressLabel?: string;\n showAddButton?: boolean;\n isLoading?: boolean;\n /** Disable selection while a parent mutation is in flight. */\n isPending?: boolean;\n className?: string;\n}\n\nfunction formatLine1(address: fluidPay.CustomerAddress): string {\n return [address.address1, address.address2].filter(Boolean).join(\", \");\n}\n\nfunction formatCityStateZip(address: fluidPay.CustomerAddress): string {\n const cityState = [address.city, address.state].filter(Boolean).join(\", \");\n return [cityState, address.postal_code].filter(Boolean).join(\" \");\n}\n\n/**\n * Selectable variant of profile-ui's AddressDropdown, mirroring\n * SelectablePaymentMethodDropdown. Flat layout (no Card wrapper) so it\n * sits inline next to the payment method dropdown in the subscription\n * detail's Payment & Shipping section.\n */\nexport function SelectableAddressDropdown({\n title,\n displayAddress,\n addressList,\n selectedAddressId,\n onSelectAddress,\n onAddAddressClick,\n onEditAddress,\n onDeleteAddress,\n onMakeDefaultAddress,\n addAddressLabel: addAddressLabelProp,\n showAddButton = true,\n isLoading = false,\n isPending = false,\n className = \"\",\n}: SelectableAddressDropdownProps): JSX.Element {\n const { t } = useProfileTranslation();\n const addAddressLabel = addAddressLabelProp ?? t(\"add_an_address\");\n const [isOpen, setIsOpen] = useState(false);\n const sectionId = useId();\n\n return (\n <div className={cn(\"border-border mb-6 border-b pb-4\", className)}>\n <button\n type=\"button\"\n aria-expanded={isOpen}\n aria-controls={sectionId}\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"flex w-full flex-row items-center justify-between\"\n >\n <span className=\"text-muted-foreground text-sm\">{title}</span>\n <ChevronDown\n className={cn(\n \"text-muted-foreground h-4 w-4 transition-transform duration-200\",\n isOpen && \"rotate-180\",\n )}\n />\n </button>\n\n {/* Collapsed summary — shows the subscription's current address inline.\n Clicking expands. Mirrors checkout's address-dropdown collapse\n behavior. */}\n {!isOpen && displayAddress && (\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n className=\"mt-1 mb-2 flex w-full cursor-pointer flex-col text-left\"\n >\n <span className=\"text-foreground text-sm font-medium\">\n {displayAddress.name}\n {displayAddress.name && displayAddress.address1 ? \", \" : \"\"}\n {displayAddress.address1}\n </span>\n <span className=\"text-muted-foreground text-sm\">\n {formatCityStateZip(displayAddress)}\n </span>\n </button>\n )}\n\n {isOpen && (\n <div\n id={sectionId}\n role=\"listbox\"\n aria-label={title}\n className=\"mt-5 flex max-h-[400px] flex-col gap-y-4 overflow-y-auto pr-0.5\"\n >\n {isLoading ? (\n <>\n {[1, 2].map((i) => (\n <div key={`skeleton-${i}`} className=\"bg-muted rounded-sm p-3\">\n <Skeleton className=\"mb-1 h-4 w-32\" />\n <Skeleton className=\"mb-1 h-4 w-48\" />\n <Skeleton className=\"h-4 w-40\" />\n </div>\n ))}\n </>\n ) : (\n addressList.map((address) => {\n const isSelected = selectedAddressId === address.id;\n const handleSelect = () => {\n if (isPending) return;\n onSelectAddress(address);\n };\n return (\n <div\n key={address.id}\n role=\"option\"\n tabIndex={isPending ? -1 : 0}\n aria-selected={isSelected}\n aria-disabled={isPending}\n onClick={handleSelect}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleSelect();\n }\n }}\n className={cn(\n \"text-foreground flex w-full flex-row items-center justify-between gap-3 rounded-sm p-3 text-left transition-colors\",\n \"not-aria-disabled:cursor-pointer aria-disabled:cursor-not-allowed aria-disabled:opacity-60\",\n isSelected\n ? \"bg-background border-border border\"\n : \"bg-muted hover:bg-muted/80 border border-transparent\",\n )}\n >\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-foreground text-sm font-medium\">\n {address.name}\n </span>\n <span className=\"text-muted-foreground text-sm\">\n {formatLine1(address)}\n </span>\n <span className=\"text-muted-foreground text-sm\">\n {formatCityStateZip(address)}\n </span>\n </div>\n <div className=\"flex shrink-0 flex-row items-center gap-2\">\n {address.default && (\n <span className=\"bg-primary text-primary-foreground rounded px-2 py-0.5 text-xs font-medium\">\n {t(\"default\")}\n </span>\n )}\n {(onEditAddress ||\n onDeleteAddress ||\n onMakeDefaultAddress) && (\n <span\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <EllipsesDropdown\n onEdit={\n onEditAddress\n ? () => onEditAddress(address)\n : undefined\n }\n onDelete={\n onDeleteAddress\n ? () => onDeleteAddress(address)\n : undefined\n }\n onMakeDefault={\n !address.default && onMakeDefaultAddress\n ? () => onMakeDefaultAddress(address)\n : undefined\n }\n />\n </span>\n )}\n </div>\n </div>\n );\n })\n )}\n </div>\n )}\n\n {showAddButton && (\n <button\n type=\"button\"\n disabled={isPending}\n className=\"text-foreground mt-3 text-left text-sm disabled:cursor-not-allowed disabled:opacity-60\"\n onClick={onAddAddressClick}\n >\n {addAddressLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useCallback, useMemo, useState, type JSX } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport { AddressFormDialog, ConfirmActionDialog } from \"@fluid-app/profile-ui\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n subscriptionsKeys,\n useUpdateSubscriptionInfo,\n} from \"@fluid-app/subscriptions-core\";\nimport type { ShippingAddressSlotContext } from \"@fluid-app/subscriptions-ui\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { payKeys, storeKeys } from \"../account/query-keys\";\nimport { createFluidPayApiAdapter } from \"../adapters/fluid-pay-api-adapter\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { SelectableAddressDropdown } from \"./SelectableAddressDropdown\";\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\n// Fall back when the customer's saved-address list doesn't contain the\n// subscription's current address (initial load before fetch, or address\n// removed in another session). Without this the collapsed accordion\n// header would render blank.\nfunction subscriptionAddressToFluidPay(\n raw: ShippingAddressSlotContext[\"address\"],\n): fluidPay.CustomerAddress | null {\n if (!raw) return null;\n return {\n id: raw.id,\n address1: raw.address1,\n address2: raw.address2,\n city: raw.city,\n country_code: raw.country_code,\n default: raw.default,\n name: raw.name,\n postal_code: raw.postal_code,\n state: raw.state,\n subdivision_code: raw.subdivision_code,\n };\n}\n\ntype ShippingAddressSectionProps = ShippingAddressSlotContext & {\n // `severity` is omitted for normal success and set to \"warning\" when the\n // backend deduped an address create (existing record returned). Callers that\n // ignore the second argument default to a success toast.\n onSuccess?: (message: string, severity?: \"success\" | \"warning\") => void;\n onError?: (message: string, error: unknown) => void;\n};\n\nexport function PortalSubscriptionShippingAddressSection(\n props: ShippingAddressSectionProps,\n): JSX.Element {\n return (\n <ProfileTranslationBridge>\n <PortalSubscriptionShippingAddressSectionInner {...props} />\n </ProfileTranslationBridge>\n );\n}\n\nfunction PortalSubscriptionShippingAddressSectionInner({\n address: currentAddress,\n subscriptionToken,\n onSuccess,\n onError,\n}: ShippingAddressSectionProps): JSX.Element {\n const { t: profileT } = useProfileTranslation();\n const { t: subsT } = useSubscriptionsTranslation();\n const { config } = useFluidContext();\n const { locale } = useActiveLocale();\n\n // Bridge for fluid-pay-ui dialogs that accept `t: (key: string) => string`.\n // The underlying adapter falls back to `key` for unknown keys, so widening\n // the key type is safe at runtime.\n const tFn = useCallback(\n (key: string): string => profileT(key as never),\n [profileT],\n );\n\n const payApi = usePayApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const [isFormDialogOpen, setIsFormDialogOpen] = useState(false);\n const [editingAddress, setEditingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [deletingAddress, setDeletingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [deleteError, setDeleteError] = useState<string | undefined>(undefined);\n\n const { data: addresses = [], isLoading } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n });\n\n const countriesApi = useCountriesApi();\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(),\n queryFn: () => countriesApi.listCountries(),\n enabled: isFormDialogOpen,\n });\n const countryOptions = useMemo(\n () =>\n [...(countriesData?.countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countriesData?.countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countriesData]);\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n const updateSubscription = useUpdateSubscriptionInfo({\n onSuccess: () => {\n onSuccess?.(profileT(\"shipping_address_updated\"));\n queryClient.invalidateQueries({\n queryKey: subscriptionsKeys.detail(subscriptionToken),\n });\n },\n onError: (err) =>\n onError?.(profileT(\"failed_to_update_shipping_address\"), err),\n });\n\n const createAddressMutation = useMutation({\n // Detect a server-side dedupe (POST /api/pay/addresses returns the existing\n // record when an identical address already exists, ignoring `name`). Snapshot\n // the current id set before the request and compare against the returned id.\n mutationFn: async (body: fluidPay.CreateAddressBody) => {\n const existingIds = new Set(addresses.map((a) => a.id));\n const address = await payApi.createAddress({\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n default: body.address.default,\n },\n });\n return { address, deduped: existingIds.has(address.id) };\n },\n onSuccess: ({ deduped }) => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n if (deduped) {\n onSuccess?.(profileT(\"address_already_exists\"), \"warning\");\n } else {\n onSuccess?.(profileT(\"address_created\"), \"success\");\n }\n },\n onError: (err) => onError?.(profileT(\"failed_to_create_address\"), err),\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n default: body.address.default,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onSuccess?.(profileT(\"address_updated\"));\n },\n onError: (err) => onError?.(profileT(\"failed_to_update_address\"), err),\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onSuccess?.(profileT(\"address_deleted\"));\n },\n });\n\n const makeDefaultAddressMutation = useMutation({\n mutationFn: (address: fluidPay.CustomerAddress) =>\n payApi.updateAddress(address.id, {\n address: {\n name: address.name ?? null,\n street1: address.address1 ?? \"\",\n street2: address.address2,\n city: address.city ?? \"\",\n state: address.state ?? \"\",\n zip: address.postal_code ?? \"\",\n country: address.country_code ?? \"\",\n default: true,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onSuccess?.(profileT(\"default_address_updated\"));\n },\n onError: (err) =>\n onError?.(profileT(\"failed_to_update_default_address\"), err),\n });\n\n const displayed =\n addresses.find((a) => a.id === currentAddress?.id) ??\n subscriptionAddressToFluidPay(currentAddress);\n\n const handleCloseFormDialog = () => {\n setIsFormDialogOpen(false);\n setEditingAddress(null);\n };\n\n const handleConfirmDelete = async () => {\n if (!deletingAddress) return;\n setDeleteError(undefined);\n try {\n await deleteAddressMutation.mutateAsync(deletingAddress.id);\n setDeletingAddress(null);\n } catch (err) {\n setDeleteError(\n err instanceof Error\n ? err.message\n : profileT(\"unable_to_delete_address\"),\n );\n }\n };\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <SelectableAddressDropdown\n title={subsT(\"shipping_address\")}\n displayAddress={displayed}\n addressList={addresses}\n selectedAddressId={currentAddress?.id ?? 0}\n onSelectAddress={(addr) => {\n if (addr.id === currentAddress?.id) return;\n updateSubscription.mutate({\n subscriptionToken,\n body: { address_id: addr.id },\n });\n }}\n onAddAddressClick={() => {\n setEditingAddress(null);\n setIsFormDialogOpen(true);\n }}\n onEditAddress={(addr) => {\n setEditingAddress(addr);\n setIsFormDialogOpen(true);\n }}\n onDeleteAddress={(addr) => {\n setDeleteError(undefined);\n setDeletingAddress(addr);\n }}\n onMakeDefaultAddress={(addr) => makeDefaultAddressMutation.mutate(addr)}\n addAddressLabel={profileT(\"add_an_address_action\")}\n showAddButton\n isLoading={isLoading}\n isPending={\n updateSubscription.isPending ||\n createAddressMutation.isPending ||\n updateAddressMutation.isPending ||\n makeDefaultAddressMutation.isPending\n }\n />\n\n <AddressFormDialog\n isOpen={isFormDialogOpen}\n onClose={handleCloseFormDialog}\n selectedAddress={editingAddress}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ??\n currentAddress?.country_code ??\n config.countryIso ??\n \"US\"\n }\n languageIso={locale}\n t={tFn}\n onSubmit={async (data: fluidPay.CreateAddressBody) => {\n try {\n if (editingAddress) {\n await updateAddressMutation.mutateAsync({\n addressId: editingAddress.id,\n body: data,\n });\n } else {\n await createAddressMutation.mutateAsync(data);\n }\n handleCloseFormDialog();\n } catch {\n // onError surfaces the toast; swallow here so AddressFormDialog\n // doesn't see an unhandled rejection from its onSubmit handler.\n }\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={profileT(\"address_line_1\")}\n />\n )}\n />\n\n <ConfirmActionDialog\n title={profileT(\"delete_address\")}\n description={profileT(\"delete_address_message\")}\n actionText={profileT(\"delete\")}\n openDialog={deletingAddress !== null}\n setOpenDialog={(open) => {\n if (!open) {\n setDeletingAddress(null);\n setDeleteError(undefined);\n }\n }}\n onAction={handleConfirmDelete}\n errorMsg={deleteError}\n isLoading={deleteAddressMutation.isPending}\n />\n </FluidPayCoreProvider>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { SubscriptionDetailScreen as SubscriptionDetailScreenContent } from \"@fluid-app/subscriptions-ui/screens/SubscriptionDetailScreen\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalSubscriptionPaymentMethodSection } from \"../subscriptions/PortalSubscriptionPaymentMethodSection\";\nimport { PortalSubscriptionShippingAddressSection } from \"../subscriptions/PortalSubscriptionShippingAddressSection\";\n\ninterface SubscriptionDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function SubscriptionDetailScreen({\n token,\n onToast,\n}: SubscriptionDetailScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n const { t } = useSubscriptionsTranslation();\n // Lift the Add Payment Method dialog state so the past-due banner's\n // \"Update your card\" CTA and the in-section payment-method dropdown\n // open the same dialog. Without this, the banner would have to\n // duplicate the \"Add Payment Method\" mounting logic, or scroll\n // (which the subscriptions-ui fallback does for non-portal hosts).\n const [addPaymentDialogOpen, setAddPaymentDialogOpen] = useState(false);\n\n const handleNavigateToList = useCallback(\n () => navigate(\"subscriptions\"),\n [navigate],\n );\n\n const handleNavigateToSubscription = useCallback(\n (nextToken: string) => navigate(`subscriptions/${nextToken}`),\n [navigate],\n );\n\n const handleNotFound = useCallback(() => {\n onToast(t(\"subscription_not_found\"), \"warning\");\n navigate(\"subscriptions\");\n }, [onToast, navigate, t]);\n\n const handleError = useCallback(\n (err: unknown) => {\n const message = err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(t(\"failed_to_load_subscription\", { message }), \"error\");\n },\n [onToast, t],\n );\n\n const handleSuccess = useCallback(\n (message: string) => {\n onToast(message, \"success\");\n },\n [onToast],\n );\n\n const handleMutationError = useCallback(\n (message: string, err: unknown) => {\n const detail = err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(`${message}: ${detail}`, \"error\");\n },\n [onToast, t],\n );\n\n return (\n <SubscriptionDetailScreenContent\n token={token}\n onNavigateToList={handleNavigateToList}\n onNavigateToSubscription={handleNavigateToSubscription}\n onNotFound={handleNotFound}\n onError={handleError}\n onSuccess={handleSuccess}\n onMutationError={handleMutationError}\n onUpdatePaymentClick={() => setAddPaymentDialogOpen(true)}\n renderPaymentMethod={(ctx) => (\n <PortalSubscriptionPaymentMethodSection\n {...ctx}\n onSuccess={(msg) => onToast(msg, \"success\")}\n onError={(msg, err) => {\n const detail =\n err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(`${msg}: ${detail}`, \"error\");\n }}\n addDialogOpen={addPaymentDialogOpen}\n onAddDialogOpenChange={setAddPaymentDialogOpen}\n />\n )}\n renderShippingAddress={(ctx) => (\n <PortalSubscriptionShippingAddressSection\n {...ctx}\n onSuccess={(msg, severity) => onToast(msg, severity ?? \"success\")}\n onError={(msg, err) => {\n const detail =\n err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(`${msg}: ${detail}`, \"error\");\n }}\n />\n )}\n />\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { PortalSubscriptionsApiProvider } from \"../subscriptions/PortalSubscriptionsApiProvider\";\nimport { PortalBundlesApiProvider } from \"../subscriptions/PortalBundlesApiProvider\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { SubscriptionsTranslationBridge } from \"../providers/SubscriptionsTranslationBridge\";\nimport { SubscriptionsListScreen } from \"./SubscriptionsListScreen\";\nimport { SubscriptionDetailScreen } from \"./SubscriptionDetailScreen\";\n\nfunction AccountErrorFallback(): React.JSX.Element {\n const { t } = useSubscriptionsTranslation();\n return (\n <div className=\"text-muted-foreground px-4 py-8 text-center text-sm\">\n {t(\"account_load_error\")}\n </div>\n );\n}\n\ntype SubscriptionsScreenProps = 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 SubscriptionsScreen({\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}: SubscriptionsScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const effectiveToast = onToast ?? defaultToast;\n\n // Parse slug: \"subscriptions\" → list, \"subscriptions/{token}\" → detail\n const detailToken = currentSlug.split(\"/\")[1];\n const isDetailView = detailToken !== undefined;\n\n const { data: account } = useAccount();\n const customerId = account?.id;\n const isLoadingCustomer = account === undefined;\n const isCustomerError = false;\n\n return (\n <div {...divProps}>\n <SubscriptionsTranslationBridge>\n <PortalSubscriptionsApiProvider>\n <PortalBundlesApiProvider>\n {isDetailView ? (\n <SubscriptionDetailScreen\n token={detailToken}\n onToast={effectiveToast}\n />\n ) : isCustomerError && !isLoadingCustomer ? (\n <AccountErrorFallback />\n ) : (\n <SubscriptionsListScreen\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n onToast={effectiveToast}\n />\n )}\n </PortalBundlesApiProvider>\n </PortalSubscriptionsApiProvider>\n </SubscriptionsTranslationBridge>\n </div>\n );\n}\n\nexport const subscriptionsScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"SubscriptionsScreen\",\n displayName: \"Subscriptions Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SubscriptionsScreen-BMVXwFoz.cjs","names":["addDays","addMonths","getInternalDefaultOptions","toDate","constructFrom","constructFrom","millisecondsInHour","millisecondsInMinute","millisecondsInSecond","getWeekYear","startOfWeek","constructFrom","startOfISOWeek","toDate","getWeek","startOfWeek","toDate","getISOWeek","startOfISOWeek","getDefaultOptions","toDate","addDays","toDate","addDays","constructFrom","getTimezoneOffsetInMilliseconds","constructFrom","getTimezoneOffsetInMilliseconds","constructFrom","constructFrom","constructFrom","defaultLocale","toDate","longFormatters","isProtectedWeekYearToken","isProtectedDayOfYearToken","usePortalTenantClient","usePortalTenantClient","createTranslationContext","createDomainTranslations","createStaticDictAdapter","useActiveLocale","useDomainDict","ScreenHeaderBreadcrumbs","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbPage","Package","Popover","PopoverTrigger","PopoverContent","ImageOff","Play","Repeat","AlertCircle","Truck","Check","Package","Repeat","Check","Check","CreditCard","Sheet","SheetContent","SheetTitle","mapToFluidPayAddress","useAppNavigation","usePayApi","useCountriesApi","useProfileTranslation","useFluidContext","useActiveLocale","useStore","payKeys","mapToFluidPayPaymentMethod","storeKeys","isApiError","AddressFormDialog","AddressAutocompleteInput","CreditCardFormDialog","FluidPayCoreProvider","createFluidPayApiAdapter","ProfileTranslationBridge","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button","AlertDialogFooter","AlertDialogCancel","format","Dialog","DialogContent","DialogHeader","DialogTitle","Label","DialogFooter","Button","addDays","format","Dialog","DialogContent","DialogHeader","DialogTitle","Label","Popover","PopoverTrigger","Button","cn","CalendarIcon","PopoverContent","Calendar","DialogFooter","addDays","addMonths","isAfter","format","ChevronLeft","cn","ChevronRight","Dialog","DialogContent","DialogHeader","DialogTitle","Label","PortalContainerProvider","Popover","PopoverTrigger","Button","CalendarIcon","PopoverContent","Calendar","DialogFooter","CreditCard","CircleDollarSign","BadgeAlert","CalendarClock","Sparkles","Wallet","DollarSign","Receipt","PiggyBank","ShieldCheck","Calendar","Banknote","RefreshCw","X","Button","Skeleton","cn","Minus","Input","Plus","Button","SkipForward","CalendarDays","Pause","XCircle","CreditCard","Play","RotateCcw","format","addMonths","SubscriptionDetailScreen","ScreenHeaderBreadcrumbs","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","useProfileTranslation","getCardExpiry","cn","ChevronDown","PaymentIcon","getCardDisplayName","Skeleton","EllipsesDropdown","mapToFluidPayAddress","ProfileTranslationBridge","useProfileTranslation","usePayApi","createFluidPayApiAdapter","payKeys","mapToFluidPayPaymentMethod","useCountriesApi","storeKeys","FluidPayCoreProvider","CreditCardFormDialog","AddressFormDialog","AddressAutocompleteInput","EditPaymentMethodDialog","ConfirmActionDialog","useProfileTranslation","cn","ChevronDown","Skeleton","EllipsesDropdown","ProfileTranslationBridge","useProfileTranslation","useFluidContext","useActiveLocale","usePayApi","createFluidPayApiAdapter","payKeys","useCountriesApi","storeKeys","FluidPayCoreProvider","AddressFormDialog","AddressAutocompleteInput","ConfirmActionDialog","useAppNavigation","SubscriptionDetailScreenContent","useAppNavigation","useAccount"],"sources":["../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addWeeks.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addYears.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDefaultOptions.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISODay.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/transpose.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/Setter.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/EraParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/constants.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/utils.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/YearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/LocalWeekYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOWeekYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ExtendedYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/QuarterParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/StandAloneQuarterParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/MonthParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/StandAloneMonthParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setWeek.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/LocalWeekParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setISOWeek.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOWeekParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DateParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DayOfYearParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setDay.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/LocalDayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/StandAloneLocalDayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setISODay.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISODayParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/AMPMParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/AMPMMidnightParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/DayPeriodParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour1to12Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour0to23Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour0To11Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/Hour1To24Parser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/MinuteParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/SecondParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/FractionOfSecondParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOTimezoneWithZParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/ISOTimezoneParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/TimestampSecondsParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers/TimestampMillisecondsParser.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers.js","../../../../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse.js","../../../subscriptions/core/src/subscriptions-api-context.ts","../../../subscriptions/core/src/provider.tsx","../../../subscriptions/core/src/query-keys.ts","../../../subscriptions/core/src/bundles-api-context.ts","../../../subscriptions/core/src/bundles-provider.tsx","../../../subscriptions/core/src/hooks/use-subscriptions.ts","../../../subscriptions/core/src/hooks/use-infinite-subscriptions.ts","../../../subscriptions/core/src/hooks/use-subscription.ts","../../../subscriptions/core/src/hooks/use-pause-subscription.ts","../../../subscriptions/core/src/hooks/use-resume-subscription.ts","../../../subscriptions/core/src/hooks/use-skip-subscription.ts","../../../subscriptions/core/src/hooks/use-cancel-subscription.ts","../../../subscriptions/core/src/hooks/use-reactivate-subscription.ts","../../../subscriptions/core/src/hooks/use-retry-subscription.ts","../../../subscriptions/core/src/hooks/use-update-subscription-info.ts","../../../subscriptions/core/src/hooks/use-bundles.ts","../../../subscriptions/core/src/hooks/use-create-bundle.ts","../../../subscriptions/core/src/utils/subscription-helpers.ts","../src/adapters/subscriptions-api-adapter.ts","../src/subscriptions/PortalSubscriptionsApiProvider.tsx","../src/adapters/bundles-api-adapter.ts","../src/subscriptions/PortalBundlesApiProvider.tsx","../../../subscriptions/core/src/translation-api-context.ts","../../../subscriptions/core/src/translation-dictionary.ts","../../../subscriptions/core/src/translation-adapter.ts","../src/providers/SubscriptionsTranslationBridge.tsx","../src/screens/subscriptions/portal-subscriptions-list-helpers.ts","../src/screens/subscriptions/PortalSubscriptionsList.tsx","../src/screens/subscriptions/bundle-drawer/payment-utils.ts","../src/screens/subscriptions/bundle-drawer/use-bundle-form.ts","../src/screens/subscriptions/bundle-drawer/DrawerStepTabs.tsx","../src/screens/subscriptions/bundle-drawer/DrawerStepSelect.tsx","../src/screens/subscriptions/bundle-drawer/DrawerStepDate.tsx","../src/screens/subscriptions/bundle-drawer/DrawerStepAddress.tsx","../src/screens/subscriptions/bundle-drawer/DrawerStepPayment.tsx","../src/screens/subscriptions/bundle-drawer/BundleSubscriptionsDrawer.tsx","../src/screens/SubscriptionsListScreen.tsx","../../../subscriptions/ui/src/components/cancel-subscription-dialog.tsx","../../../subscriptions/ui/src/components/pause-subscription-dialog.tsx","../../../subscriptions/ui/src/lib/parse-iso-date.ts","../../../subscriptions/ui/src/components/resume-subscription-dialog.tsx","../../../subscriptions/ui/src/components/edit-bill-date-dialog.tsx","../../../subscriptions/ui/src/lib/cn.ts","../../../subscriptions/ui/src/components/status-pill.tsx","../../../subscriptions/ui/src/components/past-due-banner.tsx","../../../subscriptions/ui/src/lib/format.ts","../../../subscriptions/ui/src/components/subscription-detail.tsx","../../../subscriptions/ui/src/screens/SubscriptionDetailScreen.tsx","../src/subscriptions/SelectablePaymentMethodDropdown.tsx","../src/subscriptions/PortalSubscriptionPaymentMethodSection.tsx","../src/subscriptions/SelectableAddressDropdown.tsx","../src/subscriptions/PortalSubscriptionShippingAddressSection.tsx","../src/screens/SubscriptionDetailScreen.tsx","../src/screens/SubscriptionsScreen.tsx"],"sourcesContent":["import { addDays } from \"./addDays.js\";\n\n/**\n * The {@link addWeeks} function options.\n */\n\n/**\n * @name addWeeks\n * @category Week Helpers\n * @summary Add the specified number of weeks to the given date.\n *\n * @description\n * Add the specified number of weeks to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of weeks to be added.\n * @param options - An object with options\n *\n * @returns The new date with the weeks added\n *\n * @example\n * // Add 4 weeks to 1 September 2014:\n * const result = addWeeks(new Date(2014, 8, 1), 4)\n * //=> Mon Sep 29 2014 00:00:00\n */\nexport function addWeeks(date, amount, options) {\n return addDays(date, amount * 7, options);\n}\n\n// Fallback for modularized imports:\nexport default addWeeks;\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The {@link addYears} function options.\n */\n\n/**\n * @name addYears\n * @category Year Helpers\n * @summary Add the specified number of years to the given date.\n *\n * @description\n * Add the specified number of years to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The date to be changed\n * @param amount - The amount of years to be added.\n * @param options - The options\n *\n * @returns The new date with the years added\n *\n * @example\n * // Add 5 years to 1 September 2014:\n * const result = addYears(new Date(2014, 8, 1), 5)\n * //=> Sun Sep 01 2019 00:00:00\n */\nexport function addYears(date, amount, options) {\n return addMonths(date, amount * 12, options);\n}\n\n// Fallback for modularized imports:\nexport default addYears;\n","import { getDefaultOptions as getInternalDefaultOptions } from \"./_lib/defaultOptions.js\";\n\n/**\n * @name getDefaultOptions\n * @category Common Helpers\n * @summary Get default options.\n * @pure false\n *\n * @description\n * Returns an object that contains defaults for\n * `options.locale`, `options.weekStartsOn` and `options.firstWeekContainsDate`\n * arguments for all functions.\n *\n * You can change these with [setDefaultOptions](https://date-fns.org/docs/setDefaultOptions).\n *\n * @returns The default options\n *\n * @example\n * const result = getDefaultOptions()\n * //=> {}\n *\n * @example\n * setDefaultOptions({ weekStarsOn: 1, firstWeekContainsDate: 4 })\n * const result = getDefaultOptions()\n * //=> { weekStarsOn: 1, firstWeekContainsDate: 4 }\n */\nexport function getDefaultOptions() {\n return Object.assign({}, getInternalDefaultOptions());\n}\n\n// Fallback for modularized imports:\nexport default getDefaultOptions;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISODay} function options.\n */\n\n/**\n * @name getISODay\n * @category Weekday Helpers\n * @summary Get the day of the ISO week of the given date.\n *\n * @description\n * Get the day of the ISO week of the given date,\n * which is 7 for Sunday, 1 for Monday etc.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The day of ISO week\n *\n * @example\n * // Which day of the ISO week is 26 February 2012?\n * const result = getISODay(new Date(2012, 1, 26))\n * //=> 7\n */\nexport function getISODay(date, options) {\n const day = toDate(date, options?.in).getDay();\n return day === 0 ? 7 : day;\n}\n\n// Fallback for modularized imports:\nexport default getISODay;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name transpose\n * @category Generic Helpers\n * @summary Transpose the date to the given constructor.\n *\n * @description\n * The function transposes the date to the given constructor. It helps you\n * to transpose the date in the system time zone to say `UTCDate` or any other\n * date extension.\n *\n * @typeParam InputDate - The input `Date` type derived from the passed argument.\n * @typeParam ResultDate - The result `Date` type derived from the passed constructor.\n *\n * @param date - The date to use values from\n * @param constructor - The date constructor to use\n *\n * @returns Date transposed to the given constructor\n *\n * @example\n * // Create July 10, 2022 00:00 in locale time zone\n * const date = new Date(2022, 6, 10)\n * //=> 'Sun Jul 10 2022 00:00:00 GMT+0800 (Singapore Standard Time)'\n *\n * @example\n * // Transpose the date to July 10, 2022 00:00 in UTC\n * transpose(date, UTCDate)\n * //=> 'Sun Jul 10 2022 00:00:00 GMT+0000 (Coordinated Universal Time)'\n */\nexport function transpose(date, constructor) {\n const date_ = isConstructor(constructor)\n ? new constructor(0)\n : constructFrom(constructor, 0);\n date_.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n date_.setHours(\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n );\n return date_;\n}\n\nfunction isConstructor(constructor) {\n return (\n typeof constructor === \"function\" &&\n constructor.prototype?.constructor === constructor\n );\n}\n\n// Fallback for modularized imports:\nexport default transpose;\n","import { constructFrom } from \"../../constructFrom.js\";\nimport { transpose } from \"../../transpose.js\";\n\nconst TIMEZONE_UNIT_PRIORITY = 10;\n\nexport class Setter {\n subPriority = 0;\n\n validate(_utcDate, _options) {\n return true;\n }\n}\n\nexport class ValueSetter extends Setter {\n constructor(\n value,\n\n validateValue,\n\n setValue,\n\n priority,\n subPriority,\n ) {\n super();\n this.value = value;\n this.validateValue = validateValue;\n this.setValue = setValue;\n this.priority = priority;\n if (subPriority) {\n this.subPriority = subPriority;\n }\n }\n\n validate(date, options) {\n return this.validateValue(date, this.value, options);\n }\n\n set(date, flags, options) {\n return this.setValue(date, flags, this.value, options);\n }\n}\n\nexport class DateTimezoneSetter extends Setter {\n priority = TIMEZONE_UNIT_PRIORITY;\n subPriority = -1;\n\n constructor(context, reference) {\n super();\n this.context = context || ((date) => constructFrom(reference, date));\n }\n\n set(date, flags) {\n if (flags.timestampIsSet) return date;\n return constructFrom(date, transpose(date, this.context));\n }\n}\n","import { ValueSetter } from \"./Setter.js\";\n\nexport class Parser {\n run(dateString, token, match, options) {\n const result = this.parse(dateString, token, match, options);\n if (!result) {\n return null;\n }\n\n return {\n setter: new ValueSetter(\n result.value,\n this.validate,\n this.set,\n this.priority,\n this.subPriority,\n ),\n rest: result.rest,\n };\n }\n\n validate(_utcDate, _value, _options) {\n return true;\n }\n}\n","import { Parser } from \"../Parser.js\";\n\nexport class EraParser extends Parser {\n priority = 140;\n\n parse(dateString, token, match) {\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return (\n match.era(dateString, { width: \"abbreviated\" }) ||\n match.era(dateString, { width: \"narrow\" })\n );\n\n // A, B\n case \"GGGGG\":\n return match.era(dateString, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return (\n match.era(dateString, { width: \"wide\" }) ||\n match.era(dateString, { width: \"abbreviated\" }) ||\n match.era(dateString, { width: \"narrow\" })\n );\n }\n }\n\n set(date, flags, value) {\n flags.era = value;\n date.setFullYear(value, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"R\", \"u\", \"t\", \"T\"];\n}\n","export const numericPatterns = {\n month: /^(1[0-2]|0?\\d)/, // 0 to 12\n date: /^(3[0-1]|[0-2]?\\d)/, // 0 to 31\n dayOfYear: /^(36[0-6]|3[0-5]\\d|[0-2]?\\d?\\d)/, // 0 to 366\n week: /^(5[0-3]|[0-4]?\\d)/, // 0 to 53\n hour23h: /^(2[0-3]|[0-1]?\\d)/, // 0 to 23\n hour24h: /^(2[0-4]|[0-1]?\\d)/, // 0 to 24\n hour11h: /^(1[0-1]|0?\\d)/, // 0 to 11\n hour12h: /^(1[0-2]|0?\\d)/, // 0 to 12\n minute: /^[0-5]?\\d/, // 0 to 59\n second: /^[0-5]?\\d/, // 0 to 59\n\n singleDigit: /^\\d/, // 0 to 9\n twoDigits: /^\\d{1,2}/, // 0 to 99\n threeDigits: /^\\d{1,3}/, // 0 to 999\n fourDigits: /^\\d{1,4}/, // 0 to 9999\n\n anyDigitsSigned: /^-?\\d+/,\n singleDigitSigned: /^-?\\d/, // 0 to 9, -0 to -9\n twoDigitsSigned: /^-?\\d{1,2}/, // 0 to 99, -0 to -99\n threeDigitsSigned: /^-?\\d{1,3}/, // 0 to 999, -0 to -999\n fourDigitsSigned: /^-?\\d{1,4}/, // 0 to 9999, -0 to -9999\n};\n\nexport const timezonePatterns = {\n basicOptionalMinutes: /^([+-])(\\d{2})(\\d{2})?|Z/,\n basic: /^([+-])(\\d{2})(\\d{2})|Z/,\n basicOptionalSeconds: /^([+-])(\\d{2})(\\d{2})((\\d{2}))?|Z/,\n extended: /^([+-])(\\d{2}):(\\d{2})|Z/,\n extendedOptionalSeconds: /^([+-])(\\d{2}):(\\d{2})(:(\\d{2}))?|Z/,\n};\n","import {\n millisecondsInHour,\n millisecondsInMinute,\n millisecondsInSecond,\n} from \"../../constants.js\";\n\nimport { numericPatterns } from \"./constants.js\";\n\nexport function mapValue(parseFnResult, mapFn) {\n if (!parseFnResult) {\n return parseFnResult;\n }\n\n return {\n value: mapFn(parseFnResult.value),\n rest: parseFnResult.rest,\n };\n}\n\nexport function parseNumericPattern(pattern, dateString) {\n const matchResult = dateString.match(pattern);\n\n if (!matchResult) {\n return null;\n }\n\n return {\n value: parseInt(matchResult[0], 10),\n rest: dateString.slice(matchResult[0].length),\n };\n}\n\nexport function parseTimezonePattern(pattern, dateString) {\n const matchResult = dateString.match(pattern);\n\n if (!matchResult) {\n return null;\n }\n\n // Input is 'Z'\n if (matchResult[0] === \"Z\") {\n return {\n value: 0,\n rest: dateString.slice(1),\n };\n }\n\n const sign = matchResult[1] === \"+\" ? 1 : -1;\n const hours = matchResult[2] ? parseInt(matchResult[2], 10) : 0;\n const minutes = matchResult[3] ? parseInt(matchResult[3], 10) : 0;\n const seconds = matchResult[5] ? parseInt(matchResult[5], 10) : 0;\n\n return {\n value:\n sign *\n (hours * millisecondsInHour +\n minutes * millisecondsInMinute +\n seconds * millisecondsInSecond),\n rest: dateString.slice(matchResult[0].length),\n };\n}\n\nexport function parseAnyDigitsSigned(dateString) {\n return parseNumericPattern(numericPatterns.anyDigitsSigned, dateString);\n}\n\nexport function parseNDigits(n, dateString) {\n switch (n) {\n case 1:\n return parseNumericPattern(numericPatterns.singleDigit, dateString);\n case 2:\n return parseNumericPattern(numericPatterns.twoDigits, dateString);\n case 3:\n return parseNumericPattern(numericPatterns.threeDigits, dateString);\n case 4:\n return parseNumericPattern(numericPatterns.fourDigits, dateString);\n default:\n return parseNumericPattern(new RegExp(\"^\\\\d{1,\" + n + \"}\"), dateString);\n }\n}\n\nexport function parseNDigitsSigned(n, dateString) {\n switch (n) {\n case 1:\n return parseNumericPattern(numericPatterns.singleDigitSigned, dateString);\n case 2:\n return parseNumericPattern(numericPatterns.twoDigitsSigned, dateString);\n case 3:\n return parseNumericPattern(numericPatterns.threeDigitsSigned, dateString);\n case 4:\n return parseNumericPattern(numericPatterns.fourDigitsSigned, dateString);\n default:\n return parseNumericPattern(new RegExp(\"^-?\\\\d{1,\" + n + \"}\"), dateString);\n }\n}\n\nexport function dayPeriodEnumToHours(dayPeriod) {\n switch (dayPeriod) {\n case \"morning\":\n return 4;\n case \"evening\":\n return 17;\n case \"pm\":\n case \"noon\":\n case \"afternoon\":\n return 12;\n case \"am\":\n case \"midnight\":\n case \"night\":\n default:\n return 0;\n }\n}\n\nexport function normalizeTwoDigitYear(twoDigitYear, currentYear) {\n const isCommonEra = currentYear > 0;\n // Absolute number of the current year:\n // 1 -> 1 AC\n // 0 -> 1 BC\n // -1 -> 2 BC\n const absCurrentYear = isCommonEra ? currentYear : 1 - currentYear;\n\n let result;\n if (absCurrentYear <= 50) {\n result = twoDigitYear || 100;\n } else {\n const rangeEnd = absCurrentYear + 50;\n const rangeEndCentury = Math.trunc(rangeEnd / 100) * 100;\n const isPreviousCentury = twoDigitYear >= rangeEnd % 100;\n result = twoDigitYear + rangeEndCentury - (isPreviousCentury ? 100 : 0);\n }\n\n return isCommonEra ? result : 1 - result;\n}\n\nexport function isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { mapValue, normalizeTwoDigitYear, parseNDigits } from \"../utils.js\";\n\n// From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns\n// | Year | y | yy | yyy | yyyy | yyyyy |\n// |----------|-------|----|-------|-------|-------|\n// | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n// | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n// | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n// | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n// | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\nexport class YearParser extends Parser {\n priority = 130;\n incompatibleTokens = [\"Y\", \"R\", \"u\", \"w\", \"I\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n\n parse(dateString, token, match) {\n const valueCallback = (year) => ({\n year,\n isTwoDigitYear: token === \"yy\",\n });\n\n switch (token) {\n case \"y\":\n return mapValue(parseNDigits(4, dateString), valueCallback);\n case \"yo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"year\",\n }),\n valueCallback,\n );\n default:\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n }\n }\n\n validate(_date, value) {\n return value.isTwoDigitYear || value.year > 0;\n }\n\n set(date, flags, value) {\n const currentYear = date.getFullYear();\n\n if (value.isTwoDigitYear) {\n const normalizedTwoDigitYear = normalizeTwoDigitYear(\n value.year,\n currentYear,\n );\n date.setFullYear(normalizedTwoDigitYear, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n const year =\n !(\"era\" in flags) || flags.era === 1 ? value.year : 1 - value.year;\n date.setFullYear(year, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n}\n","import { getWeekYear } from \"../../../getWeekYear.js\";\n\nimport { startOfWeek } from \"../../../startOfWeek.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, normalizeTwoDigitYear, parseNDigits } from \"../utils.js\";\n\n// Local week-numbering year\nexport class LocalWeekYearParser extends Parser {\n priority = 130;\n\n parse(dateString, token, match) {\n const valueCallback = (year) => ({\n year,\n isTwoDigitYear: token === \"YY\",\n });\n\n switch (token) {\n case \"Y\":\n return mapValue(parseNDigits(4, dateString), valueCallback);\n case \"Yo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"year\",\n }),\n valueCallback,\n );\n default:\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n }\n }\n\n validate(_date, value) {\n return value.isTwoDigitYear || value.year > 0;\n }\n\n set(date, flags, value, options) {\n const currentYear = getWeekYear(date, options);\n\n if (value.isTwoDigitYear) {\n const normalizedTwoDigitYear = normalizeTwoDigitYear(\n value.year,\n currentYear,\n );\n date.setFullYear(\n normalizedTwoDigitYear,\n 0,\n options.firstWeekContainsDate,\n );\n date.setHours(0, 0, 0, 0);\n return startOfWeek(date, options);\n }\n\n const year =\n !(\"era\" in flags) || flags.era === 1 ? value.year : 1 - value.year;\n date.setFullYear(year, 0, options.firstWeekContainsDate);\n date.setHours(0, 0, 0, 0);\n return startOfWeek(date, options);\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"Q\",\n \"q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"t\",\n \"T\",\n ];\n}\n","import { startOfISOWeek } from \"../../../startOfISOWeek.js\";\nimport { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigitsSigned } from \"../utils.js\";\n\n// ISO week-numbering year\nexport class ISOWeekYearParser extends Parser {\n priority = 130;\n\n parse(dateString, token) {\n if (token === \"R\") {\n return parseNDigitsSigned(4, dateString);\n }\n\n return parseNDigitsSigned(token.length, dateString);\n }\n\n set(date, _flags, value) {\n const firstWeekOfYear = constructFrom(date, 0);\n firstWeekOfYear.setFullYear(value, 0, 4);\n firstWeekOfYear.setHours(0, 0, 0, 0);\n return startOfISOWeek(firstWeekOfYear);\n }\n\n incompatibleTokens = [\n \"G\",\n \"y\",\n \"Y\",\n \"u\",\n \"Q\",\n \"q\",\n \"M\",\n \"L\",\n \"w\",\n \"d\",\n \"D\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigitsSigned } from \"../utils.js\";\n\nexport class ExtendedYearParser extends Parser {\n priority = 130;\n\n parse(dateString, token) {\n if (token === \"u\") {\n return parseNDigitsSigned(4, dateString);\n }\n\n return parseNDigitsSigned(token.length, dateString);\n }\n\n set(date, _flags, value) {\n date.setFullYear(value, 0, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"G\", \"y\", \"Y\", \"R\", \"w\", \"I\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigits } from \"../utils.js\";\n\nexport class QuarterParser extends Parser {\n priority = 120;\n\n parse(dateString, token, match) {\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n case \"QQ\": // 01, 02, 03, 04\n return parseNDigits(token.length, dateString);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return match.ordinalNumber(dateString, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return (\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return match.quarter(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return (\n match.quarter(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 4;\n }\n\n set(date, _flags, value) {\n date.setMonth((value - 1) * 3, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"M\",\n \"L\",\n \"w\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigits } from \"../utils.js\";\n\nexport class StandAloneQuarterParser extends Parser {\n priority = 120;\n\n parse(dateString, token, match) {\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n case \"qq\": // 01, 02, 03, 04\n return parseNDigits(token.length, dateString);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return match.ordinalNumber(dateString, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return (\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n })\n );\n\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return match.quarter(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return (\n match.quarter(dateString, {\n width: \"wide\",\n context: \"standalone\",\n }) ||\n match.quarter(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.quarter(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 4;\n }\n\n set(date, _flags, value) {\n date.setMonth((value - 1) * 3, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class MonthParser extends Parser {\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"L\",\n \"w\",\n \"I\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n\n priority = 110;\n\n parse(dateString, token, match) {\n const valueCallback = (value) => value - 1;\n\n switch (token) {\n // 1, 2, ..., 12\n case \"M\":\n return mapValue(\n parseNumericPattern(numericPatterns.month, dateString),\n valueCallback,\n );\n // 01, 02, ..., 12\n case \"MM\":\n return mapValue(parseNDigits(2, dateString), valueCallback);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"month\",\n }),\n valueCallback,\n );\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return (\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // J, F, ..., D\n case \"MMMMM\":\n return match.month(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return (\n match.month(dateString, { width: \"wide\", context: \"formatting\" }) ||\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 11;\n }\n\n set(date, _flags, value) {\n date.setMonth(value, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class StandAloneMonthParser extends Parser {\n priority = 110;\n\n parse(dateString, token, match) {\n const valueCallback = (value) => value - 1;\n\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return mapValue(\n parseNumericPattern(numericPatterns.month, dateString),\n valueCallback,\n );\n // 01, 02, ..., 12\n case \"LL\":\n return mapValue(parseNDigits(2, dateString), valueCallback);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"month\",\n }),\n valueCallback,\n );\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return (\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n\n // J, F, ..., D\n case \"LLLLL\":\n return match.month(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return (\n match.month(dateString, { width: \"wide\", context: \"standalone\" }) ||\n match.month(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.month(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 11;\n }\n\n set(date, _flags, value) {\n date.setMonth(value, 1);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"M\",\n \"w\",\n \"I\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { getWeek } from \"./getWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setWeek} function options.\n */\n\n/**\n * @name setWeek\n * @category Week Helpers\n * @summary Set the local week to the given date.\n *\n * @description\n * Set the local week to the given date, saving the weekday number.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param week - The week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the local week set\n *\n * @example\n * // Set the 1st week to 2 January 2005 with default options:\n * const result = setWeek(new Date(2005, 0, 2), 1)\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // Set the 1st week to 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January:\n * const result = setWeek(new Date(2005, 0, 2), 1, {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Sun Jan 4 2004 00:00:00\n */\nexport function setWeek(date, week, options) {\n const date_ = toDate(date, options?.in);\n const diff = getWeek(date_, options) - week;\n date_.setDate(date_.getDate() - diff * 7);\n return toDate(date_, options?.in);\n}\n\n// Fallback for modularized imports:\nexport default setWeek;\n","import { setWeek } from \"../../../setWeek.js\";\nimport { startOfWeek } from \"../../../startOfWeek.js\";\nimport { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\n// Local week of year\nexport class LocalWeekParser extends Parser {\n priority = 100;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"w\":\n return parseNumericPattern(numericPatterns.week, dateString);\n case \"wo\":\n return match.ordinalNumber(dateString, { unit: \"week\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 53;\n }\n\n set(date, _flags, value, options) {\n return startOfWeek(setWeek(date, value, options), options);\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"i\",\n \"t\",\n \"T\",\n ];\n}\n","import { getISOWeek } from \"./getISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setISOWeek} function options.\n */\n\n/**\n * @name setISOWeek\n * @category ISO Week Helpers\n * @summary Set the ISO week to the given date.\n *\n * @description\n * Set the ISO week to the given date, saving the weekday number.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The `Date` type of the context function.\n *\n * @param date - The date to be changed\n * @param week - The ISO week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the ISO week set\n *\n * @example\n * // Set the 53rd ISO week to 7 August 2004:\n * const result = setISOWeek(new Date(2004, 7, 7), 53)\n * //=> Sat Jan 01 2005 00:00:00\n */\nexport function setISOWeek(date, week, options) {\n const _date = toDate(date, options?.in);\n const diff = getISOWeek(_date, options) - week;\n _date.setDate(_date.getDate() - diff * 7);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default setISOWeek;\n","import { setISOWeek } from \"../../../setISOWeek.js\";\nimport { startOfISOWeek } from \"../../../startOfISOWeek.js\";\nimport { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\n// ISO week of year\nexport class ISOWeekParser extends Parser {\n priority = 100;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"I\":\n return parseNumericPattern(numericPatterns.week, dateString);\n case \"Io\":\n return match.ordinalNumber(dateString, { unit: \"week\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 53;\n }\n\n set(date, _flags, value) {\n return startOfISOWeek(setISOWeek(date, value));\n }\n\n incompatibleTokens = [\n \"y\",\n \"Y\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"d\",\n \"D\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport {\n isLeapYearIndex,\n parseNDigits,\n parseNumericPattern,\n} from \"../utils.js\";\n\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst DAYS_IN_MONTH_LEAP_YEAR = [\n 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,\n];\n\n// Day of the month\nexport class DateParser extends Parser {\n priority = 90;\n subPriority = 1;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"d\":\n return parseNumericPattern(numericPatterns.date, dateString);\n case \"do\":\n return match.ordinalNumber(dateString, { unit: \"date\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(date, value) {\n const year = date.getFullYear();\n const isLeapYear = isLeapYearIndex(year);\n const month = date.getMonth();\n if (isLeapYear) {\n return value >= 1 && value <= DAYS_IN_MONTH_LEAP_YEAR[month];\n } else {\n return value >= 1 && value <= DAYS_IN_MONTH[month];\n }\n }\n\n set(date, _flags, value) {\n date.setDate(value);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"w\",\n \"I\",\n \"D\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport {\n isLeapYearIndex,\n parseNDigits,\n parseNumericPattern,\n} from \"../utils.js\";\n\nexport class DayOfYearParser extends Parser {\n priority = 90;\n\n subpriority = 1;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"D\":\n case \"DD\":\n return parseNumericPattern(numericPatterns.dayOfYear, dateString);\n case \"Do\":\n return match.ordinalNumber(dateString, { unit: \"date\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(date, value) {\n const year = date.getFullYear();\n const isLeapYear = isLeapYearIndex(year);\n if (isLeapYear) {\n return value >= 1 && value <= 366;\n } else {\n return value >= 1 && value <= 365;\n }\n }\n\n set(date, _flags, value) {\n date.setMonth(0, value);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"Y\",\n \"R\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"I\",\n \"d\",\n \"E\",\n \"i\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { addDays } from \"./addDays.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setDay} function options.\n */\n\n/**\n * @name setDay\n * @category Weekday Helpers\n * @summary Set the day of the week to the given date.\n *\n * @description\n * Set the day of the week to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param day - The day of the week of the new date\n * @param options - An object with options.\n *\n * @returns The new date with the day of the week set\n *\n * @example\n * // Set week day to Sunday, with the default weekStartsOn of Sunday:\n * const result = setDay(new Date(2014, 8, 1), 0)\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // Set week day to Sunday, with a weekStartsOn of Monday:\n * const result = setDay(new Date(2014, 8, 1), 0, { weekStartsOn: 1 })\n * //=> Sun Sep 07 2014 00:00:00\n */\nexport function setDay(date, day, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const date_ = toDate(date, options?.in);\n const currentDay = date_.getDay();\n\n const remainder = day % 7;\n const dayIndex = (remainder + 7) % 7;\n\n const delta = 7 - weekStartsOn;\n const diff =\n day < 0 || day > 6\n ? day - ((currentDay + delta) % 7)\n : ((dayIndex + delta) % 7) - ((currentDay + delta) % 7);\n return addDays(date_, diff, options);\n}\n\n// Fallback for modularized imports:\nexport default setDay;\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\n// Day of week\nexport class DayParser extends Parser {\n priority = 90;\n\n parse(dateString, token, match) {\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return (\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // T\n case \"EEEEE\":\n return match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return (\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // Tuesday\n case \"EEEE\":\n default:\n return (\n match.day(dateString, { width: \"wide\", context: \"formatting\" }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 6;\n }\n\n set(date, _flags, value, options) {\n date = setDay(date, value, options);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"D\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n}\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// Local day of week\nexport class LocalDayParser extends Parser {\n priority = 90;\n parse(dateString, token, match, options) {\n const valueCallback = (value) => {\n // We want here floor instead of trunc, so we get -7 for value 0 instead of 0\n const wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n return ((value + options.weekStartsOn + 6) % 7) + wholeWeekDays;\n };\n\n switch (token) {\n // 3\n case \"e\":\n case \"ee\": // 03\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n // 3rd\n case \"eo\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"day\",\n }),\n valueCallback,\n );\n // Tue\n case \"eee\":\n return (\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // T\n case \"eeeee\":\n return match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return (\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n\n // Tuesday\n case \"eeee\":\n default:\n return (\n match.day(dateString, { width: \"wide\", context: \"formatting\" }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 6;\n }\n\n set(date, _flags, value, options) {\n date = setDay(date, value, options);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"E\",\n \"i\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// Stand-alone local day of week\nexport class StandAloneLocalDayParser extends Parser {\n priority = 90;\n\n parse(dateString, token, match, options) {\n const valueCallback = (value) => {\n // We want here floor instead of trunc, so we get -7 for value 0 instead of 0\n const wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n return ((value + options.weekStartsOn + 6) % 7) + wholeWeekDays;\n };\n\n switch (token) {\n // 3\n case \"c\":\n case \"cc\": // 03\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n // 3rd\n case \"co\":\n return mapValue(\n match.ordinalNumber(dateString, {\n unit: \"day\",\n }),\n valueCallback,\n );\n // Tue\n case \"ccc\":\n return (\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n\n // T\n case \"ccccc\":\n return match.day(dateString, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return (\n match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n\n // Tuesday\n case \"cccc\":\n default:\n return (\n match.day(dateString, { width: \"wide\", context: \"standalone\" }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"standalone\",\n }) ||\n match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n );\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 6;\n }\n\n set(date, _flags, value, options) {\n date = setDay(date, value, options);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"y\",\n \"R\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"I\",\n \"d\",\n \"D\",\n \"E\",\n \"i\",\n \"e\",\n \"t\",\n \"T\",\n ];\n}\n","import { addDays } from \"./addDays.js\";\nimport { getISODay } from \"./getISODay.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setISODay} function options.\n */\n\n/**\n * @name setISODay\n * @category Weekday Helpers\n * @summary Set the day of the ISO week to the given date.\n *\n * @description\n * Set the day of the ISO week to the given date.\n * ISO week starts with Monday.\n * 7 is the index of Sunday, 1 is the index of Monday, etc.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param day - The day of the ISO week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the day of the ISO week set\n *\n * @example\n * // Set Sunday to 1 September 2014:\n * const result = setISODay(new Date(2014, 8, 1), 7)\n * //=> Sun Sep 07 2014 00:00:00\n */\nexport function setISODay(date, day, options) {\n const date_ = toDate(date, options?.in);\n const currentDay = getISODay(date_, options);\n const diff = day - currentDay;\n return addDays(date_, diff, options);\n}\n\n// Fallback for modularized imports:\nexport default setISODay;\n","import { setISODay } from \"../../../setISODay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// ISO day of week\nexport class ISODayParser extends Parser {\n priority = 90;\n\n parse(dateString, token, match) {\n const valueCallback = (value) => {\n if (value === 0) {\n return 7;\n }\n return value;\n };\n\n switch (token) {\n // 2\n case \"i\":\n case \"ii\": // 02\n return parseNDigits(token.length, dateString);\n // 2nd\n case \"io\":\n return match.ordinalNumber(dateString, { unit: \"day\" });\n // Tue\n case \"iii\":\n return mapValue(\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"short\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n // T\n case \"iiiii\":\n return mapValue(\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n // Tu\n case \"iiiiii\":\n return mapValue(\n match.day(dateString, {\n width: \"short\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n // Tuesday\n case \"iiii\":\n default:\n return mapValue(\n match.day(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"short\",\n context: \"formatting\",\n }) ||\n match.day(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n }),\n valueCallback,\n );\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 7;\n }\n\n set(date, _flags, value) {\n date = setISODay(date, value);\n date.setHours(0, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\n \"y\",\n \"Y\",\n \"u\",\n \"q\",\n \"Q\",\n \"M\",\n \"L\",\n \"w\",\n \"d\",\n \"D\",\n \"E\",\n \"e\",\n \"c\",\n \"t\",\n \"T\",\n ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\nexport class AMPMParser extends Parser {\n priority = 80;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"a\":\n case \"aa\":\n case \"aaa\":\n return (\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n case \"aaaaa\":\n return match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return (\n match.dayPeriod(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n set(date, _flags, value) {\n date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"b\", \"B\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\nexport class AMPMMidnightParser extends Parser {\n priority = 80;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"b\":\n case \"bb\":\n case \"bbb\":\n return (\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n case \"bbbbb\":\n return match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return (\n match.dayPeriod(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n set(date, _flags, value) {\n date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"B\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\n// in the morning, in the afternoon, in the evening, at night\nexport class DayPeriodParser extends Parser {\n priority = 80;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return (\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n\n case \"BBBBB\":\n return match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return (\n match.dayPeriod(dateString, {\n width: \"wide\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"abbreviated\",\n context: \"formatting\",\n }) ||\n match.dayPeriod(dateString, {\n width: \"narrow\",\n context: \"formatting\",\n })\n );\n }\n }\n\n set(date, _flags, value) {\n date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"b\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour1to12Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"h\":\n return parseNumericPattern(numericPatterns.hour12h, dateString);\n case \"ho\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 12;\n }\n\n set(date, _flags, value) {\n const isPM = date.getHours() >= 12;\n if (isPM && value < 12) {\n date.setHours(value + 12, 0, 0, 0);\n } else if (!isPM && value === 12) {\n date.setHours(0, 0, 0, 0);\n } else {\n date.setHours(value, 0, 0, 0);\n }\n return date;\n }\n\n incompatibleTokens = [\"H\", \"K\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour0to23Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"H\":\n return parseNumericPattern(numericPatterns.hour23h, dateString);\n case \"Ho\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 23;\n }\n\n set(date, _flags, value) {\n date.setHours(value, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"b\", \"h\", \"K\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour0To11Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"K\":\n return parseNumericPattern(numericPatterns.hour11h, dateString);\n case \"Ko\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 11;\n }\n\n set(date, _flags, value) {\n const isPM = date.getHours() >= 12;\n if (isPM && value < 12) {\n date.setHours(value + 12, 0, 0, 0);\n } else {\n date.setHours(value, 0, 0, 0);\n }\n return date;\n }\n\n incompatibleTokens = [\"h\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour1To24Parser extends Parser {\n priority = 70;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"k\":\n return parseNumericPattern(numericPatterns.hour24h, dateString);\n case \"ko\":\n return match.ordinalNumber(dateString, { unit: \"hour\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 1 && value <= 24;\n }\n\n set(date, _flags, value) {\n const hours = value <= 24 ? value % 24 : value;\n date.setHours(hours, 0, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"a\", \"b\", \"h\", \"H\", \"K\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class MinuteParser extends Parser {\n priority = 60;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"m\":\n return parseNumericPattern(numericPatterns.minute, dateString);\n case \"mo\":\n return match.ordinalNumber(dateString, { unit: \"minute\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 59;\n }\n\n set(date, _flags, value) {\n date.setMinutes(value, 0, 0);\n return date;\n }\n\n incompatibleTokens = [\"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class SecondParser extends Parser {\n priority = 50;\n\n parse(dateString, token, match) {\n switch (token) {\n case \"s\":\n return parseNumericPattern(numericPatterns.second, dateString);\n case \"so\":\n return match.ordinalNumber(dateString, { unit: \"second\" });\n default:\n return parseNDigits(token.length, dateString);\n }\n }\n\n validate(_date, value) {\n return value >= 0 && value <= 59;\n }\n\n set(date, _flags, value) {\n date.setSeconds(value, 0);\n return date;\n }\n\n incompatibleTokens = [\"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\nexport class FractionOfSecondParser extends Parser {\n priority = 30;\n\n parse(dateString, token) {\n const valueCallback = (value) =>\n Math.trunc(value * Math.pow(10, -token.length + 3));\n return mapValue(parseNDigits(token.length, dateString), valueCallback);\n }\n\n set(date, _flags, value) {\n date.setMilliseconds(value);\n return date;\n }\n\n incompatibleTokens = [\"t\", \"T\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"../../../_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { timezonePatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseTimezonePattern } from \"../utils.js\";\n\n// Timezone (ISO-8601. +00:00 is `'Z'`)\nexport class ISOTimezoneWithZParser extends Parser {\n priority = 10;\n\n parse(dateString, token) {\n switch (token) {\n case \"X\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalMinutes,\n dateString,\n );\n case \"XX\":\n return parseTimezonePattern(timezonePatterns.basic, dateString);\n case \"XXXX\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalSeconds,\n dateString,\n );\n case \"XXXXX\":\n return parseTimezonePattern(\n timezonePatterns.extendedOptionalSeconds,\n dateString,\n );\n case \"XXX\":\n default:\n return parseTimezonePattern(timezonePatterns.extended, dateString);\n }\n }\n\n set(date, flags, value) {\n if (flags.timestampIsSet) return date;\n return constructFrom(\n date,\n date.getTime() - getTimezoneOffsetInMilliseconds(date) - value,\n );\n }\n\n incompatibleTokens = [\"t\", \"T\", \"x\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"../../../_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { timezonePatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseTimezonePattern } from \"../utils.js\";\n\n// Timezone (ISO-8601)\nexport class ISOTimezoneParser extends Parser {\n priority = 10;\n\n parse(dateString, token) {\n switch (token) {\n case \"x\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalMinutes,\n dateString,\n );\n case \"xx\":\n return parseTimezonePattern(timezonePatterns.basic, dateString);\n case \"xxxx\":\n return parseTimezonePattern(\n timezonePatterns.basicOptionalSeconds,\n dateString,\n );\n case \"xxxxx\":\n return parseTimezonePattern(\n timezonePatterns.extendedOptionalSeconds,\n dateString,\n );\n case \"xxx\":\n default:\n return parseTimezonePattern(timezonePatterns.extended, dateString);\n }\n }\n\n set(date, flags, value) {\n if (flags.timestampIsSet) return date;\n return constructFrom(\n date,\n date.getTime() - getTimezoneOffsetInMilliseconds(date) - value,\n );\n }\n\n incompatibleTokens = [\"t\", \"T\", \"X\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseAnyDigitsSigned } from \"../utils.js\";\n\nexport class TimestampSecondsParser extends Parser {\n priority = 40;\n\n parse(dateString) {\n return parseAnyDigitsSigned(dateString);\n }\n\n set(date, _flags, value) {\n return [constructFrom(date, value * 1000), { timestampIsSet: true }];\n }\n\n incompatibleTokens = \"*\";\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseAnyDigitsSigned } from \"../utils.js\";\n\nexport class TimestampMillisecondsParser extends Parser {\n priority = 20;\n\n parse(dateString) {\n return parseAnyDigitsSigned(dateString);\n }\n\n set(date, _flags, value) {\n return [constructFrom(date, value), { timestampIsSet: true }];\n }\n\n incompatibleTokens = \"*\";\n}\n","import { EraParser } from \"./parsers/EraParser.js\";\nimport { YearParser } from \"./parsers/YearParser.js\";\nimport { LocalWeekYearParser } from \"./parsers/LocalWeekYearParser.js\";\nimport { ISOWeekYearParser } from \"./parsers/ISOWeekYearParser.js\";\nimport { ExtendedYearParser } from \"./parsers/ExtendedYearParser.js\";\nimport { QuarterParser } from \"./parsers/QuarterParser.js\";\nimport { StandAloneQuarterParser } from \"./parsers/StandAloneQuarterParser.js\";\nimport { MonthParser } from \"./parsers/MonthParser.js\";\nimport { StandAloneMonthParser } from \"./parsers/StandAloneMonthParser.js\";\nimport { LocalWeekParser } from \"./parsers/LocalWeekParser.js\";\nimport { ISOWeekParser } from \"./parsers/ISOWeekParser.js\";\nimport { DateParser } from \"./parsers/DateParser.js\";\nimport { DayOfYearParser } from \"./parsers/DayOfYearParser.js\";\nimport { DayParser } from \"./parsers/DayParser.js\";\nimport { LocalDayParser } from \"./parsers/LocalDayParser.js\";\nimport { StandAloneLocalDayParser } from \"./parsers/StandAloneLocalDayParser.js\";\nimport { ISODayParser } from \"./parsers/ISODayParser.js\";\nimport { AMPMParser } from \"./parsers/AMPMParser.js\";\nimport { AMPMMidnightParser } from \"./parsers/AMPMMidnightParser.js\";\nimport { DayPeriodParser } from \"./parsers/DayPeriodParser.js\";\nimport { Hour1to12Parser } from \"./parsers/Hour1to12Parser.js\";\nimport { Hour0to23Parser } from \"./parsers/Hour0to23Parser.js\";\nimport { Hour0To11Parser } from \"./parsers/Hour0To11Parser.js\";\nimport { Hour1To24Parser } from \"./parsers/Hour1To24Parser.js\";\nimport { MinuteParser } from \"./parsers/MinuteParser.js\";\nimport { SecondParser } from \"./parsers/SecondParser.js\";\nimport { FractionOfSecondParser } from \"./parsers/FractionOfSecondParser.js\";\nimport { ISOTimezoneWithZParser } from \"./parsers/ISOTimezoneWithZParser.js\";\nimport { ISOTimezoneParser } from \"./parsers/ISOTimezoneParser.js\";\nimport { TimestampSecondsParser } from \"./parsers/TimestampSecondsParser.js\";\nimport { TimestampMillisecondsParser } from \"./parsers/TimestampMillisecondsParser.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O* | Timezone (GMT) |\n * | p | | P | |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z* | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `parse` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n */\nexport const parsers = {\n G: new EraParser(),\n y: new YearParser(),\n Y: new LocalWeekYearParser(),\n R: new ISOWeekYearParser(),\n u: new ExtendedYearParser(),\n Q: new QuarterParser(),\n q: new StandAloneQuarterParser(),\n M: new MonthParser(),\n L: new StandAloneMonthParser(),\n w: new LocalWeekParser(),\n I: new ISOWeekParser(),\n d: new DateParser(),\n D: new DayOfYearParser(),\n E: new DayParser(),\n e: new LocalDayParser(),\n c: new StandAloneLocalDayParser(),\n i: new ISODayParser(),\n a: new AMPMParser(),\n b: new AMPMMidnightParser(),\n B: new DayPeriodParser(),\n h: new Hour1to12Parser(),\n H: new Hour0to23Parser(),\n K: new Hour0To11Parser(),\n k: new Hour1To24Parser(),\n m: new MinuteParser(),\n s: new SecondParser(),\n S: new FractionOfSecondParser(),\n X: new ISOTimezoneWithZParser(),\n x: new ISOTimezoneParser(),\n t: new TimestampSecondsParser(),\n T: new TimestampMillisecondsParser(),\n};\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getDefaultOptions } from \"./getDefaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\nimport { DateTimezoneSetter } from \"./parse/_lib/Setter.js\";\nimport { parsers } from \"./parse/_lib/parsers.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { longFormatters, parsers };\n\n/**\n * The {@link parse} function options.\n */\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\n\nconst notWhitespaceRegExp = /\\S/;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\n/**\n * @name parse\n * @category Common Helpers\n * @summary Parse the date.\n *\n * @description\n * Return the date parsed from string using the given format string.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters in the format string wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n *\n * Format of the format string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 5 below the table).\n *\n * Not all tokens are compatible. Combinations that don't make sense or could lead to bugs are prohibited\n * and will throw `RangeError`. For example usage of 24-hour format token with AM/PM token will throw an exception:\n *\n * ```javascript\n * parse('23 AM', 'HH a', new Date())\n * //=> RangeError: The format string mustn't contain `HH` and `a` at the same time\n * ```\n *\n * See the compatibility table: https://docs.google.com/spreadsheets/d/e/2PACX-1vQOPU3xUhplll6dyoMmVUXHKl_8CRDs6_ueLmex3SoqwhuolkuN3O05l4rqx5h1dKX8eb46Ul-CCSrq/pubhtml?gid=0&single=true\n *\n * Accepted format string patterns:\n * | Unit |Prior| Pattern | Result examples | Notes |\n * |---------------------------------|-----|---------|-----------------------------------|-------|\n * | Era | 140 | G..GGG | AD, BC | |\n * | | | GGGG | Anno Domini, Before Christ | 2 |\n * | | | GGGGG | A, B | |\n * | Calendar year | 130 | y | 44, 1, 1900, 2017, 9999 | 4 |\n * | | | yo | 44th, 1st, 1900th, 9999999th | 4,5 |\n * | | | yy | 44, 01, 00, 17 | 4 |\n * | | | yyy | 044, 001, 123, 999 | 4 |\n * | | | yyyy | 0044, 0001, 1900, 2017 | 4 |\n * | | | yyyyy | ... | 2,4 |\n * | Local week-numbering year | 130 | Y | 44, 1, 1900, 2017, 9000 | 4 |\n * | | | Yo | 44th, 1st, 1900th, 9999999th | 4,5 |\n * | | | YY | 44, 01, 00, 17 | 4,6 |\n * | | | YYY | 044, 001, 123, 999 | 4 |\n * | | | YYYY | 0044, 0001, 1900, 2017 | 4,6 |\n * | | | YYYYY | ... | 2,4 |\n * | ISO week-numbering year | 130 | R | -43, 1, 1900, 2017, 9999, -9999 | 4,5 |\n * | | | RR | -43, 01, 00, 17 | 4,5 |\n * | | | RRR | -043, 001, 123, 999, -999 | 4,5 |\n * | | | RRRR | -0043, 0001, 2017, 9999, -9999 | 4,5 |\n * | | | RRRRR | ... | 2,4,5 |\n * | Extended year | 130 | u | -43, 1, 1900, 2017, 9999, -999 | 4 |\n * | | | uu | -43, 01, 99, -99 | 4 |\n * | | | uuu | -043, 001, 123, 999, -999 | 4 |\n * | | | uuuu | -0043, 0001, 2017, 9999, -9999 | 4 |\n * | | | uuuuu | ... | 2,4 |\n * | Quarter (formatting) | 120 | Q | 1, 2, 3, 4 | |\n * | | | Qo | 1st, 2nd, 3rd, 4th | 5 |\n * | | | QQ | 01, 02, 03, 04 | |\n * | | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | 120 | q | 1, 2, 3, 4 | |\n * | | | qo | 1st, 2nd, 3rd, 4th | 5 |\n * | | | qq | 01, 02, 03, 04 | |\n * | | | qqq | Q1, Q2, Q3, Q4 | |\n * | | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | | qqqqq | 1, 2, 3, 4 | 3 |\n * | Month (formatting) | 110 | M | 1, 2, ..., 12 | |\n * | | | Mo | 1st, 2nd, ..., 12th | 5 |\n * | | | MM | 01, 02, ..., 12 | |\n * | | | MMM | Jan, Feb, ..., Dec | |\n * | | | MMMM | January, February, ..., December | 2 |\n * | | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | 110 | L | 1, 2, ..., 12 | |\n * | | | Lo | 1st, 2nd, ..., 12th | 5 |\n * | | | LL | 01, 02, ..., 12 | |\n * | | | LLL | Jan, Feb, ..., Dec | |\n * | | | LLLL | January, February, ..., December | 2 |\n * | | | LLLLL | J, F, ..., D | |\n * | Local week of year | 100 | w | 1, 2, ..., 53 | |\n * | | | wo | 1st, 2nd, ..., 53th | 5 |\n * | | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | 100 | I | 1, 2, ..., 53 | 5 |\n * | | | Io | 1st, 2nd, ..., 53th | 5 |\n * | | | II | 01, 02, ..., 53 | 5 |\n * | Day of month | 90 | d | 1, 2, ..., 31 | |\n * | | | do | 1st, 2nd, ..., 31st | 5 |\n * | | | dd | 01, 02, ..., 31 | |\n * | Day of year | 90 | D | 1, 2, ..., 365, 366 | 7 |\n * | | | Do | 1st, 2nd, ..., 365th, 366th | 5 |\n * | | | DD | 01, 02, ..., 365, 366 | 7 |\n * | | | DDD | 001, 002, ..., 365, 366 | |\n * | | | DDDD | ... | 2 |\n * | Day of week (formatting) | 90 | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | | EEEEE | M, T, W, T, F, S, S | |\n * | | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | 90 | i | 1, 2, 3, ..., 7 | 5 |\n * | | | io | 1st, 2nd, ..., 7th | 5 |\n * | | | ii | 01, 02, ..., 07 | 5 |\n * | | | iii | Mon, Tue, Wed, ..., Sun | 5 |\n * | | | iiii | Monday, Tuesday, ..., Sunday | 2,5 |\n * | | | iiiii | M, T, W, T, F, S, S | 5 |\n * | | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 5 |\n * | Local day of week (formatting) | 90 | e | 2, 3, 4, ..., 1 | |\n * | | | eo | 2nd, 3rd, ..., 1st | 5 |\n * | | | ee | 02, 03, ..., 01 | |\n * | | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | | eeeee | M, T, W, T, F, S, S | |\n * | | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | 90 | c | 2, 3, 4, ..., 1 | |\n * | | | co | 2nd, 3rd, ..., 1st | 5 |\n * | | | cc | 02, 03, ..., 01 | |\n * | | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | | ccccc | M, T, W, T, F, S, S | |\n * | | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | 80 | a..aaa | AM, PM | |\n * | | | aaaa | a.m., p.m. | 2 |\n * | | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | 80 | b..bbb | AM, PM, noon, midnight | |\n * | | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | | bbbbb | a, p, n, mi | |\n * | Flexible day period | 80 | B..BBB | at night, in the morning, ... | |\n * | | | BBBB | at night, in the morning, ... | 2 |\n * | | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | 70 | h | 1, 2, ..., 11, 12 | |\n * | | | ho | 1st, 2nd, ..., 11th, 12th | 5 |\n * | | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | 70 | H | 0, 1, 2, ..., 23 | |\n * | | | Ho | 0th, 1st, 2nd, ..., 23rd | 5 |\n * | | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | 70 | K | 1, 2, ..., 11, 0 | |\n * | | | Ko | 1st, 2nd, ..., 11th, 0th | 5 |\n * | | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | 70 | k | 24, 1, 2, ..., 23 | |\n * | | | ko | 24th, 1st, 2nd, ..., 23rd | 5 |\n * | | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | 60 | m | 0, 1, ..., 59 | |\n * | | | mo | 0th, 1st, ..., 59th | 5 |\n * | | | mm | 00, 01, ..., 59 | |\n * | Second | 50 | s | 0, 1, ..., 59 | |\n * | | | so | 0th, 1st, ..., 59th | 5 |\n * | | | ss | 00, 01, ..., 59 | |\n * | Seconds timestamp | 40 | t | 512969520 | |\n * | | | tt | ... | 2 |\n * | Fraction of second | 30 | S | 0, 1, ..., 9 | |\n * | | | SS | 00, 01, ..., 99 | |\n * | | | SSS | 000, 001, ..., 999 | |\n * | | | SSSS | ... | 2 |\n * | Milliseconds timestamp | 20 | T | 512969520900 | |\n * | | | TT | ... | 2 |\n * | Timezone (ISO-8601 w/ Z) | 10 | X | -08, +0530, Z | |\n * | | | XX | -0800, +0530, Z | |\n * | | | XXX | -08:00, +05:30, Z | |\n * | | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | 10 | x | -08, +0530, +00 | |\n * | | | xx | -0800, +0530, +0000 | |\n * | | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Long localized date | NA | P | 05/29/1453 | 5,8 |\n * | | | PP | May 29, 1453 | |\n * | | | PPP | May 29th, 1453 | |\n * | | | PPPP | Sunday, May 29th, 1453 | 2,5,8 |\n * | Long localized time | NA | p | 12:00 AM | 5,8 |\n * | | | pp | 12:00:00 AM | |\n * | Combination of date and time | NA | Pp | 05/29/1453, 12:00 AM | |\n * | | | PPpp | May 29, 1453, 12:00:00 AM | |\n * | | | PPPpp | May 29th, 1453 at ... | |\n * | | | PPPPpp | Sunday, May 29th, 1453 at ... | 2,5,8 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular.\n * In `format` function, they will produce different result:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * `parse` will try to match both formatting and stand-alone units interchangeably.\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table:\n * - for numerical units (`yyyyyyyy`) `parse` will try to match a number\n * as wide as the sequence\n * - for text units (`MMMMMMMM`) `parse` will try to match the widest variation of the unit.\n * These variations are marked with \"2\" in the last column of the table.\n *\n * 3. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 4. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` will try to guess the century of two digit year by proximity with `referenceDate`:\n *\n * `parse('50', 'yy', new Date(2018, 0, 1)) //=> Sat Jan 01 2050 00:00:00`\n *\n * `parse('75', 'yy', new Date(2018, 0, 1)) //=> Wed Jan 01 1975 00:00:00`\n *\n * while `uu` will just assign the year as is:\n *\n * `parse('50', 'uu', new Date(2018, 0, 1)) //=> Sat Jan 01 0050 00:00:00`\n *\n * `parse('75', 'uu', new Date(2018, 0, 1)) //=> Tue Jan 01 0075 00:00:00`\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [setISOWeekYear](https://date-fns.org/docs/setISOWeekYear)\n * and [setWeekYear](https://date-fns.org/docs/setWeekYear)).\n *\n * 5. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 6. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 7. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 8. `P+` tokens do not have a defined priority since they are merely aliases to other tokens based\n * on the given locale.\n *\n * using `en-US` locale: `P` => `MM/dd/yyyy`\n * using `en-US` locale: `p` => `hh:mm a`\n * using `pt-BR` locale: `P` => `dd/MM/yyyy`\n * using `pt-BR` locale: `p` => `HH:mm`\n *\n * Values will be assigned to the date in the descending order of its unit's priority.\n * Units of an equal priority overwrite each other in the order of appearance.\n *\n * If no values of higher priority are parsed (e.g. when parsing string 'January 1st' without a year),\n * the values will be taken from 3rd argument `referenceDate` which works as a context of parsing.\n *\n * `referenceDate` must be passed for correct work of the function.\n * If you're not sure which `referenceDate` to supply, create a new instance of Date:\n * `parse('02/11/2014', 'MM/dd/yyyy', new Date())`\n * In this case parsing will be done in the context of the current date.\n * If `referenceDate` is `Invalid Date` or a value not convertible to valid `Date`,\n * then `Invalid Date` will be returned.\n *\n * The result may vary by locale.\n *\n * If `formatString` matches with `dateString` but does not provides tokens, `referenceDate` will be returned.\n *\n * If parsing failed, `Invalid Date` will be returned.\n * Invalid Date is a Date, whose time value is NaN.\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param dateStr - The string to parse\n * @param formatStr - The string of tokens\n * @param referenceDate - defines values missing from the parsed dateString\n * @param options - An object with options.\n * see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @returns The parsed date\n *\n * @throws `options.locale` must contain `match` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Parse 11 February 2014 from middle-endian format:\n * var result = parse('02/11/2014', 'MM/dd/yyyy', new Date())\n * //=> Tue Feb 11 2014 00:00:00\n *\n * @example\n * // Parse 28th of February in Esperanto locale in the context of 2010 year:\n * import eo from 'date-fns/locale/eo'\n * var result = parse('28-a de februaro', \"do 'de' MMMM\", new Date(2010, 0, 1), {\n * locale: eo\n * })\n * //=> Sun Feb 28 2010 00:00:00\n */\nexport function parse(dateStr, formatStr, referenceDate, options) {\n const invalidDate = () => constructFrom(options?.in || referenceDate, NaN);\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n if (!formatStr)\n return dateStr ? invalidDate() : toDate(referenceDate, options?.in);\n\n const subFnOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n // If timezone isn't specified, it will try to use the context or\n // the reference date and fallback to the system time zone.\n const setters = [new DateTimezoneSetter(options?.in, referenceDate)];\n\n const tokens = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter in longFormatters) {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp);\n\n const usedTokens = [];\n\n for (let token of tokens) {\n if (\n !options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)\n ) {\n warnOrThrowProtectedError(token, formatStr, dateStr);\n }\n if (\n !options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token)\n ) {\n warnOrThrowProtectedError(token, formatStr, dateStr);\n }\n\n const firstCharacter = token[0];\n const parser = parsers[firstCharacter];\n if (parser) {\n const { incompatibleTokens } = parser;\n if (Array.isArray(incompatibleTokens)) {\n const incompatibleToken = usedTokens.find(\n (usedToken) =>\n incompatibleTokens.includes(usedToken.token) ||\n usedToken.token === firstCharacter,\n );\n if (incompatibleToken) {\n throw new RangeError(\n `The format string mustn't contain \\`${incompatibleToken.fullToken}\\` and \\`${token}\\` at the same time`,\n );\n }\n } else if (parser.incompatibleTokens === \"*\" && usedTokens.length > 0) {\n throw new RangeError(\n `The format string mustn't contain \\`${token}\\` and any other token at the same time`,\n );\n }\n\n usedTokens.push({ token: firstCharacter, fullToken: token });\n\n const parseResult = parser.run(\n dateStr,\n token,\n locale.match,\n subFnOptions,\n );\n\n if (!parseResult) {\n return invalidDate();\n }\n\n setters.push(parseResult.setter);\n\n dateStr = parseResult.rest;\n } else {\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n // Replace two single quote characters with one single quote character\n if (token === \"''\") {\n token = \"'\";\n } else if (firstCharacter === \"'\") {\n token = cleanEscapedString(token);\n }\n\n // Cut token from string, or, if string doesn't match the token, return Invalid Date\n if (dateStr.indexOf(token) === 0) {\n dateStr = dateStr.slice(token.length);\n } else {\n return invalidDate();\n }\n }\n }\n\n // Check if the remaining input contains something other than whitespace\n if (dateStr.length > 0 && notWhitespaceRegExp.test(dateStr)) {\n return invalidDate();\n }\n\n const uniquePrioritySetters = setters\n .map((setter) => setter.priority)\n .sort((a, b) => b - a)\n .filter((priority, index, array) => array.indexOf(priority) === index)\n .map((priority) =>\n setters\n .filter((setter) => setter.priority === priority)\n .sort((a, b) => b.subPriority - a.subPriority),\n )\n .map((setterArray) => setterArray[0]);\n\n let date = toDate(referenceDate, options?.in);\n\n if (isNaN(+date)) return invalidDate();\n\n const flags = {};\n for (const setter of uniquePrioritySetters) {\n if (!setter.validate(date, subFnOptions)) {\n return invalidDate();\n }\n\n const result = setter.set(date, flags, subFnOptions);\n // Result is tuple (date, flags)\n if (Array.isArray(result)) {\n date = result[0];\n Object.assign(flags, result[1]);\n // Result is date\n } else {\n date = result;\n }\n }\n\n return date;\n}\n\nfunction cleanEscapedString(input) {\n return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default parse;\n","import { createContext, use } from \"react\";\nimport type { SubscriptionsApi } from \"./subscriptions-api\";\n\nconst SubscriptionsApiContext = createContext<SubscriptionsApi | null>(null);\n\nexport const SubscriptionsApiProvider = SubscriptionsApiContext.Provider;\n\nexport function useSubscriptionsApi(): SubscriptionsApi {\n const api = use(SubscriptionsApiContext);\n if (!api) {\n throw new Error(\n \"useSubscriptionsApi must be used within a SubscriptionsCoreProvider\",\n );\n }\n return api;\n}\n","import type { JSX } from \"react\";\nimport type { SubscriptionsApi } from \"./subscriptions-api\";\nimport { SubscriptionsApiProvider } from \"./subscriptions-api-context\";\n\nexport interface SubscriptionsCoreProviderProps {\n api: SubscriptionsApi;\n children: React.ReactNode;\n}\n\nexport function SubscriptionsCoreProvider({\n api,\n children,\n}: SubscriptionsCoreProviderProps): JSX.Element {\n return (\n <SubscriptionsApiProvider value={api}>{children}</SubscriptionsApiProvider>\n );\n}\n","import type { subscriptions } from \"./types\";\n\nexport const subscriptionsKeys = {\n all: [\"subscriptions\"] as const,\n list: (params?: subscriptions.FetchSubscriptionsParams) =>\n [...subscriptionsKeys.all, \"list\", params] as const,\n detail: (token: string) =>\n [...subscriptionsKeys.all, \"detail\", token] as const,\n} as const;\n\nexport const bundlesKeys = {\n all: [\"subscription_bundles\"] as const,\n list: () => [...bundlesKeys.all, \"list\"] as const,\n} as const;\n","import { createContext, use } from \"react\";\nimport type { BundlesApi } from \"./bundles-api\";\n\nconst BundlesApiContext = createContext<BundlesApi | null>(null);\n\nexport const BundlesApiProvider = BundlesApiContext.Provider;\n\nexport function useBundlesApi(): BundlesApi {\n const api = use(BundlesApiContext);\n if (!api) {\n throw new Error(\"useBundlesApi must be used within a BundlesCoreProvider\");\n }\n return api;\n}\n","import type { JSX } from \"react\";\nimport type { BundlesApi } from \"./bundles-api\";\nimport { BundlesApiProvider } from \"./bundles-api-context\";\n\nexport interface BundlesCoreProviderProps {\n api: BundlesApi;\n children: React.ReactNode;\n}\n\nexport function BundlesCoreProvider({\n api,\n children,\n}: BundlesCoreProviderProps): JSX.Element {\n return <BundlesApiProvider value={api}>{children}</BundlesApiProvider>;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useSubscriptions(\n params: subscriptions.FetchSubscriptionsParams,\n options?: { enabled?: boolean },\n) {\n const api = useSubscriptionsApi();\n return useQuery({\n queryKey: subscriptionsKeys.list(params),\n queryFn: () => api.fetchCustomerSubscriptions(params),\n enabled: options?.enabled ?? !!params.customerId,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useInfiniteSubscriptions(\n params: Omit<subscriptions.FetchSubscriptionsParams, \"cursor\" | \"page\">,\n options?: { enabled?: boolean },\n) {\n const api = useSubscriptionsApi();\n return useInfiniteQuery({\n queryKey: [...subscriptionsKeys.all, \"infinite-list\", params],\n queryFn: ({ pageParam }) =>\n api.fetchCustomerSubscriptions({\n ...params,\n cursor: pageParam,\n limit: params.limit ?? params.perPage,\n }),\n getNextPageParam: (lastPage) =>\n lastPage.meta?.pagination?.next_cursor ?? undefined,\n initialPageParam: undefined as string | undefined,\n enabled: options?.enabled ?? !!params.customerId,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useSubscription(\n token: string,\n options?: { enabled?: boolean },\n) {\n const api = useSubscriptionsApi();\n return useQuery({\n queryKey: subscriptionsKeys.detail(token),\n queryFn: () => api.fetchSubscription(token),\n enabled: (options?.enabled ?? true) && !!token,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function usePauseSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n pauseParams: subscriptions.PauseSubscriptionParams;\n }) => api.pauseSubscription(params.subscriptionToken, params.pauseParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useResumeSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n resumeParams: subscriptions.ResumeSubscriptionParams;\n }) => api.resumeSubscription(params.subscriptionToken, params.resumeParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useSkipSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n skipParams: subscriptions.SkipSubscriptionParams;\n }) => api.skipSubscription(params.subscriptionToken, params.skipParams),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useCancelSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: { subscriptionToken: string; customerId?: number }) =>\n api.cancelSubscription(params.subscriptionToken, params.customerId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useReactivateSubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n reactivateParams: subscriptions.ReactivateSubscriptionParams;\n }) =>\n api.reactivateSubscription(\n params.subscriptionToken,\n params.reactivateParams,\n ),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\n// Wraps the explicit retry endpoint. The customer-facing UI calls this\n// after a successful payment-method update so the retry is opt-in\n// (vs. a side-effect of the update). See SubscriptionsApi#retrySubscription.\nexport function useRetrySubscription(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: { subscriptionToken: string }) =>\n api.retrySubscription(params.subscriptionToken),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { subscriptionsKeys } from \"../query-keys\";\nimport { useSubscriptionsApi } from \"../subscriptions-api-context\";\n\nexport function useUpdateSubscriptionInfo(options?: {\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n // Opt out of the hook's auto-invalidation when the consumer needs\n // to chain another mutation (e.g. payment-method update → retry).\n // Without this, the auto-invalidate fires immediately on update\n // success and the chained mutation triggers a second refetch later\n // — two round-trips for one orchestrated flow. Consumers that opt\n // out are responsible for calling invalidateQueries themselves\n // after their orchestration completes.\n skipAutoInvalidate?: boolean;\n}) {\n const api = useSubscriptionsApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: {\n subscriptionToken: string;\n body: Partial<\n Pick<\n subscriptions.UpdateSubscriptionInfoBody,\n \"payment_method_id\" | \"quantity\" | \"address_id\" | \"next_bill_date\"\n >\n >;\n }) => api.updateSubscriptionInfo(params.subscriptionToken, params.body),\n onSuccess: () => {\n if (!options?.skipAutoInvalidate) {\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n }\n options?.onSuccess?.();\n },\n onError: options?.onError,\n });\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { bundlesKeys } from \"../query-keys\";\nimport { useBundlesApi } from \"../bundles-api-context\";\n\nexport function useBundles(options?: { enabled?: boolean }) {\n const api = useBundlesApi();\n return useQuery({\n queryKey: bundlesKeys.list(),\n queryFn: () => api.fetchBundles(),\n enabled: options?.enabled ?? true,\n });\n}\n","import { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport type { subscriptions } from \"../types\";\nimport { bundlesKeys, subscriptionsKeys } from \"../query-keys\";\nimport { useBundlesApi } from \"../bundles-api-context\";\n\nexport function useCreateBundle(options?: {\n onSuccess?: (bundle: subscriptions.Bundle) => void;\n onError?: (error: unknown) => void;\n}) {\n const api = useBundlesApi();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (params: subscriptions.CreateBundleParams) =>\n api.createBundle(params),\n onSuccess: (bundle) => {\n queryClient.invalidateQueries({ queryKey: bundlesKeys.all });\n queryClient.invalidateQueries({ queryKey: subscriptionsKeys.all });\n options?.onSuccess?.(bundle);\n },\n onError: options?.onError,\n });\n}\n","interface SubscriptionPriceItem {\n allow_subscription: boolean;\n subscription_interval: number | null;\n subscription_price_in_currency: string | null;\n}\n\nexport function getSubscriptionPrice(\n item: SubscriptionPriceItem,\n): string | null {\n if (!item.allow_subscription) return null;\n const intervalText =\n item.subscription_interval === 1\n ? \"month\"\n : `${item.subscription_interval} mo.`;\n return `${item.subscription_price_in_currency}/${intervalText}`;\n}\n\nexport function formatSubscriptionFrequency(frequency: string): string {\n if (frequency === \"day\") return \"Daily\";\n if (frequency === \"week\") return \"Weekly\";\n if (frequency === \"month\") return \"Monthly\";\n if (frequency === \"year\") return \"Yearly\";\n return frequency;\n}\n\nexport function calculateResumeDate(\n billingInterval: number,\n billingIntervalUnit: string,\n orderCount: number,\n fromDate?: string | Date | null,\n): Date {\n let startDate: Date;\n\n if (fromDate) {\n if (typeof fromDate === \"string\") {\n startDate = new Date(\n fromDate + (fromDate.includes(\"T\") ? \"\" : \"T12:00:00.000Z\"),\n );\n } else {\n startDate = new Date(\n Date.UTC(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n } else {\n const now = new Date();\n startDate = new Date(\n Date.UTC(\n now.getUTCFullYear(),\n now.getUTCMonth(),\n now.getUTCDate(),\n 12,\n 0,\n 0,\n 0,\n ),\n );\n }\n\n const baseDate = new Date(startDate.getTime());\n const totalIntervals = billingInterval * orderCount;\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals);\n break;\n case \"week\":\n baseDate.setUTCDate(baseDate.getUTCDate() + totalIntervals * 7);\n break;\n case \"month\": {\n const currentMonth = baseDate.getUTCMonth();\n const currentDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(currentMonth + totalIntervals);\n if (baseDate.getUTCDate() !== currentDay) {\n baseDate.setUTCDate(0);\n }\n break;\n }\n case \"year\":\n baseDate.setUTCFullYear(baseDate.getUTCFullYear() + totalIntervals);\n break;\n default: {\n const defaultMonth = baseDate.getUTCMonth();\n const defaultDay = baseDate.getUTCDate();\n baseDate.setUTCMonth(defaultMonth + totalIntervals);\n if (baseDate.getUTCDate() !== defaultDay) {\n baseDate.setUTCDate(0);\n }\n }\n }\n\n return baseDate;\n}\n\nexport function calculateNextBillDate(\n billingInterval: number = 1,\n billingIntervalUnit: string = \"month\",\n): string {\n const now = new Date();\n const nextBillDate = new Date(now);\n\n switch (billingIntervalUnit.toLowerCase()) {\n case \"day\":\n nextBillDate.setDate(now.getDate() + billingInterval);\n break;\n case \"week\":\n nextBillDate.setDate(now.getDate() + billingInterval * 7);\n break;\n case \"month\":\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n break;\n case \"year\":\n nextBillDate.setFullYear(now.getFullYear() + billingInterval);\n break;\n default:\n nextBillDate.setMonth(now.getMonth() + billingInterval);\n }\n\n return nextBillDate.toISOString().split(\"T\")[0] || \"\";\n}\n\nexport function formatDate(\n dateString: string,\n isCancelled: boolean = false,\n): string {\n if (isCancelled) return \"Cancelled\";\n if (!dateString) return \"Paused\";\n\n const datePortion = dateString.split(\"T\")[0] ?? dateString;\n const parts = datePortion.split(\"-\");\n if (parts.length !== 3) return \"Invalid date\";\n\n const [year, month, day] = parts.map(Number);\n if (!year || !month || !day) return \"Invalid date\";\n const date = new Date(year, month - 1, day);\n\n const monthNames = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ];\n\n const dayNum = date.getDate();\n const monthName = monthNames[date.getMonth()];\n const yearNum = date.getFullYear();\n\n const ordinalSuffix = (d: number) => {\n if (d > 3 && d < 21) return \"th\";\n switch (d % 10) {\n case 1:\n return \"st\";\n case 2:\n return \"nd\";\n case 3:\n return \"rd\";\n default:\n return \"th\";\n }\n };\n\n return `${monthName} ${dayNum}${ordinalSuffix(dayNum)}, ${yearNum}`;\n}\n\n// Formats the time-of-day portion of an ISO timestamp in the given IANA\n// timezone. Returns \"\" when no timezone is supplied — the next-order display\n// intentionally omits the time line in that case (the BFF can't promise the\n// stored time-of-day is meaningful without a zone to interpret it in).\nexport function formatTime(\n dateString: string | null | undefined,\n timezone: string | null | undefined,\n): string {\n if (!dateString || !timezone) return \"\";\n const date = new Date(dateString);\n if (Number.isNaN(date.getTime())) return \"\";\n try {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n timeZone: timezone,\n }).format(date);\n } catch {\n // Intl throws on unknown IANA identifiers — fall back to no time rather\n // than crashing the row.\n return \"\";\n }\n}\n\nexport function getNextBillDisplay<\n T extends { status?: string; next_bill_date?: string | null },\n>(subscription: T | null | undefined): string {\n if (subscription?.status === \"cancelled\") return \"Cancelled\";\n if (subscription?.next_bill_date)\n return formatDate(subscription.next_bill_date);\n if (subscription?.status === \"paused\") return \"Paused\";\n return \"N/A\";\n}\n\nexport function calculateSubscriptionPrice(\n totalPrice: number,\n subscribeAndSave: string | null | undefined,\n quantity: number,\n): string {\n if (!subscribeAndSave) return totalPrice.toFixed(2);\n\n const unitDiscountAmount = parseFloat(subscribeAndSave);\n if (isNaN(unitDiscountAmount)) return totalPrice.toFixed(2);\n\n const subscriptionAmount = totalPrice - unitDiscountAmount * quantity;\n return subscriptionAmount.toFixed(2);\n}\n","import type { SubscriptionsApi } from \"@fluid-app/subscriptions-core\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\n\n/**\n * Maps the BFF meta envelope to the port's expected shape.\n */\nfunction mapMeta(raw: { request_id?: string | null; timestamp?: string }): {\n request_id: string;\n timestamp: string;\n} {\n return {\n request_id: raw.request_id ?? \"\",\n timestamp: raw.timestamp ?? \"\",\n };\n}\n\ntype BffSubscriptionResponse = Awaited<\n ReturnType<typeof portalTenant.subscriptions_show>\n>;\n\ntype BffListResponse = Awaited<\n ReturnType<typeof portalTenant.subscriptions_list>\n>;\n\ntype BffSubscription = NonNullable<BffSubscriptionResponse[\"subscription\"]>;\n\n/**\n * Safely parses a price string to a number, returning the fallback if the\n * result is NaN (e.g. non-numeric strings from a malformed BFF response).\n */\nfunction safeParsePrice(\n value: string | null | undefined,\n fallback = 0,\n): number {\n if (!value) return fallback;\n const parsed = parseFloat(value);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\n/**\n * Maps a BFF subscription detail response to the port's SubscriptionDetail.\n *\n * The BFF returns a flat Subscription schema (plan_name, product, etc.) while\n * the port expects richly nested objects (subscription_plan, variant.product).\n * This explicitly maps every field the UI accesses so undefined-property crashes\n * are caught here at the adapter boundary rather than deep in the component tree.\n */\nexport function mapDetailSubscription(\n bff: BffSubscription,\n): subscriptions.SubscriptionDetailSubscription {\n const price = safeParsePrice(bff.total);\n\n return {\n id: bff.id ?? 0,\n subscription_token: bff.token ?? \"\",\n status: bff.status ?? \"\",\n quantity: bff.quantity ?? 1,\n price,\n original_price: safeParsePrice(bff.original_price, price),\n next_bill_date: bff.next_billing_date ?? null,\n last_bill_date: bff.last_billing_date ?? null,\n timezone: bff.timezone ?? null,\n next_ship_date: null,\n last_ship_date: bff.last_shipping_date ?? null,\n disabled: false,\n attempts: 0,\n // The portal-tenant OpenAPI schema dropped last_failed_at/next_retry_at\n // from the Subscription response, but the BFF still returns them at runtime\n // and downstream components (past-due-banner, subscription-detail) rely on\n // them. Read through a cast until the schema is restored. Tracked in\n // CURRENT-1069.\n last_failed_at:\n ((bff as Record<string, unknown>).last_failed_at as\n | string\n | null\n | undefined) ?? null,\n next_retry_at:\n ((bff as Record<string, unknown>).next_retry_at as\n | string\n | null\n | undefined) ?? null,\n skipped_count: 0,\n max_skips: null,\n cancelled_at: null,\n created_at: bff.created_at ?? \"\",\n updated_at: bff.updated_at ?? \"\",\n notes: null,\n subscription_plan: {\n id: bff.plan?.id ?? 0,\n name: bff.plan?.name ?? bff.plan_name ?? \"\",\n billing_interval: bff.plan?.billing_interval ?? 1,\n billing_interval_unit:\n bff.plan?.billing_interval_unit ?? bff.interval ?? \"month\",\n billing_frequency_in_words: bff.plan?.billing_interval_unit\n ? `Every ${bff.plan.billing_interval ?? 1} ${bff.plan.billing_interval_unit}`\n : \"\",\n shipping_interval: 1,\n shipping_interval_unit:\n bff.plan?.billing_interval_unit ?? bff.interval ?? \"month\",\n trial_period: null,\n trial_period_unit: null,\n split_volume: false,\n allow_skipping: bff.plan?.allow_skipping ?? false,\n max_skips: bff.plan?.max_skips ?? null,\n price_adjustment_type: null,\n price_adjustment_amount: null,\n // Variant-level cap exposed via `bff.product.max_quantity` (the BFF\n // sources it from `variants.subscription_max_qty` gated on\n // `limit_subscription`). The FE port still keys it under\n // `subscription_plan` for back-compat with the existing UI consumer.\n max_quantity: bff.product?.max_quantity ?? null,\n active: true,\n company_default: null,\n created_at: \"\",\n updated_at: \"\",\n products_count: null,\n subscribers_count: null,\n },\n customer: {\n id: 0,\n account_id: null,\n first_name: null,\n last_name: null,\n full_name: bff.customer_name ?? \"\",\n email: \"\",\n verified_email: null,\n phone: null,\n orders_count: null,\n created_at: \"\",\n display_total_spent: \"0\",\n metadata: {},\n user_company_id: null,\n external_id: null,\n last_order_id: null,\n notes: null,\n active: true,\n total_spent: 0,\n customer_notes: [],\n default_address: null,\n addresses: [],\n active_subscriptions_count: 0,\n inactive_subscriptions_count: 0,\n is_rep: false,\n },\n variant: {\n id: bff.product?.id ?? 0,\n title: bff.product?.variant_name ?? \"\",\n image_url: bff.product?.image_url ?? null,\n image_path: null,\n sku: null,\n primary_image: bff.product?.image_url ?? null,\n price: bff.total ? safeParsePrice(bff.total) : null,\n price_in_currency: bff.total ?? \"0\",\n options: [],\n product: {\n id: bff.product?.id ?? 0,\n title: bff.product?.name ?? \"\",\n image_url: bff.product?.image_url ?? null,\n image_path: null,\n price: bff.total ? safeParsePrice(bff.total) : null,\n cv: null,\n tax: null,\n sku: null,\n price_in_currency: bff.total ?? \"0\",\n tax_in_currency: \"0\",\n cv_in_currency: \"0\",\n },\n },\n address: bff.address\n ? {\n id: bff.address.id ?? 0,\n name: bff.address.name ?? null,\n address1: bff.address.address1 ?? \"\",\n address2: bff.address.address2 ?? null,\n city: bff.address.city ?? \"\",\n state: bff.address.state ?? \"\",\n subdivision_code: null,\n postal_code: bff.address.postal_code ?? \"\",\n country_code: bff.address.country_code ?? null,\n default: false,\n }\n : {\n id: 0,\n name: null,\n address1: \"\",\n address2: null,\n city: \"\",\n state: \"\",\n subdivision_code: null,\n postal_code: \"\",\n country_code: null,\n default: false,\n },\n payment_method: bff.payment_method\n ? {\n id: bff.payment_method.id ?? 0,\n source: bff.payment_method.source ?? \"\",\n payment_type:\n bff.payment_method.payment_type ?? bff.payment_method.source ?? \"\",\n created_at: \"\",\n updated_at: \"\",\n default: false,\n details: {\n card_type: bff.payment_method.card_type ?? undefined,\n last4: bff.payment_method.last4 ?? undefined,\n },\n }\n : {\n id: 0,\n source: \"\",\n payment_type: \"\",\n created_at: \"\",\n updated_at: \"\",\n default: false,\n details: {},\n },\n currency: {\n id: 0,\n name: bff.currency ?? null,\n code: bff.currency ?? \"USD\",\n rate: null,\n active: true,\n symbol: null,\n },\n country: { id: 0, name: \"\", iso: \"\" },\n company: { id: 0, name: \"\" },\n subscription_skips: [],\n orders: [],\n bundled_items: bff.bundled_items\n ? bff.bundled_items.map((item) => ({\n quantity: item.quantity ?? 0,\n product_id: item.product_id ?? 0,\n variant_id: item.variant_id ?? 0,\n option_titles: item.option_titles ?? [],\n product_title: item.product_title ?? \"\",\n variant_title: item.variant_title ?? \"\",\n display_to_customer: item.display_to_customer ?? true,\n }))\n : undefined,\n bundled_subscriptions: bff.bundled_subscriptions\n ? bff.bundled_subscriptions.map((sib) => ({\n subscription_token: sib.subscription_token ?? \"\",\n product_title: sib.product_title ?? \"\",\n variant_title: sib.variant_title ?? null,\n price: sib.price ?? 0,\n image_url: sib.image_url ?? null,\n }))\n : undefined,\n };\n}\n\nfunction mapSubscriptionDetail(\n response: BffSubscriptionResponse,\n): subscriptions.SubscriptionDetail {\n const bff = response.subscription;\n if (!bff) {\n throw new Error(\n \"BFF returned a successful response but subscription data was missing\",\n );\n }\n return {\n subscription: mapDetailSubscription(bff),\n meta: response.meta ? mapMeta(response.meta) : undefined,\n };\n}\n\n/**\n * Maps a BFF list subscription to the port's SubscriptionListItem.\n *\n * The BFF returns a flat shape with `product` and `quantity` while the port\n * expects nested `variant.product` (from the admin API). This bridges the two\n * so the UI layer sees a consistent shape regardless of which API backs it.\n */\nfunction mapListItem(\n bff: NonNullable<BffListResponse[\"subscriptions\"]>[number],\n): subscriptions.SubscriptionListItem {\n return {\n id: bff.id ?? 0,\n subscription_token: bff.token ?? \"\",\n created_at: bff.created_at ?? \"\",\n customer: {\n id: 0,\n account_id: \"\",\n active: true,\n display_total_spent: \"0\",\n email: \"\",\n first_name: \"\",\n full_name: bff.customer_name ?? \"\",\n is_rep: false,\n last_name: \"\",\n orders_count: 0,\n phone: null,\n total_spent: \"0\",\n user_company_id: null,\n },\n last_bill_date: null,\n next_bill_date: bff.next_billing_date ?? null,\n price: safeParsePrice(bff.total),\n quantity: bff.quantity ?? 1,\n status: bff.status ?? \"\",\n subscription_plan: {\n // The flat top-level `bff.interval` is a denormalized convenience that\n // does NOT carry a numeric interval — it's a single descriptor like\n // \"monthly\". The accurate fields are on `bff.plan` (number + unit), so\n // a quarterly subscription returns interval=3 / unit=\"month\" there.\n id: bff.plan?.id ?? 0,\n active: true,\n billing_interval: bff.plan?.billing_interval ?? 1,\n billing_interval_unit: bff.plan?.billing_interval_unit ?? \"\",\n shipping_interval: bff.plan?.billing_interval ?? 1,\n shipping_interval_unit: bff.plan?.billing_interval_unit ?? \"\",\n },\n variant: {\n id: bff.product?.id ?? 0,\n title: bff.product?.variant_name ?? \"\",\n product: {\n id: bff.product?.id ?? 0,\n title: bff.product?.name ?? \"\",\n image_url: bff.product?.image_url ?? \"\",\n price_in_currency: bff.total ?? \"0\",\n },\n },\n bundled_subscriptions: (bff.bundled_subscriptions ?? []).map((b) => ({\n subscription_token: b.subscription_token ?? \"\",\n product_title: b.product_title ?? \"\",\n variant_title: b.variant_title ?? null,\n price: b.price ?? 0,\n image_url: b.image_url ?? null,\n })),\n };\n}\n\nfunction mapSubscriptionList(\n response: BffListResponse,\n): subscriptions.SubscriptionsResponse {\n const raw = response.meta ?? {};\n return {\n subscriptions: (response.subscriptions ?? []).map(mapListItem),\n meta: {\n ...mapMeta(raw),\n pagination: raw.pagination\n ? {\n cursor: raw.pagination.cursor ?? null,\n limit: raw.pagination.limit,\n next_cursor: raw.pagination.next_cursor ?? null,\n prev_cursor: raw.pagination.prev_cursor ?? null,\n }\n : undefined,\n },\n };\n}\n\n/**\n * Creates a SubscriptionsApi-compatible adapter backed by the portal-tenant BFF.\n *\n * Uses async/await with explicit field mapping. The BFF returns simplified\n * subscription types compared to the full admin API; the adapter maps the\n * response envelope and provides runtime defaults for optional fields.\n */\nexport function createPortalSubscriptionsAdapter(\n client: FetchClient,\n): SubscriptionsApi {\n return {\n fetchCustomerSubscriptions: async (\n params: subscriptions.FetchSubscriptionsParams,\n ) => {\n const rawStatus = params.status;\n const status =\n rawStatus === \"active\" || rawStatus === \"inactive\"\n ? rawStatus\n : undefined;\n const response = await portalTenant.subscriptions_list(client, {\n \"page[cursor]\": params.cursor,\n \"page[limit]\": params.limit ?? params.perPage,\n status,\n q: params.search ?? undefined,\n });\n return mapSubscriptionList(response);\n },\n\n fetchSubscription: async (subscriptionToken: string) => {\n const response = await portalTenant.subscriptions_show(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n pauseSubscription: async (\n subscriptionToken: string,\n params: subscriptions.PauseSubscriptionParams,\n ) => {\n const body: {\n next_bill_date?: string;\n number_of_orders?: number;\n } = {};\n if (params.nextBillDate != null)\n body.next_bill_date = params.nextBillDate;\n if (params.numberOfOrders != null)\n body.number_of_orders = params.numberOfOrders;\n const response = await portalTenant.subscriptions_pause(\n client,\n subscriptionToken,\n body,\n );\n return mapSubscriptionDetail(response);\n },\n\n resumeSubscription: async (\n subscriptionToken: string,\n params: subscriptions.ResumeSubscriptionParams,\n ) => {\n const response = await portalTenant.subscriptions_resume(\n client,\n subscriptionToken,\n { next_bill_date: params.nextBillDate },\n );\n return mapSubscriptionDetail(response);\n },\n\n skipSubscription: async (\n subscriptionToken: string,\n _params: subscriptions.SkipSubscriptionParams,\n ) => {\n const response = await portalTenant.subscriptions_skip(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n cancelSubscription: async (\n subscriptionToken: string,\n _customerId?: number,\n ) => {\n const response = await portalTenant.subscriptions_cancel(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n reactivateSubscription: async (\n subscriptionToken: string,\n _params: subscriptions.ReactivateSubscriptionParams,\n ) => {\n const response = await portalTenant.subscriptions_reactivate(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n retrySubscription: async (subscriptionToken: string) => {\n const response = await portalTenant.subscriptions_retry(\n client,\n subscriptionToken,\n );\n return mapSubscriptionDetail(response);\n },\n\n updateSubscriptionInfo: async (\n subscriptionToken: string,\n body: Partial<\n Pick<\n subscriptions.UpdateSubscriptionInfoBody,\n \"payment_method_id\" | \"quantity\" | \"address_id\" | \"next_bill_date\"\n >\n >,\n ) => {\n const subscription: {\n payment_method_id?: number;\n quantity?: number;\n address_id?: number;\n next_bill_date?: string;\n } = {};\n if (body.payment_method_id != null) {\n subscription.payment_method_id = body.payment_method_id;\n }\n if (body.quantity != null) {\n subscription.quantity = body.quantity;\n }\n if (body.address_id != null) {\n subscription.address_id = body.address_id;\n }\n if (body.next_bill_date != null) {\n subscription.next_bill_date = body.next_bill_date;\n }\n const response = await portalTenant.subscriptions_update(\n client,\n subscriptionToken,\n { subscription },\n );\n return mapSubscriptionDetail(response);\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { SubscriptionsCoreProvider } from \"@fluid-app/subscriptions-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalSubscriptionsAdapter } from \"../adapters/subscriptions-api-adapter\";\n\nexport function PortalSubscriptionsApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n\n const api = useMemo(() => createPortalSubscriptionsAdapter(client), [client]);\n\n return (\n <SubscriptionsCoreProvider api={api}>{children}</SubscriptionsCoreProvider>\n );\n}\n","import type { BundlesApi } from \"@fluid-app/subscriptions-core\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport type { FetchClient } from \"@fluid-app/portal-tenant-api-client\";\nimport { portalTenant } from \"@fluid-app/portal-tenant-api-client\";\nimport { mapDetailSubscription } from \"./subscriptions-api-adapter\";\n\ntype BffBundleListResponse = Awaited<\n ReturnType<typeof portalTenant.subscription_bundles_list>\n>;\ntype BffBundle = NonNullable<\n BffBundleListResponse[\"subscription_bundles\"]\n>[number];\n\ntype BffSubscriptionInBundle = NonNullable<BffBundle[\"subscriptions\"]>[number];\n\nfunction mapAddress(\n bff: BffBundle[\"address\"],\n): subscriptions.SubscriptionDetailAddress | null {\n if (!bff) return null;\n return {\n id: bff.id ?? 0,\n name: bff.name ?? null,\n address1: bff.address1 ?? \"\",\n address2: bff.address2 ?? null,\n city: bff.city ?? \"\",\n state: bff.state ?? \"\",\n subdivision_code: null,\n postal_code: bff.postal_code ?? \"\",\n country_code: bff.country_code ?? null,\n default: false,\n };\n}\n\nfunction mapVolumeRep(\n bff: BffBundle[\"volume_rep\"],\n): subscriptions.BundleVolumeRep | null {\n if (!bff) return null;\n return {\n id: bff.id ?? 0,\n email: bff.email ?? null,\n full_name: bff.full_name ?? null,\n image_url: bff.image_url ?? null,\n };\n}\n\nfunction mapBundle(bff: BffBundle): subscriptions.Bundle {\n return {\n next_bill_date: bff.next_bill_date ?? null,\n subscription_count: bff.subscription_count ?? 0,\n address: mapAddress(bff.address),\n volume_rep: mapVolumeRep(bff.volume_rep),\n subscriptions: (bff.subscriptions ?? []).map((s) =>\n // The bundle's subscriptions field uses the same Subscription schema as\n // the subscriptions_show endpoint, so the existing detail mapper works\n // unchanged.\n mapDetailSubscription(s as BffSubscriptionInBundle),\n ),\n };\n}\n\nexport function createPortalBundlesAdapter(client: FetchClient): BundlesApi {\n return {\n fetchBundles: async () => {\n const response = await portalTenant.subscription_bundles_list(client);\n return (response.subscription_bundles ?? []).map(mapBundle);\n },\n\n createBundle: async (params: subscriptions.CreateBundleParams) => {\n const bundle: {\n subscription_tokens: string[];\n next_bill_date: string;\n address_id?: number | null;\n volume_rep_id?: number | null;\n } = {\n subscription_tokens: params.subscription_tokens,\n next_bill_date: params.next_bill_date,\n };\n if (params.address_id !== undefined)\n bundle.address_id = params.address_id;\n if (params.volume_rep_id !== undefined)\n bundle.volume_rep_id = params.volume_rep_id;\n\n const response = await portalTenant.subscription_bundles_create(client, {\n bundle,\n });\n const bff = response.subscription_bundle;\n if (!bff) {\n throw new Error(\n \"BFF returned a successful response but bundle data was missing\",\n );\n }\n return mapBundle(bff);\n },\n };\n}\n","import { useMemo, type ReactElement, type ReactNode } from \"react\";\nimport { BundlesCoreProvider } from \"@fluid-app/subscriptions-core\";\nimport { usePortalTenantClient } from \"../providers/PortalTenantClientProvider\";\nimport { createPortalBundlesAdapter } from \"../adapters/bundles-api-adapter\";\n\nexport function PortalBundlesApiProvider({\n children,\n}: {\n children: ReactNode;\n}): ReactElement {\n const client = usePortalTenantClient();\n const api = useMemo(() => createPortalBundlesAdapter(client), [client]);\n return <BundlesCoreProvider api={api}>{children}</BundlesCoreProvider>;\n}\n","import type { Provider } from \"react\";\nimport { createTranslationContext } from \"@fluid-app/i18n/translation-api-context-factory\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport type { SubscriptionsDict } from \"./translation-dictionary\";\n\nconst { Provider: SubscriptionsProvider, useTranslation } =\n createTranslationContext<SubscriptionsDict>(\"Subscriptions\");\n\nexport const SubscriptionsTranslationProvider: Provider<TranslationApi<SubscriptionsDict> | null> =\n SubscriptionsProvider;\nexport const useSubscriptionsTranslation = useTranslation;\n","export const subscriptionsEn = {\n // Breadcrumbs & navigation\n breadcrumb: \"Subscriptions\",\n breadcrumb_detail: \"Subscription #{{token}}\",\n\n // Filter tabs\n all: \"All\",\n active: \"Active\",\n inactive: \"Inactive\",\n\n // Search\n search_placeholder: \"Search subscriptions...\",\n\n // Table columns\n product: \"Product\",\n next_bill_date: \"Next Bill Date\",\n price: \"Price\",\n status: \"Status\",\n\n // Empty / unknown states\n no_subscriptions_found: \"No subscriptions found\",\n unknown_status: \"Unknown\",\n\n // Pagination (used by subscriptions-list)\n total: \"Total\",\n results: \"results\",\n previous: \"Previous\",\n next: \"Next\",\n pagination: \"Pagination\",\n\n // Subscription detail — upcoming order\n your_upcoming_order: \"Your Upcoming Order\",\n next_order_date: \"Next Order Date\",\n next_bill_amount: \"Next Bill Amount\",\n payment_failed_on: \"Payment failed on\",\n\n // Product row\n product_image_alt: \"Product image\",\n no_image: \"No image\",\n quantity_label: \"Quantity\",\n quantity_aria: \"Quantity\",\n decrease_quantity_aria: \"Decrease quantity\",\n increase_quantity_aria: \"Increase quantity\",\n\n // Pricing summary\n subtotal: \"Subtotal\",\n discount: \"Discount\",\n total_label: \"Total\",\n tax_shipping_note:\n \"*Tax and shipping will be calculated when the subscription processes\",\n\n // Order actions\n order_actions: \"Order Actions\",\n skip_next_order: \"Skip Next Order\",\n edit_bill_date: \"Edit Bill Date\",\n pause_subscription: \"Pause Subscription\",\n cancel_subscription: \"Cancel Subscription\",\n cancelled_subscription: \"Cancelled Subscription\",\n resume_subscription: \"Resume Subscription\",\n reactivate_subscription: \"Reactivate Subscription\",\n update_payment_method_action: \"Update Payment Method\",\n\n // Short action labels (SubscriptionActions)\n skip_next: \"Skip Next\",\n pause: \"Pause\",\n cancel: \"Cancel\",\n resume: \"Resume\",\n reactivate: \"Reactivate\",\n\n // Subscription details section\n subscription_details: \"Subscription Details\",\n order_frequency: \"Order Frequency\",\n next_payment: \"Next Payment\",\n last_billed: \"Last Billed\",\n last_shipped: \"Last Shipped\",\n last_bill_amount: \"Last Bill Amount\",\n\n // Payment & shipping\n payment_and_shipping: \"Payment & Shipping\",\n shipping_address: \"Shipping Address\",\n payment_method: \"Payment Method\",\n card_fallback: \"Card\",\n ending_in: \"ending in {{last4}}\",\n no_payment_method: \"No payment method\",\n no_shipping_address: \"No shipping address available\",\n\n // Order history\n subscription_order_history: \"Subscription Order History\",\n order: \"Order\",\n date: \"Date\",\n amount: \"Amount\",\n not_available: \"N/A\",\n\n // Cancel dialog\n cancel_dialog_title: \"Cancel Subscription\",\n cancel_dialog_description:\n \"Are you sure you want to cancel this subscription? You can reactivate it later.\",\n cancel_dialog_pause_question:\n \"Would you like to pause your subscription instead?\",\n cancel_dialog_pause_button: \"Pause Subscription\",\n cancel_dialog_cancel_button: \"Cancel\",\n cancel_dialog_confirm_button: \"Cancel Subscription\",\n pause_for: \"Pause for\",\n select_duration: \"Select duration\",\n month_singular: \"{{count}} month\",\n month_plural: \"{{count}} months\",\n\n // Pause dialog\n pause_dialog_title: \"Pause subscription\",\n pause_dialog_description: \"Are you sure you want to pause subscription?\",\n pause_dialog_action: \"Pause\",\n pause_indefinitely: \"Pause indefinitely\",\n pause_for_orders: \"Pause for a number of upcoming orders\",\n choose_orders_to_skip: \"Choose how many orders to skip\",\n select: \"Select\",\n pause_dialog_cancel: \"Cancel\",\n pause_indefinite_message_prefix:\n \"If you pause indefinitely no further charges will occur. To restart, simply select\",\n pause_indefinite_message_resume: \"Resume\",\n pause_indefinite_message_suffix: \"from your account.\",\n pause_resume_message_prefix:\n \"You won't be charged until your subscription resumes on\",\n pause_resume_message_suffix: \".\",\n\n // Resume dialog\n resume_dialog_title: \"Resume subscription\",\n resume_dialog_description: \"Choose the date your subscription should resume.\",\n resume_dialog_action: \"Resume\",\n resume_date: \"Resume date\",\n date_placeholder: \"mm/dd/yyyy\",\n resume_dialog_cancel: \"Cancel\",\n resume_charge_message_prefix:\n \"Your subscription will resume and you'll be charged on\",\n resume_charge_message_suffix: \".\",\n\n // Edit bill date dialog\n edit_bill_date_title: \"Edit bill date\",\n edit_bill_date_description: \"Select a new date for your next bill.\",\n edit_bill_date_action: \"Save\",\n next_bill_date_label: \"Next bill date\",\n edit_bill_date_cancel: \"Cancel\",\n bill_date_preview_prefix: \"Your next bill will be on\",\n bill_date_preview_suffix: \".\",\n your_other_subscriptions: \"Your other subscriptions\",\n other_subs_product: \"Product\",\n other_subs_bill_date: \"Bill Date\",\n\n // Toast / mutation messages\n subscription_paused: \"Subscription paused\",\n failed_to_pause: \"Failed to pause subscription\",\n subscription_resumed: \"Subscription resumed\",\n failed_to_resume: \"Failed to resume subscription\",\n next_billing_skipped: \"Next billing skipped\",\n failed_to_skip: \"Failed to skip billing\",\n subscription_cancelled: \"Subscription cancelled\",\n failed_to_cancel: \"Failed to cancel subscription\",\n subscription_reactivated: \"Subscription reactivated\",\n failed_to_reactivate: \"Failed to reactivate subscription\",\n quantity_updated: \"Quantity updated\",\n failed_to_update_quantity: \"Failed to update quantity\",\n bill_date_updated: \"Bill date updated\",\n failed_to_update_bill_date: \"Failed to update bill date\",\n bill_date_error:\n \"Could not update the bill date. Please try a different date.\",\n generic_error: \"Something went wrong. Please try again.\",\n\n // Account error\n account_load_error: \"Unable to load account data. Please try again later.\",\n\n // Detail screen errors (portal)\n subscription_not_found: \"Subscription not found\",\n error_occurred: \"An error occurred\",\n failed_to_load_subscription: \"Failed to load subscription: {{message}}\",\n\n // ─── List screen (portal) ──────────────────────────────────────────────\n\n // Page chrome\n list_title: \"Your subscriptions\",\n list_loading: \"Loading...\",\n list_load_more: \"Load more\",\n list_product_fallback: \"Product\",\n\n // Filter pills\n list_filter_paused: \"Paused\",\n list_filter_cancelled: \"Cancelled\",\n\n // Status labels\n list_status_active: \"Active\",\n list_status_paused: \"Paused\",\n list_status_cancelled: \"Cancelled\",\n list_status_past_due: \"Payment issue\",\n list_status_pending: \"Pending\",\n\n // Cadence\n list_cadence_monthly: \"Monthly\",\n list_cadence_weekly: \"Weekly\",\n list_cadence_yearly: \"Yearly\",\n list_cadence_quarterly: \"Quarterly\",\n list_cadence_every_n_units: \"Every {{n}} {{unit}}\",\n list_cadence_every_unit: \"Every {{unit}}\",\n\n // Pricing suffix\n list_price_per_month: \"per month\",\n list_price_per_week: \"per week\",\n list_price_per_year: \"per year\",\n list_price_per_day: \"per day\",\n list_price_every_n_units: \"every {{n}} {{unit}}\",\n\n // Bill summary card\n list_next_bill_label: \"Your next bill\",\n list_last_bill_label: \"Last bill\",\n list_bill_overdue: \"Bill overdue\",\n list_bill_due_1_day_ago: \"Bill was due 1 day ago\",\n list_bill_due_n_days_ago: \"Bill was due {{n}} days ago\",\n list_bill_date: \"Bill date\",\n list_bill_amount: \"Bill amount\",\n list_last_bill_date: \"Last bill date\",\n list_last_bill_amount: \"Last bill amount\",\n\n // Cycle progress\n list_last_bill_today: \"Last bill today\",\n list_last_bill_yesterday: \"Last bill yesterday\",\n list_last_bill_n_days_ago: \"Last bill {{n}} days ago\",\n list_bills_today: \"Bills today\",\n list_bills_tomorrow: \"Bills tomorrow\",\n list_bills_in_n_days: \"Bills in {{n}} days\",\n list_bill_overdue_n_days: \"Bill overdue by {{n}} days\",\n\n // Sections / actions\n list_cancelled_section_label: \"Cancelled · {{n}}\",\n list_resume_cta: \"Resume subscription\",\n list_recurring_badge: \"Recurring delivery\",\n\n // Empty / error / retry\n list_no_in_view: \"No subscriptions in this view\",\n list_none_yet: \"No subscriptions yet\",\n list_filtered_hint: \"Try a different filter to see your other subscriptions.\",\n list_empty_hint: \"When you subscribe to a product, it'll show up here.\",\n list_load_failed_title: \"Couldn't load your subscriptions\",\n list_load_failed_hint: \"Something went wrong on our end. Please try again.\",\n list_try_again: \"Try again\",\n\n // ─── Bundling (CURRENT-848) ────────────────────────────────────────────\n\n // List screen — bundle CTA + card\n list_bundle_cta: \"Bundle\",\n list_bundle_card_label: \"Bundle · {{n}} subscriptions\",\n list_bundle_more_count: \"+{{n}} more\",\n list_bundle_members_title: \"Bundle members\",\n\n // Bundle drawer — chrome\n bundle_subscriptions: \"Bundle subscriptions\",\n bundle_back: \"Back\",\n bundle_done: \"Done\",\n bundle_create: \"Create bundle\",\n bundle_step_select: \"Select\",\n bundle_step_date: \"Date\",\n bundle_step_address: \"Address\",\n bundle_step_payment: \"Payment\",\n\n // Bundle drawer — step 1\n bundle_and_save: \"Bundle and save\",\n bundle_select_subs:\n \"Select 2 or more subscriptions to bundle them onto one bill date and shipment.\",\n bundle_no_bundleable_subs:\n \"You don't have any subscriptions that can be bundled right now. Bundling requires 2 or more active subscriptions that aren't already bundled.\",\n bundle_step1_message: \"✨ Bundle and save on shipping\",\n\n // Bundle drawer — step 2\n bundle_select_new_bill_date: \"Select a new bill date\",\n bundle_select_new_bill_date_description:\n \"All bundled subscriptions will share this bill date.\",\n bundle_year: \"Year\",\n bundle_month: \"Month\",\n bundle_day: \"Day\",\n bundle_step2_message: \"📅 Choose when they ship together\",\n\n // Bundle drawer — step 3\n bundle_select_address: \"Select shipping address\",\n bundle_select_address_description:\n \"All bundled subscriptions will ship to this address.\",\n bundle_selected_bill_date: \"Selected bill date:\",\n bundle_add_new_address: \"Add new address\",\n bundle_default_badge: \"Default\",\n bundle_step3_message: \"🎁 Almost there — pick delivery\",\n\n // Bundle drawer — step 4\n bundle_select_payment: \"Select payment method\",\n bundle_select_payment_description:\n \"All bundled subscriptions will be charged to this payment method.\",\n bundle_no_usable_payment_methods:\n \"No usable payment methods. Add one in your profile.\",\n bundle_card_expires: \"Expires\",\n bundle_add_new_card: \"Add new card\",\n bundle_step4_message: \"💳 Last step — choose payment method\",\n\n // Bundle drawer — toasts\n bundle_succeeded: \"Subscriptions bundled successfully.\",\n bundle_partial_payment_failure:\n \"Bundle created but payment method failed for {{n}} subscription(s).\",\n bundle_failed: \"Couldn't bundle subscriptions. Please try again.\",\n\n // Past-due banner — default state (payment failed, no retry queued)\n past_due_banner_heading: \"We couldn't process your payment\",\n past_due_banner_heading_for_product:\n \"We couldn't process your payment for {{product}}\",\n past_due_banner_body:\n \"Your payment method may have expired or been declined. Update your card to continue your subscription and avoid interruptions.\",\n\n // Past-due banner — retry-scheduled state (next_retry_at is set, e.g. after\n // the customer just updated their card and CURRENT-882's auto-retry queued\n // a billing attempt, or after an admin manual reprocess in CURRENT-883).\n // Two sub-states based on whether last_failed_at is also set: just-queued\n // (immediate retry, no failure since the last reset) vs. retry-failed\n // (a previous attempt failed and the next one is pending after a backoff).\n past_due_banner_heading_retry_scheduled: \"Payment retry scheduled\",\n past_due_banner_heading_retry_scheduled_for_product:\n \"Payment retry scheduled for {{product}}\",\n past_due_banner_body_retry_scheduled:\n \"We're trying your payment again now. We'll update once it's processed.\",\n past_due_banner_body_retry_failed:\n \"The last retry didn't go through. We'll try again automatically {{when}}. You can also update your card to use a different one.\",\n update_your_card: \"Update your card\",\n dismiss: \"Dismiss\",\n\n // Time-bucket strings used in {{when}} interpolation for the\n // retry-failed body. Bucketed (instead of formatDistanceToNow) so the\n // displayed range absorbs the up-to-6h RetryFailedPaymentsJob cron\n // lag — showing \"in 2 hours\" would lie when the cron only ticks\n // every 6 hours.\n past_due_retry_when_shortly: \"shortly\",\n past_due_retry_when_few_hours: \"in the next few hours\",\n past_due_retry_when_within_day: \"within a day\",\n} as const satisfies Record<string, string>;\n\nexport type SubscriptionsDict = typeof subscriptionsEn;\n","import {\n createDomainTranslations,\n type DomainTranslations,\n} from \"@fluid-app/i18n/translations\";\nimport { createStaticDictAdapter } from \"@fluid-app/i18n/static-dict-adapter\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\nimport {\n subscriptionsEn,\n type SubscriptionsDict,\n} from \"./translation-dictionary\";\n\nexport const subscriptionsDomain: DomainTranslations<SubscriptionsDict> =\n createDomainTranslations<SubscriptionsDict>({\n fallback: subscriptionsEn,\n loaders: {\n de: () =>\n import(\"./locale/de.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n el: () =>\n import(\"./locale/el.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n es: () =>\n import(\"./locale/es.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n fr: () =>\n import(\"./locale/fr.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n he: () =>\n import(\"./locale/he.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n hu: () =>\n import(\"./locale/hu.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n id: () =>\n import(\"./locale/id.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n it: () =>\n import(\"./locale/it.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ja: () =>\n import(\"./locale/ja.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ko: () =>\n import(\"./locale/ko.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n nl: () =>\n import(\"./locale/nl.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n pl: () =>\n import(\"./locale/pl.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n pt: () =>\n import(\"./locale/pt.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ro: () =>\n import(\"./locale/ro.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n ru: () =>\n import(\"./locale/ru.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n th: () =>\n import(\"./locale/th.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n tl: () =>\n import(\"./locale/tl.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n tr: () =>\n import(\"./locale/tr.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n zh_CN: () =>\n import(\"./locale/zh_CN.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n zh_TW: () =>\n import(\"./locale/zh_TW.json\").then(\n (m): SubscriptionsDict => m.default as SubscriptionsDict,\n ),\n },\n });\n\nexport function createSubscriptionsTranslationAdapter(\n locale: string,\n dict: SubscriptionsDict,\n): TranslationApi<SubscriptionsDict> {\n return createStaticDictAdapter(locale, dict);\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useDomainDict } from \"@fluid-app/i18n/use-domain-dict\";\nimport {\n subscriptionsDomain,\n createSubscriptionsTranslationAdapter,\n} from \"@fluid-app/subscriptions-core/translation-adapter\";\nimport { SubscriptionsTranslationProvider } from \"@fluid-app/subscriptions-core/translation-api-context\";\n\nexport function SubscriptionsTranslationBridge({\n children,\n}: {\n children: ReactNode;\n}): React.JSX.Element {\n const { locale } = useActiveLocale();\n const dict = useDomainDict(subscriptionsDomain, locale);\n const api = useMemo(\n () => createSubscriptionsTranslationAdapter(locale, dict),\n [locale, dict],\n );\n return (\n <SubscriptionsTranslationProvider value={api}>\n {children}\n </SubscriptionsTranslationProvider>\n );\n}\n","import type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport type { SubscriptionsDict } from \"@fluid-app/subscriptions-core/translation-dictionary\";\nimport type { TranslationApi } from \"@fluid-app/i18n/translation-api\";\n\nexport type T = TranslationApi<SubscriptionsDict>[\"t\"];\n\nexport type FilterKey = \"all\" | \"active\" | \"paused\" | \"cancelled\";\n\nexport type StatusKind =\n | \"active\"\n | \"paused\"\n | \"cancelled\"\n | \"pending\"\n | \"past_due\";\n\nexport interface MappedStatus {\n kind: StatusKind;\n label: string;\n}\n\n/** Status label keys — all non-parameterized so they can be passed to `t()` with no args. */\ntype StatusLabelKey =\n | \"list_status_active\"\n | \"list_status_paused\"\n | \"list_status_cancelled\"\n | \"list_status_past_due\"\n | \"list_status_pending\";\n\n// US `canceled` and UK `cancelled` fold together; `past_due`/`past-due` too.\nconst STATUS_LOOKUP: Record<\n string,\n { kind: StatusKind; labelKey: StatusLabelKey }\n> = {\n active: { kind: \"active\", labelKey: \"list_status_active\" },\n paused: { kind: \"paused\", labelKey: \"list_status_paused\" },\n cancelled: { kind: \"cancelled\", labelKey: \"list_status_cancelled\" },\n canceled: { kind: \"cancelled\", labelKey: \"list_status_cancelled\" },\n past_due: { kind: \"past_due\", labelKey: \"list_status_past_due\" },\n \"past-due\": { kind: \"past_due\", labelKey: \"list_status_past_due\" },\n pending: { kind: \"pending\", labelKey: \"list_status_pending\" },\n};\n\n/**\n * Map a raw subscription `status` string from the BFF onto our internal\n * status vocabulary. Unknown statuses pass through with `kind: \"pending\"`\n * and a capitalized raw label — never synthesize a colored pill that\n * pretends to be real status data.\n */\nexport function mapStatus(status: string, t: T): MappedStatus {\n const entry = STATUS_LOOKUP[(status || \"\").toLowerCase()];\n if (entry) return { kind: entry.kind, label: t(entry.labelKey) };\n return {\n kind: \"pending\",\n label: status ? status.charAt(0).toUpperCase() + status.slice(1) : \"—\",\n };\n}\n\n/**\n * Sort priority — past-due first (urgent), cancelled last. Used to order\n * subscriptions within the active grid before the cancelled section.\n */\nexport const STATUS_PRIORITY: Record<StatusKind, number> = {\n past_due: 0,\n active: 1,\n pending: 2,\n paused: 3,\n cancelled: 4,\n};\n\n/**\n * \"Active\" group = anything still actionable, including paused (can be\n * resumed). The cancelled section is reserved for cancelled subs only —\n * those are truly done and can't be acted on beyond viewing.\n */\nexport function isActiveKind(kind: StatusKind): boolean {\n return (\n kind === \"active\" ||\n kind === \"past_due\" ||\n kind === \"pending\" ||\n kind === \"paused\"\n );\n}\n\n/**\n * Filter predicate — status-only, does not need translation so we use a\n * stripped-down identity helper that satisfies the `T` signature.\n */\nexport function filterPredicate(\n filter: FilterKey,\n sub: subscriptions.SubscriptionListItem,\n): boolean {\n if (filter === \"all\") return true;\n // We only need the `kind` for filter classification — mapStatus's `t`\n // call for the label is irrelevant here. Cast a no-op identity so this\n // stays a pure filter without a translation dependency.\n const kind = mapStatusKindOnly(sub.status);\n // past_due belongs in Active — it's still actionable (user needs to fix\n // payment) and renders in the active grid by default. Excluding it here\n // would make the most-urgent subs vanish when the Active pill is selected.\n if (filter === \"active\")\n return kind === \"active\" || kind === \"pending\" || kind === \"past_due\";\n if (filter === \"paused\") return kind === \"paused\";\n if (filter === \"cancelled\") return kind === \"cancelled\";\n return true;\n}\n\n/** Lightweight status-kind lookup that doesn't need `t`. */\nexport function mapStatusKindOnly(status: string): StatusKind {\n const entry = STATUS_LOOKUP[(status || \"\").toLowerCase()];\n return entry?.kind ?? \"pending\";\n}\n\nexport function countByFilter(\n list: subscriptions.SubscriptionListItem[],\n): Record<FilterKey, number> {\n return {\n all: list.length,\n active: list.filter((s) => filterPredicate(\"active\", s)).length,\n paused: list.filter((s) => filterPredicate(\"paused\", s)).length,\n cancelled: list.filter((s) => filterPredicate(\"cancelled\", s)).length,\n };\n}\n\nexport function formatCadence(\n plan: subscriptions.SubscriptionListPlan,\n t: T,\n): string {\n const interval = plan.billing_interval;\n const unit = plan.billing_interval_unit;\n if (interval === 1 && unit === \"month\") return t(\"list_cadence_monthly\");\n if (interval === 1 && unit === \"week\") return t(\"list_cadence_weekly\");\n if (interval === 1 && unit === \"year\") return t(\"list_cadence_yearly\");\n if (interval === 3 && unit === \"month\") return t(\"list_cadence_quarterly\");\n // Generic fallback uses the BFF-provided unit string verbatim — units\n // like \"day\"/\"week\"/\"month\"/\"year\" come from the API and aren't part of\n // the translation dictionary. The wrapping template IS translated.\n if (interval > 1) {\n return t(\"list_cadence_every_n_units\", {\n n: String(interval),\n unit: unit + \"s\",\n });\n }\n return t(\"list_cadence_every_unit\", { unit });\n}\n\nexport function pricingSuffix(\n plan: subscriptions.SubscriptionListPlan,\n t: T,\n): string {\n const unit = plan.billing_interval_unit;\n const interval = plan.billing_interval;\n if (interval === 1) {\n if (unit === \"month\") return t(\"list_price_per_month\");\n if (unit === \"week\") return t(\"list_price_per_week\");\n if (unit === \"year\") return t(\"list_price_per_year\");\n if (unit === \"day\") return t(\"list_price_per_day\");\n }\n return t(\"list_price_every_n_units\", {\n n: String(interval),\n unit: unit + (interval > 1 ? \"s\" : \"\"),\n });\n}\n\nexport function formatLongDate(iso: string): string {\n // BFF date fields come in two shapes: pure calendar dates (\"2026-05-10\",\n // e.g. Bundle.next_bill_date) and datetimes (\"2026-05-10T07:00:00Z\", e.g.\n // Subscription.next_billing_date). For both we want to render the calendar\n // date the API meant, NOT shift it via timezone math — `new Date(...)` +\n // `toLocaleDateString()` would render UTC-midnight calendar dates as the\n // previous day for any user west of UTC. Pull Y/M/D from the front of the\n // string and format in UTC to keep the date stable across timezones.\n try {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(iso);\n if (!match) return iso;\n const y = Number(match[1]);\n const m = Number(match[2]);\n const d = Number(match[3]);\n if (!y || !m || !d) return iso;\n const date = new Date(Date.UTC(y, m - 1, d));\n return date.toLocaleDateString(undefined, {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n timeZone: \"UTC\",\n });\n } catch {\n return iso;\n }\n}\n\n/**\n * Render the per-cycle subscription bill amount (`price × quantity`).\n *\n * `sub.price` (mapped from the BFF's `total`) is the per-unit price, not the\n * line total — the variant column it ultimately reads from is a plain\n * decimal column, and the detail page also computes `price * quantity` for\n * its bill rows. At qty=1 the multiplication is a no-op so the bug stayed\n * hidden until qty>1 surfaced the mismatch with the detail view.\n */\nexport function formatPrice(sub: subscriptions.SubscriptionListItem): string {\n return (sub.price * (sub.quantity ?? 1)).toFixed(2);\n}\n\n/** Detail-shape counterpart for bundle member rows. */\nexport function formatDetailPrice(\n sub: subscriptions.SubscriptionDetailSubscription,\n): string {\n return (sub.price * (sub.quantity ?? 1)).toFixed(2);\n}\n\nexport interface CycleProgress {\n /** 0..1 fraction of the cycle that has elapsed. */\n progress: number;\n /** \"Last bill 18 days ago\" — friendly label for the start of the cycle. */\n startLabel: string;\n /** \"Bills in 12 days\" — friendly label for the end of the cycle. */\n endLabel: string;\n}\n\n/**\n * Compute progress through a billing cycle. Returns `null` when either\n * date is missing, unparseable, or `end <= start`. `now` is injectable\n * for tests.\n */\nexport function computeCycleProgress(\n last: string | null,\n next: string | null,\n t: T,\n now: number = Date.now(),\n): CycleProgress | null {\n if (!last || !next) return null;\n const start = new Date(last).getTime();\n const end = new Date(next).getTime();\n if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start) {\n return null;\n }\n const raw = (now - start) / (end - start);\n const progress = Math.max(0, Math.min(1, raw));\n return {\n progress,\n startLabel: friendlyDaysAgo(start, t, now),\n endLabel: friendlyDaysAhead(end, t, now),\n };\n}\n\nexport function friendlyDaysAgo(\n start: number,\n t: T,\n now: number = Date.now(),\n): string {\n const days = Math.max(0, Math.round((now - start) / (1000 * 60 * 60 * 24)));\n if (days === 0) return t(\"list_last_bill_today\");\n if (days === 1) return t(\"list_last_bill_yesterday\");\n return t(\"list_last_bill_n_days_ago\", { n: String(days) });\n}\n\nexport function friendlyDaysAhead(\n end: number,\n t: T,\n now: number = Date.now(),\n): string {\n const days = Math.round((end - now) / (1000 * 60 * 60 * 24));\n if (days < 0)\n return t(\"list_bill_overdue_n_days\", { n: String(Math.abs(days)) });\n if (days === 0) return t(\"list_bills_today\");\n if (days === 1) return t(\"list_bills_tomorrow\");\n return t(\"list_bills_in_n_days\", { n: String(days) });\n}\n","import { type JSX, useMemo, useState } from \"react\";\nimport {\n type subscriptions,\n useInfiniteSubscriptions,\n} from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { ImageOff, Package, Play, Repeat, AlertCircle } from \"lucide-react\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport {\n type CycleProgress as CycleProgressData,\n type FilterKey,\n type T,\n STATUS_PRIORITY,\n computeCycleProgress,\n countByFilter,\n filterPredicate,\n formatCadence,\n formatDetailPrice,\n formatLongDate,\n formatPrice,\n isActiveKind,\n mapStatus,\n pricingSuffix,\n} from \"./portal-subscriptions-list-helpers\";\n\nexport type { FilterKey } from \"./portal-subscriptions-list-helpers\";\n\ninterface PortalSubscriptionsListProps {\n customerId: number | undefined;\n isLoadingCustomer?: boolean;\n onSubscriptionClick: (token: string) => void;\n onResume?: (sub: subscriptions.SubscriptionListItem) => void;\n onBundleClick?: () => void;\n bundles?: subscriptions.Bundle[];\n}\n\nconst EMPTY_BUNDLES: subscriptions.Bundle[] = [];\n\nexport function PortalSubscriptionsList({\n customerId,\n isLoadingCustomer,\n onSubscriptionClick,\n onResume,\n onBundleClick,\n bundles = EMPTY_BUNDLES,\n}: PortalSubscriptionsListProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n const [filter, setFilter] = useState<FilterKey>(\"all\");\n const {\n data,\n isLoading,\n isError,\n refetch,\n fetchNextPage,\n hasNextPage,\n isFetchingNextPage,\n } = useInfiniteSubscriptions(\n { customerId, limit: 12 },\n { enabled: !!customerId && !isLoadingCustomer },\n );\n\n const list = useMemo(\n () => data?.pages.flatMap((p) => p.subscriptions) ?? [],\n [data],\n );\n const counts = useMemo(() => countByFilter(list), [list]);\n const filteredList = useMemo(\n () => list.filter((s) => filterPredicate(filter, s)),\n [list, filter],\n );\n\n // Real bundles only — singletons (size 1) come back from the bundles\n // endpoint too but they aren't \"bundled\" from the user's perspective.\n const relevantBundles = useMemo(\n () => bundles.filter((b) => b.subscription_count > 1),\n [bundles],\n );\n const bundledTokens = useMemo(() => {\n const tokens = new Set<string>();\n for (const bundle of relevantBundles) {\n for (const sub of bundle.subscriptions) {\n if (sub.subscription_token) tokens.add(sub.subscription_token);\n }\n }\n return tokens;\n }, [relevantBundles]);\n\n // Bundle cards only render in the \"all\" view because a bundle is a\n // billing-time grouping, not a status. Status-filtered views (active /\n // paused / cancelled) show every member sub as an individual card so the\n // filter answer stays direct.\n const showBundleSection = filter === \"all\" && relevantBundles.length > 0;\n\n const { activeSubs, inactiveSubs } = useMemo(() => {\n const sorted = filteredList\n .slice()\n .sort(\n (a, b) =>\n STATUS_PRIORITY[mapStatus(a.status, t).kind] -\n STATUS_PRIORITY[mapStatus(b.status, t).kind],\n );\n const activeCandidates = sorted.filter((s) =>\n isActiveKind(mapStatus(s.status, t).kind),\n );\n return {\n activeSubs: showBundleSection\n ? activeCandidates.filter(\n (s) => !bundledTokens.has(s.subscription_token),\n )\n : activeCandidates,\n inactiveSubs: sorted.filter(\n (s) => !isActiveKind(mapStatus(s.status, t).kind),\n ),\n };\n }, [filteredList, t, showBundleSection, bundledTokens]);\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb\")}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div className=\"relative\">\n <div className=\"relative mx-auto max-w-4xl px-5 pt-8 pb-20 md:px-8\">\n <h1 className=\"text-foreground text-xl font-bold tracking-tight md:text-2xl\">\n {t(\"list_title\")}\n </h1>\n\n {list.length > 0 && (\n <FilterPills\n active={filter}\n counts={counts}\n onChange={setFilter}\n onBundleClick={onBundleClick}\n t={t}\n />\n )}\n\n {isLoading || isLoadingCustomer ? (\n <div className=\"mt-8 grid grid-cols-1 gap-5 md:grid-cols-2\">\n {Array(4)\n .fill(0)\n .map((_, i) => (\n <SubscriptionCardSkeleton key={i} />\n ))}\n </div>\n ) : isError ? (\n <ErrorState onRetry={() => refetch()} t={t} />\n ) : filteredList.length === 0 ? (\n <EmptyState filtered={filter !== \"all\" && list.length > 0} t={t} />\n ) : (\n <>\n {(showBundleSection || activeSubs.length > 0) && (\n // Single grid for bundle cards + regular subscription cards so\n // they share rows. CSS Grid's default `align-items: stretch`\n // makes every cell in the same row match heights, which is\n // what we want — the tallest card in a row sets the row\n // height and the others stretch to match.\n <div className=\"mt-6 grid grid-cols-1 gap-5 md:grid-cols-2\">\n {showBundleSection &&\n relevantBundles.map((bundle, i) => (\n <BundleCard\n key={`bundle-${i}-${bundle.next_bill_date}`}\n bundle={bundle}\n onSubscriptionClick={onSubscriptionClick}\n t={t}\n />\n ))}\n {activeSubs.map((sub) => (\n <SubscriptionCard\n key={sub.id}\n sub={sub}\n onClick={() =>\n onSubscriptionClick(sub.subscription_token)\n }\n onResume={onResume ? () => onResume(sub) : undefined}\n t={t}\n />\n ))}\n </div>\n )}\n\n {inactiveSubs.length > 0 && (\n <div className={activeSubs.length > 0 ? \"mt-10\" : \"mt-6\"}>\n <div className=\"text-muted-foreground mb-2 px-1 text-xs font-semibold\">\n {t(\"list_cancelled_section_label\", {\n n: String(inactiveSubs.length),\n })}\n </div>\n <div className=\"space-y-3\">\n {inactiveSubs.map((sub) => (\n <InactiveSubscriptionRow\n key={sub.id}\n sub={sub}\n onClick={() =>\n onSubscriptionClick(sub.subscription_token)\n }\n t={t}\n />\n ))}\n </div>\n </div>\n )}\n </>\n )}\n\n {hasNextPage && (\n <div className=\"mt-6 flex justify-center\">\n <button\n type=\"button\"\n onClick={() => fetchNextPage()}\n disabled={isFetchingNextPage}\n className=\"ring-border text-foreground hover:bg-muted inline-flex items-center gap-1 rounded-md bg-transparent px-3 py-1.5 text-xs font-bold ring-1 transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {isFetchingNextPage ? t(\"list_loading\") : t(\"list_load_more\")}\n </button>\n </div>\n )}\n </div>\n </div>\n </>\n );\n}\n\n// ─── Filter pills ─────────────────────────────────────────────────────────\n\nconst FILTER_KEYS: ReadonlyArray<{\n key: FilterKey;\n labelKey: \"all\" | \"active\" | \"list_filter_paused\" | \"list_filter_cancelled\";\n}> = [\n { key: \"all\", labelKey: \"all\" },\n { key: \"active\", labelKey: \"active\" },\n { key: \"paused\", labelKey: \"list_filter_paused\" },\n { key: \"cancelled\", labelKey: \"list_filter_cancelled\" },\n];\n\nfunction FilterPills({\n active,\n counts,\n onChange,\n onBundleClick,\n t,\n}: {\n active: FilterKey;\n counts: Record<FilterKey, number>;\n onChange: (k: FilterKey) => void;\n onBundleClick?: () => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"-mx-1 mt-5 flex flex-wrap items-center gap-1.5 px-1\">\n {FILTER_KEYS.map((f) => {\n const isActive = f.key === active;\n const count = counts[f.key];\n return (\n <button\n key={f.key}\n type=\"button\"\n onClick={() => onChange(f.key)}\n className={`inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-bold transition-all ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"ring-border text-foreground hover:bg-muted bg-transparent ring-1\"\n }`}\n >\n {t(f.labelKey)}\n <span\n className={`text-xs tabular-nums ${\n isActive\n ? \"text-primary-foreground/70\"\n : \"text-muted-foreground\"\n }`}\n >\n {count}\n </span>\n </button>\n );\n })}\n {/* Bundling requires at least 2 subscriptions to merge — hide the\n button when the user has zero or one so they can't reach a step 1\n where the Next button is permanently disabled. Also hide when the\n tenant company has bundling disabled (the screen passes\n onBundleClick=undefined in that case). */}\n {counts.all >= 2 && onBundleClick && (\n <button\n type=\"button\"\n onClick={onBundleClick}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 ml-auto inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs font-bold transition-all\"\n >\n {t(\"list_bundle_cta\")}\n </button>\n )}\n </div>\n );\n}\n\n// ─── Bundle card ───────────────────────────────────────────────────────────\n// Renders a runtime bundle (a customer + address + bill date grouping) as a\n// single card containing each member subscription as a clickable row plus a\n// shared bill summary (date + summed amount). Members navigate to their\n// individual detail screens — bundle-level edit is a future affordance.\n\n// Cap inline member rows so every bundle card has the same height regardless\n// of how many subscriptions are in the bundle. Overflow lives behind a\n// \"+N more\" popover anchored to the card.\nconst BUNDLE_INLINE_LIMIT = 2;\n\nfunction BundleCard({\n bundle,\n onSubscriptionClick,\n t,\n}: {\n bundle: subscriptions.Bundle;\n onSubscriptionClick: (token: string) => void;\n t: T;\n}): JSX.Element {\n const [popoverOpen, setPopoverOpen] = useState(false);\n const total = bundle.subscriptions.reduce(\n (sum, s) => sum + s.price * (s.quantity ?? 1),\n 0,\n );\n const nextBillLong = bundle.next_bill_date\n ? formatLongDate(bundle.next_bill_date)\n : null;\n\n const inlineMembers = bundle.subscriptions.slice(0, BUNDLE_INLINE_LIMIT);\n const overflowCount = bundle.subscriptions.length - inlineMembers.length;\n\n const handleMemberClick = (token: string) => {\n onSubscriptionClick(token);\n setPopoverOpen(false);\n };\n\n return (\n <div className=\"ring-border hover:ring-foreground/10 relative flex flex-col gap-4 rounded-2xl bg-transparent p-5 shadow-sm ring-1 transition-all duration-300 hover:shadow-lg\">\n {/* Bundle header */}\n <div className=\"flex items-center gap-2\">\n <div className=\"bg-muted flex size-7 items-center justify-center rounded-full\">\n <Package className=\"text-foreground size-4\" strokeWidth={2} />\n </div>\n <div className=\"text-foreground text-xs font-bold\">\n {t(\"list_bundle_card_label\", {\n n: String(bundle.subscription_count),\n })}\n </div>\n </div>\n\n {/* Inline member rows (capped) */}\n <div className=\"flex flex-col\">\n {inlineMembers.map((sub) => (\n <BundleMemberRow\n key={sub.subscription_token}\n sub={sub}\n onClick={() => handleMemberClick(sub.subscription_token)}\n t={t}\n />\n ))}\n\n {overflowCount > 0 && (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground focus-visible:ring-foreground/30 mt-1 inline-flex w-fit cursor-pointer items-center rounded-md px-2 py-1 text-xs font-bold transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n >\n {t(\"list_bundle_more_count\", { n: String(overflowCount) })}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"start\"\n className=\"bg-background ring-border w-80 rounded-2xl p-3 shadow-lg ring-1\"\n >\n <div className=\"text-muted-foreground px-2 pt-1 pb-2 text-xs font-bold uppercase\">\n {t(\"list_bundle_members_title\")}\n </div>\n <div className=\"flex max-h-80 flex-col overflow-y-auto\">\n {bundle.subscriptions.map((sub) => (\n <BundleMemberRow\n key={sub.subscription_token}\n sub={sub}\n onClick={() => handleMemberClick(sub.subscription_token)}\n t={t}\n />\n ))}\n </div>\n </PopoverContent>\n </Popover>\n )}\n </div>\n\n {/* Shared bill summary — pushed to the bottom so the card height\n can stretch (auto-rows-fr) without the summary floating mid-card. */}\n <div className=\"bg-muted mt-auto rounded-xl px-4 py-3.5\">\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"list_next_bill_label\")}\n </div>\n <div className=\"mt-3 grid grid-cols-2\">\n <div className=\"pr-4\">\n <div className=\"text-muted-foreground text-xs\">\n {t(\"list_bill_date\")}\n </div>\n <div className=\"text-foreground mt-1 text-base font-bold tracking-tight tabular-nums\">\n {nextBillLong ?? \"—\"}\n </div>\n </div>\n <div className=\"border-border border-l pl-4\">\n <div className=\"text-muted-foreground text-xs\">\n {t(\"list_bill_amount\")}\n </div>\n <div className=\"text-foreground mt-1 text-base font-bold tracking-tight tabular-nums\">\n {total.toFixed(2)}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction BundleMemberRow({\n sub,\n onClick,\n t,\n}: {\n sub: subscriptions.SubscriptionDetailSubscription;\n onClick: () => void;\n t: T;\n}): JSX.Element {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"hover:bg-muted/60 focus-visible:ring-foreground/30 -mx-2 flex cursor-pointer items-center gap-3 rounded-lg p-2 text-left transition-colors focus-visible:ring-2 focus-visible:outline-none\"\n >\n <div className=\"relative size-12 shrink-0\">\n {sub.variant.product.image_url ? (\n <img\n src={sub.variant.product.image_url}\n alt=\"\"\n className=\"ring-background size-12 rounded-lg bg-transparent object-cover ring-2\"\n />\n ) : (\n <div className=\"bg-muted ring-background text-muted-foreground flex size-12 items-center justify-center rounded-lg ring-2\">\n <ImageOff className=\"size-4\" strokeWidth={1.75} />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground truncate text-xs font-bold\">\n {sub.variant.product.title || t(\"list_product_fallback\")}\n </div>\n <div className=\"text-muted-foreground truncate text-xs\">\n {bundleMemberCadence(sub.subscription_plan, t)}\n </div>\n </div>\n <div className=\"text-foreground shrink-0 text-xs font-bold tabular-nums\">\n {formatDetailPrice(sub)}\n </div>\n </button>\n );\n}\n\n// `formatCadence` types its input to SubscriptionListPlan; bundle members are\n// SubscriptionDetailPlan which carries the same billing_interval fields.\n// Avoid an unsafe cast by re-implementing the small subset we need.\nfunction bundleMemberCadence(\n plan: { billing_interval: number; billing_interval_unit: string },\n t: T,\n): string {\n const { billing_interval: interval, billing_interval_unit: unit } = plan;\n if (interval === 1 && unit === \"month\") return t(\"list_cadence_monthly\");\n if (interval === 1 && unit === \"week\") return t(\"list_cadence_weekly\");\n if (interval === 1 && unit === \"year\") return t(\"list_cadence_yearly\");\n if (interval === 3 && unit === \"month\") return t(\"list_cadence_quarterly\");\n if (interval > 1) {\n return t(\"list_cadence_every_n_units\", {\n n: String(interval),\n unit: unit + \"s\",\n });\n }\n return t(\"list_cadence_every_unit\", { unit });\n}\n\n// ─── Card ──────────────────────────────────────────────────────────────────\n\nfunction SubscriptionCard({\n sub,\n onClick,\n onResume,\n t,\n}: {\n sub: subscriptions.SubscriptionListItem;\n onClick: () => void;\n onResume?: () => void;\n t: T;\n}): JSX.Element {\n const status = mapStatus(sub.status, t);\n const isPaused = status.kind === \"paused\";\n const isCancelled = status.kind === \"cancelled\";\n const isPastDue = status.kind === \"past_due\";\n const cadence = formatCadence(sub.subscription_plan, t);\n const nextBillLong = sub.next_bill_date\n ? formatLongDate(sub.next_bill_date)\n : null;\n const lastBillLong = sub.last_bill_date\n ? formatLongDate(sub.last_bill_date)\n : null;\n const daysOverdue =\n isPastDue && sub.next_bill_date\n ? Math.max(\n 0,\n Math.round(\n (Date.now() - new Date(sub.next_bill_date).getTime()) /\n (1000 * 60 * 60 * 24),\n ),\n )\n : 0;\n const cycle = computeCycleProgress(sub.last_bill_date, sub.next_bill_date, t);\n const showCycle = cycle != null && !isPaused && !isCancelled && !isPastDue;\n\n return (\n <div\n className={`group has-[:focus-visible]:ring-foreground/30 relative flex flex-col gap-5 rounded-2xl p-5 ring-1 transition-all duration-300 hover:-translate-y-0.5 has-[:focus-visible]:ring-2 ${\n isPastDue\n ? \"from-destructive/10 via-destructive/[0.03] ring-destructive/15 hover:ring-destructive/30 bg-transparent bg-gradient-to-br to-transparent shadow-sm hover:shadow-lg\"\n : \"ring-foreground/5 hover:ring-foreground/10 bg-transparent shadow-sm hover:shadow-lg\"\n } ${isPaused || isCancelled ? \"opacity-90\" : \"\"}`}\n >\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex flex-1 cursor-pointer flex-col gap-5 text-left focus:outline-none\"\n >\n {/* Top: image + title */}\n <div className=\"flex items-start gap-4\">\n <Thumbnail\n product={sub.variant.product}\n muted={isPaused || isCancelled}\n t={t}\n />\n <div className=\"min-w-0 flex-1 pt-1\">\n <div className=\"text-foreground truncate text-base font-bold\">\n {sub.variant.product.title || t(\"list_product_fallback\")}\n </div>\n <div className=\"text-muted-foreground mt-0.5 text-sm\">\n {cadence}\n </div>\n {(isPaused || isCancelled || isPastDue) && (\n <div\n className={`mt-2 inline-flex items-center gap-1.5 text-xs font-semibold ${\n isPastDue ? \"text-destructive\" : \"text-muted-foreground/75\"\n }`}\n >\n <span\n className={`size-1.5 rounded-full ${\n isCancelled || isPastDue\n ? \"bg-destructive\"\n : \"bg-muted-foreground\"\n }`}\n />\n {status.label}\n </div>\n )}\n </div>\n </div>\n\n {/* Bill summary pinned to the bottom of the click area via mt-auto\n so when the card stretches (e.g. when a bundle in the same grid\n row is taller), empty space grows between the title and summary\n instead of below them. */}\n {isCancelled ? (\n <div className=\"bg-muted text-muted-foreground mt-auto rounded-xl px-4 py-3 text-sm font-semibold\">\n {status.label}\n </div>\n ) : (\n <div className=\"bg-muted mt-auto rounded-xl px-4 py-3.5\">\n <div\n className={`text-sm font-bold ${isPastDue ? \"text-destructive\" : \"text-foreground\"}`}\n >\n {isPastDue\n ? daysOverdue === 1\n ? t(\"list_bill_due_1_day_ago\")\n : daysOverdue > 0\n ? t(\"list_bill_due_n_days_ago\", {\n n: String(daysOverdue),\n })\n : t(\"list_bill_overdue\")\n : isPaused\n ? t(\"list_last_bill_label\")\n : t(\"list_next_bill_label\")}\n </div>\n <div className=\"mt-3 grid grid-cols-2\">\n <div className=\"pr-4\">\n <div className=\"text-muted-foreground text-xs\">\n {isPaused ? t(\"list_last_bill_date\") : t(\"list_bill_date\")}\n </div>\n <div\n className={`mt-1 text-base font-bold tracking-tight tabular-nums ${isPastDue ? \"text-destructive\" : \"text-foreground\"}`}\n >\n {(isPaused ? lastBillLong : nextBillLong) ?? \"—\"}\n </div>\n </div>\n <div className=\"border-border border-l pl-4\">\n <div className=\"text-muted-foreground text-xs\">\n {isPaused\n ? t(\"list_last_bill_amount\")\n : t(\"list_bill_amount\")}\n </div>\n <div className=\"text-foreground mt-1 text-base font-bold tracking-tight tabular-nums\">\n {formatPrice(sub)}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {pricingSuffix(sub.subscription_plan, t)}\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Cycle progress bar */}\n {showCycle && cycle && <CycleProgress cycle={cycle} />}\n </button>\n\n {/* Resume CTA */}\n {isPaused && (\n <button\n type=\"button\"\n onClick={onResume}\n disabled={!onResume}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 inline-flex w-full items-center justify-center gap-1.5 rounded-md py-2.5 text-xs font-bold transition-colors focus:outline-none disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Play className=\"size-3 fill-current\" strokeWidth={2.25} />\n {t(\"list_resume_cta\")}\n </button>\n )}\n </div>\n );\n}\n\n// ─── Cycle progress ───────────────────────────────────────────────────────\n\nfunction CycleProgress({ cycle }: { cycle: CycleProgressData }): JSX.Element {\n const pct = Math.round(cycle.progress * 100);\n return (\n <div>\n <div className=\"bg-muted relative h-1.5 overflow-hidden rounded-full\">\n <div\n className=\"bg-foreground absolute top-0 left-0 h-full rounded-full transition-all duration-500\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <div className=\"text-muted-foreground mt-2 flex items-center justify-between text-xs font-medium\">\n <span>{cycle.startLabel}</span>\n <span>{cycle.endLabel}</span>\n </div>\n </div>\n );\n}\n\n// ─── Inactive (condensed) row ─────────────────────────────────────────────\n\nfunction InactiveSubscriptionRow({\n sub,\n onClick,\n t,\n}: {\n sub: subscriptions.SubscriptionListItem;\n onClick: () => void;\n t: T;\n}): JSX.Element {\n const status = mapStatus(sub.status, t);\n const cadence = formatCadence(sub.subscription_plan, t);\n const detail = `${cadence} · ${status.label}`;\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"group ring-foreground/5 hover:ring-foreground/10 focus-visible:ring-foreground/30 flex w-full cursor-pointer items-center gap-3 rounded-2xl bg-transparent px-4 py-3 text-left shadow-sm ring-1 transition-all duration-300 hover:-translate-y-0.5 hover:shadow-lg focus-visible:ring-2 focus-visible:outline-none\"\n >\n <div className=\"relative size-10 shrink-0 opacity-60 saturate-50\">\n {sub.variant.product.image_url ? (\n <img\n src={sub.variant.product.image_url}\n alt=\"\"\n className=\"ring-background size-10 rounded-xl bg-transparent object-cover ring-[3px]\"\n />\n ) : (\n <div className=\"bg-muted ring-background text-muted-foreground flex size-10 items-center justify-center rounded-xl ring-[3px]\">\n <ImageOff className=\"size-4\" strokeWidth={1.75} />\n </div>\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-foreground truncate text-sm font-bold\">\n {sub.variant.product.title || t(\"list_product_fallback\")}\n </div>\n <div className=\"text-muted-foreground truncate text-xs\">{detail}</div>\n </div>\n </button>\n );\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction Thumbnail({\n product,\n muted,\n t,\n}: {\n product: subscriptions.SubscriptionListVariantProduct;\n muted?: boolean;\n t: T;\n}): JSX.Element {\n const wrapperClass = `relative size-24 shrink-0 transition-all ${muted ? \"saturate-50 opacity-60\" : \"\"}`;\n const imgClass =\n \"bg-transparent ring-background size-24 rounded-2xl object-cover ring-[3px] shadow-sm\";\n return (\n <div className={wrapperClass}>\n {product.image_url ? (\n <img src={product.image_url} alt=\"\" className={imgClass} />\n ) : (\n <div className=\"bg-muted ring-background text-muted-foreground flex size-24 items-center justify-center rounded-2xl shadow-sm ring-[3px]\">\n <ImageOff className=\"size-7\" strokeWidth={1.75} />\n </div>\n )}\n <div\n className=\"bg-primary text-primary-foreground ring-background absolute -top-1 -right-1 z-40 flex size-6 items-center justify-center rounded-full ring-2\"\n title={t(\"list_recurring_badge\")}\n >\n <Repeat className=\"size-3\" strokeWidth={2.75} />\n </div>\n </div>\n );\n}\n\n// ─── Empty / loading ───────────────────────────────────────────────────────\n\nfunction SubscriptionCardSkeleton(): JSX.Element {\n return (\n <div className=\"ring-border flex flex-col gap-5 rounded-2xl bg-transparent p-5 ring-1\">\n <div className=\"flex items-start gap-4\">\n <div className=\"bg-muted size-20 shrink-0 animate-pulse rounded-2xl\" />\n <div className=\"flex-1 space-y-2 pt-1\">\n <div className=\"bg-muted h-5 w-2/3 animate-pulse rounded\" />\n <div className=\"bg-muted h-4 w-1/2 animate-pulse rounded\" />\n </div>\n </div>\n <div className=\"bg-muted h-12 animate-pulse rounded\" />\n <div className=\"bg-muted h-6 animate-pulse rounded\" />\n </div>\n );\n}\n\nfunction EmptyState({\n filtered,\n t,\n}: {\n filtered?: boolean;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"ring-border mx-auto mt-12 flex max-w-md flex-col items-center gap-2 rounded-2xl bg-transparent px-6 py-12 text-center ring-1\">\n <div className=\"text-foreground text-sm font-bold\">\n {filtered ? t(\"list_no_in_view\") : t(\"list_none_yet\")}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {filtered ? t(\"list_filtered_hint\") : t(\"list_empty_hint\")}\n </div>\n </div>\n );\n}\n\nfunction ErrorState({\n onRetry,\n t,\n}: {\n onRetry: () => void;\n t: T;\n}): JSX.Element {\n return (\n <div className=\"ring-border mx-auto mt-12 flex max-w-md flex-col items-center gap-2 rounded-2xl bg-transparent px-6 py-12 text-center ring-1\">\n <div className=\"bg-muted flex size-12 items-center justify-center rounded-full\">\n <AlertCircle className=\"text-muted-foreground size-5\" strokeWidth={2} />\n </div>\n <div className=\"text-foreground text-sm font-bold\">\n {t(\"list_load_failed_title\")}\n </div>\n <div className=\"text-muted-foreground text-xs\">\n {t(\"list_load_failed_hint\")}\n </div>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 mt-2 inline-flex items-center gap-1 rounded-md px-3 py-1.5 text-xs font-bold transition-all\"\n >\n {t(\"list_try_again\")}\n </button>\n </div>\n );\n}\n","import type { fluidPay } from \"@fluid-app/fluid-pay-core\";\n\n/**\n * Mirrors fluid-checkout's `isPaymentMethodUsable`. A payment method is only\n * eligible for bundle attachment when it has a complete billing address.\n *\n * Note: the portal's `fluidPay.CustomerPaymentMethod` does not surface the\n * checkout-only `au_status` field, so we only check billing-address completeness.\n */\nexport function isPaymentMethodUsable(\n pm: fluidPay.CustomerPaymentMethod,\n): boolean {\n const addr = pm.billing_address;\n if (!addr) return false;\n return Boolean(\n addr.address1 && addr.city && addr.state && addr.zip && addr.country_code,\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { isPaymentMethodUsable } from \"./payment-utils\";\nimport type { Step } from \"./types\";\n\ninterface UseBundleFormArgs {\n addresses: fluidPay.CustomerAddress[];\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n defaultAddressId?: number | null;\n defaultPaymentMethodId?: number | null;\n}\n\nexport interface BundleForm {\n step: Step;\n setStep: (s: Step) => void;\n selectedTokens: Set<string>;\n toggleToken: (token: string) => void;\n\n selectedYear: number;\n selectedMonth: number | null;\n selectedDay: number | null;\n setYear: (y: number) => void;\n setMonth: (m: number) => void;\n setDay: (d: number) => void;\n\n selectedAddressId: number | null;\n setSelectedAddressId: (id: number | null) => void;\n\n selectedPaymentMethodId: number | null;\n setSelectedPaymentMethodId: (id: number | null) => void;\n\n canProceedFromStep1: boolean;\n canProceedFromStep2: boolean;\n canProceedFromStep3: boolean;\n canProceedFromStep4: boolean;\n\n /** \"YYYY-MM-DD\" or null when month/day not yet selected. */\n formattedDate: string | null;\n}\n\nfunction pickDefaultAddressId(\n addresses: fluidPay.CustomerAddress[],\n defaultAddressId: number | null | undefined,\n): number | null {\n if (defaultAddressId != null) {\n const match = addresses.find((a) => a.id === defaultAddressId);\n if (match) return match.id;\n }\n const flagged = addresses.find((a) => a.default);\n if (flagged) return flagged.id;\n return addresses[0]?.id ?? null;\n}\n\nfunction pickDefaultPaymentMethodId(\n paymentMethods: fluidPay.CustomerPaymentMethod[],\n defaultPaymentMethodId: number | null | undefined,\n): number | null {\n const usable = paymentMethods.filter(isPaymentMethodUsable);\n if (defaultPaymentMethodId != null) {\n const match = usable.find((pm) => pm.id === defaultPaymentMethodId);\n if (match) return match.id;\n }\n const flagged = usable.find((pm) => pm.default);\n if (flagged) return flagged.id;\n return usable[0]?.id ?? null;\n}\n\nexport function useBundleForm({\n addresses,\n paymentMethods,\n defaultAddressId,\n defaultPaymentMethodId,\n}: UseBundleFormArgs): BundleForm {\n const [step, setStep] = useState<Step>(1);\n const [selectedTokens, setSelectedTokens] = useState<Set<string>>(\n () => new Set(),\n );\n const today = useMemo(() => new Date(), []);\n const [selectedYear, setYearState] = useState<number>(today.getUTCFullYear());\n const [selectedMonth, setMonthState] = useState<number | null>(null);\n const [selectedDay, setDayState] = useState<number | null>(null);\n const [selectedAddressId, setSelectedAddressId] = useState<number | null>(\n () => pickDefaultAddressId(addresses, defaultAddressId),\n );\n const [selectedPaymentMethodId, setSelectedPaymentMethodId] = useState<\n number | null\n >(() => pickDefaultPaymentMethodId(paymentMethods, defaultPaymentMethodId));\n\n // When the user opens the drawer with an empty address book, then adds an\n // address inline (AddressFormDialog → query invalidates → `addresses` prop\n // refreshes), auto-select the new address so step 3's Next button enables\n // without requiring a manual tap. The lazy useState initializer above only\n // runs once at mount and would otherwise leave `selectedAddressId === null`\n // forever. Mirror logic for payment methods.\n useEffect(() => {\n if (selectedAddressId == null && addresses.length > 0) {\n setSelectedAddressId(pickDefaultAddressId(addresses, defaultAddressId));\n }\n }, [selectedAddressId, addresses, defaultAddressId]);\n\n useEffect(() => {\n if (\n selectedPaymentMethodId == null &&\n paymentMethods.some(isPaymentMethodUsable)\n ) {\n setSelectedPaymentMethodId(\n pickDefaultPaymentMethodId(paymentMethods, defaultPaymentMethodId),\n );\n }\n }, [selectedPaymentMethodId, paymentMethods, defaultPaymentMethodId]);\n\n const toggleToken = useCallback((token: string) => {\n setSelectedTokens((prev) => {\n const next = new Set(prev);\n if (next.has(token)) next.delete(token);\n else next.add(token);\n return next;\n });\n }, []);\n\n // Cascade-clear month/day when year changes if month/day become invalid.\n const setYear = useCallback(\n (y: number) => {\n setYearState(y);\n if (selectedMonth != null) {\n const isPastMonth =\n y < today.getUTCFullYear() ||\n (y === today.getUTCFullYear() && selectedMonth < today.getUTCMonth());\n // Same-month edge case: switching back to the current year while a\n // day from the current month is selected can leave the day in the\n // past (e.g. selectedDay=3 when today=May 7). Clear the day in that\n // case so the user doesn't unknowingly submit a past date and trip\n // the BFF's `next_bill_date_in_past` validator.\n const isPastDay =\n y === today.getUTCFullYear() &&\n selectedMonth === today.getUTCMonth() &&\n selectedDay != null &&\n selectedDay < today.getUTCDate();\n if (isPastMonth) {\n setMonthState(null);\n setDayState(null);\n } else if (isPastDay) {\n setDayState(null);\n }\n }\n },\n [selectedMonth, selectedDay, today],\n );\n\n // Clear day when month changes if day exceeds the new month's day count OR\n // becomes past-dated. Past-dated example: today is May 7; user selected\n // year=2026 / month=July / day=3 (valid), then switches month back to May\n // — selectedDay=3 fits in May (3 <= 31) but is past today, so it would\n // submit as 2026-05-03 and trip the BFF's `next_bill_date_in_past`\n // validator with no inline explanation.\n const setMonth = useCallback(\n (m: number) => {\n setMonthState(m);\n if (selectedDay != null) {\n const daysInNewMonth = new Date(\n Date.UTC(selectedYear, m + 1, 0),\n ).getUTCDate();\n const isPastDay =\n selectedYear === today.getUTCFullYear() &&\n m === today.getUTCMonth() &&\n selectedDay < today.getUTCDate();\n if (selectedDay > daysInNewMonth || isPastDay) setDayState(null);\n }\n },\n [selectedDay, selectedYear, today],\n );\n\n const setDay = useCallback((d: number) => setDayState(d), []);\n\n const canProceedFromStep1 = selectedTokens.size >= 2;\n const canProceedFromStep2 = selectedMonth !== null && selectedDay !== null;\n const canProceedFromStep3 = selectedAddressId != null;\n const canProceedFromStep4 = selectedPaymentMethodId != null;\n\n const formattedDate = useMemo(() => {\n if (selectedMonth == null || selectedDay == null) return null;\n const mm = String(selectedMonth + 1).padStart(2, \"0\");\n const dd = String(selectedDay).padStart(2, \"0\");\n return `${selectedYear}-${mm}-${dd}`;\n }, [selectedYear, selectedMonth, selectedDay]);\n\n return {\n step,\n setStep,\n selectedTokens,\n toggleToken,\n selectedYear,\n selectedMonth,\n selectedDay,\n setYear,\n setMonth,\n setDay,\n selectedAddressId,\n setSelectedAddressId,\n selectedPaymentMethodId,\n setSelectedPaymentMethodId,\n canProceedFromStep1,\n canProceedFromStep2,\n canProceedFromStep3,\n canProceedFromStep4,\n formattedDate,\n };\n}\n","import type { JSX } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport type { Step } from \"./types\";\n\ninterface DrawerStepTabsProps {\n step: Step;\n onStepClick: (step: Step) => void;\n canProceedFromStep1: boolean;\n canProceedFromStep2: boolean;\n canProceedFromStep3: boolean;\n}\n\ntype TabLabelKey =\n | \"bundle_step_select\"\n | \"bundle_step_date\"\n | \"bundle_step_address\"\n | \"bundle_step_payment\";\n\nconst TABS: ReadonlyArray<{ id: Step; labelKey: TabLabelKey }> = [\n { id: 1, labelKey: \"bundle_step_select\" },\n { id: 2, labelKey: \"bundle_step_date\" },\n { id: 3, labelKey: \"bundle_step_address\" },\n { id: 4, labelKey: \"bundle_step_payment\" },\n];\n\nconst PROGRESS_BY_STEP: Record<Step, string> = {\n 1: \"0%\",\n 2: \"33%\",\n 3: \"66%\",\n 4: \"100%\",\n};\n\ntype StepMessageKey =\n | \"bundle_step1_message\"\n | \"bundle_step2_message\"\n | \"bundle_step3_message\"\n | \"bundle_step4_message\";\n\nexport function DrawerStepTabs({\n step,\n onStepClick,\n canProceedFromStep1,\n canProceedFromStep2,\n canProceedFromStep3,\n}: DrawerStepTabsProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n\n const handleClick = (target: Step) => {\n if (target < step) {\n onStepClick(target);\n } else if (target === 2 && canProceedFromStep1) {\n onStepClick(2);\n } else if (target === 3 && canProceedFromStep1 && canProceedFromStep2) {\n onStepClick(3);\n } else if (\n target === 4 &&\n canProceedFromStep1 &&\n canProceedFromStep2 &&\n canProceedFromStep3\n ) {\n onStepClick(4);\n }\n };\n\n const messageKey: StepMessageKey =\n step === 1\n ? \"bundle_step1_message\"\n : step === 2\n ? \"bundle_step2_message\"\n : step === 3\n ? \"bundle_step3_message\"\n : \"bundle_step4_message\";\n\n return (\n <div className=\"px-6 pt-4\">\n <div className=\"mb-2 flex items-center justify-between\">\n {TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => handleClick(tab.id)}\n className={`text-xs font-bold transition-colors ${\n step === tab.id\n ? \"text-foreground\"\n : step > tab.id\n ? \"text-muted-foreground cursor-pointer\"\n : \"text-muted-foreground/75\"\n }`}\n >\n {t(tab.labelKey)}\n </button>\n ))}\n </div>\n\n <div className=\"bg-muted relative h-1 rounded-full\">\n <div\n className=\"bg-primary absolute h-1 rounded-full transition-all duration-300\"\n style={{ width: PROGRESS_BY_STEP[step] }}\n />\n {TABS.map((tab, index) => (\n <div\n key={tab.id}\n className={`absolute top-1/2 size-3 rounded-full transition-colors ${\n step >= tab.id ? \"bg-primary\" : \"bg-muted ring-border ring-1\"\n }`}\n style={\n index === 0\n ? { left: 0, transform: \"translateY(-50%)\" }\n : index === TABS.length - 1\n ? { right: 0, transform: \"translateY(-50%)\" }\n : {\n left: `${(index / (TABS.length - 1)) * 100}%`,\n transform: \"translate(-50%, -50%)\",\n }\n }\n />\n ))}\n </div>\n\n <div className=\"text-muted-foreground mt-3 flex items-center justify-center text-xs\">\n <span>{t(messageKey)}</span>\n </div>\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { Check, Package, Repeat, Truck } from \"lucide-react\";\nimport {\n formatCadence,\n formatPrice,\n} from \"../portal-subscriptions-list-helpers\";\n\ninterface DrawerStepSelectProps {\n subscriptions: subscriptions.SubscriptionListItem[];\n selectedTokens: Set<string>;\n onToggle: (token: string) => void;\n}\n\nfunction formatBillDate(value: string | null): string {\n if (!value) return \"—\";\n // Mirror the calendar-date-from-the-front parse in `formatLongDate` so a\n // pure date string like \"2026-05-10\" doesn't get shifted to May 9 for\n // anyone west of UTC. Subscription.next_billing_date is a datetime; the\n // date prefix matches the same regex.\n try {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(value);\n if (!match) return \"—\";\n const y = Number(match[1]);\n const m = Number(match[2]);\n const d = Number(match[3]);\n if (!y || !m || !d) return \"—\";\n const date = new Date(Date.UTC(y, m - 1, d));\n return date.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n timeZone: \"UTC\",\n });\n } catch {\n return \"—\";\n }\n}\n\nexport function DrawerStepSelect({\n subscriptions,\n selectedTokens,\n onToggle,\n}: DrawerStepSelectProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n return (\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n <div className=\"bg-muted mt-2 rounded-2xl p-6 text-center\">\n <div className=\"mx-auto mb-3 flex size-14 items-center justify-center rounded-2xl bg-transparent shadow-sm\">\n <Truck className=\"text-foreground size-7\" strokeWidth={2} />\n </div>\n <h3 className=\"text-foreground text-sm font-bold\">\n {t(\"bundle_and_save\")}\n </h3>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n {t(\"bundle_select_subs\")}\n </p>\n </div>\n\n {subscriptions.length < 2 && (\n <div className=\"ring-border mt-4 rounded-2xl p-6 text-center ring-1\">\n <p className=\"text-muted-foreground text-xs\">\n {t(\"bundle_no_bundleable_subs\")}\n </p>\n </div>\n )}\n\n <div className=\"mt-4 space-y-2\">\n {subscriptions.length >= 2 &&\n subscriptions.map((sub) => {\n const isSelected = selectedTokens.has(sub.subscription_token);\n return (\n <div\n key={sub.subscription_token}\n role=\"checkbox\"\n aria-checked={isSelected}\n tabIndex={0}\n onClick={() => onToggle(sub.subscription_token)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onToggle(sub.subscription_token);\n }\n }}\n className={`flex cursor-pointer items-start gap-3 rounded-2xl p-4 transition-all ${\n isSelected\n ? \"ring-primary bg-muted ring-2\"\n : \"ring-border hover:ring-foreground/20 ring-1\"\n }`}\n >\n <div className=\"pt-1\">\n <div\n className={`flex size-5 items-center justify-center rounded-full transition-colors ${\n isSelected ? \"bg-primary\" : \"ring-foreground/30 ring-2\"\n }`}\n >\n {isSelected && (\n <Check\n className=\"text-primary-foreground size-3\"\n strokeWidth={3}\n />\n )}\n </div>\n </div>\n\n {sub.variant?.product?.image_url ? (\n <img\n src={sub.variant.product.image_url}\n alt={sub.variant.product.title ?? \"\"}\n className=\"size-12 shrink-0 rounded-lg object-cover\"\n />\n ) : (\n <div className=\"bg-muted flex size-12 shrink-0 items-center justify-center rounded-lg\">\n <Package\n className=\"text-muted-foreground size-6\"\n strokeWidth={1.75}\n />\n </div>\n )}\n\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-foreground truncate text-xs font-bold\">\n {sub.variant?.product?.title ?? t(\"list_product_fallback\")}\n </p>\n <p className=\"text-foreground mt-0.5 text-xs\">\n {formatPrice(sub)}\n </p>\n {sub.customer?.full_name && (\n <p className=\"text-muted-foreground mt-0.5 truncate text-xs\">\n {sub.customer.full_name}\n </p>\n )}\n </div>\n\n <div className=\"shrink-0 text-right\">\n <div className=\"text-muted-foreground inline-flex items-center gap-1 text-xs\">\n <Repeat className=\"size-3\" strokeWidth={2} />\n {formatCadence(sub.subscription_plan, t)}\n </div>\n <p className=\"text-muted-foreground/75 mt-1 text-xs\">\n {formatBillDate(sub.next_bill_date)}\n </p>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { useMemo, type JSX } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\n\ninterface DrawerStepDateProps {\n selectedYear: number;\n selectedMonth: number | null;\n selectedDay: number | null;\n onYearChange: (year: number) => void;\n onMonthChange: (month: number) => void;\n onDayChange: (day: number) => void;\n}\n\nconst MONTHS = [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n];\n\nfunction getDaysInMonth(year: number, month: number): number {\n return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n}\n\nexport function DrawerStepDate({\n selectedYear,\n selectedMonth,\n selectedDay,\n onYearChange,\n onMonthChange,\n onDayChange,\n}: DrawerStepDateProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n const today = useMemo(() => new Date(), []);\n const currentYear = today.getUTCFullYear();\n const currentMonth = today.getUTCMonth();\n const currentDay = today.getUTCDate();\n const availableYears = useMemo(\n () => [currentYear, currentYear + 1, currentYear + 2],\n [currentYear],\n );\n\n const isMonthDisabled = (monthIndex: number): boolean => {\n if (selectedYear < currentYear) return true;\n if (selectedYear > currentYear) return false;\n return monthIndex < currentMonth;\n };\n\n const daysInSelectedMonth =\n selectedMonth == null ? 31 : getDaysInMonth(selectedYear, selectedMonth);\n\n const isDayDisabled = (day: number): boolean => {\n if (selectedMonth == null) return true;\n if (day > getDaysInMonth(selectedYear, selectedMonth)) return true;\n if (selectedYear < currentYear) return true;\n if (selectedYear > currentYear) return false;\n if (selectedMonth > currentMonth) return false;\n if (selectedMonth < currentMonth) return true;\n return day < currentDay;\n };\n\n return (\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n <div className=\"mt-2\">\n <h3 className=\"text-foreground text-sm font-bold\">\n {t(\"bundle_select_new_bill_date\")}\n </h3>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n {t(\"bundle_select_new_bill_date_description\")}\n </p>\n </div>\n\n <div className=\"mt-6\">\n <h4 className=\"text-foreground mb-3 text-xs font-bold\">\n {t(\"bundle_year\")}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {availableYears.map((year) => {\n const isActive = selectedYear === year;\n return (\n <button\n key={year}\n type=\"button\"\n onClick={() => onYearChange(year)}\n className={`rounded-lg px-3 py-2.5 text-xs font-semibold transition-all ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"text-foreground ring-border hover:ring-foreground/20 bg-transparent ring-1\"\n }`}\n >\n {year}\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"mt-6\">\n <h4 className=\"text-foreground mb-3 text-xs font-bold\">\n {t(\"bundle_month\")}\n </h4>\n <div className=\"grid grid-cols-4 gap-2\">\n {MONTHS.map((month, index) => {\n const isActive = selectedMonth === index;\n const disabled = isMonthDisabled(index);\n return (\n <button\n key={month}\n type=\"button\"\n disabled={disabled}\n onClick={() => onMonthChange(index)}\n className={`rounded-lg px-3 py-2.5 text-xs font-semibold transition-all ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"text-foreground ring-border hover:ring-foreground/20 bg-transparent ring-1\"\n } ${disabled ? \"cursor-not-allowed opacity-40\" : \"\"}`}\n >\n {month}\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"mt-6\">\n <h4 className=\"text-foreground mb-3 text-xs font-bold\">\n {t(\"bundle_day\")}\n </h4>\n <div className=\"grid grid-cols-8 gap-1.5\">\n {Array.from({ length: daysInSelectedMonth }, (_, i) => i + 1).map(\n (day) => {\n const isActive = selectedDay === day;\n const disabled = isDayDisabled(day);\n return (\n <button\n key={day}\n type=\"button\"\n disabled={disabled}\n onClick={() => onDayChange(day)}\n className={`rounded-lg py-2 text-xs font-semibold transition-all ${\n isActive\n ? \"bg-primary text-primary-foreground\"\n : \"text-foreground ring-border hover:ring-foreground/20 bg-transparent ring-1\"\n } ${disabled ? \"cursor-not-allowed opacity-40\" : \"\"}`}\n >\n {day}\n </button>\n );\n },\n )}\n </div>\n </div>\n </div>\n );\n}\n","import type { JSX } from \"react\";\nimport { Check } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { formatLongDate } from \"../portal-subscriptions-list-helpers\";\n\ninterface DrawerStepAddressProps {\n addresses: fluidPay.CustomerAddress[];\n selectedAddressId: number | null;\n onAddressSelect: (id: number) => void;\n onAddAddress: () => void;\n formattedSelectedDate: string | null;\n}\n\nexport function DrawerStepAddress({\n addresses,\n selectedAddressId,\n onAddressSelect,\n onAddAddress,\n formattedSelectedDate,\n}: DrawerStepAddressProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n const hasFlaggedDefault = addresses.some((a) => a.default);\n return (\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n <div className=\"mt-2\">\n <h3 className=\"text-foreground text-sm font-bold\">\n {t(\"bundle_select_address\")}\n </h3>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n {t(\"bundle_select_address_description\")}\n </p>\n </div>\n\n {formattedSelectedDate && (\n <div className=\"bg-muted text-muted-foreground mt-4 rounded-lg px-4 py-2.5 text-xs\">\n {t(\"bundle_selected_bill_date\")}{\" \"}\n <span className=\"text-foreground font-semibold\">\n {formatLongDate(formattedSelectedDate)}\n </span>\n </div>\n )}\n\n <div className=\"mt-4 space-y-2\" role=\"radiogroup\">\n {addresses.map((address, index) => {\n const isSelected = selectedAddressId === address.id;\n const isDefault =\n address.default || (!hasFlaggedDefault && index === 0);\n return (\n <button\n key={address.id}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => onAddressSelect(address.id)}\n className={`flex h-auto w-full cursor-pointer items-start gap-3 rounded-2xl p-4 text-left transition-all ${\n isSelected\n ? \"ring-primary bg-muted ring-2\"\n : \"ring-border hover:ring-foreground/20 ring-1\"\n }`}\n >\n <div className=\"pt-0.5\">\n <div\n className={`flex size-5 items-center justify-center rounded-full transition-colors ${\n isSelected ? \"bg-primary\" : \"ring-foreground/30 ring-2\"\n }`}\n >\n {isSelected && (\n <Check\n className=\"text-primary-foreground size-3\"\n strokeWidth={3}\n />\n )}\n </div>\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {address.name && (\n <p className=\"text-foreground truncate text-xs font-bold\">\n {address.name}\n </p>\n )}\n {isDefault && (\n <span className=\"text-foreground ring-border rounded-full bg-transparent px-2 py-0.5 text-xs font-bold ring-1\">\n {t(\"bundle_default_badge\")}\n </span>\n )}\n </div>\n <p className=\"text-muted-foreground mt-0.5 truncate text-xs\">\n {address.address1}\n </p>\n <p className=\"text-muted-foreground truncate text-xs\">\n {[address.city, address.state].filter(Boolean).join(\", \")}{\" \"}\n {address.postal_code}\n </p>\n </div>\n </button>\n );\n })}\n </div>\n\n <div className=\"mt-4 text-right\">\n <button\n type=\"button\"\n onClick={onAddAddress}\n className=\"text-foreground inline-flex items-center text-xs font-bold underline-offset-2 hover:underline\"\n >\n {t(\"bundle_add_new_address\")}\n </button>\n </div>\n </div>\n );\n}\n","import { useMemo, type JSX } from \"react\";\nimport { Check, CreditCard } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { isPaymentMethodUsable } from \"./payment-utils\";\n\ninterface DrawerStepPaymentProps {\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n selectedPaymentMethodId: number | null;\n onPaymentMethodSelect: (id: number) => void;\n onAddPaymentMethod: () => void;\n}\n\nexport function DrawerStepPayment({\n paymentMethods,\n selectedPaymentMethodId,\n onPaymentMethodSelect,\n onAddPaymentMethod,\n}: DrawerStepPaymentProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n // Filter to usable + sort default-first.\n const usable = useMemo(() => {\n const filtered = paymentMethods.filter(isPaymentMethodUsable);\n const defaultIdx = filtered.findIndex((pm) => pm.default);\n if (defaultIdx <= 0) return filtered;\n const defaultCard = filtered[defaultIdx];\n if (!defaultCard) return filtered;\n return [defaultCard, ...filtered.filter((_, i) => i !== defaultIdx)];\n }, [paymentMethods]);\n\n return (\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">\n <div className=\"mt-2\">\n <h3 className=\"text-foreground text-sm font-bold\">\n {t(\"bundle_select_payment\")}\n </h3>\n <p className=\"text-muted-foreground mt-1 text-xs\">\n {t(\"bundle_select_payment_description\")}\n </p>\n </div>\n\n {usable.length === 0 && (\n <div className=\"bg-muted text-muted-foreground mt-4 rounded-lg px-4 py-3 text-xs\">\n {t(\"bundle_no_usable_payment_methods\")}\n </div>\n )}\n\n <div className=\"mt-4 space-y-2\" role=\"radiogroup\">\n {usable.map((pm) => {\n const isSelected = selectedPaymentMethodId === pm.id;\n const brand =\n pm.details.card_brand ??\n pm.details.card_type ??\n pm.payment_type ??\n \"Card\";\n const lastFour = pm.details.last_four ?? \"••••\";\n const expiry =\n pm.details.exp_month != null && pm.details.exp_year != null\n ? `${t(\"bundle_card_expires\")} ${pm.details.exp_month}/${pm.details.exp_year}`\n : null;\n return (\n <button\n key={pm.id}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => onPaymentMethodSelect(pm.id)}\n className={`flex h-auto w-full cursor-pointer items-start gap-3 rounded-2xl p-4 text-left transition-all ${\n isSelected\n ? \"ring-primary bg-muted ring-2\"\n : \"ring-border hover:ring-foreground/20 ring-1\"\n }`}\n >\n <div className=\"pt-0.5\">\n <div\n className={`flex size-5 items-center justify-center rounded-full transition-colors ${\n isSelected ? \"bg-primary\" : \"ring-foreground/30 ring-2\"\n }`}\n >\n {isSelected && (\n <Check\n className=\"text-primary-foreground size-3\"\n strokeWidth={3}\n />\n )}\n </div>\n </div>\n\n {pm.details.logo_url ? (\n <img\n src={pm.details.logo_url}\n alt={brand}\n className=\"h-6 w-10 shrink-0 object-contain\"\n />\n ) : (\n <div className=\"bg-muted text-muted-foreground flex h-6 w-10 shrink-0 items-center justify-center rounded\">\n <CreditCard className=\"size-4\" strokeWidth={1.75} />\n </div>\n )}\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"text-foreground text-xs font-bold\">\n {brand} •••• {lastFour}\n </p>\n {pm.default && (\n <span className=\"text-foreground ring-border rounded-full bg-transparent px-2 py-0.5 text-xs font-bold ring-1\">\n {t(\"bundle_default_badge\")}\n </span>\n )}\n </div>\n {expiry && (\n <p className=\"text-muted-foreground mt-0.5 text-xs\">\n {expiry}\n </p>\n )}\n </div>\n </button>\n );\n })}\n </div>\n\n <div className=\"mt-4 text-right\">\n <button\n type=\"button\"\n onClick={onAddPaymentMethod}\n className=\"text-foreground inline-flex items-center text-xs font-bold underline-offset-2 hover:underline\"\n >\n {t(\"bundle_add_new_card\")}\n </button>\n </div>\n </div>\n );\n}\n","import { type JSX } from \"react\";\nimport { Sheet, SheetContent, SheetTitle } from \"@fluid-app/ui-primitives\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { useBundleForm } from \"./use-bundle-form\";\nimport { DrawerStepTabs } from \"./DrawerStepTabs\";\nimport { DrawerStepSelect } from \"./DrawerStepSelect\";\nimport { DrawerStepDate } from \"./DrawerStepDate\";\nimport { DrawerStepAddress } from \"./DrawerStepAddress\";\nimport { DrawerStepPayment } from \"./DrawerStepPayment\";\nimport type { Step } from \"./types\";\n\nexport interface BundleSubscriptionsDrawerProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n subscriptions: subscriptions.SubscriptionListItem[];\n addresses: fluidPay.CustomerAddress[];\n paymentMethods: fluidPay.CustomerPaymentMethod[];\n defaultAddressId?: number | null;\n defaultPaymentMethodId?: number | null;\n onAddAddress: () => void;\n onAddPaymentMethod: () => void;\n onSubmit: (params: {\n subscription_tokens: string[];\n next_bill_date: string;\n address_id: number;\n payment_method_id: number;\n }) => Promise<void>;\n isSubmitting?: boolean;\n}\n\nexport function BundleSubscriptionsDrawer({\n open,\n onOpenChange,\n subscriptions: subscriptionList,\n addresses,\n paymentMethods,\n defaultAddressId,\n defaultPaymentMethodId,\n onAddAddress,\n onAddPaymentMethod,\n onSubmit,\n isSubmitting,\n}: BundleSubscriptionsDrawerProps): JSX.Element {\n const { t } = useSubscriptionsTranslation();\n const form = useBundleForm({\n addresses,\n paymentMethods,\n defaultAddressId,\n defaultPaymentMethodId,\n });\n\n const handleClose = () => onOpenChange(false);\n\n const handleNext = () => {\n if (form.step < 4) form.setStep((form.step + 1) as Step);\n };\n\n const handleBack = () => {\n if (form.step === 1) handleClose();\n else form.setStep((form.step - 1) as Step);\n };\n\n const handleSubmit = async () => {\n if (\n !form.canProceedFromStep1 ||\n !form.canProceedFromStep2 ||\n !form.canProceedFromStep3 ||\n !form.canProceedFromStep4 ||\n form.formattedDate == null ||\n form.selectedAddressId == null ||\n form.selectedPaymentMethodId == null\n ) {\n return;\n }\n await onSubmit({\n subscription_tokens: Array.from(form.selectedTokens),\n next_bill_date: form.formattedDate,\n address_id: form.selectedAddressId,\n payment_method_id: form.selectedPaymentMethodId,\n });\n };\n\n const nextDisabled =\n (form.step === 1 && !form.canProceedFromStep1) ||\n (form.step === 2 && !form.canProceedFromStep2) ||\n (form.step === 3 && !form.canProceedFromStep3);\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent\n side=\"right\"\n className=\"bg-background flex h-full w-full flex-col gap-0 p-0 sm:max-w-md\"\n >\n {/* Header */}\n <div className=\"border-border flex items-center justify-between border-b px-6 py-4\">\n <SheetTitle className=\"text-foreground text-base font-bold\">\n {t(\"bundle_subscriptions\")}\n </SheetTitle>\n {/* SheetContent already renders its own close (X) button via the shadcn primitive. */}\n </div>\n\n {/* Step indicator */}\n <DrawerStepTabs\n step={form.step}\n onStepClick={form.setStep}\n canProceedFromStep1={form.canProceedFromStep1}\n canProceedFromStep2={form.canProceedFromStep2}\n canProceedFromStep3={form.canProceedFromStep3}\n />\n\n {/* Active step body */}\n {form.step === 1 && (\n <DrawerStepSelect\n subscriptions={subscriptionList}\n selectedTokens={form.selectedTokens}\n onToggle={form.toggleToken}\n />\n )}\n {form.step === 2 && (\n <DrawerStepDate\n selectedYear={form.selectedYear}\n selectedMonth={form.selectedMonth}\n selectedDay={form.selectedDay}\n onYearChange={form.setYear}\n onMonthChange={form.setMonth}\n onDayChange={form.setDay}\n />\n )}\n {form.step === 3 && (\n <DrawerStepAddress\n addresses={addresses}\n selectedAddressId={form.selectedAddressId}\n onAddressSelect={form.setSelectedAddressId}\n onAddAddress={onAddAddress}\n formattedSelectedDate={form.formattedDate}\n />\n )}\n {form.step === 4 && (\n <DrawerStepPayment\n paymentMethods={paymentMethods}\n selectedPaymentMethodId={form.selectedPaymentMethodId}\n onPaymentMethodSelect={form.setSelectedPaymentMethodId}\n onAddPaymentMethod={onAddPaymentMethod}\n />\n )}\n\n {/* Footer */}\n <div className=\"border-border flex items-center justify-between gap-3 border-t px-6 py-4\">\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"text-foreground ring-border hover:bg-muted rounded-lg bg-transparent px-6 py-2.5 text-xs font-bold ring-1 transition-all\"\n >\n {form.step === 1 ? t(\"bundle_done\") : t(\"bundle_back\")}\n </button>\n {form.step < 4 ? (\n <button\n type=\"button\"\n onClick={handleNext}\n disabled={nextDisabled}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 rounded-lg px-6 py-2.5 text-xs font-bold transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {t(\"next\")}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!form.canProceedFromStep4 || isSubmitting}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 inline-flex min-w-[140px] items-center justify-center rounded-lg px-6 py-2.5 text-xs font-bold transition-all disabled:cursor-not-allowed disabled:opacity-40\"\n >\n {isSubmitting ? (\n <span className=\"border-primary-foreground size-5 animate-spin rounded-full border-2 border-t-transparent\" />\n ) : (\n t(\"bundle_create\")\n )}\n </button>\n )}\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n","import { useCallback, useMemo, useState } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport { isApiError } from \"@fluid-app/api-client-core\";\nimport {\n AddressFormDialog,\n CreditCardFormDialog,\n type CreditCardFormSubmitData,\n} from \"@fluid-app/profile-ui\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport {\n useBundles,\n useCreateBundle,\n useInfiniteSubscriptions,\n useUpdateSubscriptionInfo,\n} from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { TOKEN_PROVIDER_VGS } from \"@fluid-app/portal-core/pay-types\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { payKeys, storeKeys } from \"../account/query-keys\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport { PortalSubscriptionsList } from \"./subscriptions/PortalSubscriptionsList\";\nimport { BundleSubscriptionsDrawer } from \"./subscriptions/bundle-drawer/BundleSubscriptionsDrawer\";\nimport { mapStatusKindOnly } from \"./subscriptions/portal-subscriptions-list-helpers\";\nimport { useStore } from \"../hooks/use-store\";\n\ninterface SubscriptionsListScreenProps {\n customerId: number | undefined;\n isLoadingCustomer: boolean;\n onToast?: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\n// AddressFormDialog and CreditCardFormDialog accept their own free-form\n// translation function. Their label set is closed and not part of the\n// subscriptions dictionary, so we inline a small map and Title-Case any\n// unknown key (mirrors the pattern in PortalSubscriptionShippingAddressSection).\nconst ADDRESS_DIALOG_LABELS: Record<string, string> = {\n add_an_address: \"Add an Address\",\n add_address: \"Add Address\",\n edit_address: \"Edit Address\",\n delete_address: \"Delete Address\",\n delete_address_message:\n \"Are you sure you want to delete this address? This action cannot be undone.\",\n delete: \"Delete\",\n cancel: \"Cancel\",\n country: \"Country\",\n name: \"Name\",\n address_line_1: \"Address Line 1\",\n address_line_2: \"Apartment, suite, etc.\",\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 select_an_option: \"Select an option\",\n set_as_default_address: \"Set as default address\",\n save_address: \"Save Address\",\n deleting: \"Deleting…\",\n tap_to_confirm: \"Tap to confirm\",\n add_credit_card: \"Add Credit Card\",\n add_billing_address: \"Add billing address\",\n billing_address: \"Billing Address\",\n same_as_shipping: \"Same as shipping address\",\n use_a_different_address: \"Use a different address\",\n set_as_default_payment_method: \"Set as default payment method\",\n save_card: \"Save Card\",\n saving: \"Saving...\",\n securing: \"Loading secure form...\",\n};\n\nfunction addressDialogT(key: string): string {\n return (\n ADDRESS_DIALOG_LABELS[key] ??\n key\n .split(\"_\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \")\n );\n}\n\nfunction mapToFluidPayAddress(raw: PayAddress): fluidPay.CustomerAddress {\n return {\n id: raw.id,\n address1: raw.street1,\n address2: raw.street2,\n city: raw.city,\n country_code: raw.country,\n default: raw.default,\n name: raw.name,\n postal_code: raw.zip,\n state: raw.state,\n subdivision_code: null,\n };\n}\n\nfunction SubscriptionsListScreenInner({\n customerId,\n isLoadingCustomer,\n onToast,\n}: SubscriptionsListScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n const queryClient = useQueryClient();\n const payApi = usePayApi();\n const countriesApi = useCountriesApi();\n const { t } = useSubscriptionsTranslation();\n const { t: profileT } = useProfileTranslation();\n const { config } = useFluidContext();\n const { locale } = useActiveLocale();\n\n // Company-level bundling feature flag from the portal-tenant store endpoint.\n // The Rails BFF returns 422 on bundle endpoints when this is false, so we\n // hide every bundle entry point (CTA, drawer, list cards) rather than show\n // controls that are guaranteed to fail.\n const { data: store } = useStore();\n const bundlingEnabled = !!store?.bundle_subscriptions_enabled;\n\n const { data: addresses = [] } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: !!customerId && !isLoadingCustomer,\n });\n\n const { data: paymentMethods = [] } = 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: !!customerId && !isLoadingCustomer,\n });\n\n // Re-call useInfiniteSubscriptions here so the drawer can see the same flat\n // list without prop-drilling. TanStack Query dedupes the network request,\n // so this is just a cache-read after PortalSubscriptionsList has fetched.\n const { data: subscriptionsData } = useInfiniteSubscriptions(\n { customerId, limit: 12 },\n { enabled: !!customerId && !isLoadingCustomer },\n );\n const subscriptionsList = useMemo(\n () => subscriptionsData?.pages.flatMap((p) => p.subscriptions) ?? [],\n [subscriptionsData],\n );\n\n // Only active/paused/pending/past-due, currently un-bundled subs can be\n // bundled. Cancelled subs have no future billing for the bundler to align,\n // and already-bundled subs would re-trigger bundler.rb's composite-key\n // grouping rather than create a fresh group.\n const bundleableSubscriptions = useMemo(\n () =>\n subscriptionsList.filter(\n (s) =>\n mapStatusKindOnly(s.status) !== \"cancelled\" &&\n (s.bundled_subscriptions?.length ?? 0) === 0,\n ),\n [subscriptionsList],\n );\n\n // Authoritative source for runtime bundle groupings — the backend recomputes\n // group membership at request time from `bundler.rb`'s composite key\n // (customer + address + volume_rep + next_bill_date + digital). The list\n // component picks out `subscription_count > 1` for actual bundle cards.\n const { data: bundlesData } = useBundles({\n enabled: !!customerId && !isLoadingCustomer && bundlingEnabled,\n });\n\n // Drawer + dialog state.\n const [bundleDrawerOpen, setBundleDrawerOpen] = useState(false);\n const [bundleDrawerKey, setBundleDrawerKey] = useState(0);\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 // `isBundling` covers the FULL handleBundle async span (createBundle +\n // per-token payment-method PUT loop), not just createBundle.isPending.\n // Without this, the submit button would re-enable after createBundle\n // resolved while the PUT loop was still in flight, allowing a duplicate\n // bundle creation request.\n const [isBundling, setIsBundling] = useState(false);\n\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(),\n queryFn: () => countriesApi.listCountries(),\n enabled: addressDialog.open || isAddCardOpen,\n });\n const countryOptions = useMemo(\n () =>\n [...(countriesData?.countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countriesData?.countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countriesData]);\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n const createAddressMutation = useMutation({\n // Detect a server-side dedupe (POST /api/pay/addresses returns the existing\n // record when an identical address already exists, ignoring `name`). Snapshot\n // the current id set before the request and compare against the returned id.\n mutationFn: async (body: fluidPay.CreateAddressBody) => {\n const existingIds = new Set(addresses.map((a) => a.id));\n const address = await payApi.createAddress({\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n default: body.address.default,\n },\n });\n return { address, deduped: existingIds.has(address.id) };\n },\n onSuccess: ({ deduped }) => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n if (deduped) {\n onToast?.(profileT(\"address_already_exists\"), \"warning\");\n } else {\n onToast?.(profileT(\"address_created\"), \"success\");\n }\n },\n onError: () => onToast?.(profileT(\"failed_to_create_address\"), \"error\"),\n });\n\n const addCreditCardMutation = useMutation({\n mutationFn: (data: CreditCardFormSubmitData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n token_provider: TOKEN_PROVIDER_VGS,\n exp_month: data.payment_method.exp_month,\n exp_year: data.payment_method.exp_year,\n cvv_token: data.payment_method.cvv_token,\n card_holder: data.payment_method.card_holder,\n default: data.set_as_default,\n },\n billing_address_id: data.billing_address_id,\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.paymentMethods.all });\n onToast?.(\"Payment method added\", \"success\");\n },\n onError: () => onToast?.(\"Failed to add payment method\", \"error\"),\n });\n\n const createBundle = useCreateBundle();\n const updateSubscription = useUpdateSubscriptionInfo();\n\n const handleBundleClick = () => {\n setBundleDrawerKey((k) => k + 1);\n setBundleDrawerOpen(true);\n };\n\n const handleBundle = async (params: {\n subscription_tokens: string[];\n next_bill_date: string;\n address_id: number;\n payment_method_id: number;\n }) => {\n if (isBundling) return;\n setIsBundling(true);\n try {\n await createBundle.mutateAsync({\n subscription_tokens: params.subscription_tokens,\n next_bill_date: params.next_bill_date,\n address_id: params.address_id,\n });\n } catch (err) {\n // Surface the BFF's validation message (e.g. \"cannot bundle a cancelled\n // subscription\") instead of a generic \"Please try again\" — FetchClient\n // already extracts `data.message` from the JSON body into ApiError.\n // Only trust the message when it's a 4xx ApiError (real validation); on\n // 5xx or non-ApiError throws, fall through to the localized fallback so\n // users never see FetchClient's \"POST request failed\" default.\n const bffMessage =\n isApiError(err) && err.status >= 400 && err.status < 500\n ? err.message\n : undefined;\n const message = bffMessage ?? t(\"bundle_failed\");\n onToast?.(message, \"error\");\n setIsBundling(false);\n return;\n }\n\n // PUT-loop workaround: the BFF create endpoint accepts subscription_tokens,\n // next_bill_date, address_id, and volume_rep_id only — it does NOT honor\n // payment_method_id. Push the chosen payment method onto each member sub\n // via the existing per-subscription update endpoint. Settle all in\n // parallel so a single 4xx doesn't block the others.\n const results = await Promise.allSettled(\n params.subscription_tokens.map((token) =>\n updateSubscription.mutateAsync({\n subscriptionToken: token,\n body: { payment_method_id: params.payment_method_id },\n }),\n ),\n );\n const failedCount = results.filter((r) => r.status === \"rejected\").length;\n if (failedCount === 0) {\n onToast?.(t(\"bundle_succeeded\"), \"success\");\n } else {\n onToast?.(\n t(\"bundle_partial_payment_failure\", { n: String(failedCount) }),\n \"warning\",\n );\n }\n setBundleDrawerOpen(false);\n setIsBundling(false);\n };\n\n const goToDetail = (token: string) => navigate(`subscriptions/${token}`);\n\n return (\n <>\n <PortalSubscriptionsList\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n onSubscriptionClick={goToDetail}\n onResume={(sub) => goToDetail(sub.subscription_token)}\n onBundleClick={\n bundlingEnabled && bundleableSubscriptions.length >= 2\n ? handleBundleClick\n : undefined\n }\n bundles={bundlingEnabled ? bundlesData : undefined}\n />\n\n {bundlingEnabled && (\n <BundleSubscriptionsDrawer\n key={bundleDrawerKey}\n open={bundleDrawerOpen}\n onOpenChange={setBundleDrawerOpen}\n subscriptions={bundleableSubscriptions}\n addresses={addresses}\n paymentMethods={paymentMethods}\n defaultAddressId={\n addresses.find((a) => a.default)?.id ?? addresses[0]?.id ?? null\n }\n defaultPaymentMethodId={\n paymentMethods.find((pm) => pm.default)?.id ??\n paymentMethods[0]?.id ??\n null\n }\n onAddAddress={() => setAddressDialog({ open: true, selected: null })}\n onAddPaymentMethod={() => setIsAddCardOpen(true)}\n onSubmit={handleBundle}\n isSubmitting={isBundling}\n />\n )}\n\n <AddressFormDialog\n isOpen={addressDialog.open}\n onClose={() => setAddressDialog({ open: false, selected: null })}\n selectedAddress={addressDialog.selected}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ??\n config.countryIso ??\n \"US\"\n }\n languageIso={locale}\n t={addressDialogT}\n onSubmit={async (formData) => {\n try {\n await createAddressMutation.mutateAsync(formData);\n setAddressDialog({ open: false, selected: null });\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={createAddressMutation.isPending}\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={addressDialogT(\"address_line_1\")}\n />\n )}\n />\n\n <CreditCardFormDialog\n isOpen={isAddCardOpen}\n onClose={() => setIsAddCardOpen(false)}\n t={addressDialogT}\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 jwt=\"\"\n savedAddresses={addresses}\n defaultBillingAddressId={addresses.find((a) => a.default)?.id}\n renderAddressFormDialog={({ isOpen, onClose, onAddressCreated }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={null}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ??\n config.countryIso ??\n \"US\"\n }\n languageIso={locale}\n t={addressDialogT}\n onSubmit={async (formData) => {\n try {\n const { address } =\n await createAddressMutation.mutateAsync(formData);\n onAddressCreated(mapToFluidPayAddress(address));\n } catch {\n // toast surfaced via onError\n }\n }}\n isSubmitting={createAddressMutation.isPending}\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={addressDialogT(\"address_line_1\")}\n />\n )}\n />\n )}\n />\n </>\n );\n}\n\nexport function SubscriptionsListScreen(\n props: SubscriptionsListScreenProps,\n): React.JSX.Element {\n const payApi = usePayApi();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <ProfileTranslationBridge>\n <SubscriptionsListScreenInner {...props} />\n </ProfileTranslationBridge>\n </FluidPayCoreProvider>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n AlertDialog,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@fluid-app/ui-primitives\";\n\nconst PAUSE_MONTH_OPTIONS = [1, 2, 3] as const;\nexport type PauseMonths = (typeof PAUSE_MONTH_OPTIONS)[number];\n\nexport interface CancelSubscriptionDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: () => void | Promise<unknown>;\n onPauseInstead: (months: PauseMonths) => void;\n errorMessage?: string;\n}\n\nexport function CancelSubscriptionDialog({\n open,\n onOpenChange,\n onConfirm,\n onPauseInstead,\n errorMessage,\n}: CancelSubscriptionDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [isPending, setIsPending] = useState(false);\n const [selectedMonths, setSelectedMonths] = useState<PauseMonths | null>(\n null,\n );\n\n useEffect(() => {\n if (!open) setSelectedMonths(null);\n }, [open]);\n\n const handleConfirm = async () => {\n const result = onConfirm();\n if (!(result instanceof Promise)) {\n onOpenChange(false);\n return;\n }\n setIsPending(true);\n try {\n await result;\n onOpenChange(false);\n } catch (error) {\n // Leave the dialog open so the parent can surface errorMessage inline.\n console.error(\"CancelSubscriptionDialog: action rejected\", error);\n } finally {\n setIsPending(false);\n }\n };\n\n const handlePause = () => {\n if (!selectedMonths) return;\n onPauseInstead(selectedMonths);\n };\n\n return (\n <AlertDialog\n open={open}\n onOpenChange={(v) => !isPending && onOpenChange(v)}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{t(\"cancel_dialog_title\")}</AlertDialogTitle>\n <AlertDialogDescription>\n {t(\"cancel_dialog_description\")}\n </AlertDialogDescription>\n </AlertDialogHeader>\n\n <div className=\"border-border space-y-2 rounded-md border p-3\">\n <p className=\"text-foreground text-sm font-medium\">\n {t(\"cancel_dialog_pause_question\")}\n </p>\n <Label\n htmlFor=\"cancel-pause-months\"\n className=\"text-foreground text-sm font-semibold\"\n >\n {t(\"pause_for\")}\n </Label>\n <Select\n value={selectedMonths ? String(selectedMonths) : undefined}\n onValueChange={(value) =>\n setSelectedMonths(value ? (Number(value) as PauseMonths) : null)\n }\n disabled={isPending}\n >\n <SelectTrigger id=\"cancel-pause-months\" className=\"w-full\">\n <SelectValue placeholder={t(\"select_duration\")} />\n </SelectTrigger>\n <SelectContent>\n {PAUSE_MONTH_OPTIONS.map((months) => (\n <SelectItem key={months} value={String(months)}>\n {months === 1\n ? t(\"month_singular\", { count: String(months) })\n : t(\"month_plural\", { count: String(months) })}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n variant=\"outline\"\n onClick={handlePause}\n disabled={isPending || !selectedMonths}\n className=\"w-full\"\n >\n {t(\"cancel_dialog_pause_button\")}\n </Button>\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <AlertDialogFooter className=\"flex-col gap-2 sm:flex-row sm:justify-end\">\n <AlertDialogCancel disabled={isPending}>\n {t(\"cancel_dialog_cancel_button\")}\n </AlertDialogCancel>\n {/*\n Plain Button rather than AlertDialogAction: Action auto-closes\n the dialog after onClick, which races handleConfirm's async\n path — the dialog would dismiss before the mutation settled,\n the spinner would never show, and an inline errorMessage would\n never be visible. handleConfirm calls onOpenChange itself on\n success and intentionally leaves the dialog open on rejection.\n */}\n <Button\n variant=\"destructive\"\n onClick={handleConfirm}\n disabled={isPending}\n autoFocus\n >\n {isPending ? \"...\" : t(\"cancel_dialog_confirm_button\")}\n </Button>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { calculateResumeDate } from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Label,\n} from \"@fluid-app/ui-primitives\";\nimport { format } from \"date-fns\";\n\ntype PauseType = \"indefinite\" | \"order_count\";\n\nexport type PauseSubscriptionSelection =\n | { type: \"indefinite\" }\n | { type: \"order_count\"; numberOfOrders: number };\n\nexport interface PauseSubscriptionDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: (selection: PauseSubscriptionSelection) => void;\n isLoading?: boolean;\n errorMessage?: string;\n currentNextBillDate?: string | null;\n billingInterval?: number;\n billingIntervalUnit?: string;\n}\n\nexport function PauseSubscriptionDialog({\n open,\n onOpenChange,\n onConfirm,\n isLoading,\n errorMessage,\n currentNextBillDate,\n billingInterval = 1,\n billingIntervalUnit = \"month\",\n}: PauseSubscriptionDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [pauseType, setPauseType] = useState<PauseType>(\"indefinite\");\n const [selectedOrderCount, setSelectedOrderCount] = useState<number | null>(\n null,\n );\n\n const orderCountOptions = Array.from({ length: 99 }, (_, i) => i + 1);\n\n const calculatedResumeDate =\n selectedOrderCount && currentNextBillDate\n ? calculateResumeDate(\n billingInterval,\n billingIntervalUnit,\n selectedOrderCount,\n currentNextBillDate,\n )\n : null;\n\n // Reset selections whenever the dialog opens so stale state doesn't\n // leak across invocations.\n useEffect(() => {\n if (!open) return;\n setPauseType(\"indefinite\");\n setSelectedOrderCount(null);\n }, [open]);\n\n const handleConfirm = () => {\n if (pauseType === \"indefinite\") {\n onConfirm({ type: \"indefinite\" });\n return;\n }\n if (pauseType === \"order_count\" && selectedOrderCount) {\n onConfirm({\n type: \"order_count\",\n numberOfOrders: selectedOrderCount,\n });\n }\n };\n\n const handleDismiss = (next: boolean) => {\n if (!next) {\n setPauseType(\"indefinite\");\n setSelectedOrderCount(null);\n }\n onOpenChange(next);\n };\n\n const statusMessage = (() => {\n if (pauseType === \"indefinite\") {\n return (\n <>\n {t(\"pause_indefinite_message_prefix\")}{\" \"}\n <strong>{t(\"pause_indefinite_message_resume\")}</strong>{\" \"}\n {t(\"pause_indefinite_message_suffix\")}\n </>\n );\n }\n if (!selectedOrderCount) return null;\n const displayDate = calculatedResumeDate\n ? format(calculatedResumeDate, \"MMMM d, yyyy\")\n : \"a future date\";\n return (\n <>\n {t(\"pause_resume_message_prefix\")}{\" \"}\n <span className=\"font-semibold\">{displayDate}</span>\n {t(\"pause_resume_message_suffix\")}\n </>\n );\n })();\n\n const isActionDisabled = pauseType === \"order_count\" && !selectedOrderCount;\n\n return (\n <Dialog open={open} onOpenChange={handleDismiss}>\n <DialogContent\n aria-describedby=\"pause-subscription-dialog-description\"\n className=\"rounded\"\n >\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {t(\"pause_dialog_title\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p\n id=\"pause-subscription-dialog-description\"\n className=\"text-muted-foreground text-sm\"\n >\n {t(\"pause_dialog_description\")}\n </p>\n\n <div className=\"space-y-4\">\n {/* Pause Indefinitely */}\n <div className=\"flex items-center gap-x-2\">\n <input\n id=\"pause-indefinitely\"\n type=\"radio\"\n checked={pauseType === \"indefinite\"}\n onChange={() => setPauseType(\"indefinite\")}\n className=\"border-border accent-primary size-4 focus:ring-0\"\n />\n <Label\n htmlFor=\"pause-indefinitely\"\n className=\"text-foreground cursor-pointer text-sm font-medium\"\n >\n {t(\"pause_indefinitely\")}\n </Label>\n </div>\n\n {/* Pause for Number of Orders */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-x-2\">\n <input\n id=\"pause-order-count\"\n type=\"radio\"\n checked={pauseType === \"order_count\"}\n onChange={() => setPauseType(\"order_count\")}\n className=\"border-border accent-primary size-4 focus:ring-0\"\n />\n <Label\n htmlFor=\"pause-order-count\"\n className=\"text-foreground cursor-pointer text-sm font-medium\"\n >\n {t(\"pause_for_orders\")}\n </Label>\n </div>\n\n {pauseType === \"order_count\" && (\n <div className=\"ml-6 space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"choose_orders_to_skip\")}\n </Label>\n <select\n value={selectedOrderCount ?? \"\"}\n onChange={(e) =>\n setSelectedOrderCount(Number(e.target.value))\n }\n className=\"border-input bg-background focus:border-ring focus:ring-ring h-10 w-full rounded-md border px-3 py-2 text-sm focus:ring-2 focus:outline-hidden\"\n >\n <option value=\"\" disabled>\n {t(\"select\")}\n </option>\n {orderCountOptions.map((count) => (\n <option key={count} value={count}>\n {count}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n\n {/* Status Message */}\n {statusMessage && (\n <div className=\"text-muted-foreground text-xs\">\n {statusMessage}\n </div>\n )}\n </div>\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between gap-x-2\">\n <Button\n variant=\"outline\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={() => handleDismiss(false)}\n >\n {t(\"pause_dialog_cancel\")}\n </Button>\n <Button\n type=\"button\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={handleConfirm}\n disabled={isActionDisabled || isLoading}\n >\n {isLoading ? (\n <div className=\"border-primary-foreground size-5 animate-spin rounded-full border-4 border-t-4 border-t-transparent\" />\n ) : (\n t(\"pause_dialog_action\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { parse } from \"date-fns\";\n\nconst ISO_DATE = \"yyyy-MM-dd\";\n\n/**\n * Parse an ISO date string as local midnight. Accepts either a bare\n * \"yyyy-MM-dd\" or a full ISO timestamp — both are sliced to the date\n * portion first so the result lands on the intended calendar day\n * regardless of the viewer's timezone.\n */\nexport function parseIsoDate(value: string): Date {\n return parse(value.slice(0, 10), ISO_DATE, new Date());\n}\n","import { useEffect, useState } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Button,\n Calendar,\n cn,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@fluid-app/ui-primitives\";\nimport { addDays, format } from \"date-fns\";\nimport { CalendarIcon } from \"lucide-react\";\nimport { parseIsoDate } from \"../lib/parse-iso-date\";\n\nexport interface ResumeSubscriptionDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: (nextBillDate: string) => void;\n isLoading?: boolean;\n errorMessage?: string;\n /** Seeds the calendar; must be in the future. Defaults to tomorrow. */\n defaultNextBillDate?: string | null;\n}\n\nexport function ResumeSubscriptionDialog({\n open,\n onOpenChange,\n onConfirm,\n isLoading,\n errorMessage,\n defaultNextBillDate,\n}: ResumeSubscriptionDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [selectedDate, setSelectedDate] = useState<Date | undefined>(undefined);\n const [calendarOpen, setCalendarOpen] = useState(false);\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const minDate = addDays(today, 1);\n\n // Seed selected date when the dialog opens.\n useEffect(() => {\n if (!open) return;\n if (defaultNextBillDate) {\n const seeded = parseIsoDate(defaultNextBillDate);\n setSelectedDate(seeded < minDate ? minDate : seeded);\n } else {\n setSelectedDate(minDate);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, defaultNextBillDate]);\n\n const handleConfirm = () => {\n if (!selectedDate) return;\n onConfirm(format(selectedDate, \"yyyy-MM-dd\"));\n };\n\n const handleDismiss = (next: boolean) => {\n if (!next) setSelectedDate(undefined);\n onOpenChange(next);\n };\n\n return (\n <Dialog open={open} onOpenChange={handleDismiss}>\n <DialogContent\n aria-describedby=\"resume-subscription-dialog-description\"\n className=\"rounded\"\n >\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {t(\"resume_dialog_title\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p\n id=\"resume-subscription-dialog-description\"\n className=\"text-muted-foreground text-left text-sm\"\n >\n {t(\"resume_dialog_description\")}\n </p>\n\n <div className=\"space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"resume_date\")}\n </Label>\n <Popover open={calendarOpen} onOpenChange={setCalendarOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground h-9 w-full justify-start border px-3 py-2 text-left font-normal\",\n !selectedDate &&\n \"text-muted-foreground hover:text-muted-foreground\",\n )}\n >\n {selectedDate ? (\n format(selectedDate, \"MM/dd/yyyy\")\n ) : (\n <span>{t(\"date_placeholder\")}</span>\n )}\n <CalendarIcon className=\"text-muted-foreground ml-auto size-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"bg-popover w-auto rounded-md border p-0 shadow-lg\"\n align=\"start\"\n sideOffset={4}\n style={{ zIndex: 9999 }}\n >\n <Calendar\n mode=\"single\"\n selected={selectedDate}\n onSelect={(date) => {\n setSelectedDate(date);\n setCalendarOpen(false);\n }}\n disabled={(date) => date < minDate}\n defaultMonth={selectedDate}\n modifiersStyles={{\n selected: {\n backgroundColor: \"var(--primary)\",\n color: \"var(--primary-foreground)\",\n },\n }}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n {selectedDate && (\n <p className=\"text-muted-foreground text-xs\">\n {t(\"resume_charge_message_prefix\")}{\" \"}\n <span className=\"font-semibold\">\n {format(selectedDate, \"MMMM d, yyyy\")}\n </span>\n {t(\"resume_charge_message_suffix\")}\n </p>\n )}\n </div>\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between gap-x-2\">\n <Button\n className=\"bg-muted text-foreground ring-border hover:bg-muted/80 h-10 min-w-[70px] rounded p-3 ring-1\"\n onClick={() => handleDismiss(false)}\n >\n {t(\"resume_dialog_cancel\")}\n </Button>\n <Button\n type=\"button\"\n className=\"bg-primary text-primary-foreground h-10 min-w-[70px] rounded p-3 hover:opacity-90 disabled:opacity-50\"\n onClick={handleConfirm}\n disabled={!selectedDate || isLoading}\n >\n {isLoading ? (\n <div className=\"border-primary-foreground size-5 animate-spin rounded-full border-4 border-t-4 border-t-transparent\" />\n ) : (\n t(\"resume_dialog_action\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Button,\n Calendar,\n cn,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Label,\n Popover,\n PopoverContent,\n PopoverTrigger,\n PortalContainerProvider,\n} from \"@fluid-app/ui-primitives\";\nimport {\n addDays,\n addMonths,\n addWeeks,\n addYears,\n format,\n isAfter,\n} from \"date-fns\";\nimport { CalendarIcon, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { parseIsoDate } from \"../lib/parse-iso-date\";\n\nexport interface OtherSubscriptionForBillDate {\n token: string;\n productTitle: string;\n nextBillDate: string | null;\n billingInterval: number;\n billingIntervalUnit: string;\n}\n\nfunction advanceByInterval(date: Date, interval: number, unit: string): Date {\n const step = Math.max(1, interval);\n switch (unit.toLowerCase()) {\n case \"day\":\n return addDays(date, step);\n case \"week\":\n return addWeeks(date, step);\n case \"year\":\n return addYears(date, step);\n case \"month\":\n default:\n return addMonths(date, step);\n }\n}\n\nconst SUBSCRIPTION_COLORS = [\n \"#3b82f6\",\n \"#f97316\",\n \"#10b981\",\n \"#a855f7\",\n \"#ec4899\",\n \"#eab308\",\n \"#14b8a6\",\n \"#ef4444\",\n \"#0ea5e9\",\n \"#84cc16\",\n];\n\n// Cap projection iterations per subscription so a daily-interval row can't\n// run away tens of thousands of times across the 2-year horizon. Sized for\n// a weekly cycle (~104 over two years) — covers the longest realistic\n// non-daily case without truncating dots for the rep.\nconst MAX_PROJECTIONS_PER_SUB = 104;\n\nexport interface EditBillDateDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: (nextBillDate: string) => void;\n isLoading?: boolean;\n errorMessage?: string;\n currentNextBillDate?: string | null;\n otherSubscriptions?: OtherSubscriptionForBillDate[];\n onNavigateToSubscription?: (token: string) => void;\n}\n\nexport function EditBillDateDialog({\n open,\n onOpenChange,\n onConfirm,\n isLoading,\n errorMessage,\n currentNextBillDate,\n otherSubscriptions,\n onNavigateToSubscription,\n}: EditBillDateDialogProps) {\n const { t } = useSubscriptionsTranslation();\n const [selectedDate, setSelectedDate] = useState<Date | undefined>(undefined);\n const [calendarOpen, setCalendarOpen] = useState(false);\n // Anchor the popover's portal inside the dialog so Safari doesn't\n // swallow clicks on the calendar — Radix renders the popover into\n // document.body by default, but Dialog applies pointer-events: none\n // to the body while open, which kills clicks on a body-portaled\n // popover in Safari/WebKit specifically.\n const [popoverContainer, setPopoverContainer] =\n useState<HTMLDivElement | null>(null);\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const minDate = addDays(today, 1);\n\n const subscriptionsWithColor = useMemo(\n () =>\n (otherSubscriptions ?? []).map((sub, idx) => ({\n ...sub,\n color: SUBSCRIPTION_COLORS[idx % SUBSCRIPTION_COLORS.length] as string,\n })),\n [otherSubscriptions],\n );\n\n const billingColorsByDate = useMemo<Map<string, string[]>>(() => {\n const m = new Map<string, string[]>();\n const horizon = addYears(new Date(), 2);\n for (const sub of subscriptionsWithColor) {\n if (!sub.nextBillDate) continue;\n let d = parseIsoDate(sub.nextBillDate);\n let count = 0;\n while (!isAfter(d, horizon) && count < MAX_PROJECTIONS_PER_SUB) {\n const key = format(d, \"yyyy-MM-dd\");\n const arr = m.get(key) ?? [];\n arr.push(sub.color);\n m.set(key, arr);\n d = advanceByInterval(d, sub.billingInterval, sub.billingIntervalUnit);\n count++;\n }\n }\n return m;\n }, [subscriptionsWithColor]);\n\n // Memoize the components map: react-day-picker uses each entry's identity\n // as the React element type for every day cell, so a fresh object every\n // render unmounts/remounts all visible cells (visible flicker, lost cell\n // state).\n const calendarComponents = useMemo(\n () => ({\n DayContent: ({ date }: { date: Date }) => {\n const key = format(date, \"yyyy-MM-dd\");\n const colors = billingColorsByDate.get(key) ?? [];\n return (\n <div className=\"flex h-full w-full flex-col items-center justify-center\">\n <span className=\"leading-none\">{date.getDate()}</span>\n {colors.length > 0 && (\n <div className=\"mt-0.5 flex items-center justify-center gap-0.5\">\n {colors.map((c, i) => (\n <span\n key={`${key}-${i}`}\n className=\"size-1 rounded-[1px]\"\n style={{ backgroundColor: c }}\n />\n ))}\n </div>\n )}\n </div>\n );\n },\n IconLeft: ({\n className: iconClassName,\n ...iconProps\n }: React.ComponentProps<typeof ChevronLeft>) => (\n <ChevronLeft className={cn(\"h-4 w-4\", iconClassName)} {...iconProps} />\n ),\n IconRight: ({\n className: iconClassName,\n ...iconProps\n }: React.ComponentProps<typeof ChevronRight>) => (\n <ChevronRight className={cn(\"h-4 w-4\", iconClassName)} {...iconProps} />\n ),\n }),\n [billingColorsByDate],\n );\n\n useEffect(() => {\n if (!open) return;\n if (currentNextBillDate) {\n const initial = parseIsoDate(currentNextBillDate);\n setSelectedDate(initial < minDate ? minDate : initial);\n } else {\n setSelectedDate(undefined);\n }\n // minDate derives from `new Date()` — intentionally excluded so this\n // only runs on open transitions.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, currentNextBillDate]);\n\n const handleConfirm = () => {\n if (!selectedDate) return;\n onConfirm(format(selectedDate, \"yyyy-MM-dd\"));\n };\n\n const handleDismiss = (next: boolean) => {\n if (!next) {\n setSelectedDate(undefined);\n }\n onOpenChange(next);\n };\n\n const previewDate = selectedDate\n ? format(selectedDate, \"MMMM d, yyyy\")\n : currentNextBillDate\n ? format(parseIsoDate(currentNextBillDate), \"MMMM d, yyyy\")\n : \"a future date\";\n\n return (\n <Dialog open={open} onOpenChange={handleDismiss}>\n <DialogContent\n aria-describedby=\"edit-bill-date-dialog-description\"\n className=\"rounded\"\n >\n <DialogHeader className=\"flex flex-row justify-between\">\n <DialogTitle className=\"text-md w-full text-left font-medium\">\n {t(\"edit_bill_date_title\")}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <p\n id=\"edit-bill-date-dialog-description\"\n className=\"text-muted-foreground text-sm\"\n >\n {t(\"edit_bill_date_description\")}\n </p>\n\n <div className=\"space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"next_bill_date_label\")}\n </Label>\n {/* Render the popover into a fixed-positioned overlay nested\n inside the dialog rather than document.body. This sidesteps\n the WebKit/Safari issue where Dialog's body-level\n pointer-events: none silently blocks clicks on a body-\n portaled popover. The fixed overlay is `inset-0` +\n `pointer-events-none` so it doesn't capture stray clicks\n or affect dialog layout — only the popover content\n (which sets its own pointer-events: auto) is interactive. */}\n <PortalContainerProvider container={popoverContainer}>\n <Popover open={calendarOpen} onOpenChange={setCalendarOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n className={cn(\n \"border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground h-9 w-full justify-start border px-3 py-2 text-left font-normal\",\n !selectedDate &&\n \"text-muted-foreground hover:text-muted-foreground\",\n )}\n >\n {selectedDate ? (\n format(selectedDate, \"MM/dd/yyyy\")\n ) : (\n <span>{t(\"date_placeholder\")}</span>\n )}\n <CalendarIcon className=\"text-muted-foreground ml-auto size-4\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"bg-popover pointer-events-auto z-[9999] w-auto rounded-md border p-0 shadow-lg\"\n align=\"start\"\n sideOffset={4}\n >\n <Calendar\n mode=\"single\"\n selected={selectedDate}\n onSelect={(date) => {\n setSelectedDate(date);\n setCalendarOpen(false);\n }}\n disabled={(date) => date < minDate}\n defaultMonth={\n selectedDate ??\n (currentNextBillDate\n ? parseIsoDate(currentNextBillDate)\n : undefined)\n }\n components={calendarComponents}\n initialFocus\n />\n </PopoverContent>\n </Popover>\n </PortalContainerProvider>\n </div>\n <div\n ref={setPopoverContainer}\n className=\"pointer-events-none fixed inset-0 z-[9998]\"\n aria-hidden={true}\n />\n\n {selectedDate && (\n <div className=\"text-muted-foreground text-xs\">\n {t(\"bill_date_preview_prefix\")}{\" \"}\n <span className=\"font-semibold\">{previewDate}</span>\n {t(\"bill_date_preview_suffix\")}\n </div>\n )}\n\n {subscriptionsWithColor.length > 0 && (\n <div className=\"space-y-2\">\n <Label className=\"text-foreground text-sm font-semibold\">\n {t(\"your_other_subscriptions\")}\n </Label>\n <div className=\"border-border max-h-40 overflow-auto rounded-md border\">\n <table className=\"w-full table-fixed text-sm\">\n <thead className=\"bg-muted text-muted-foreground sticky top-0\">\n <tr>\n <th className=\"w-6 p-2\" aria-label=\"Color\" />\n <th className=\"px-3 py-2 text-left font-medium\">\n {t(\"other_subs_product\")}\n </th>\n <th className=\"w-28 px-3 py-2 text-left font-medium\">\n {t(\"other_subs_bill_date\")}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-border divide-y\">\n {subscriptionsWithColor.map((sub) => (\n <tr key={sub.token}>\n <td className=\"p-2\">\n <span\n aria-hidden\n className=\"inline-block size-2.5 rounded-full\"\n style={{ backgroundColor: sub.color }}\n />\n </td>\n <td\n className=\"overflow-hidden px-3 py-2\"\n title={sub.productTitle}\n >\n {onNavigateToSubscription ? (\n <button\n type=\"button\"\n onClick={() => {\n onNavigateToSubscription(sub.token);\n handleDismiss(false);\n }}\n className=\"text-primary block w-full truncate text-left hover:underline\"\n >\n {sub.productTitle}\n </button>\n ) : (\n <span className=\"text-foreground block truncate\">\n {sub.productTitle}\n </span>\n )}\n </td>\n <td className=\"text-muted-foreground px-3 py-2 whitespace-nowrap\">\n {sub.nextBillDate\n ? format(\n parseIsoDate(sub.nextBillDate),\n \"MMM d, yyyy\",\n )\n : \"—\"}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n\n {errorMessage && (\n <p className=\"text-destructive text-left text-sm\">{errorMessage}</p>\n )}\n\n <DialogFooter>\n <div className=\"flex w-full flex-row justify-between gap-x-2\">\n <Button\n variant=\"outline\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={() => handleDismiss(false)}\n >\n {t(\"edit_bill_date_cancel\")}\n </Button>\n <Button\n type=\"button\"\n className=\"h-10 min-w-[70px] rounded p-3\"\n onClick={handleConfirm}\n disabled={!selectedDate || isLoading}\n >\n {isLoading ? (\n <div className=\"border-primary-foreground size-5 animate-spin rounded-full border-4 border-t-4 border-t-transparent\" />\n ) : (\n t(\"edit_bill_date_action\")\n )}\n </Button>\n </div>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import type { JSX } from \"react\";\nimport { cn } from \"../lib/cn\";\n\nconst STATUS_COLORS: Record<string, string> = {\n active: \"bg-green-100 text-green-800\",\n paused: \"bg-gray-100 text-gray-800\",\n cancelled: \"bg-red-100 text-red-800\",\n pending: \"bg-yellow-100 text-yellow-800\",\n inactive: \"bg-gray-100 text-gray-800\",\n disabled: \"bg-red-100 text-red-800\",\n past_due: \"bg-gray-100 text-gray-800\",\n};\n\nconst STATUS_DOT_COLORS: Record<string, string> = {\n active: \"bg-green-500\",\n paused: \"bg-gray-400\",\n cancelled: \"bg-red-500\",\n pending: \"bg-yellow-500\",\n inactive: \"bg-gray-400\",\n disabled: \"bg-red-500\",\n past_due: \"bg-gray-400\",\n};\n\nexport interface StatusPillProps {\n status: string | undefined | null;\n children: React.ReactNode;\n}\n\nexport function StatusPill({ status, children }: StatusPillProps): JSX.Element {\n const key = status?.toLowerCase() ?? \"\";\n const pillColor = STATUS_COLORS[key] ?? \"bg-gray-100 text-gray-800\";\n const dotColor = STATUS_DOT_COLORS[key] ?? \"bg-gray-400\";\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium\",\n pillColor,\n )}\n >\n <span className={cn(\"h-1.5 w-1.5 rounded-full\", dotColor)} />\n {children}\n </span>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport { Button } from \"@fluid-app/ui-primitives\";\nimport {\n CreditCard,\n Calendar,\n DollarSign,\n BadgeAlert,\n Wallet,\n RefreshCw,\n ShieldCheck,\n Receipt,\n Sparkles,\n CalendarClock,\n CircleDollarSign,\n Banknote,\n PiggyBank,\n X,\n} from \"lucide-react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { cn } from \"../lib/cn\";\n\nexport interface PastDueBannerProps {\n productTitle?: string | null;\n // Body copy is derived from these two fields:\n // next_retry_at null → \"payment failed, update your card\"\n // next_retry_at set, last_failed_at null → just queued (immediate retry, no\n // failure since the last reset)\n // next_retry_at set, last_failed_at set → previous attempt failed, retry\n // pending after the dunning backoff;\n // copy includes a bucketed time\n // estimate that absorbs the up-to-6h\n // RetryFailedPaymentsJob cron lag.\n // The \"Update your card\" button stays visible in all states.\n nextRetryAt?: string | null;\n lastFailedAt?: string | null;\n onUpdatePaymentClick?: () => void;\n // When provided, the parent owns dismiss state. Clicking X calls\n // onDismiss and the banner relies on the parent to unmount it —\n // internal `dismissed` state is skipped so the parent can re-show\n // the banner on a new failure event (different last_failed_at).\n onDismiss?: () => void;\n className?: string;\n}\n\nconst ICON_STROKE = 1.5;\nconst ICON_SCALE = 26; // px\nconst ICON_RIGHT_OFFSET = 23; // % from right edge for the rightmost column\nconst ICON_OPACITY = 0.35;\nconst ICON_VERTICAL_SPACING = 26; // % gap between rows in the same column\nconst COL_SPACING = 18; // % gap between adjacent columns\n\nconst ICONS_BY_COLUMN: Array<{\n icons: Array<typeof CreditCard>;\n offset: boolean;\n}> = [\n {\n icons: [\n CreditCard,\n CircleDollarSign,\n BadgeAlert,\n CalendarClock,\n Sparkles,\n Wallet,\n ],\n offset: false,\n },\n {\n icons: [DollarSign, Receipt, PiggyBank, ShieldCheck, CreditCard],\n offset: true,\n },\n {\n icons: [\n Calendar,\n Banknote,\n RefreshCw,\n DollarSign,\n CircleDollarSign,\n Calendar,\n ],\n offset: false,\n },\n];\n\nexport function PastDueBanner({\n productTitle,\n nextRetryAt,\n lastFailedAt,\n onUpdatePaymentClick,\n onDismiss,\n className,\n}: PastDueBannerProps): JSX.Element | null {\n const { t } = useSubscriptionsTranslation();\n const [internalDismissed, setInternalDismissed] = useState(false);\n const retryScheduled = nextRetryAt != null;\n const previousAttemptFailed = retryScheduled && lastFailedAt != null;\n\n if (!onDismiss && internalDismissed) return null;\n\n const heading = retryScheduled\n ? productTitle\n ? t(\"past_due_banner_heading_retry_scheduled_for_product\", {\n product: productTitle,\n })\n : t(\"past_due_banner_heading_retry_scheduled\")\n : productTitle\n ? t(\"past_due_banner_heading_for_product\", { product: productTitle })\n : t(\"past_due_banner_heading\");\n\n // Bucket the time-until-next-retry to absorb the up-to-6h cron lag.\n // 2h backoff → 2–8h actual wall-clock → \"in the next few hours\"\n // 6h backoff → 6–12h → \"in the next few hours\"\n // 24h backoff → 24–30h → \"within a day\"\n const whenLabel = (() => {\n if (!nextRetryAt) return t(\"past_due_retry_when_shortly\");\n const ms = new Date(nextRetryAt).getTime() - Date.now();\n if (ms < 60_000) return t(\"past_due_retry_when_shortly\");\n if (ms < 12 * 60 * 60 * 1000) return t(\"past_due_retry_when_few_hours\");\n return t(\"past_due_retry_when_within_day\");\n })();\n\n const body = previousAttemptFailed\n ? t(\"past_due_banner_body_retry_failed\", { when: whenLabel })\n : retryScheduled\n ? t(\"past_due_banner_body_retry_scheduled\")\n : t(\"past_due_banner_body\");\n\n return (\n <div\n role=\"status\"\n className={cn(\n \"border-border bg-background relative overflow-hidden rounded-2xl border p-5 sm:p-6\",\n className,\n )}\n >\n <button\n type=\"button\"\n onClick={() => (onDismiss ? onDismiss() : setInternalDismissed(true))}\n aria-label={t(\"dismiss\")}\n className=\"text-muted-foreground hover:bg-muted hover:text-foreground focus-visible:outline-ring absolute top-3 right-3 z-10 flex size-6 items-center justify-center rounded-md transition-colors focus-visible:outline-2 focus-visible:outline-offset-2\"\n >\n <X className=\"size-4\" strokeWidth={2} />\n </button>\n <div\n aria-hidden\n className=\"pointer-events-none absolute inset-y-0 right-0 hidden w-1/2 max-w-md sm:block\"\n >\n {ICONS_BY_COLUMN.flatMap((col, colIdx) => {\n const right = `${ICON_RIGHT_OFFSET + colIdx * COL_SPACING}%`;\n const baseTop =\n -ICON_VERTICAL_SPACING * 0.4 +\n (col.offset ? ICON_VERTICAL_SPACING / 2 : 0);\n return col.icons.map((Icon, rowIdx) => {\n const top = `${baseTop + rowIdx * ICON_VERTICAL_SPACING}%`;\n return (\n <Icon\n key={`${colIdx.toString()}-${rowIdx.toString()}`}\n strokeWidth={ICON_STROKE}\n className=\"text-muted-foreground absolute\"\n style={{\n top,\n right,\n width: ICON_SCALE,\n height: ICON_SCALE,\n opacity: ICON_OPACITY,\n }}\n />\n );\n });\n })}\n </div>\n\n <div className=\"relative flex max-w-xl flex-col gap-3.5\">\n <div className=\"flex flex-col gap-1.5\">\n <h3 className=\"text-foreground text-base font-bold tracking-tight sm:text-lg\">\n {heading}\n </h3>\n <p className=\"text-muted-foreground text-sm leading-relaxed\">\n {body}\n </p>\n </div>\n\n {onUpdatePaymentClick && (\n <Button\n type=\"button\"\n variant=\"destructive\"\n size=\"default\"\n onClick={onUpdatePaymentClick}\n className=\"self-start px-5 active:scale-[0.99]\"\n >\n {t(\"update_your_card\")}\n </Button>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Format a number as currency (USD).\n */\nexport function formatCurrency(value: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n }).format(value);\n}\n\n/**\n * Convert a snake_case or lowercase string to Start Case.\n * Replaces lodash startCase for simple status strings.\n */\nexport function startCase(str: string | undefined | null): string {\n if (!str) return \"\";\n return str.replace(/_/g, \" \").replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\n/**\n * Format a next bill date string to M/D/YYYY (UTC).\n */\nexport function formatNextBillDate(nextBillDate: string): string {\n if (!nextBillDate) return \"N/A\";\n const date = new Date(nextBillDate);\n if (isNaN(date.getTime())) return \"N/A\";\n const month = date.getUTCMonth() + 1;\n const day = date.getUTCDate();\n const year = date.getUTCFullYear();\n return `${month}/${day}/${year}`;\n}\n","import {\n useState,\n useEffect,\n useMemo,\n useRef,\n useCallback,\n type JSX,\n} from \"react\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport {\n useSubscription,\n useSubscriptions,\n usePauseSubscription,\n useResumeSubscription,\n useSkipSubscription,\n useCancelSubscription,\n useReactivateSubscription,\n useUpdateSubscriptionInfo,\n formatSubscriptionFrequency,\n formatDate,\n formatTime,\n getNextBillDisplay,\n calculateNextBillDate,\n} from \"@fluid-app/subscriptions-core\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n SkipForward,\n Pause,\n Play,\n XCircle,\n RotateCcw,\n CalendarDays,\n CreditCard,\n Minus,\n Plus,\n} from \"lucide-react\";\nimport { addMonths, format } from \"date-fns\";\nimport { Skeleton, Button, Input, cn } from \"@fluid-app/ui-primitives\";\nimport {\n CancelSubscriptionDialog,\n type PauseMonths,\n} from \"./cancel-subscription-dialog\";\nimport {\n PauseSubscriptionDialog,\n type PauseSubscriptionSelection,\n} from \"./pause-subscription-dialog\";\nimport { ResumeSubscriptionDialog } from \"./resume-subscription-dialog\";\nimport { EditBillDateDialog } from \"./edit-bill-date-dialog\";\nimport { StatusPill } from \"./status-pill\";\nimport { PastDueBanner } from \"./past-due-banner\";\nimport { startCase, formatCurrency } from \"../lib/format\";\n\nexport interface PaymentMethodSlotContext {\n paymentMethod: subscriptions.SubscriptionDetailPaymentMethod;\n subscriptionToken: string;\n customerId: number;\n countryCode: string;\n}\n\nexport interface ShippingAddressSlotContext {\n address: subscriptions.SubscriptionDetailAddress | null;\n subscriptionToken: string;\n customerId: number;\n countryCode: string;\n}\n\nexport interface SubscriptionDetailProps {\n token: string;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSuccess?: (message: string) => void;\n onMutationError?: (message: string, error: unknown) => void;\n /**\n * Called when the Edit Bill Date dialog wants to navigate the host app to\n * another subscription's detail page (clicking a row in the calendar's\n * \"Your other subscriptions\" list).\n */\n onNavigateToSubscription?: (token: string) => void;\n /**\n * Optional render-prop for the Payment Method block. When provided, replaces\n * the read-only display so consumers can wire change/add UX. Default falls\n * back to a read-only summary.\n */\n renderPaymentMethod?: (ctx: PaymentMethodSlotContext) => JSX.Element;\n /**\n * Optional render-prop for the Shipping Address block. When provided,\n * replaces the read-only display so consumers can wire change/add UX.\n * Default falls back to a read-only summary.\n */\n renderShippingAddress?: (ctx: ShippingAddressSlotContext) => JSX.Element;\n /**\n * Called when the past-due banner's \"Update payment method\" button is\n * clicked. Consumers should open their Add Payment Method dialog. If\n * omitted, the banner falls back to scrolling the payment-method section\n * into view.\n */\n onUpdatePaymentClick?: () => void;\n}\n\nfunction SubscriptionDetailSkeleton() {\n return (\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n {/* Left: items skeleton */}\n <div className=\"bg-muted flex flex-col items-center px-8 lg:col-span-4\">\n <div className=\"w-full max-w-lg py-6\">\n <Skeleton className=\"mb-4 h-6 w-48\" />\n <div className=\"grid grid-cols-2 gap-4\">\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n <div className=\"mt-6 flex items-center gap-x-4\">\n <Skeleton className=\"size-24 rounded\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-4 w-3/4\" />\n <Skeleton className=\"h-4 w-1/2\" />\n <Skeleton className=\"h-4 w-1/4\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-2\">\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-5 w-full\" />\n </div>\n </div>\n </div>\n {/* Right: management skeleton */}\n <div className=\"bg-background col-span-4 px-8 pt-4\">\n <div className=\"mx-auto max-w-lg\">\n <Skeleton className=\"mb-3 h-5 w-32\" />\n <div className=\"grid grid-cols-2 gap-3\">\n <Skeleton className=\"h-10 w-full rounded\" />\n <Skeleton className=\"h-10 w-full rounded\" />\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <div className=\"flex gap-4\">\n <Skeleton className=\"h-12 flex-1 rounded\" />\n <Skeleton className=\"h-12 flex-1 rounded\" />\n </div>\n </div>\n <div className=\"mt-6 space-y-4\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n <Skeleton className=\"h-16 w-full rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Left column: product & order summary ──────────────────────────── */\n\n/* ── Quantity input ─────────────────────────────────────────────────\n The displayed value is local string state so the user can backspace\n a single-digit quantity without React snapping it back. We only\n forward valid positive integers to onQuantityChange; on blur we\n restore the last committed quantity if the field was left empty\n or invalid.\n\n Two focus-retention quirks worth keeping in mind:\n - Toggling `disabled` blurs a focused input (especially WebKit).\n Use `readOnly` while the mutation is in flight instead so the\n user keeps their cursor as they tweak the value.\n - We skip the prop-sync useEffect while the field is focused —\n writing `inputValue` again on a server confirmation doesn't change\n anything visible, but the controlled-input value write is enough\n to drop focus on mobile Safari. The post-blur restore on line ~186\n handles the unfocused case. */\n\nfunction QuantityInput({\n inputId,\n quantity,\n maxQuantity,\n isUpdatingQuantity,\n onQuantityChange,\n quantityAriaLabel,\n decrementAriaLabel,\n incrementAriaLabel,\n}: {\n inputId: string;\n quantity: number;\n maxQuantity: number | null;\n isUpdatingQuantity: boolean;\n onQuantityChange: (next: number) => void;\n quantityAriaLabel: string;\n decrementAriaLabel: string;\n incrementAriaLabel: string;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [inputValue, setInputValue] = useState(String(quantity));\n // Captured the moment focus enters the field. Backspacing from \"12\"\n // through \"1\" to \"\" commits an intermediate quantity of 1 to the\n // parent, so on blur we can't trust the live `quantity` prop as the\n // restore target — use the value the user started with.\n const focusEntryQuantityRef = useRef(quantity);\n // Local debounce on commit. Without this, every keystroke fires\n // onQuantityChange, which the parent uses to update pendingQuantity\n // synchronously — so intermediate values (e.g. the \"1\" mid-way through\n // backspacing \"12\" to retype) flash in the order summary before the\n // user is done typing.\n const commitTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n // Keep the latest onQuantityChange in a ref so the debounced timer\n // doesn't fire with a stale closure if the parent re-renders within\n // the 500ms window with a new callback identity.\n const onQuantityChangeRef = useRef(onQuantityChange);\n useEffect(() => {\n onQuantityChangeRef.current = onQuantityChange;\n }, [onQuantityChange]);\n\n useEffect(\n () => () => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n },\n [],\n );\n\n useEffect(() => {\n if (\n typeof document !== \"undefined\" &&\n document.activeElement === inputRef.current\n ) {\n return;\n }\n setInputValue(String(quantity));\n }, [quantity]);\n\n const scheduleCommit = (next: number) => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n commitTimerRef.current = setTimeout(() => {\n onQuantityChangeRef.current(next);\n // Move the restore baseline forward — once a value successfully\n // commits, that's what an empty-blur should fall back to, not\n // the value at focus-entry.\n focusEntryQuantityRef.current = next;\n }, 500);\n };\n\n // Drive the +/− disabled state from the in-flight value so the buttons\n // stay in sync with what the user sees mid-edit, instead of lagging\n // 500ms behind the committed quantity.\n const parsedInput = parseInt(inputValue, 10);\n const currentValue =\n Number.isFinite(parsedInput) && parsedInput > 0 ? parsedInput : quantity;\n const decrementDisabled = isUpdatingQuantity || currentValue <= 1;\n const incrementDisabled =\n isUpdatingQuantity || (maxQuantity != null && currentValue >= maxQuantity);\n\n // Single clamp source so the typing path enforces the same min/max\n // window the +/− buttons gate visually — without this, typing 999 with\n // a max_quantity of 10 would commit 999 even though `+` is disabled.\n const clampToBounds = (n: number): number =>\n maxQuantity != null\n ? Math.min(maxQuantity, Math.max(1, n))\n : Math.max(1, n);\n\n const stepBy = (delta: 1 | -1) => {\n const clamped = clampToBounds(currentValue + delta);\n if (clamped === currentValue) return;\n setInputValue(String(clamped));\n scheduleCommit(clamped);\n };\n\n const stepperButtonClass = cn(\n \"text-muted-foreground hover:text-foreground hover:bg-muted flex h-7 w-7 shrink-0 items-center justify-center rounded-full shadow-xs disabled:cursor-not-allowed\",\n );\n\n return (\n <div\n className={cn(\n \"border-border bg-background focus-within:border-ring focus-within:ring-ring/50 flex h-7.5 items-center justify-between rounded-2xl border focus-within:ring-[3px]\",\n isUpdatingQuantity && \"opacity-60\",\n )}\n >\n <button\n type=\"button\"\n onClick={() => stepBy(-1)}\n disabled={decrementDisabled}\n aria-label={decrementAriaLabel}\n aria-controls={inputId}\n className={cn(stepperButtonClass, decrementDisabled && \"opacity-40\")}\n >\n <Minus className=\"size-3\" />\n </button>\n <Input\n ref={inputRef}\n id={inputId}\n type=\"number\"\n min={1}\n max={maxQuantity ?? undefined}\n step={1}\n value={inputValue}\n onFocus={() => {\n // Capture the displayed value, not the committed `quantity` —\n // a + click before focus updates inputValue but its 500ms\n // debounce may not have fired yet, so the committed prop is\n // stale. Without this, an erase-then-blur restores to the\n // pre-+ value and silently discards the click.\n focusEntryQuantityRef.current = currentValue;\n }}\n onChange={(e) => {\n const raw = e.target.value;\n setInputValue(raw);\n if (raw === \"\") {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n return;\n }\n const next = parseInt(raw, 10);\n if (Number.isFinite(next) && next > 0) {\n scheduleCommit(clampToBounds(next));\n }\n }}\n onBlur={() => {\n if (commitTimerRef.current) clearTimeout(commitTimerRef.current);\n const parsed = parseInt(inputValue, 10);\n if (Number.isFinite(parsed) && parsed > 0) {\n const clamped = clampToBounds(parsed);\n // Snap the displayed value back to the cap on blur so the\n // user sees the bound that was applied to the committed value.\n if (clamped !== parsed) {\n setInputValue(String(clamped));\n }\n if (clamped !== quantity) {\n onQuantityChange(clamped);\n }\n focusEntryQuantityRef.current = clamped;\n } else {\n const restore = focusEntryQuantityRef.current;\n setInputValue(String(restore));\n if (restore !== quantity) {\n onQuantityChange(restore);\n }\n }\n }}\n readOnly={isUpdatingQuantity}\n className=\"text-foreground h-7 w-10 rounded-none border-0 bg-transparent px-0 text-center text-xs font-semibold shadow-none [-moz-appearance:textfield] focus-visible:border-0 focus-visible:ring-0 md:text-xs [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none\"\n aria-label={quantityAriaLabel}\n />\n <button\n type=\"button\"\n onClick={() => stepBy(1)}\n disabled={incrementDisabled}\n aria-label={incrementAriaLabel}\n aria-controls={inputId}\n className={cn(stepperButtonClass, incrementDisabled && \"opacity-40\")}\n >\n <Plus className=\"size-3\" />\n </button>\n </div>\n );\n}\n\nfunction SubscriptionItemsSection({\n subscription,\n displayQuantity,\n displayNextBillDate,\n canEditQuantity = false,\n onQuantityChange,\n isUpdatingQuantity = false,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n displayQuantity?: number;\n displayNextBillDate?: string;\n canEditQuantity?: boolean;\n onQuantityChange?: (next: number) => void;\n isUpdatingQuantity?: boolean;\n}) {\n const { t } = useSubscriptionsTranslation();\n const variant = subscription.variant;\n const product = variant?.product;\n const quantity = displayQuantity ?? subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n const quantityInputId = `subscription-${subscription.subscription_token}-quantity`;\n const discount =\n subscription.original_price != null\n ? subscription.original_price - subscription.price\n : 0;\n const subtotal =\n discount > 0\n ? formatCurrency(subscription.original_price * quantity)\n : totalPrice;\n const effectiveNextBillDate =\n displayNextBillDate ?? subscription.next_bill_date;\n const nextOrderTimeOfDay = formatTime(\n effectiveNextBillDate,\n subscription.timezone,\n );\n\n return (\n <section className=\"bg-muted flex w-full flex-col items-center rounded-lg px-8 lg:col-span-4 lg:self-start\">\n <div className=\"flex w-full max-w-lg flex-col\">\n {/* Upcoming order summary */}\n <div className=\"mt-4\">\n <h2 className=\"text-foreground mb-2 text-lg font-medium\">\n {t(\"your_upcoming_order\")}\n </h2>\n <div className=\"text-muted-foreground\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"border-border border-r pr-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n {subscription.status === \"past_due\"\n ? t(\"payment_failed_on\")\n : t(\"next_order_date\")}\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {subscription.status === \"past_due\"\n ? subscription.last_failed_at\n ? formatDate(subscription.last_failed_at)\n : \"—\"\n : getNextBillDisplay(\n displayNextBillDate\n ? {\n ...subscription,\n next_bill_date: displayNextBillDate,\n }\n : subscription,\n )}\n </div>\n {nextOrderTimeOfDay && (\n <div className=\"text-muted-foreground mt-1 text-xs\">\n {nextOrderTimeOfDay} ({subscription.timezone})\n </div>\n )}\n </div>\n <div className=\"pl-4\">\n <div className=\"text-muted-foreground mb-1 text-sm\">\n {t(\"next_bill_amount\")}\n </div>\n <div className=\"text-foreground text-2xl font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </div>\n </div>\n </div>\n <hr className=\"border-border mt-4\" />\n </div>\n </div>\n\n {/* Product row */}\n <div className=\"py-6\">\n <div className=\"flex flex-row items-center gap-x-4\">\n <div className=\"flex min-w-0 flex-1 flex-row gap-x-4\">\n <div className=\"relative shrink-0\">\n <div className=\"bg-muted h-24 w-24 overflow-hidden rounded\">\n {product?.image_url ? (\n <img\n src={product.image_url}\n alt={variant?.title || t(\"product_image_alt\")}\n width={96}\n height={96}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"text-muted-foreground flex size-full items-center justify-center\">\n {t(\"no_image\")}\n </div>\n )}\n {quantity > 1 && (\n <span className=\"bg-foreground text-background absolute -top-2 -right-2 z-10 flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\">\n {quantity}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex min-w-0 flex-col gap-y-0.5\">\n <p\n className=\"text-foreground truncate text-sm font-medium\"\n title={product?.title}\n >\n {product?.title}\n </p>\n {variant?.title && product?.title && (\n <p className=\"text-muted-foreground text-sm\">\n {variant.title}\n </p>\n )}\n <div>\n <p className=\"text-foreground text-sm font-medium\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n </div>\n </div>\n {canEditQuantity && onQuantityChange && (\n <div className=\"flex shrink-0 flex-col items-center\">\n <label\n htmlFor={quantityInputId}\n className=\"text-muted-foreground mb-1 text-xs\"\n >\n {t(\"quantity_label\")}\n </label>\n <QuantityInput\n inputId={quantityInputId}\n quantity={quantity}\n maxQuantity={subscription.subscription_plan.max_quantity}\n isUpdatingQuantity={isUpdatingQuantity}\n onQuantityChange={onQuantityChange}\n quantityAriaLabel={t(\"quantity_aria\")}\n decrementAriaLabel={t(\"decrease_quantity_aria\")}\n incrementAriaLabel={t(\"increase_quantity_aria\")}\n />\n </div>\n )}\n </div>\n </div>\n\n {/* Pricing summary */}\n <div className=\"mb-4\">\n {discount > 0 && (\n <>\n <div className=\"flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"subtotal\")}\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n {subtotal}\n </p>\n </div>\n <div className=\"mt-2 flex justify-between text-sm\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"discount\")}\n </p>\n <p className=\"text-muted-foreground text-sm font-medium\">\n -{formatCurrency(discount * quantity)}\n </p>\n </div>\n </>\n )}\n <div className=\"mt-4 flex items-center justify-between text-base font-medium\">\n <p className=\"text-muted-foreground text-sm font-medium\">\n {t(\"total_label\")}\n </p>\n <p className=\"text-foreground text-base font-bold\">\n {formatCurrency(subscription.price * quantity)}\n </p>\n </div>\n <span className=\"text-muted-foreground text-xs\">\n {t(\"tax_shipping_note\")}\n </span>\n </div>\n </div>\n </section>\n );\n}\n\n/* ── Right column: actions & details ───────────────────────────────── */\n\nfunction SubscriptionManagementSection({\n subscription,\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n onSkip,\n onPause,\n onResume,\n onCancel,\n onReactivate,\n onEditBillDate,\n onUpdatePaymentClick,\n renderPaymentMethod,\n renderShippingAddress,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n onSkip: () => void;\n onPause: () => void;\n onResume: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n onEditBillDate: () => void;\n onUpdatePaymentClick?: () => void;\n renderPaymentMethod?: (ctx: PaymentMethodSlotContext) => JSX.Element;\n renderShippingAddress?: (ctx: ShippingAddressSlotContext) => JSX.Element;\n}) {\n const { t } = useSubscriptionsTranslation();\n const plan = subscription.subscription_plan;\n const quantity = subscription.quantity;\n const totalPrice = formatCurrency(subscription.price * quantity);\n\n const paymentMethod = subscription.payment_method;\n const paymentDetails = paymentMethod?.details as {\n last4?: string;\n card_type?: string;\n logo_url?: string;\n } | null;\n\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"bg-background col-span-4 flex-auto px-8 pt-4\">\n <div className=\"mx-auto max-w-lg lg:mx-0 lg:mr-auto\">\n {/* Action Buttons */}\n <div className=\"border-border mb-6 border-b pb-6\">\n <h2 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"order_actions\")}\n </h2>\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && plan.allow_skipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating || !subscription.next_bill_date}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"skip_next_order\")}</span>\n </Button>\n )}\n {isActive && (\n <Button\n variant=\"outline\"\n onClick={onEditBillDate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <CalendarDays className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"edit_bill_date\")}</span>\n </Button>\n )}\n {isActive && (\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"pause_subscription\")}</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating || isCancelled}\n className={actionButtonClass}\n >\n <XCircle className=\"size-3 shrink-0\" />\n <span className=\"truncate\">\n {isCancelled\n ? t(\"cancelled_subscription\")\n : t(\"cancel_subscription\")}\n </span>\n </Button>\n {subscription.status === \"past_due\" && onUpdatePaymentClick && (\n <Button\n variant=\"outline\"\n onClick={onUpdatePaymentClick}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <CreditCard className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">\n {t(\"update_payment_method_action\")}\n </span>\n </Button>\n )}\n {isPaused && (\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"resume_subscription\")}</span>\n </Button>\n )}\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"reactivate_subscription\")}</span>\n </Button>\n )}\n </div>\n </div>\n\n {/* Subscription Details */}\n <div className=\"border-border mb-4 border-b\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h3 className=\"text-foreground text-sm/6 font-semibold\">\n {t(\"subscription_details\")}\n </h3>\n <StatusPill status={subscription.status}>\n {startCase(subscription.status)}\n </StatusPill>\n </div>\n <div className=\"divide-border mb-4 flex divide-x\">\n <div className=\"flex-1 pr-4\">\n <div className=\"text-muted-foreground text-sm\">\n {t(\"order_frequency\")}\n </div>\n <div className=\"text-foreground font-medium\">\n {formatSubscriptionFrequency(plan.billing_interval_unit)}\n </div>\n </div>\n {subscription.last_ship_date && (\n <div className=\"flex-1 px-4\">\n <div className=\"text-muted-foreground text-sm\">\n {t(\"last_shipped\")}\n </div>\n <div className=\"text-foreground font-medium\">\n {formatDate(subscription.last_ship_date)}\n </div>\n </div>\n )}\n {subscription.last_bill_date && (\n <div className=\"flex-1 px-4\">\n <div className=\"text-muted-foreground text-sm\">\n {t(\"last_bill_amount\")}\n </div>\n <div className=\"text-foreground font-medium\">{totalPrice}</div>\n <div className=\"text-muted-foreground text-xs\">\n {formatDate(subscription.last_bill_date)}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Payment & Shipping */}\n <div className=\"pt-2\">\n <h3 className=\"text-foreground mb-4 text-sm/6 font-semibold\">\n {t(\"payment_and_shipping\")}\n </h3>\n <div className=\"flex flex-col\">\n {/* Shipping Address */}\n {renderShippingAddress\n ? renderShippingAddress({\n address: subscription.address ?? null,\n subscriptionToken: subscription.subscription_token,\n customerId: subscription.customer?.id ?? 0,\n countryCode: subscription.address?.country_code ?? \"US\",\n })\n : subscription.address && (\n <div className=\"border-border mb-6 border-b pb-4\">\n <div className=\"text-muted-foreground mt-3 mb-1 text-sm\">\n {t(\"shipping_address\")}\n </div>\n <div className=\"text-foreground text-sm\">\n <p className=\"font-medium\">{subscription.address.name}</p>\n <p>{subscription.address.address1}</p>\n {subscription.address.address2 && (\n <p>{subscription.address.address2}</p>\n )}\n <p>\n {[subscription.address.city, subscription.address.state]\n .filter(Boolean)\n .join(\", \")}{\" \"}\n {subscription.address.postal_code}\n </p>\n {subscription.address.country_code && (\n <p>{subscription.address.country_code}</p>\n )}\n </div>\n </div>\n )}\n\n {/* Payment Method */}\n {paymentMethod &&\n (renderPaymentMethod ? (\n <div\n id=\"subscription-payment-method-section\"\n className=\"scroll-mt-24\"\n >\n {renderPaymentMethod({\n paymentMethod,\n subscriptionToken: subscription.subscription_token,\n customerId: subscription.customer?.id ?? 0,\n countryCode: subscription.address?.country_code ?? \"US\",\n })}\n </div>\n ) : (\n <div\n id=\"subscription-payment-method-section\"\n className=\"border-border mb-6 scroll-mt-24 border-b pb-4\"\n >\n <div className=\"text-muted-foreground mb-1 text-sm\">\n {t(\"payment_method\")}\n </div>\n <div className=\"text-foreground flex items-center gap-2 text-sm\">\n {paymentDetails?.logo_url && (\n <img\n src={paymentDetails.logo_url}\n alt={paymentDetails.card_type ?? t(\"card_fallback\")}\n className=\"h-6\"\n />\n )}\n <span className=\"font-medium\">\n {paymentDetails?.card_type\n ? startCase(paymentDetails.card_type)\n : paymentMethod.payment_type}\n {paymentDetails?.last4\n ? ` ${t(\"ending_in\", { last4: paymentDetails.last4 })}`\n : \"\"}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n/* ── Order history (own section, full-width below the grid) ────────── */\n\nfunction OrderHistorySection({\n subscription,\n}: {\n subscription: subscriptions.SubscriptionDetailSubscription;\n}) {\n const { t } = useSubscriptionsTranslation();\n if (subscription.orders.length === 0) return null;\n return (\n <section className=\"mt-6 px-8 pt-6 pb-8\">\n <h3 className=\"text-foreground mb-3 text-sm/6 font-semibold\">\n {t(\"subscription_order_history\")}\n </h3>\n <div className=\"border-border overflow-x-auto rounded-md border\">\n <table className=\"divide-border min-w-full divide-y text-sm\">\n <thead className=\"bg-muted\">\n <tr>\n <th className=\"text-muted-foreground py-2 pr-3 pl-3 text-left font-medium\">\n {t(\"order\")}\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n {t(\"date\")}\n </th>\n <th className=\"text-muted-foreground px-3 py-2 text-left font-medium\">\n {t(\"status\")}\n </th>\n <th className=\"text-muted-foreground py-2 pr-3 pl-3 text-right font-medium\">\n {t(\"amount\")}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-border divide-y\">\n {subscription.orders.map((order) => (\n <tr key={order.id}>\n <td className=\"text-foreground py-2 pr-3 pl-3 font-medium\">\n {order.order_number ?? `#${order.id}`}\n </td>\n <td className=\"text-muted-foreground px-3 py-2\">\n {formatDate(order.created_at.split(\"T\")[0] ?? \"\")}\n </td>\n <td className=\"px-3 py-2\">\n <StatusPill status={order.status}>\n {startCase(order.status)}\n </StatusPill>\n </td>\n <td className=\"text-foreground py-2 pr-3 pl-3 text-right\">\n {order.amount != null\n ? formatCurrency(Number(order.amount))\n : t(\"not_available\")}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </section>\n );\n}\n\n/* ── Main component ────────────────────────────────────────────────── */\n\nexport function SubscriptionDetail({\n token,\n onNotFound,\n onError,\n onSuccess,\n onMutationError,\n onNavigateToSubscription,\n renderPaymentMethod,\n renderShippingAddress,\n onUpdatePaymentClick,\n}: SubscriptionDetailProps): JSX.Element | null {\n const { t } = useSubscriptionsTranslation();\n const [showCancelModal, setShowCancelModal] = useState(false);\n const [showPauseModal, setShowPauseModal] = useState(false);\n const [showResumeModal, setShowResumeModal] = useState(false);\n const [showEditBillDateModal, setShowEditBillDateModal] = useState(false);\n const [pendingNextBillDate, setPendingNextBillDate] = useState<string | null>(\n null,\n );\n // Track the last_failed_at value at dismiss time so a fresh failure\n // (different timestamp) re-shows the banner after a recovery+refailure\n // cycle. Gating the whole wrapper on this also keeps the mb-4/lg:mb-6\n // gap from lingering once the banner is closed.\n const [dismissedForFailedAt, setDismissedForFailedAt] = useState<\n string | null | undefined\n >(undefined);\n\n const { data, isLoading, error } = useSubscription(token);\n const subscription = data?.subscription;\n const customerId = subscription?.customer?.id ?? 0;\n\n // Customer's other active subscriptions, only loaded once the bill-date\n // dialog opens — feeds the calendar's color-coded dots. The portal-tenant\n // BFF list endpoint scopes server-side to the member's own customer\n // record (PortalTenant::SubscriptionBrowser), so we don't pass customerId\n // — and we don't gate on it either, since the detail mapper hardcodes\n // customer.id to 0 today.\n //\n // Capped at 100 — a customer with more than 100 subscriptions will be\n // missing some dots from the calendar. Matches the practical ceiling of\n // every other \"list customer's subscriptions\" surface; if/when we have a\n // real-world customer past that, swap to cursor pagination here.\n const customerSubscriptionsQuery = useSubscriptions(\n { perPage: 100 },\n { enabled: showEditBillDateModal },\n );\n const otherSubscriptionsForBillDate = useMemo(\n () =>\n (customerSubscriptionsQuery.data?.subscriptions ?? [])\n .filter((s) => s.subscription_token !== token)\n .map((s) => ({\n token: s.subscription_token,\n productTitle: s.variant?.product?.title ?? t(\"breadcrumb\"),\n nextBillDate: s.next_bill_date,\n billingInterval: s.subscription_plan?.billing_interval ?? 1,\n billingIntervalUnit:\n s.subscription_plan?.billing_interval_unit ?? \"month\",\n })),\n [customerSubscriptionsQuery.data, token, t],\n );\n\n const pauseMutation = usePauseSubscription({\n onSuccess: () => onSuccess?.(t(\"subscription_paused\")),\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_pause\"), err),\n });\n\n const resumeMutation = useResumeSubscription({\n onSuccess: () => onSuccess?.(t(\"subscription_resumed\")),\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_resume\"), err),\n });\n\n const skipMutation = useSkipSubscription({\n onSuccess: () => onSuccess?.(t(\"next_billing_skipped\")),\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_skip\"), err),\n });\n\n const cancelMutation = useCancelSubscription({\n onSuccess: () => {\n onSuccess?.(t(\"subscription_cancelled\"));\n setShowCancelModal(false);\n },\n onError: (err: unknown) => onMutationError?.(t(\"failed_to_cancel\"), err),\n });\n\n const reactivateMutation = useReactivateSubscription({\n onSuccess: () => onSuccess?.(t(\"subscription_reactivated\")),\n onError: (err: unknown) =>\n onMutationError?.(t(\"failed_to_reactivate\"), err),\n });\n\n const [pendingQuantity, setPendingQuantity] = useState<number | null>(null);\n const quantityDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n\n const quantityMutation = useUpdateSubscriptionInfo({\n onSuccess: () => {\n // Keep pendingQuantity set so the displayed amounts stay on the\n // new value while the invalidated query refetches. The effect\n // below clears it once the refetched subscription carries the\n // same quantity — avoids a flicker back to the old amounts.\n onSuccess?.(t(\"quantity_updated\"));\n },\n onError: (err: unknown) => {\n setPendingQuantity(null);\n onMutationError?.(t(\"failed_to_update_quantity\"), err);\n },\n });\n\n const editBillDateMutation = useUpdateSubscriptionInfo({\n onSuccess: () => {\n onSuccess?.(t(\"bill_date_updated\"));\n setShowEditBillDateModal(false);\n },\n onError: (err: unknown) => {\n setPendingNextBillDate(null);\n onMutationError?.(t(\"failed_to_update_bill_date\"), err);\n },\n });\n\n const serverNextBillDate = data?.subscription.next_bill_date ?? null;\n useEffect(() => {\n if (\n pendingNextBillDate != null &&\n serverNextBillDate != null &&\n serverNextBillDate.startsWith(pendingNextBillDate)\n ) {\n setPendingNextBillDate(null);\n }\n }, [pendingNextBillDate, serverNextBillDate]);\n\n const serverQuantity = data?.subscription.quantity;\n useEffect(() => {\n if (pendingQuantity != null && serverQuantity === pendingQuantity) {\n setPendingQuantity(null);\n }\n }, [pendingQuantity, serverQuantity]);\n\n useEffect(\n () => () => {\n if (quantityDebounceRef.current)\n clearTimeout(quantityDebounceRef.current);\n },\n [],\n );\n\n const quantityMutate = quantityMutation.mutate;\n const handleQuantityChange = useCallback(\n (next: number) => {\n const clamped = Math.max(1, next);\n setPendingQuantity(clamped);\n if (quantityDebounceRef.current)\n clearTimeout(quantityDebounceRef.current);\n quantityDebounceRef.current = setTimeout(() => {\n const current = data?.subscription.quantity;\n if (clamped === current) {\n setPendingQuantity(null);\n return;\n }\n quantityMutate({\n subscriptionToken: token,\n body: { quantity: clamped },\n });\n }, 500);\n },\n [data?.subscription.quantity, quantityMutate, token],\n );\n\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onNotFoundRef = useRef(onNotFound);\n onNotFoundRef.current = onNotFound;\n\n useEffect(() => {\n if (!isLoading && error) {\n onErrorRef.current?.(error as Error);\n }\n }, [isLoading, error]);\n\n useEffect(() => {\n if (!isLoading && !error && !subscription) {\n onNotFoundRef.current?.();\n }\n }, [isLoading, error, subscription]);\n\n if (isLoading) {\n return <SubscriptionDetailSkeleton />;\n }\n\n if (!subscription) {\n return null;\n }\n\n const plan = subscription.subscription_plan;\n const isActive = subscription.status === \"active\";\n const isPaused = subscription.status === \"paused\";\n const isCancelled = subscription.status === \"cancelled\";\n const isMutating =\n pauseMutation.isPending ||\n resumeMutation.isPending ||\n skipMutation.isPending ||\n cancelMutation.isPending ||\n reactivateMutation.isPending ||\n editBillDateMutation.isPending;\n\n const handlePauseConfirm = (selection: PauseSubscriptionSelection) => {\n const pauseParams: subscriptions.PauseSubscriptionParams = { customerId };\n if (selection.type === \"order_count\") {\n pauseParams.numberOfOrders = selection.numberOfOrders;\n }\n pauseMutation.mutate(\n { subscriptionToken: token, pauseParams },\n { onSuccess: () => setShowPauseModal(false) },\n );\n };\n\n const handleResumeConfirm = (nextBillDate: string) => {\n resumeMutation.mutate(\n {\n subscriptionToken: token,\n resumeParams: { customerId, nextBillDate },\n },\n { onSuccess: () => setShowResumeModal(false) },\n );\n };\n\n const handleSkip = () => {\n const nextBillDate = calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n );\n skipMutation.mutate({\n subscriptionToken: token,\n skipParams: { customerId, nextBillDate },\n });\n };\n\n const handleCancel = () => {\n cancelMutation.mutate({ subscriptionToken: token, customerId });\n };\n\n const handleReactivate = () => {\n reactivateMutation.mutate({\n subscriptionToken: token,\n reactivateParams: {},\n });\n };\n\n const bannerDismissed =\n dismissedForFailedAt !== undefined &&\n dismissedForFailedAt === subscription.last_failed_at;\n\n return (\n <>\n {subscription.status === \"past_due\" && !bannerDismissed && (\n <div className=\"mb-4 px-2 sm:px-0 lg:mb-6\">\n <PastDueBanner\n productTitle={subscription.variant?.product?.title ?? null}\n nextRetryAt={subscription.next_retry_at ?? null}\n lastFailedAt={subscription.last_failed_at ?? null}\n onUpdatePaymentClick={\n onUpdatePaymentClick ??\n (() => {\n const el = document.getElementById(\n \"subscription-payment-method-section\",\n );\n if (el) {\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n })\n }\n onDismiss={() =>\n setDismissedForFailedAt(subscription.last_failed_at ?? null)\n }\n />\n </div>\n )}\n <div className=\"flex flex-col lg:grid lg:grid-cols-8\">\n <SubscriptionItemsSection\n subscription={subscription}\n displayQuantity={pendingQuantity ?? undefined}\n displayNextBillDate={pendingNextBillDate ?? undefined}\n canEditQuantity={isActive}\n onQuantityChange={handleQuantityChange}\n isUpdatingQuantity={quantityMutation.isPending}\n />\n <SubscriptionManagementSection\n subscription={subscription}\n isActive={isActive}\n isPaused={isPaused}\n isCancelled={isCancelled}\n isMutating={isMutating}\n onSkip={handleSkip}\n onPause={() => setShowPauseModal(true)}\n onResume={() => setShowResumeModal(true)}\n onCancel={() => setShowCancelModal(true)}\n onReactivate={handleReactivate}\n onEditBillDate={() => setShowEditBillDateModal(true)}\n onUpdatePaymentClick={onUpdatePaymentClick}\n renderPaymentMethod={renderPaymentMethod}\n renderShippingAddress={renderShippingAddress}\n />\n </div>\n <OrderHistorySection subscription={subscription} />\n <CancelSubscriptionDialog\n open={showCancelModal}\n onOpenChange={setShowCancelModal}\n onConfirm={handleCancel}\n onPauseInstead={(months: PauseMonths) => {\n setShowCancelModal(false);\n pauseMutation.mutate({\n subscriptionToken: token,\n pauseParams: {\n customerId,\n nextBillDate: format(addMonths(new Date(), months), \"yyyy-MM-dd\"),\n },\n });\n }}\n />\n <EditBillDateDialog\n open={showEditBillDateModal}\n onOpenChange={(next) => {\n if (!next) editBillDateMutation.reset();\n setShowEditBillDateModal(next);\n }}\n onConfirm={(nextBillDate) => {\n setPendingNextBillDate(nextBillDate);\n editBillDateMutation.mutate({\n subscriptionToken: token,\n body: { next_bill_date: nextBillDate },\n });\n }}\n isLoading={editBillDateMutation.isPending}\n errorMessage={\n editBillDateMutation.isError ? t(\"bill_date_error\") : undefined\n }\n currentNextBillDate={subscription.next_bill_date}\n otherSubscriptions={otherSubscriptionsForBillDate}\n onNavigateToSubscription={onNavigateToSubscription}\n />\n <PauseSubscriptionDialog\n open={showPauseModal}\n onOpenChange={(next) => {\n if (!next) pauseMutation.reset();\n setShowPauseModal(next);\n }}\n onConfirm={handlePauseConfirm}\n isLoading={pauseMutation.isPending}\n errorMessage={pauseMutation.isError ? t(\"generic_error\") : undefined}\n currentNextBillDate={subscription.next_bill_date}\n billingInterval={plan.billing_interval}\n billingIntervalUnit={plan.billing_interval_unit}\n />\n <ResumeSubscriptionDialog\n open={showResumeModal}\n onOpenChange={(next) => {\n if (!next) resumeMutation.reset();\n setShowResumeModal(next);\n }}\n onConfirm={handleResumeConfirm}\n isLoading={resumeMutation.isPending}\n errorMessage={resumeMutation.isError ? t(\"generic_error\") : undefined}\n defaultNextBillDate={calculateNextBillDate(\n plan.billing_interval,\n plan.billing_interval_unit,\n )}\n />\n </>\n );\n}\n\nexport interface SubscriptionActionsProps {\n isActive: boolean;\n isPaused: boolean;\n isCancelled: boolean;\n isMutating: boolean;\n allowSkipping: boolean | null;\n onPause: () => void;\n onResume: () => void;\n onSkip: () => void;\n onCancel: () => void;\n onReactivate: () => void;\n}\n\nexport function SubscriptionActions({\n isActive,\n isPaused,\n isCancelled,\n isMutating,\n allowSkipping,\n onPause,\n onResume,\n onSkip,\n onCancel,\n onReactivate,\n}: SubscriptionActionsProps) {\n const { t } = useSubscriptionsTranslation();\n const actionButtonClass =\n \"flex h-auto flex-row items-center justify-center gap-2 overflow-hidden border border-border bg-muted py-2 text-xs whitespace-nowrap text-foreground hover:bg-accent sm:text-sm\";\n\n return (\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\">\n {isActive && (\n <>\n {allowSkipping && (\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <SkipForward className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"skip_next\")}</span>\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={onPause}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Pause className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"pause\")}</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"cancel\")}</span>\n </Button>\n </>\n )}\n {isPaused && (\n <>\n <Button\n variant=\"outline\"\n onClick={onResume}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <Play className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"resume\")}</span>\n </Button>\n <Button\n variant=\"outline\"\n onClick={onCancel}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <XCircle className=\"size-3 shrink-0\" />\n <span className=\"truncate\">{t(\"cancel\")}</span>\n </Button>\n </>\n )}\n {isCancelled && (\n <Button\n variant=\"outline\"\n onClick={onReactivate}\n disabled={isMutating}\n className={actionButtonClass}\n >\n <RotateCcw className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{t(\"reactivate\")}</span>\n </Button>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { JSX } from \"react\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from \"@fluid-app/ui-primitives\";\nimport { ScreenHeaderBreadcrumbs } from \"@fluid-app/portal-react/shell/ScreenHeaderContext\";\nimport {\n SubscriptionDetail,\n type PaymentMethodSlotContext,\n type ShippingAddressSlotContext,\n} from \"../components/subscription-detail\";\n\nexport interface SubscriptionDetailScreenProps {\n token: string;\n onNavigateToList: () => void;\n onNavigateToSubscription?: (token: string) => void;\n onNotFound?: () => void;\n onError?: (error: Error) => void;\n onSuccess?: (message: string) => void;\n onMutationError?: (message: string, error: unknown) => void;\n renderPaymentMethod?: (ctx: PaymentMethodSlotContext) => JSX.Element;\n renderShippingAddress?: (ctx: ShippingAddressSlotContext) => JSX.Element;\n onUpdatePaymentClick?: () => void;\n}\n\nexport function SubscriptionDetailScreen({\n token,\n onNavigateToList,\n onNavigateToSubscription,\n onNotFound,\n onError,\n onSuccess,\n onMutationError,\n renderPaymentMethod,\n renderShippingAddress,\n onUpdatePaymentClick,\n}: SubscriptionDetailScreenProps) {\n const { t } = useSubscriptionsTranslation();\n\n return (\n <>\n <ScreenHeaderBreadcrumbs>\n <Breadcrumb>\n <BreadcrumbList className=\"text-lg\">\n <BreadcrumbItem>\n <BreadcrumbLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onNavigateToList();\n }}\n >\n {t(\"breadcrumb\")}\n </BreadcrumbLink>\n </BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage className=\"font-semibold\">\n {t(\"breadcrumb_detail\", { token })}\n </BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </ScreenHeaderBreadcrumbs>\n <div className=\"mx-auto max-w-7xl px-4 py-4 sm:px-6 sm:py-6 lg:px-10 lg:py-8\">\n <SubscriptionDetail\n token={token}\n onNotFound={onNotFound}\n onError={onError}\n onSuccess={onSuccess}\n onMutationError={onMutationError}\n onNavigateToSubscription={onNavigateToSubscription}\n renderPaymentMethod={renderPaymentMethod}\n renderShippingAddress={renderShippingAddress}\n onUpdatePaymentClick={onUpdatePaymentClick}\n />\n </div>\n </>\n );\n}\n","import { useId, useState, type JSX } from \"react\";\nimport { cn, Skeleton } from \"@fluid-app/ui-primitives\";\nimport { ChevronDown } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport {\n PaymentIcon,\n getCardDisplayName,\n getCardExpiry,\n} from \"@fluid-app/profile-ui/components/payment-method-card-internals\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\n\ninterface SelectablePaymentMethodDropdownProps {\n title: string;\n displayPaymentMethod: fluidPay.CustomerPaymentMethod | null;\n paymentMethodList: fluidPay.CustomerPaymentMethod[];\n selectedPaymentMethodId: number;\n onSelectPaymentMethod: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n onAddPaymentMethodClick: () => void;\n onEditPaymentMethod?: (paymentMethod: fluidPay.CustomerPaymentMethod) => void;\n onDeletePaymentMethod?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n onMakeDefaultPaymentMethod?: (\n paymentMethod: fluidPay.CustomerPaymentMethod,\n ) => void;\n addPaymentMethodLabel?: string;\n showAddButton?: boolean;\n isLoading?: boolean;\n /** Disable selection while a parent mutation is in flight. */\n isPending?: boolean;\n className?: string;\n}\n\n/**\n * Selectable variant of profile-ui's PaymentMethodDropdown — same chrome\n * (accordion, collapsed summary, list, add button), with rows that\n * commit a selection through onSelectPaymentMethod when clicked.\n */\nexport function SelectablePaymentMethodDropdown({\n title,\n displayPaymentMethod,\n paymentMethodList,\n selectedPaymentMethodId,\n onSelectPaymentMethod,\n onAddPaymentMethodClick,\n onEditPaymentMethod,\n onDeletePaymentMethod,\n onMakeDefaultPaymentMethod,\n addPaymentMethodLabel: addPaymentMethodLabelProp,\n showAddButton = true,\n isLoading = false,\n isPending = false,\n className = \"\",\n}: SelectablePaymentMethodDropdownProps): JSX.Element {\n const { t } = useProfileTranslation();\n const addPaymentMethodLabel =\n addPaymentMethodLabelProp ?? t(\"add_a_payment_method\");\n const [isOpen, setIsOpen] = useState(false);\n const sectionId = useId();\n const collapsedExpiry = displayPaymentMethod\n ? getCardExpiry(displayPaymentMethod, t(\"card_expires\"))\n : null;\n\n return (\n <div className={cn(\"border-border mb-6 border-b pb-4\", className)}>\n <button\n type=\"button\"\n aria-expanded={isOpen}\n aria-controls={sectionId}\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"flex w-full flex-row items-center justify-between\"\n >\n <span className=\"text-muted-foreground text-sm\">{title}</span>\n <ChevronDown\n className={cn(\n \"text-muted-foreground h-4 w-4 transition-transform duration-200\",\n isOpen && \"rotate-180\",\n )}\n />\n </button>\n\n {/* Collapsed summary — shows the subscription's current payment method\n inline. Clicking expands. Mirrors checkout's payment-method-dropdown\n collapse behavior. */}\n {!isOpen && displayPaymentMethod && (\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n className=\"mt-1 mb-2 flex w-full cursor-pointer flex-row items-center gap-3 text-left\"\n >\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={displayPaymentMethod.details.logo_url}\n brand={displayPaymentMethod.details.card_type}\n alt={\n displayPaymentMethod.details.card_type ??\n t(\"payment_method_alt\")\n }\n />\n </div>\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-foreground text-sm font-medium capitalize\">\n {getCardDisplayName(displayPaymentMethod, t(\"card_fallback\"))}\n </span>\n {collapsedExpiry && (\n <span className=\"text-muted-foreground text-sm\">\n {collapsedExpiry}\n </span>\n )}\n </div>\n </button>\n )}\n\n {isOpen && (\n <div\n id={sectionId}\n role=\"listbox\"\n aria-label={title}\n className=\"mt-5 flex max-h-[400px] flex-col gap-y-4 overflow-y-auto pr-0.5\"\n >\n {isLoading ? (\n <>\n {[1, 2].map((i) => (\n <div\n key={`skeleton-${i}`}\n className=\"bg-muted flex flex-row items-center gap-x-2 rounded-sm p-3\"\n >\n <Skeleton className=\"h-6 w-10\" />\n <div className=\"flex flex-col gap-y-1\">\n <Skeleton className=\"h-4 w-32\" />\n <Skeleton className=\"h-4 w-24\" />\n </div>\n </div>\n ))}\n </>\n ) : (\n paymentMethodList.map((paymentMethod) => {\n const isSelected = selectedPaymentMethodId === paymentMethod.id;\n const expiry = getCardExpiry(paymentMethod, t(\"card_expires\"));\n const handleSelect = () => {\n if (isPending) return;\n onSelectPaymentMethod(paymentMethod);\n };\n return (\n <div\n key={paymentMethod.id}\n role=\"option\"\n tabIndex={isPending ? -1 : 0}\n aria-selected={isSelected}\n aria-disabled={isPending}\n onClick={handleSelect}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleSelect();\n }\n }}\n className={cn(\n \"text-foreground flex w-full flex-row items-center justify-between gap-3 rounded-sm p-3 text-left transition-colors\",\n \"not-aria-disabled:cursor-pointer aria-disabled:cursor-not-allowed aria-disabled:opacity-60\",\n isSelected\n ? \"bg-background border-border border\"\n : \"bg-muted hover:bg-muted/80 border border-transparent\",\n )}\n >\n <div className=\"flex min-w-0 flex-row items-center gap-3\">\n <div className=\"flex h-6 w-10 flex-shrink-0 items-center justify-center\">\n <PaymentIcon\n logoUrl={paymentMethod.details.logo_url}\n brand={paymentMethod.details.card_type}\n alt={\n paymentMethod.details.card_type ??\n t(\"payment_method_alt\")\n }\n />\n </div>\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-foreground text-sm font-medium capitalize\">\n {getCardDisplayName(paymentMethod)}\n </span>\n {expiry && (\n <span className=\"text-muted-foreground text-sm\">\n {expiry}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex shrink-0 flex-row items-center gap-2\">\n {paymentMethod.default && (\n <span className=\"bg-primary text-primary-foreground rounded px-2 py-0.5 text-xs font-medium\">\n {t(\"default\")}\n </span>\n )}\n {(onEditPaymentMethod ||\n onDeletePaymentMethod ||\n onMakeDefaultPaymentMethod) && (\n <span\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <EllipsesDropdown\n onEdit={\n onEditPaymentMethod\n ? () => onEditPaymentMethod(paymentMethod)\n : undefined\n }\n onDelete={\n onDeletePaymentMethod\n ? () => onDeletePaymentMethod(paymentMethod)\n : undefined\n }\n onMakeDefault={\n !paymentMethod.default && onMakeDefaultPaymentMethod\n ? () => onMakeDefaultPaymentMethod(paymentMethod)\n : undefined\n }\n />\n </span>\n )}\n </div>\n </div>\n );\n })\n )}\n </div>\n )}\n\n {showAddButton && (\n <button\n type=\"button\"\n disabled={isPending}\n className=\"text-foreground mt-3 text-left text-sm disabled:cursor-not-allowed disabled:opacity-60\"\n onClick={onAddPaymentMethodClick}\n >\n {addPaymentMethodLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useCallback, useMemo, useState, type JSX } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { FluidPayCoreProvider, type fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport {\n AddressFormDialog,\n ConfirmActionDialog,\n CreditCardFormDialog,\n EditPaymentMethodDialog,\n type CreditCardFormSubmitData,\n type EditPaymentMethodFormData,\n} from \"@fluid-app/profile-ui\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { SelectablePaymentMethodDropdown } from \"./SelectablePaymentMethodDropdown\";\nimport {\n subscriptionsKeys,\n useRetrySubscription,\n useUpdateSubscriptionInfo,\n} from \"@fluid-app/subscriptions-core\";\nimport type { subscriptions } from \"@fluid-app/subscriptions-core\";\nimport type { PaymentMethodSlotContext } from \"@fluid-app/subscriptions-ui\";\nimport { TOKEN_PROVIDER_VGS } from \"@fluid-app/portal-core/pay-types\";\nimport type {\n PayAddress,\n UpdatePaymentMethodBody,\n} from \"@fluid-app/portal-core/pay-types\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { payKeys, storeKeys } from \"../account/query-keys\";\nimport {\n createFluidPayApiAdapter,\n mapToFluidPayPaymentMethod,\n} from \"../adapters/fluid-pay-api-adapter\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\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\n// Map the subscription's payment_method shape (which lives on\n// SubscriptionDetail and uses different field names than PayApi) to the\n// fluidPay shape PaymentMethodDropdown consumes.\nfunction subscriptionPaymentMethodToFluidPay(\n raw: subscriptions.SubscriptionDetailPaymentMethod,\n): fluidPay.CustomerPaymentMethod {\n const details = raw.details as {\n last4?: string;\n card_type?: string;\n card_brand?: string;\n logo_url?: string;\n exp_month?: number | string;\n exp_year?: number | string;\n } | null;\n return {\n id: raw.id,\n created_at: raw.created_at,\n default: raw.default,\n details: {\n card_type: details?.card_type ?? null,\n card_brand: details?.card_brand ?? details?.card_type ?? null,\n last_four: details?.last4 ?? \"\",\n exp_month:\n details?.exp_month != null ? Number(details.exp_month) : undefined,\n exp_year:\n details?.exp_year != null ? Number(details.exp_year) : undefined,\n logo_url: details?.logo_url,\n },\n billing_address: null,\n payment_type: raw.payment_type,\n source: raw.source,\n updated_at: raw.updated_at,\n };\n}\n\ntype PaymentMethodSectionProps = PaymentMethodSlotContext & {\n onSuccess?: (message: string) => void;\n onError?: (message: string, error: unknown) => void;\n // Optional controlled props so a parent (e.g. the past-due banner CTA in\n // SubscriptionDetailScreen) can open the Add Payment Method dialog from\n // outside this section. When omitted, the section manages the dialog\n // internally as before.\n addDialogOpen?: boolean;\n onAddDialogOpenChange?: (open: boolean) => void;\n};\n\nexport function PortalSubscriptionPaymentMethodSection(\n props: PaymentMethodSectionProps,\n): JSX.Element {\n return (\n <ProfileTranslationBridge>\n <PortalSubscriptionPaymentMethodSectionInner {...props} />\n </ProfileTranslationBridge>\n );\n}\n\nfunction PortalSubscriptionPaymentMethodSectionInner({\n paymentMethod: currentPaymentMethod,\n subscriptionToken,\n onSuccess,\n onError,\n addDialogOpen,\n onAddDialogOpenChange,\n}: PaymentMethodSectionProps): JSX.Element {\n const { t: profileT } = useProfileTranslation();\n const { t: subsT } = useSubscriptionsTranslation();\n\n // Bridge for fluid-pay-ui dialogs that accept `t: (key: string) => string`.\n // The underlying adapter falls back to `key` for unknown keys, so widening\n // the key type is safe at runtime.\n const tFn = useCallback(\n (key: string): string => profileT(key as never),\n [profileT],\n );\n\n const payApi = usePayApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const [internalAddDialogOpen, setInternalAddDialogOpen] = useState(false);\n const isAddDialogOpen = addDialogOpen ?? internalAddDialogOpen;\n const setIsAddDialogOpen = (next: boolean) => {\n if (onAddDialogOpenChange) onAddDialogOpenChange(next);\n else setInternalAddDialogOpen(next);\n };\n const [editingPaymentMethod, setEditingPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n const [deletingPaymentMethod, setDeletingPaymentMethod] =\n useState<fluidPay.CustomerPaymentMethod | null>(null);\n const [deleteError, setDeleteError] = useState<string | undefined>(undefined);\n\n const { data: paymentMethods = [], isLoading: isLoadingMethods } = useQuery({\n queryKey: payKeys.paymentMethods.list(),\n queryFn: async () => {\n const response = await payApi.fetchPaymentMethods();\n return response.payment_methods.map(mapToFluidPayPaymentMethod);\n },\n });\n\n const { data: addresses = [] } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n enabled: isAddDialogOpen,\n });\n\n const countriesApi = useCountriesApi();\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(),\n queryFn: () => countriesApi.listCountries(),\n enabled: isAddDialogOpen || editingPaymentMethod !== null,\n });\n const countryOptions = useMemo(\n () =>\n [...(countriesData?.countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n\n const retrySubscription = useRetrySubscription({\n onError: (err) => onError?.(\"Failed to queue retry\", err),\n });\n\n const updateSubscription = useUpdateSubscriptionInfo({\n // Skip the hook's auto-invalidate so we coalesce into a single\n // refetch — either retrySubscription's onSuccess (past_due path)\n // or the explicit invalidate below (non-past-due path).\n skipAutoInvalidate: true,\n onSuccess: () => {\n onSuccess?.(profileT(\"default_payment_method_updated\"));\n // Explicit retry as a separate request, only when the sub was\n // past_due. Decoupled from the update endpoint per SRP — and\n // gated client-side so non-past-due subs don't fire a redundant\n // request (backend would no-op, but we don't want to ask).\n //\n // Invalidation is deferred to whichever path runs last:\n // - past_due: useRetrySubscription invalidates on its own\n // onSuccess — single refetch covers both update + retry.\n // - non-past_due: invalidate inline since no retry fires.\n const cached = queryClient.getQueryData<subscriptions.SubscriptionDetail>(\n subscriptionsKeys.detail(subscriptionToken),\n );\n if (cached?.subscription?.status === \"past_due\") {\n retrySubscription.mutate({ subscriptionToken });\n } else {\n queryClient.invalidateQueries({\n queryKey: subscriptionsKeys.detail(subscriptionToken),\n });\n }\n },\n onError: (err) =>\n onError?.(profileT(\"failed_to_update_payment_method\"), err),\n });\n\n const addCardMutation = useMutation({\n mutationFn: (data: CreditCardFormSubmitData) =>\n payApi.createPaymentMethod({\n payment_method: {\n type: \"card\",\n token: data.payment_method.token,\n token_provider: TOKEN_PROVIDER_VGS,\n exp_month: data.payment_method.exp_month,\n exp_year: data.payment_method.exp_year,\n cvv_token: data.payment_method.cvv_token,\n card_holder: data.payment_method.card_holder,\n default: data.set_as_default,\n },\n billing_address_id: data.billing_address_id,\n }),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(profileT(\"payment_method_added\"));\n },\n onError: (err) => onError?.(profileT(\"failed_to_add_payment_method\"), err),\n });\n\n const createAddressMutation = useMutation({\n mutationFn: (body: fluidPay.CreateAddressBody) => {\n return payApi.createAddress({\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n },\n });\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n },\n onError: (err) => onError?.(profileT(\"failed_to_create_address\"), err),\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: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(profileT(\"default_payment_method_updated\"));\n },\n onError: (err) =>\n onError?.(profileT(\"failed_to_update_payment_method\"), err),\n });\n\n const deletePaymentMethodMutation = useMutation({\n mutationFn: (paymentMethodId: number) =>\n payApi.deletePaymentMethod(paymentMethodId),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(profileT(\"payment_method_deleted\"));\n },\n });\n\n const makeDefaultPaymentMethodMutation = useMutation({\n mutationFn: (pm: fluidPay.CustomerPaymentMethod) => {\n const body: UpdatePaymentMethodBody = {\n payment_method: { default: true },\n };\n if (pm.billing_address) {\n body.payment_method.billing_address = {\n name: pm.billing_address.name,\n street1: pm.billing_address.address1 ?? \"\",\n street2: pm.billing_address.address2 ?? null,\n city: pm.billing_address.city ?? \"\",\n state: pm.billing_address.state ?? \"\",\n zip: pm.billing_address.zip ?? \"\",\n country: pm.billing_address.country_code ?? \"\",\n };\n }\n return payApi.updatePaymentMethod(pm.id, body);\n },\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: payKeys.paymentMethods.all,\n });\n onSuccess?.(profileT(\"default_payment_method_updated\"));\n },\n onError: (err) =>\n onError?.(profileT(\"failed_to_set_default_payment_method\"), err),\n });\n\n // Fall back to the subscription's own payment method when the customer's\n // list doesn't contain it yet (initial load) or no longer contains it (card\n // was removed in another session). Without the fallback the collapsed\n // accordion header would render blank.\n const displayed =\n paymentMethods.find((pm) => pm.id === currentPaymentMethod.id) ??\n subscriptionPaymentMethodToFluidPay(currentPaymentMethod);\n\n const handleConfirmDelete = async () => {\n if (!deletingPaymentMethod) return;\n setDeleteError(undefined);\n try {\n await deletePaymentMethodMutation.mutateAsync(deletingPaymentMethod.id);\n setDeletingPaymentMethod(null);\n } catch (err) {\n setDeleteError(\n err instanceof Error\n ? err.message\n : profileT(\"unable_to_delete_payment_method\"),\n );\n }\n };\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <SelectablePaymentMethodDropdown\n title={subsT(\"payment_method\")}\n displayPaymentMethod={displayed}\n paymentMethodList={paymentMethods}\n onAddPaymentMethodClick={() => setIsAddDialogOpen(true)}\n addPaymentMethodLabel={profileT(\"add_payment_method_action\")}\n showAddButton\n isLoading={isLoadingMethods}\n isPending={\n updateSubscription.isPending ||\n retrySubscription.isPending ||\n addCardMutation.isPending ||\n updatePaymentMethodMutation.isPending ||\n makeDefaultPaymentMethodMutation.isPending\n }\n selectedPaymentMethodId={currentPaymentMethod.id}\n onSelectPaymentMethod={(pm) => {\n if (pm.id === currentPaymentMethod.id) return;\n updateSubscription.mutate({\n subscriptionToken,\n body: { payment_method_id: pm.id },\n });\n }}\n onEditPaymentMethod={(pm) => setEditingPaymentMethod(pm)}\n onDeletePaymentMethod={(pm) => {\n setDeleteError(undefined);\n setDeletingPaymentMethod(pm);\n }}\n onMakeDefaultPaymentMethod={(pm) =>\n makeDefaultPaymentMethodMutation.mutate(pm)\n }\n />\n\n <CreditCardFormDialog\n isOpen={isAddDialogOpen}\n onClose={() => setIsAddDialogOpen(false)}\n t={tFn}\n onSubmit={async (data) => {\n try {\n await addCardMutation.mutateAsync(data);\n setIsAddDialogOpen(false);\n } catch {\n // onError surfaces the toast; swallow here so CreditCardFormDialog\n // doesn't see an unhandled rejection from its onSubmit handler.\n }\n }}\n isSubmitting={addCardMutation.isPending}\n jwt=\"\"\n savedAddresses={addresses}\n defaultBillingAddressId={addresses.find((a) => a.default)?.id}\n renderAddressFormDialog={({ isOpen, onClose, onAddressCreated }) => (\n <AddressFormDialog\n isOpen={isOpen}\n onClose={onClose}\n selectedAddress={null}\n t={tFn}\n onSubmit={async (formData) => {\n try {\n const created =\n await createAddressMutation.mutateAsync(formData);\n onAddressCreated(mapToFluidPayAddress(created));\n } catch {\n // onError surfaces the toast.\n }\n }}\n isSubmitting={createAddressMutation.isPending}\n countries={countryOptions}\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={profileT(\"address_line_1\")}\n />\n )}\n />\n )}\n />\n\n <EditPaymentMethodDialog\n isOpen={editingPaymentMethod !== null}\n paymentMethod={editingPaymentMethod}\n billingAddress={editingPaymentMethod?.billing_address ?? null}\n onClose={() => setEditingPaymentMethod(null)}\n onSubmit={async (data) => {\n if (!editingPaymentMethod) return;\n try {\n await updatePaymentMethodMutation.mutateAsync({\n paymentMethodId: editingPaymentMethod.id,\n data,\n });\n setEditingPaymentMethod(null);\n } catch {\n // onError surfaces the toast.\n }\n }}\n isSubmitting={updatePaymentMethodMutation.isPending}\n countries={countryOptions}\n />\n\n <ConfirmActionDialog\n title={profileT(\"delete_credit_card\")}\n description={profileT(\"delete_credit_card_message\")}\n actionText={profileT(\"delete\")}\n openDialog={deletingPaymentMethod !== null}\n setOpenDialog={(open) => {\n if (!open) {\n setDeletingPaymentMethod(null);\n setDeleteError(undefined);\n }\n }}\n onAction={handleConfirmDelete}\n errorMsg={deleteError}\n isLoading={deletePaymentMethodMutation.isPending}\n />\n </FluidPayCoreProvider>\n );\n}\n","import { useId, useState, type JSX } from \"react\";\nimport { cn, Skeleton } from \"@fluid-app/ui-primitives\";\nimport { ChevronDown } from \"lucide-react\";\nimport type { fluidPay } from \"@fluid-app/fluid-pay-core\";\nimport { EllipsesDropdown } from \"@fluid-app/profile-ui\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\n\ninterface SelectableAddressDropdownProps {\n title: string;\n displayAddress: fluidPay.CustomerAddress | null;\n addressList: fluidPay.CustomerAddress[];\n selectedAddressId: number;\n onSelectAddress: (address: fluidPay.CustomerAddress) => void;\n onAddAddressClick: () => void;\n onEditAddress?: (address: fluidPay.CustomerAddress) => void;\n onDeleteAddress?: (address: fluidPay.CustomerAddress) => void;\n onMakeDefaultAddress?: (address: fluidPay.CustomerAddress) => void;\n addAddressLabel?: string;\n showAddButton?: boolean;\n isLoading?: boolean;\n /** Disable selection while a parent mutation is in flight. */\n isPending?: boolean;\n className?: string;\n}\n\nfunction formatLine1(address: fluidPay.CustomerAddress): string {\n return [address.address1, address.address2].filter(Boolean).join(\", \");\n}\n\nfunction formatCityStateZip(address: fluidPay.CustomerAddress): string {\n const cityState = [address.city, address.state].filter(Boolean).join(\", \");\n return [cityState, address.postal_code].filter(Boolean).join(\" \");\n}\n\n/**\n * Selectable variant of profile-ui's AddressDropdown, mirroring\n * SelectablePaymentMethodDropdown. Flat layout (no Card wrapper) so it\n * sits inline next to the payment method dropdown in the subscription\n * detail's Payment & Shipping section.\n */\nexport function SelectableAddressDropdown({\n title,\n displayAddress,\n addressList,\n selectedAddressId,\n onSelectAddress,\n onAddAddressClick,\n onEditAddress,\n onDeleteAddress,\n onMakeDefaultAddress,\n addAddressLabel: addAddressLabelProp,\n showAddButton = true,\n isLoading = false,\n isPending = false,\n className = \"\",\n}: SelectableAddressDropdownProps): JSX.Element {\n const { t } = useProfileTranslation();\n const addAddressLabel = addAddressLabelProp ?? t(\"add_an_address\");\n const [isOpen, setIsOpen] = useState(false);\n const sectionId = useId();\n\n return (\n <div className={cn(\"border-border mb-6 border-b pb-4\", className)}>\n <button\n type=\"button\"\n aria-expanded={isOpen}\n aria-controls={sectionId}\n onClick={() => setIsOpen((prev) => !prev)}\n className=\"flex w-full flex-row items-center justify-between\"\n >\n <span className=\"text-muted-foreground text-sm\">{title}</span>\n <ChevronDown\n className={cn(\n \"text-muted-foreground h-4 w-4 transition-transform duration-200\",\n isOpen && \"rotate-180\",\n )}\n />\n </button>\n\n {/* Collapsed summary — shows the subscription's current address inline.\n Clicking expands. Mirrors checkout's address-dropdown collapse\n behavior. */}\n {!isOpen && displayAddress && (\n <button\n type=\"button\"\n onClick={() => setIsOpen(true)}\n className=\"mt-1 mb-2 flex w-full cursor-pointer flex-col text-left\"\n >\n <span className=\"text-foreground text-sm font-medium\">\n {displayAddress.name}\n {displayAddress.name && displayAddress.address1 ? \", \" : \"\"}\n {displayAddress.address1}\n </span>\n <span className=\"text-muted-foreground text-sm\">\n {formatCityStateZip(displayAddress)}\n </span>\n </button>\n )}\n\n {isOpen && (\n <div\n id={sectionId}\n role=\"listbox\"\n aria-label={title}\n className=\"mt-5 flex max-h-[400px] flex-col gap-y-4 overflow-y-auto pr-0.5\"\n >\n {isLoading ? (\n <>\n {[1, 2].map((i) => (\n <div key={`skeleton-${i}`} className=\"bg-muted rounded-sm p-3\">\n <Skeleton className=\"mb-1 h-4 w-32\" />\n <Skeleton className=\"mb-1 h-4 w-48\" />\n <Skeleton className=\"h-4 w-40\" />\n </div>\n ))}\n </>\n ) : (\n addressList.map((address) => {\n const isSelected = selectedAddressId === address.id;\n const handleSelect = () => {\n if (isPending) return;\n onSelectAddress(address);\n };\n return (\n <div\n key={address.id}\n role=\"option\"\n tabIndex={isPending ? -1 : 0}\n aria-selected={isSelected}\n aria-disabled={isPending}\n onClick={handleSelect}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleSelect();\n }\n }}\n className={cn(\n \"text-foreground flex w-full flex-row items-center justify-between gap-3 rounded-sm p-3 text-left transition-colors\",\n \"not-aria-disabled:cursor-pointer aria-disabled:cursor-not-allowed aria-disabled:opacity-60\",\n isSelected\n ? \"bg-background border-border border\"\n : \"bg-muted hover:bg-muted/80 border border-transparent\",\n )}\n >\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"text-foreground text-sm font-medium\">\n {address.name}\n </span>\n <span className=\"text-muted-foreground text-sm\">\n {formatLine1(address)}\n </span>\n <span className=\"text-muted-foreground text-sm\">\n {formatCityStateZip(address)}\n </span>\n </div>\n <div className=\"flex shrink-0 flex-row items-center gap-2\">\n {address.default && (\n <span className=\"bg-primary text-primary-foreground rounded px-2 py-0.5 text-xs font-medium\">\n {t(\"default\")}\n </span>\n )}\n {(onEditAddress ||\n onDeleteAddress ||\n onMakeDefaultAddress) && (\n <span\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n <EllipsesDropdown\n onEdit={\n onEditAddress\n ? () => onEditAddress(address)\n : undefined\n }\n onDelete={\n onDeleteAddress\n ? () => onDeleteAddress(address)\n : undefined\n }\n onMakeDefault={\n !address.default && onMakeDefaultAddress\n ? () => onMakeDefaultAddress(address)\n : undefined\n }\n />\n </span>\n )}\n </div>\n </div>\n );\n })\n )}\n </div>\n )}\n\n {showAddButton && (\n <button\n type=\"button\"\n disabled={isPending}\n className=\"text-foreground mt-3 text-left text-sm disabled:cursor-not-allowed disabled:opacity-60\"\n onClick={onAddAddressClick}\n >\n {addAddressLabel}\n </button>\n )}\n </div>\n );\n}\n","import { useCallback, useMemo, useState, type JSX } from \"react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n FluidPayCoreProvider,\n type fluidPay,\n type State,\n} from \"@fluid-app/fluid-pay-core\";\nimport { AddressFormDialog, ConfirmActionDialog } from \"@fluid-app/profile-ui\";\nimport { AddressAutocompleteInput } from \"@fluid-app/address-autocomplete/components/AddressAutocompleteInput\";\nimport { useActiveLocale } from \"@fluid-app/i18n/locale-context\";\nimport { useProfileTranslation } from \"@fluid-app/profile-core/translation-api-context\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport {\n subscriptionsKeys,\n useUpdateSubscriptionInfo,\n} from \"@fluid-app/subscriptions-core\";\nimport type { ShippingAddressSlotContext } from \"@fluid-app/subscriptions-ui\";\nimport type { PayAddress } from \"@fluid-app/portal-core/pay-types\";\nimport { usePayApi } from \"@fluid-app/portal-core/pay-api-context\";\nimport { useCountriesApi } from \"@fluid-app/store-core/countries-api-context\";\nimport { payKeys, storeKeys } from \"../account/query-keys\";\nimport { createFluidPayApiAdapter } from \"../adapters/fluid-pay-api-adapter\";\nimport { useFluidContext } from \"../providers/FluidProvider\";\nimport { ProfileTranslationBridge } from \"../providers/ProfileTranslationBridge\";\nimport { SelectableAddressDropdown } from \"./SelectableAddressDropdown\";\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\n// Fall back when the customer's saved-address list doesn't contain the\n// subscription's current address (initial load before fetch, or address\n// removed in another session). Without this the collapsed accordion\n// header would render blank.\nfunction subscriptionAddressToFluidPay(\n raw: ShippingAddressSlotContext[\"address\"],\n): fluidPay.CustomerAddress | null {\n if (!raw) return null;\n return {\n id: raw.id,\n address1: raw.address1,\n address2: raw.address2,\n city: raw.city,\n country_code: raw.country_code,\n default: raw.default,\n name: raw.name,\n postal_code: raw.postal_code,\n state: raw.state,\n subdivision_code: raw.subdivision_code,\n };\n}\n\ntype ShippingAddressSectionProps = ShippingAddressSlotContext & {\n // `severity` is omitted for normal success and set to \"warning\" when the\n // backend deduped an address create (existing record returned). Callers that\n // ignore the second argument default to a success toast.\n onSuccess?: (message: string, severity?: \"success\" | \"warning\") => void;\n onError?: (message: string, error: unknown) => void;\n};\n\nexport function PortalSubscriptionShippingAddressSection(\n props: ShippingAddressSectionProps,\n): JSX.Element {\n return (\n <ProfileTranslationBridge>\n <PortalSubscriptionShippingAddressSectionInner {...props} />\n </ProfileTranslationBridge>\n );\n}\n\nfunction PortalSubscriptionShippingAddressSectionInner({\n address: currentAddress,\n subscriptionToken,\n onSuccess,\n onError,\n}: ShippingAddressSectionProps): JSX.Element {\n const { t: profileT } = useProfileTranslation();\n const { t: subsT } = useSubscriptionsTranslation();\n const { config } = useFluidContext();\n const { locale } = useActiveLocale();\n\n // Bridge for fluid-pay-ui dialogs that accept `t: (key: string) => string`.\n // The underlying adapter falls back to `key` for unknown keys, so widening\n // the key type is safe at runtime.\n const tFn = useCallback(\n (key: string): string => profileT(key as never),\n [profileT],\n );\n\n const payApi = usePayApi();\n const queryClient = useQueryClient();\n const fluidPayShim = useMemo(\n () => createFluidPayApiAdapter(payApi),\n [payApi],\n );\n\n const [isFormDialogOpen, setIsFormDialogOpen] = useState(false);\n const [editingAddress, setEditingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [deletingAddress, setDeletingAddress] =\n useState<fluidPay.CustomerAddress | null>(null);\n const [deleteError, setDeleteError] = useState<string | undefined>(undefined);\n\n const { data: addresses = [], isLoading } = useQuery({\n queryKey: payKeys.addresses.list(),\n queryFn: async () => {\n const response = await payApi.fetchAddresses();\n return response.addresses.map(mapToFluidPayAddress);\n },\n });\n\n const countriesApi = useCountriesApi();\n const { data: countriesData } = useQuery({\n queryKey: storeKeys.countries(),\n queryFn: () => countriesApi.listCountries(),\n enabled: isFormDialogOpen,\n });\n const countryOptions = useMemo(\n () =>\n [...(countriesData?.countries ?? [])]\n .map((c) => ({ iso: c.code, name: c.name }))\n .sort((a, b) => a.name.localeCompare(b.name)),\n [countriesData],\n );\n const statesByCountry = useMemo(() => {\n const map = new Map<string, State[]>();\n for (const c of countriesData?.countries ?? []) {\n map.set(\n c.code,\n c.states.map((s) => ({ name: s.name, isoCode: s.code })),\n );\n }\n return map;\n }, [countriesData]);\n const fetchStatesFromCountries = useCallback(\n (countryCode: string): Promise<State[]> =>\n Promise.resolve(statesByCountry.get(countryCode) ?? []),\n [statesByCountry],\n );\n\n const updateSubscription = useUpdateSubscriptionInfo({\n onSuccess: () => {\n onSuccess?.(profileT(\"shipping_address_updated\"));\n queryClient.invalidateQueries({\n queryKey: subscriptionsKeys.detail(subscriptionToken),\n });\n },\n onError: (err) =>\n onError?.(profileT(\"failed_to_update_shipping_address\"), err),\n });\n\n const createAddressMutation = useMutation({\n // Detect a server-side dedupe (POST /api/pay/addresses returns the existing\n // record when an identical address already exists, ignoring `name`). Snapshot\n // the current id set before the request and compare against the returned id.\n mutationFn: async (body: fluidPay.CreateAddressBody) => {\n const existingIds = new Set(addresses.map((a) => a.id));\n const address = await payApi.createAddress({\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n default: body.address.default,\n },\n });\n return { address, deduped: existingIds.has(address.id) };\n },\n onSuccess: ({ deduped }) => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n if (deduped) {\n onSuccess?.(profileT(\"address_already_exists\"), \"warning\");\n } else {\n onSuccess?.(profileT(\"address_created\"), \"success\");\n }\n },\n onError: (err) => onError?.(profileT(\"failed_to_create_address\"), err),\n });\n\n const updateAddressMutation = useMutation({\n mutationFn: ({\n addressId,\n body,\n }: {\n addressId: number;\n body: fluidPay.CreateAddressBody;\n }) =>\n payApi.updateAddress(addressId, {\n address: {\n name: body.address.name,\n street1: body.address.address1,\n street2: body.address.address2,\n city: body.address.city,\n state: body.address.state,\n zip: body.address.postal_code,\n country: body.address.country_code,\n default: body.address.default,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onSuccess?.(profileT(\"address_updated\"));\n },\n onError: (err) => onError?.(profileT(\"failed_to_update_address\"), err),\n });\n\n const deleteAddressMutation = useMutation({\n mutationFn: (addressId: number) => payApi.deleteAddress(addressId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onSuccess?.(profileT(\"address_deleted\"));\n },\n });\n\n const makeDefaultAddressMutation = useMutation({\n mutationFn: (address: fluidPay.CustomerAddress) =>\n payApi.updateAddress(address.id, {\n address: {\n name: address.name ?? null,\n street1: address.address1 ?? \"\",\n street2: address.address2,\n city: address.city ?? \"\",\n state: address.state ?? \"\",\n zip: address.postal_code ?? \"\",\n country: address.country_code ?? \"\",\n default: true,\n },\n }),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: payKeys.addresses.all });\n onSuccess?.(profileT(\"default_address_updated\"));\n },\n onError: (err) =>\n onError?.(profileT(\"failed_to_update_default_address\"), err),\n });\n\n const displayed =\n addresses.find((a) => a.id === currentAddress?.id) ??\n subscriptionAddressToFluidPay(currentAddress);\n\n const handleCloseFormDialog = () => {\n setIsFormDialogOpen(false);\n setEditingAddress(null);\n };\n\n const handleConfirmDelete = async () => {\n if (!deletingAddress) return;\n setDeleteError(undefined);\n try {\n await deleteAddressMutation.mutateAsync(deletingAddress.id);\n setDeletingAddress(null);\n } catch (err) {\n setDeleteError(\n err instanceof Error\n ? err.message\n : profileT(\"unable_to_delete_address\"),\n );\n }\n };\n\n return (\n <FluidPayCoreProvider api={fluidPayShim}>\n <SelectableAddressDropdown\n title={subsT(\"shipping_address\")}\n displayAddress={displayed}\n addressList={addresses}\n selectedAddressId={currentAddress?.id ?? 0}\n onSelectAddress={(addr) => {\n if (addr.id === currentAddress?.id) return;\n updateSubscription.mutate({\n subscriptionToken,\n body: { address_id: addr.id },\n });\n }}\n onAddAddressClick={() => {\n setEditingAddress(null);\n setIsFormDialogOpen(true);\n }}\n onEditAddress={(addr) => {\n setEditingAddress(addr);\n setIsFormDialogOpen(true);\n }}\n onDeleteAddress={(addr) => {\n setDeleteError(undefined);\n setDeletingAddress(addr);\n }}\n onMakeDefaultAddress={(addr) => makeDefaultAddressMutation.mutate(addr)}\n addAddressLabel={profileT(\"add_an_address_action\")}\n showAddButton\n isLoading={isLoading}\n isPending={\n updateSubscription.isPending ||\n createAddressMutation.isPending ||\n updateAddressMutation.isPending ||\n makeDefaultAddressMutation.isPending\n }\n />\n\n <AddressFormDialog\n isOpen={isFormDialogOpen}\n onClose={handleCloseFormDialog}\n selectedAddress={editingAddress}\n defaultCountry={\n addresses.find((a) => a.default)?.country_code ??\n currentAddress?.country_code ??\n config.countryIso ??\n \"US\"\n }\n languageIso={locale}\n t={tFn}\n onSubmit={async (data: fluidPay.CreateAddressBody) => {\n try {\n if (editingAddress) {\n await updateAddressMutation.mutateAsync({\n addressId: editingAddress.id,\n body: data,\n });\n } else {\n await createAddressMutation.mutateAsync(data);\n }\n handleCloseFormDialog();\n } catch {\n // onError surfaces the toast; swallow here so AddressFormDialog\n // doesn't see an unhandled rejection from its onSubmit handler.\n }\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={profileT(\"address_line_1\")}\n />\n )}\n />\n\n <ConfirmActionDialog\n title={profileT(\"delete_address\")}\n description={profileT(\"delete_address_message\")}\n actionText={profileT(\"delete\")}\n openDialog={deletingAddress !== null}\n setOpenDialog={(open) => {\n if (!open) {\n setDeletingAddress(null);\n setDeleteError(undefined);\n }\n }}\n onAction={handleConfirmDelete}\n errorMsg={deleteError}\n isLoading={deleteAddressMutation.isPending}\n />\n </FluidPayCoreProvider>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { SubscriptionDetailScreen as SubscriptionDetailScreenContent } from \"@fluid-app/subscriptions-ui/screens/SubscriptionDetailScreen\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { PortalSubscriptionPaymentMethodSection } from \"../subscriptions/PortalSubscriptionPaymentMethodSection\";\nimport { PortalSubscriptionShippingAddressSection } from \"../subscriptions/PortalSubscriptionShippingAddressSection\";\n\ninterface SubscriptionDetailScreenProps {\n token: string;\n onToast: (message: string, type: \"success\" | \"error\" | \"warning\") => void;\n}\n\nexport function SubscriptionDetailScreen({\n token,\n onToast,\n}: SubscriptionDetailScreenProps): React.JSX.Element {\n const { navigate } = useAppNavigation();\n const { t } = useSubscriptionsTranslation();\n // Lift the Add Payment Method dialog state so the past-due banner's\n // \"Update your card\" CTA and the in-section payment-method dropdown\n // open the same dialog. Without this, the banner would have to\n // duplicate the \"Add Payment Method\" mounting logic, or scroll\n // (which the subscriptions-ui fallback does for non-portal hosts).\n const [addPaymentDialogOpen, setAddPaymentDialogOpen] = useState(false);\n\n const handleNavigateToList = useCallback(\n () => navigate(\"subscriptions\"),\n [navigate],\n );\n\n const handleNavigateToSubscription = useCallback(\n (nextToken: string) => navigate(`subscriptions/${nextToken}`),\n [navigate],\n );\n\n const handleNotFound = useCallback(() => {\n onToast(t(\"subscription_not_found\"), \"warning\");\n navigate(\"subscriptions\");\n }, [onToast, navigate, t]);\n\n const handleError = useCallback(\n (err: unknown) => {\n const message = err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(t(\"failed_to_load_subscription\", { message }), \"error\");\n },\n [onToast, t],\n );\n\n const handleSuccess = useCallback(\n (message: string) => {\n onToast(message, \"success\");\n },\n [onToast],\n );\n\n const handleMutationError = useCallback(\n (message: string, err: unknown) => {\n const detail = err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(`${message}: ${detail}`, \"error\");\n },\n [onToast, t],\n );\n\n return (\n <SubscriptionDetailScreenContent\n token={token}\n onNavigateToList={handleNavigateToList}\n onNavigateToSubscription={handleNavigateToSubscription}\n onNotFound={handleNotFound}\n onError={handleError}\n onSuccess={handleSuccess}\n onMutationError={handleMutationError}\n onUpdatePaymentClick={() => setAddPaymentDialogOpen(true)}\n renderPaymentMethod={(ctx) => (\n <PortalSubscriptionPaymentMethodSection\n {...ctx}\n onSuccess={(msg) => onToast(msg, \"success\")}\n onError={(msg, err) => {\n const detail =\n err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(`${msg}: ${detail}`, \"error\");\n }}\n addDialogOpen={addPaymentDialogOpen}\n onAddDialogOpenChange={setAddPaymentDialogOpen}\n />\n )}\n renderShippingAddress={(ctx) => (\n <PortalSubscriptionShippingAddressSection\n {...ctx}\n onSuccess={(msg, severity) => onToast(msg, severity ?? \"success\")}\n onError={(msg, err) => {\n const detail =\n err instanceof Error ? err.message : t(\"error_occurred\");\n onToast(`${msg}: ${detail}`, \"error\");\n }}\n />\n )}\n />\n );\n}\n","import type { ComponentProps } from \"react\";\nimport { fluidToast } from \"@fluid-app/ui-primitives\";\nimport type {\n BackgroundValue,\n BorderRadiusOptions,\n ColorOptions,\n PaddingOptions,\n} from \"../types\";\nimport type { WidgetPropertySchema } from \"../registries/property-schema-types\";\nimport { useAppNavigation } from \"../shell/AppNavigationContext\";\nimport { useAccount } from \"../hooks/use-account\";\nimport { PortalSubscriptionsApiProvider } from \"../subscriptions/PortalSubscriptionsApiProvider\";\nimport { PortalBundlesApiProvider } from \"../subscriptions/PortalBundlesApiProvider\";\nimport { useSubscriptionsTranslation } from \"@fluid-app/subscriptions-core/translation-api-context\";\nimport { SubscriptionsTranslationBridge } from \"../providers/SubscriptionsTranslationBridge\";\nimport { SubscriptionsListScreen } from \"./SubscriptionsListScreen\";\nimport { SubscriptionDetailScreen } from \"./SubscriptionDetailScreen\";\n\nfunction AccountErrorFallback(): React.JSX.Element {\n const { t } = useSubscriptionsTranslation();\n return (\n <div className=\"text-muted-foreground px-4 py-8 text-center text-sm\">\n {t(\"account_load_error\")}\n </div>\n );\n}\n\ntype SubscriptionsScreenProps = 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 SubscriptionsScreen({\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}: SubscriptionsScreenProps): React.JSX.Element {\n const { currentSlug } = useAppNavigation();\n const effectiveToast = onToast ?? defaultToast;\n\n // Parse slug: \"subscriptions\" → list, \"subscriptions/{token}\" → detail\n const detailToken = currentSlug.split(\"/\")[1];\n const isDetailView = detailToken !== undefined;\n\n const { data: account } = useAccount();\n const customerId = account?.id;\n const isLoadingCustomer = account === undefined;\n const isCustomerError = false;\n\n return (\n <div {...divProps}>\n <SubscriptionsTranslationBridge>\n <PortalSubscriptionsApiProvider>\n <PortalBundlesApiProvider>\n {isDetailView ? (\n <SubscriptionDetailScreen\n token={detailToken}\n onToast={effectiveToast}\n />\n ) : isCustomerError && !isLoadingCustomer ? (\n <AccountErrorFallback />\n ) : (\n <SubscriptionsListScreen\n customerId={customerId}\n isLoadingCustomer={isLoadingCustomer}\n onToast={effectiveToast}\n />\n )}\n </PortalBundlesApiProvider>\n </PortalSubscriptionsApiProvider>\n </SubscriptionsTranslationBridge>\n </div>\n );\n}\n\nexport const subscriptionsScreenPropertySchema: WidgetPropertySchema = {\n widgetType: \"SubscriptionsScreen\",\n displayName: \"Subscriptions Screen\",\n tabsConfig: [{ id: \"styling\", label: \"Styling\" }],\n fields: [],\n} as const satisfies WidgetPropertySchema;\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"mappings":"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"}
|