import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { useAuth } from "../contexts/AuthContext"; import { getAdminStats } from "../services/api"; import "./AdminPage.css"; interface StoryStats { id: string; title: string; messageCount: number; tokens: number; lastPlayed: string | null; } interface AdminStats { totalStories: number; totalSessions: number; totalTokens: number; stories: StoryStats[]; } export default function AdminPage() { const navigate = useNavigate(); const { isAuthenticated, isLoading: authLoading } = useAuth(); const [stats, setStats] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { if (!authLoading && !isAuthenticated) { navigate("/"); return; } const loadStats = async () => { if (!isAuthenticated) return; setIsLoading(true); try { const data = await getAdminStats(); if (data) { setStats(data); } else { setError("Не удалось загрузить статистику"); } } catch { setError("Ошибка загрузки данных"); } finally { setIsLoading(false); } }; loadStats(); }, [isAuthenticated, authLoading, navigate]); const formatTokens = (tokens: number) => { if (tokens >= 1000000) return `${(tokens / 1000000).toFixed(2)}M`; if (tokens >= 1000) return `${(tokens / 1000).toFixed(1)}K`; return tokens.toString(); }; const formatDate = (dateStr: string | null) => { if (!dateStr) return "Никогда"; return new Date(dateStr).toLocaleDateString("ru-RU", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit", }); }; if (authLoading || isLoading) { return (
Загрузка статистики...
); } if (error) { return (
{error}
); } if (!stats) { return (
Нет данных
); } return (

📊 Статистика

📚
{stats.totalStories} Историй
🎮
{stats.totalSessions} Сессий
🔤
{formatTokens(stats.totalTokens)} Всего токенов

Статистика по историям

{stats.stories.length === 0 ? ( ) : ( stats.stories.map((story) => ( )) )}
История Сообщений Токенов Последняя игра
Нет историй
{story.title} {story.messageCount} {formatTokens(story.tokens)} {formatDate(story.lastPlayed)}

💡 Примечание: Токены рассчитаны приблизительно (1 токен ≈ 3 символа для русского текста). Реальное потребление может отличаться.

); }