import { useTranslation } from 'react-i18next'; import { useTheme } from '../../hooks/useTheme'; import { getGlassColors } from '../../utils/glassTheme'; import { useHaptic } from '../../platform'; import type { SubscriptionListItem } from '../../types'; function formatDate(iso: string | null, locale?: string): string { if (!iso) return '—'; try { return new Date(iso).toLocaleDateString(locale ?? undefined, { day: '2-digit', month: '2-digit', year: 'numeric', }); } catch { return '—'; } } function StatusBadge({ status, isTrial, t, }: { status: string; isTrial: boolean; t: (key: string, fallback: string) => string; }) { const isActive = status === 'active' || status === 'trial'; const isLimited = status === 'limited'; const isExpired = status === 'expired' || status === 'disabled'; if (isTrial) { return ( {t('subscription.statusTrial', 'Тестовая')} ); } const color = isActive ? 'bg-emerald-400/15 text-emerald-400 border-emerald-400/20' : isLimited ? 'bg-amber-400/15 text-amber-400 border-amber-400/20' : 'bg-red-400/15 text-red-400 border-red-400/20'; const label = isActive ? t('subscription.statusActive', 'Активна') : isLimited ? t('subscription.statusLimited', 'Ограничена') : isExpired ? t('subscription.statusExpired', 'Истекла') : status; return ( {label} ); } export default function SubscriptionListCard({ subscription, onClick, }: { subscription: SubscriptionListItem; onClick: () => void; }) { const { t, i18n } = useTranslation(); const { isDark } = useTheme(); const g = getGlassColors(isDark); const { impact } = useHaptic(); const handleClick = () => { impact('light'); onClick(); }; const isTrial = subscription.is_trial; const isActive = subscription.status === 'active' || subscription.status === 'trial'; const isExpired = subscription.status === 'expired' || subscription.status === 'disabled'; const trafficLimit = subscription.traffic_limit_gb; const trafficUsed = subscription.traffic_used_gb; const isUnlimited = trafficLimit === 0; const trafficPercent = isUnlimited ? 0 : trafficLimit > 0 ? Math.min(100, (trafficUsed / trafficLimit) * 100) : 0; const trafficColor = trafficPercent >= 90 ? 'bg-red-400' : trafficPercent >= 70 ? 'bg-amber-400' : 'bg-emerald-400'; const borderColor = isTrial ? 'rgba(251,191,36,0.2)' : isExpired ? 'rgba(255,59,92,0.15)' : g.cardBorder; const bgColor = isTrial ? isDark ? 'rgba(251,191,36,0.04)' : 'rgba(251,191,36,0.03)' : isExpired ? isDark ? 'rgba(255,59,92,0.04)' : 'rgba(255,59,92,0.03)' : g.cardBg; return ( ); }