'use client'; import { useState, useEffect } from 'react'; import apiClient from '@/lib/api-client'; import { LoadingSpinner } from '@/components/common/LoadingSpinner'; import Link from 'next/link'; /** Подписи преимуществ из plan.features (API) */ const FEATURE_LABELS: Record = { video_calls: 'Видеозвонки', screen_sharing: 'Демонстрация экрана', whiteboard: 'Интерактивная доска', homework: 'Домашние задания', materials: 'Материалы', analytics: 'Аналитика', telegram_bot: 'Telegram-бот', api_access: 'API', }; /** Стандартные преимущества по типу тарифа (если API не вернул features) */ const DEFAULT_FEATURES: string[] = [ 'Видеозвонки', 'Демонстрация экрана', 'Интерактивная доска', 'Домашние задания', 'Материалы', 'Аналитика', 'Telegram-бот', ]; function getBenefitList(plan: any): string[] { const fromApi = plan.features && typeof plan.features === 'object' ? Object.entries(plan.features) .filter(([, enabled]) => enabled) .map(([key]) => FEATURE_LABELS[key] || key) : []; if (fromApi.length > 0) return fromApi; // Fallback: все стандартные функции для месячных, для "за ученика" добавляем "Гибкая оплата" if (plan.subscription_type === 'per_student') { return ['Гибкая оплата за каждого ученика', ...DEFAULT_FEATURES]; } return ['Безлимит учеников', ...DEFAULT_FEATURES]; } function getPlanDescription(plan: any): string { if (plan.description) return plan.description; if (plan.subscription_type === 'per_student') { return 'Оплата за каждого ученика. Гибкая система в зависимости от количества.'; } return 'Ежемесячная подписка без ограничений по количеству учеников. Все функции доступны.'; } const CheckIcon = () => ( ); export function ProfilePaymentTab() { const [plans, setPlans] = useState([]); const [loading, setLoading] = useState(true); const [subscription, setSubscription] = useState(null); useEffect(() => { const load = async () => { try { const [plansRes, subRes] = await Promise.all([ apiClient.get('/subscriptions/plans/').then((r) => r.data?.results || r.data || []), apiClient.get('/subscriptions/subscriptions/active/').then((r) => r.data).catch(() => null), ]); setPlans(Array.isArray(plansRes) ? plansRes : []); setSubscription(subRes); } catch { setPlans([]); } finally { setLoading(false); } }; load(); }, []); if (loading) { return ; } if (plans.length === 0) { return (

Нет доступных тарифов

); } return (
{subscription && (
Текущая подписка

{subscription.plan?.name || 'Активна'}

{subscription.end_date && (

До {new Date(subscription.end_date).toLocaleDateString('ru-RU')}

)}
)} ТАРИФНЫЕ ПЛАНЫ
{plans.slice(0, 5).map((plan: any) => { const benefits = getBenefitList(plan); const description = getPlanDescription(plan); const priceText = plan.price_per_student ? `${Math.round(plan.price_per_student || 0).toLocaleString('ru-RU')} ₽/уч.` : `${Math.round(plan.price || 0).toLocaleString('ru-RU')} ₽/мес`; return (
{plan.name}
{plan.price_per_student ? Math.round(plan.price_per_student || 0).toLocaleString('ru-RU') : Math.round(plan.price || 0).toLocaleString('ru-RU')} {plan.price_per_student ? 'за ученика' : '/мес'}

{description}

    {benefits.slice(0, 5).map((label) => (
  • {label}
  • ))}
Подробнее и оплатить
); })}
); }