import { prisma } from "@/lib/prisma"; import Link from "next/link"; import { UserPlus } from "lucide-react"; import { UsersTable } from "@/components/admin/users-table"; import { Suspense } from "react"; import { UsersSearch } from "@/components/admin/users-search"; const PAGE_SIZE = 20; interface Props { searchParams: Promise<{ search?: string; role?: string; page?: string }>; } export default async function UsersPage({ searchParams }: Props) { const { search = "", role = "", page = "1" } = await searchParams; const currentPage = Math.max(1, parseInt(page) || 1); const skip = (currentPage - 1) * PAGE_SIZE; const where = { ...(search ? { OR: [ { name: { contains: search, mode: "insensitive" as const } }, { email: { contains: search, mode: "insensitive" as const } }, ], } : {}), ...(role ? { role } : {}), }; const [users, total] = await Promise.all([ prisma.user.findMany({ where, orderBy: { createdAt: "desc" }, skip, take: PAGE_SIZE, include: { _count: { select: { enrollments: true } }, enrollments: { include: { course: { select: { title: true } } }, orderBy: { enrolledAt: "desc" }, }, }, }), prisma.user.count({ where }), ]); const totalPages = Math.ceil(total / PAGE_SIZE); const tableUsers = users.map((u) => ({ id: u.id, name: u.name, email: u.email, role: u.role, emailVerified: u.emailVerified, createdAt: u.createdAt, enrollmentCount: u._count.enrollments, enrollments: u.enrollments.map((e) => ({ courseId: e.courseId, courseTitle: e.course.title, expiresAt: e.expiresAt, })), })); function pageUrl(p: number) { const params = new URLSearchParams(); if (search) params.set("search", search); if (role) params.set("role", role); params.set("page", String(p)); return `/admin/users?${params.toString()}`; } return (
{total} пользователей