import {Breadcrumb} from '../../ui/breadcrumbs/breadcrumb'; import {BreadcrumbItem} from '../../ui/breadcrumbs/breadcrumb-item'; import {Trans} from '../../i18n/trans'; import {useNavigate} from '../../utils/hooks/use-navigate'; import {BillingPlanPanel} from './billing-plan-panel'; import {Product} from '../product'; import { findBestPrice, UpsellBillingCycle, } from '../pricing-table/find-best-price'; import {Fragment, useState} from 'react'; import {FormattedPrice} from '../../i18n/formatted-price'; import {Button} from '../../ui/buttons/button'; import {Link} from 'react-router-dom'; import {useProducts} from '../pricing-table/use-products'; import {Price} from '../price'; import {useBillingUser} from './use-billing-user'; import {CheckIcon} from '../../icons/material/Check'; import {Skeleton} from '../../ui/skeleton/skeleton'; import {AnimatePresence, m} from 'framer-motion'; import {BillingCycleRadio} from '../pricing-table/billing-cycle-radio'; import {opacityAnimation} from '../../ui/animation/opacity-animation'; export function ChangePlanPage() { const navigate = useNavigate(); return ( navigate('/billing')}>

}>
); } function PlanList() { const query = useProducts(); const [selectedCycle, setSelectedCycle] = useState('monthly'); if (query.isLoading) { return ; } return ( {query.data?.products.map(plan => { const price = findBestPrice(selectedCycle, plan.prices); if (!price || plan.hidden) return null; return (
{plan.name}
{plan.description}
); })}
); } interface FeatureListProps { plan: Product; } function FeatureList({plan}: FeatureListProps) { if (!plan.feature_list.length) return null; return (
{plan.feature_list.map(feature => (
))}
); } interface ContinueButtonProps { product: Product; price: Price; } function ContinueButton({product, price}: ContinueButtonProps) { const {subscription} = useBillingUser(); if (!subscription?.price || !subscription?.product) return null; if ( subscription.product_id === product.id && subscription.price_id === price.id ) { return (
); } return ( ); } function PlanSkeleton() { return ( ); }