import React, { useState, useEffect } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { useAuth } from '../context/AuthContext'; import { useSite } from '../context/SiteContext'; import { getSitePackages, subscribePackage, getActiveSubscriptions, Q } from '../api'; import SpotlightCard from '../components/bits/SpotlightCard'; import toast from 'react-hot-toast'; const resetLabelKeys = { never: 'packages.resetNever', daily: 'packages.resetDaily', weekly: 'packages.resetWeekly', monthly: 'packages.resetMonthly', }; function formatDate(unix) { if (!unix) return ''; return new Date(unix * 1000).toLocaleDateString(); } export default function Packages() { const { t } = useTranslation(); const { user, refreshUser } = useAuth(); const { site } = useSite(); const cs = site?.currency_symbol || '¥'; const navigate = useNavigate(); const [packages, setPackages] = useState([]); const [loading, setLoading] = useState(true); const [subscribing, setSubscribing] = useState(null); const [activeSubs, setActiveSubs] = useState([]); const [confirmPkg, setConfirmPkg] = useState(null); const getResetLabel = (period) => t(resetLabelKeys[period] || resetLabelKeys.never); useEffect(() => { getSitePackages() .then((r) => { if (r.data.success) setPackages(r.data.data || []); }) .catch(() => {}) .finally(() => setLoading(false)); }, []); // Load active subscriptions useEffect(() => { if (user) { getActiveSubscriptions() .then((r) => { if (r.data.success) setActiveSubs(r.data.data || []); }) .catch(() => {}); } }, [user]); const handleSubscribe = async (pkg) => { if (!user) { navigate('/register'); return; } setConfirmPkg(pkg); }; const confirmSubscribe = async () => { if (!confirmPkg) return; const pkgId = confirmPkg.id; setSubscribing(pkgId); try { const res = await subscribePackage(pkgId); if (res.data.success) { toast.success(t('packages.subscribedSuccess')); setConfirmPkg(null); await refreshUser(); // Reload subscriptions getActiveSubscriptions() .then((r) => { if (r.data.success) setActiveSubs(r.data.data || []); }) .catch(() => {}); } else { toast.error(res.data.message || t('common.requestFailed')); } } catch (e) { // Error already shown by axios interceptor } setSubscribing(null); }; if (loading) { return (
{t('packages.subtitle')}
{t('packages.noPackages')}
{t('packages.checkPricing')} →{pkg.description}
)}{t('packages.daysAccess', { count: pkg.duration })}
)}{t('packages.confirmDesc', { name: confirmPkg.name, price: pkgPrice.toFixed(2) })}
{isSubscription && ({t('packages.subscriptionInfo', { period: getResetLabel(resetPeriod), days: confirmPkg.duration || 30, amount: (confirmPkg.quota_amount / Q).toFixed(2), })}
{t('packages.yourBalance')} {cs}{userBalance.toFixed(2)}
{insufficient && ({t('packages.insufficientBalance')}