File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
import type { Metadata } from 'next';
import Link from 'next/link';
import { Alert } from '@/components/ui/alert';
import { Pagination } from '@/components/ui/pagination';
import { verifySession } from '@/lib/auth/dal';
import { fetchStudentMembers } from '@/lib/data/repositories/student-member-repository';
import { buildStudentMemberHref, parseStudentMemberQuery } from '@/lib/domain/student-member-query';
import { StudentListToolbar } from './_components/student-list-toolbar';
import { StudentSearchBar } from './_components/student-search-bar';
import { StudentTable } from './_components/student-table';
export const metadata: Metadata = {
title: '학생 회원',
};
interface PageProps {
searchParams: Promise<Record<string, string | string[] | undefined>>;
}
export default async function Page({ searchParams }: PageProps) {
await verifySession();
const query = parseStudentMemberQuery(await searchParams);
const { items, totalCount } = await fetchStudentMembers(query);
const totalPages = Math.max(1, Math.ceil(totalCount / query.pageSize));
const currentPage = Math.min(query.page, totalPages);
return (
<section className="flex flex-1 flex-col gap-6 p-8">
<h1 className="text-headline-sm text-foreground">학생 회원 목록</h1>
<StudentSearchBar query={query} />
<StudentListToolbar query={query} />
<p className="text-body-md text-foreground-muted">
총 {totalCount}명 | 현재페이지 {currentPage}/{totalPages}
</p>
{items.length === 0 ? (
<Alert
title="검색 결과가 없습니다."
actions={
<Link
href={buildStudentMemberHref(query, { keyword: '', page: 1 })}
className="bg-foreground px-4 py-2 text-background"
>
확인
</Link>
}
>
다른 검색어로 다시 시도해 주세요.
</Alert>
) : (
<>
<StudentTable items={items} page={query.page} pageSize={query.pageSize} />
<Pagination
currentPage={currentPage}
totalPages={totalPages}
buildHref={(page: number) => buildStudentMemberHref(query, { page })}
/>
</>
)}
</section>
);
}