'use client'; import { useState, useEffect } from 'react'; import Link from 'next/link'; import { AdminNav } from '@/components/AdminNav'; import { Badge, Card, Spinner } from '@/components/ui'; import { api } from '@/lib/api'; import { formatPoints, formatDate, formatTransactionAmount } from '@/lib/utils'; import type { Stats, AdminTransactionPage, AdminTransaction } from '@/lib/types'; interface StatCardProps { label: string; value: string | number; } function StatCard({ label, value }: StatCardProps) { return (

{label}

{value}

); } export default function AdminDashboardPage() { const [stats, setStats] = useState(null); const [recentTxs, setRecentTxs] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { async function load() { try { const [s, page] = await Promise.all([ api.get('/api/v1/admin/stats'), api.get('/api/v1/admin/transactions?limit=10'), ]); setStats(s); setRecentTxs(page.transactions); } catch (e) { setError(e instanceof Error ? e.message : 'Ошибка загрузки'); } finally { setLoading(false); } } load(); }, []); return (

Дашборд

{loading && (
)} {error && (

{error}

)} {!loading && stats && (
)} {!loading && (

Последние транзакции

Все транзакции →
{recentTxs.length === 0 ? (

Транзакций ещё нет

) : ( {recentTxs.map((tx) => ( ))}
Студент Тип Сумма Дата
{tx.user_email} = 0 ? 'text-green-400' : 'text-red-400' }`} > {formatTransactionAmount(tx.amount)} {formatDate(tx.created_at)}
)}
Начислить поинты →
)}
); }