'use client'; import { useState, useEffect, useCallback } from 'react'; import { AdminNav } from '@/components/AdminNav'; import { Button, Card, Spinner } from '@/components/ui'; import { api } from '@/lib/api'; import { formatPoints, formatDate } from '@/lib/utils'; import type { AdminStudent, AdminUsersPage } from '@/lib/types'; const PAGE_SIZE = 50; export default function AdminUsersPage() { const [users, setUsers] = useState([]); const [total, setTotal] = useState(0); const [offset, setOffset] = useState(0); const [loading, setLoading] = useState(true); const [loadingMore, setLoadingMore] = useState(false); const [error, setError] = useState(null); const fetchPage = useCallback(async (currentOffset: number, append: boolean) => { if (append) setLoadingMore(true); else setLoading(true); setError(null); try { const page = await api.get( `/api/v1/admin/users?limit=${PAGE_SIZE}&offset=${currentOffset}`, ); setUsers((prev) => (append ? [...prev, ...page.users] : page.users)); setTotal(page.total); } catch (e) { setError(e instanceof Error ? e.message : 'Ошибка загрузки'); } finally { setLoading(false); setLoadingMore(false); } }, []); useEffect(() => { fetchPage(0, false); }, [fetchPage]); function handleLoadMore() { const next = offset + PAGE_SIZE; setOffset(next); fetchPage(next, true); } const hasMore = users.length < total; return (

Студенты

{!loading && ( Всего: {total} )}
{loading && (
)} {error && (

{error}

)} {!loading && ( {users.length === 0 ? (

Студентов нет

) : ( {users.map((u) => ( ))}
Имя Email Student ID Баланс Дата регистрации
{u.name} {u.email} {u.student_id || '—'} {formatPoints(u.balance)} {formatDate(u.created_at)}
)}
)} {!loading && hasMore && (
)} {!loading && !hasMore && users.length > 0 && (

Показано {users.length} из {total}

)}
); }