"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import { Badge } from "@/components/ui/badge"; import { authClient } from "@/lib/auth-client"; type Enrollment = { courseId: string; courseTitle: string; expiresAt: Date | null; }; type UserRow = { id: string; name: string; email: string; role: string; emailVerified: boolean; createdAt: Date; enrollmentCount: number; enrollments: Enrollment[]; }; const roleLabel: Record = { admin: "Администратор", curator: "Куратор", student: "Ученик", }; const roleVariant: Record = { admin: "default", curator: "secondary", student: "outline", }; function UserPopup({ user }: { user: UserRow }) { const now = new Date(); return (
{/* Contact */}

Контакты

{user.email}

{/* Courses */} {user.enrollments.length > 0 ? (

Курсы ({user.enrollments.length})

{user.enrollments.map((e) => { const expired = e.expiresAt && new Date(e.expiresAt) < now; return (

{e.courseTitle}

{e.expiresAt ? expired ? "просрочен" : `до ${new Date(e.expiresAt).toLocaleDateString("ru-RU")}` : "бессрочно"}
); })}
) : (

Курсов нет

)} Открыть профиль →
); } function ImpersonateButton({ userId }: { userId: string }) { const router = useRouter(); const [loading, setLoading] = useState(false); async function handleImpersonate() { setLoading(true); try { await authClient.admin.impersonateUser({ userId }); window.location.href = "/dashboard"; } catch { setLoading(false); } } return ( ); } export function UsersTable({ users }: { users: UserRow[] }) { const [hoveredId, setHoveredId] = useState(null); return (
{["Пользователь", "Роль", "Курсов", "Email подтверждён", "Зарегистрирован", ""].map((h) => ( ))} {users.map((user) => ( {/* Actions */} ))}
{h}
{user.name}

{user.email}

{roleLabel[user.role] ?? user.role} {user.enrollmentCount} {user.emailVerified ? "Да" : "Нет"} {new Date(user.createdAt).toLocaleDateString("ru-RU")}
{user.role !== "admin" && }
setHoveredId(user.id)} onMouseLeave={() => setHoveredId(null)} > {hoveredId === user.id && }
); }