import type { GetBillingSubscriptionData } from '@dify/contracts/api/console/billing/types.gen' import { cn } from '@langgenius/dify-ui/cn' import { Switch } from '@langgenius/dify-ui/switch' import { Tabs, TabsList, TabsPanel, TabsTab } from '@langgenius/dify-ui/tabs' import { useQuery } from '@tanstack/react-query' import { useAtomValue } from 'jotai' import * as React from 'react' import { useTranslation } from 'react-i18next' import Divider from '@/app/components/base/divider' import { isCurrentWorkspaceManagerAtom } from '@/context/workspace-state' import { consoleQuery } from '@/service/client' import Cloud from './assets/cloud' import NoiseBottom from './assets/noise-bottom' import NoiseTop from './assets/noise-top' import SelfHosted from './assets/self-hosted' import { PricingFooter } from './footer' import Header from './header' import { CloudPlanItem } from './plans/cloud-plan-item' import { SelfHostedPlanItem } from './plans/self-hosted-plan-item' type BillingInterval = GetBillingSubscriptionData['query']['interval'] export function PricingContent({ pricingPageURL }: { pricingPageURL: string }) { const { t } = useTranslation() const { data: features } = useQuery(consoleQuery.features.get.queryOptions()) const educationEnabled = features?.education.enabled ?? false const { data: isEducationAccount = false } = useQuery( consoleQuery.account.education.get.queryOptions({ enabled: educationEnabled, select: ({ is_student }) => is_student ?? false, }), ) const canManageBilling = useAtomValue(isCurrentWorkspaceManagerAtom) const isEducationDiscountEligible = educationEnabled && isEducationAccount const defaultBillingInterval: BillingInterval = canManageBilling && isEducationDiscountEligible ? 'year' : 'month' const [activeCategory, setActiveCategory] = React.useState<'cloud' | 'self-hosted'>('cloud') const [selectedBillingInterval, setSelectedBillingInterval] = React.useState() const billingInterval = selectedBillingInterval ?? defaultBillingInterval const isCloud = activeCategory === 'cloud' const currentCloudPlan = features?.billing.subscription.plan ?? 'sandbox' return (
$['plansCommon.title.plans'], { ns: 'billing' })} className="items-center gap-0" > ( )} /> ( )} /> {isCloud && (
$['plansCommon.yearlyBilling'], { ns: 'billing' })} size="lg" checked={billingInterval === 'year'} onCheckedChange={(checked) => setSelectedBillingInterval(checked ? 'year' : 'month') } /> {t(($) => $['plansCommon.annualBilling'], { ns: 'billing', percent: 17 })}
)}
) }