/** * Dashboard для ментора (iOS 26). * Без календаря. Переиспользуемые секции в dashboard/mentor. */ 'use client'; import React, { useState, useEffect, useCallback } from 'react'; import { getMentorDashboard, getMentorIncome } from '@/api/dashboard'; import type { MentorDashboardResponse, MentorIncomeResponse } from '@/api/dashboard'; import type { IncomePeriod } from './mentor'; import { DashboardLayout } from './ui'; import { StatsSection, IncomeSection, ExtraStatsSection, UpcomingLessonsSection, RecentSubmissionsSection, } from './mentor'; import { ErrorDisplay } from '@/components/common/ErrorDisplay'; const isAbortError = (e: unknown): boolean => (e as any)?.name === 'AbortError' || (e as any)?.name === 'CanceledError' || (e as any)?.code === 'ERR_CANCELED'; export const MentorDashboard: React.FC = () => { const [stats, setStats] = useState(null); const [incomeStats, setIncomeStats] = useState(null); const [loading, setLoading] = useState(true); const [incomeLoading, setIncomeLoading] = useState(false); const [incomePeriod, setIncomePeriod] = useState('week'); const [error, setError] = useState(null); const loadDashboard = useCallback(async (signal?: AbortSignal) => { try { setLoading(true); setError(null); const data = await getMentorDashboard(signal ? { signal } : undefined); if (signal?.aborted) return; setStats(data); } catch (err: unknown) { if (isAbortError(err)) return; setError(err instanceof Error ? err.message : 'Ошибка загрузки данных'); } finally { if (!signal?.aborted) setLoading(false); } }, []); const loadIncome = useCallback( async (signal?: AbortSignal) => { try { setIncomeLoading(true); const data = await getMentorIncome( incomePeriod, undefined, undefined, signal ? { signal } : undefined ); if (signal?.aborted) return; setIncomeStats(data); } catch (err: unknown) { if (isAbortError(err)) return; // игнор прочих } finally { if (!signal?.aborted) setIncomeLoading(false); } }, [incomePeriod] ); useEffect(() => { const c = new AbortController(); loadDashboard(c.signal); return () => c.abort(); }, [loadDashboard]); useEffect(() => { const c = new AbortController(); loadIncome(c.signal); return () => c.abort(); }, [loadIncome]); // if (error && !stats) { // return ( // // // // ); // } return ( ); };