'use client' import type { FC } from 'react' import React, { useMemo } from 'react' import { useTranslation } from 'react-i18next' import type { BasicPlan } from '../../../type' import { Plan } from '../../../type' import { ALL_PLANS } from '../../../config' import Toast from '../../../../base/toast' import { PlanRange } from '../../plan-switcher/plan-range-switcher' import { useAppContext } from '@/context/app-context' import { fetchSubscriptionUrls } from '@/service/billing' import List from './list' import Button from './button' import { Professional, Sandbox, Team } from '../../assets' const ICON_MAP = { [Plan.sandbox]: , [Plan.professional]: , [Plan.team]: , } type CloudPlanItemProps = { currentPlan: BasicPlan plan: BasicPlan planRange: PlanRange canPay: boolean } const CloudPlanItem: FC = ({ plan, currentPlan, planRange, }) => { const { t } = useTranslation() const [loading, setLoading] = React.useState(false) const i18nPrefix = `billing.plans.${plan}` const isFreePlan = plan === Plan.sandbox const isMostPopularPlan = plan === Plan.professional const planInfo = ALL_PLANS[plan] const isYear = planRange === PlanRange.yearly const isCurrent = plan === currentPlan const isPlanDisabled = planInfo.level <= ALL_PLANS[currentPlan].level const { isCurrentWorkspaceManager } = useAppContext() const btnText = useMemo(() => { if (isCurrent) return t('billing.plansCommon.currentPlan') return ({ [Plan.sandbox]: t('billing.plansCommon.startForFree'), [Plan.professional]: t('billing.plansCommon.startBuilding'), [Plan.team]: t('billing.plansCommon.getStarted'), })[plan] }, [isCurrent, plan, t]) const handleGetPayUrl = async () => { if (loading) return if (isPlanDisabled) return if (isFreePlan) return // Only workspace manager can buy plan if (!isCurrentWorkspaceManager) { Toast.notify({ type: 'error', message: t('billing.buyPermissionDeniedTip'), className: 'z-[1001]', }) return } setLoading(true) try { const res = await fetchSubscriptionUrls(plan, isYear ? 'year' : 'month') // Adb Block additional tracking block the gtag, so we need to redirect directly window.location.href = res.url } finally { setLoading(false) } } return (
{ICON_MAP[plan]}
{t(`${i18nPrefix}.name`)}
{ isMostPopularPlan && (
{t('billing.plansCommon.mostPopular')}
) }
{t(`${i18nPrefix}.description`)}
{/* Price */}
{isFreePlan && ( {t('billing.plansCommon.free')} )} {!isFreePlan && ( <> {isYear && ${planInfo.price * 12}} ${isYear ? planInfo.price * 10 : planInfo.price} {t('billing.plansCommon.priceTip')} {t(`billing.plansCommon.${!isYear ? 'month' : 'year'}`)} )}
) } export default React.memo(CloudPlanItem)