"use client"; import { memo, useState } from "react"; import { RecurringInterval, RecurringIntervalDuration, config, getPriceWithHighestDiscount, } from "@turbostarter/billing"; import { useTranslation } from "@turbostarter/i18n"; import { Skeleton } from "@turbostarter/ui-web/skeleton"; import { Section, SectionHeader } from "~/modules/marketing/layout/section"; import { PricingHeader } from "./layout/header"; import { Plans, PlansSkeleton } from "./plans/plans"; import type { User } from "@turbostarter/auth"; import type { BillingModel } from "@turbostarter/billing"; interface PricingSectionProps { readonly user: User | null; readonly model: BillingModel; } export const PricingSection = memo(({ user, model }) => { const { t } = useTranslation("billing"); const intervals = [ ...new Set( config.plans.flatMap((plan) => plan.prices .flatMap((price) => ("interval" in price ? price.interval : null)) .filter((x): x is RecurringInterval => !!x), ), ), ].sort((a, b) => RecurringIntervalDuration[a] - RecurringIntervalDuration[b]); const [activeInterval, setActiveInterval] = useState( intervals[0] ?? RecurringInterval.MONTH, ); const priceWithDiscount = getPriceWithHighestDiscount( config.plans, config.discounts, ); return (
); }); export const PricingSectionSkeleton = () => { return (
); }; PricingSection.displayName = "PricingSection";