import { closeDialog, dialogSelector, expiredSelector, isSubscribedSelector, levelSelector, refreshSubscription, setDialog, usageSelector, } from "@/store/subscription.ts"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog.tsx"; import { useDispatch, useSelector } from "react-redux"; import { useTranslation } from "react-i18next"; import "@/assets/pages/subscription.less"; import { openDialog as openQuotaDialog, dialogSelector as quotaDialogSelector, } from "@/store/quota.ts"; import { Calendar, Info } from "lucide-react"; import { useEffectAsync } from "@/utils/hook.ts"; import { selectAuthenticated } from "@/store/auth.ts"; import SubscriptionUsage from "@/components/home/subscription/SubscriptionUsage.tsx"; import Tips from "@/components/Tips.tsx"; import { Upgrade } from "@/components/home/subscription/BuyDialog.tsx"; import { useDeeptrain } from "@/conf/env.ts"; import { useMemo } from "react"; import { getPlan, getPlanName, SubscriptionIcon, } from "@/conf/subscription.tsx"; import { cn } from "@/components/ui/lib/utils.ts"; import { Badge } from "@/components/ui/badge.tsx"; import { subscriptionDataSelector } from "@/store/globals.ts"; import { infoRelayPlanSelector } from "@/store/info.ts"; type PlanItemProps = { level: number; }; function PlanItem({ level }: PlanItemProps) { const { t } = useTranslation(); const current = useSelector(levelSelector); const subscriptionData = useSelector(subscriptionDataSelector); const plan = useMemo( () => getPlan(subscriptionData, level), [subscriptionData, level], ); const name = useMemo(() => getPlanName(level), [level]); return (
{t(`sub.${name}`)}
{t("sub.plan-price", { money: plan.price })}
{useDeeptrain &&

({t("sub.include-tax")})

}
{plan.items.map((item, index) => (
{item.value !== -1 ? t("sub.plan-usage", { name: item.name, times: item.value }) : t("sub.plan-unlimited-usage", { name: item.name })}

{t("sub.plan-tip")}

{item.models.map((model, index) => ( {model} ))}
))}
); } function SubscriptionDialog() { const { t } = useTranslation(); const open = useSelector(dialogSelector); const subscription = useSelector(isSubscribedSelector); const level = useSelector(levelSelector); const expired = useSelector(expiredSelector); const usage = useSelector(usageSelector); const auth = useSelector(selectAuthenticated); const quota = useSelector(quotaDialogSelector); const subscriptionData = useSelector(subscriptionDataSelector); const relayPlan = useSelector(infoRelayPlanSelector); const plan = useMemo( () => getPlan(subscriptionData, level), [subscriptionData, level], ); const dispatch = useDispatch(); useEffectAsync(async () => { if (!auth) return; const task = setInterval(() => refreshSubscription(dispatch), 10000); await refreshSubscription(dispatch); return () => clearInterval(task); }, [auth]); return ( dispatch(setDialog(state))} > {t("sub.dialog-title")} {subscriptionData.length > 0 ? (

quota ? dispatch(closeDialog()) : dispatch(openQuotaDialog()) } > {t("sub.quota-link")}

{!relayPlan && (
{t("sub.plan-not-support-relay")}
)} {subscription && (
} name={t("sub.expired")} usage={expired} /> {plan.items.map( (item, index) => usage?.[item.id] && ( ), )}
)}
{subscriptionData.map((item, index) => ( ))}
) : (

quota ? dispatch(closeDialog()) : dispatch(openQuotaDialog()) } > {t("sub.quota-link")}

{t("sub.disable")}

)}
); } export default SubscriptionDialog;