/** * Секция «Статистика» (список) для дашборда ментора (iOS 26). */ 'use client'; import React from 'react'; import { MentorDashboardResponse } from '@/api/dashboard'; import { Panel, SectionHeader } from '../ui'; import type { StatsListRow } from '../ui'; export interface ExtraStatsSectionProps { stats: MentorDashboardResponse | null; loading: boolean; } const IconUsers = ( ); const IconCheck = ( ); const IconCalendar = ( ); const IconRevenue = ( ); const IconFile = ( ); const IconClipboard = ( ); const IconTrendingUp = ( ); function buildRows(stats: MentorDashboardResponse | null, loading: boolean): StatsListRow[] { const s = stats?.summary; if (loading || !s) { return [ { label: 'Всего учеников:', value: '—', icon: IconUsers }, { label: 'Завершённых занятий всего:', value: '—', icon: IconCheck }, { label: 'Занятий на этой неделе:', value: '—', icon: IconCalendar }, { label: 'Всего занятий (месяц / всего):', value: '—', icon: IconCalendar }, { label: 'Доход (месяц / всё время):', value: '—', icon: IconRevenue, highlight: 'tertiary' }, { label: 'Средняя цена занятия:', value: '—', icon: IconTrendingUp }, { label: 'Процент завершённых:', value: '—', icon: IconTrendingUp }, { label: 'ДЗ на проверке:', value: '—', icon: IconClipboard }, { label: 'Всего материалов:', value: '—', icon: IconFile }, ]; } // Вычисляем среднюю цену занятия const averagePrice = s.completed_lessons && s.completed_lessons > 0 && s.total_revenue ? Math.round(s.total_revenue / s.completed_lessons) : null; // Вычисляем процент завершенных занятий const completionRate = s.total_lessons && s.total_lessons > 0 && s.completed_lessons ? Math.round((s.completed_lessons / s.total_lessons) * 100) : null; return [ { label: 'Всего учеников:', value: s.total_clients ?? '—', icon: IconUsers }, { label: 'Завершённых занятий всего:', value: s.completed_lessons ?? '—', icon: IconCheck }, { label: 'Занятий на этой неделе:', value: s.lessons_this_week ?? '—', icon: IconCalendar }, { label: 'Всего занятий (месяц / всего):', value: `${s.lessons_this_month ?? 0}/${s.total_lessons ?? 0}`, icon: IconCalendar, }, { label: 'Доход (месяц / всё время):', value: s.revenue_this_month != null || s.total_revenue != null ? `${s.revenue_this_month != null ? `${Math.round(s.revenue_this_month).toLocaleString('ru-RU')} ₽` : '0 ₽'} / ${ s.total_revenue != null ? `${Math.round(s.total_revenue).toLocaleString('ru-RU')} ₽` : '0 ₽' }` : '—', icon: IconRevenue, highlight: 'tertiary', }, { label: 'Средняя цена занятия:', value: averagePrice ? `${averagePrice.toLocaleString('ru-RU')} ₽` : '—', icon: IconTrendingUp, }, { label: 'Процент завершённых:', value: completionRate != null ? `${completionRate}%` : '—', icon: IconTrendingUp, }, { label: 'ДЗ на проверке:', value: s.pending_submissions ?? '—', icon: IconClipboard, highlight: s.pending_submissions && s.pending_submissions > 0 ? 'error' : undefined, }, { label: 'Всего материалов:', value: s.total_materials ?? '—', icon: IconFile, }, ]; } export const ExtraStatsSection: React.FC = ({ stats, loading }) => { const rows = buildRows(stats, loading).slice(0, 9); return (
{rows.map((row, index) => { const highlightClass = row.highlight === 'tertiary' ? ' ios26-stat-value--tertiary' : row.highlight === 'error' ? ' ios26-stat-value--error' : row.highlight === 'primary' || row.highlight === true ? ' ios26-stat-value--primary' : ''; return (
{row.icon &&
{row.icon}
}
{row.label.replace(/:$/, '')}
{row.value}
); })}
); };