"use client"; import { useState, useEffect } from "react"; import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, } from "lucide-react"; import { Button, buttonVariants } from "@/components/ui/button"; import { cn, formatDateTime } from "@/lib/utils"; import type { MaestroLogsResult } from "@/lib/maestros"; type LogsSectionProps = { maestroID: number; }; export function LogsSection({ maestroID }: LogsSectionProps) { const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(10); const [data, setData] = useState(null); const [isLoading, setIsLoading] = useState(true); const [errorMessage, setErrorMessage] = useState(""); useEffect(() => { let cancelled = false; const run = async () => { setIsLoading(true); setErrorMessage(""); try { const params = new URLSearchParams({ page: String(page), pageSize: String(pageSize), }); const response = await fetch( `/api/maestros/${maestroID}/logs?${params.toString()}` ); if (!response.ok) { throw new Error("처리 로그를 불러오지 못했습니다."); } const result = (await response.json()) as MaestroLogsResult; if (!cancelled) { setData(result); } } catch (err) { if (!cancelled) { setErrorMessage( err instanceof Error ? err.message : "처리 로그를 불러오지 못했습니다." ); } } finally { if (!cancelled) { setIsLoading(false); } } }; void run(); return () => { cancelled = true; }; }, [maestroID, page, pageSize]); return (

처리 로그

{data ? `전체 ${data.totalCount.toLocaleString()}건` : "로딩 중..."}

{errorMessage ? (

{errorMessage}

) : ( <> {data ? ( { setPageSize(size); setPage(1); }} page={data.page} pageSize={pageSize} totalPages={data.totalPages} /> ) : null} )}
); } function LogTable({ result, isLoading, }: { result: MaestroLogsResult | null; isLoading: boolean; }) { if (isLoading || !result) { return (

로딩 중...

); } return (
{result.items.length > 0 ? ( result.items.map((log) => ( )) ) : ( )}
LogID 유형 처리일시 내용
{log.maestroLogID} {log.type} {formatDateTime(new Date(log.logDateTime))} {log.remark}
처리 로그가 없습니다.
); } function LogPagination({ page, pageSize, totalPages, onPageChange, onPageSizeChange, }: { page: number; pageSize: number; totalPages: number; onPageChange: (page: number) => void; onPageSizeChange: (pageSize: number) => void; }) { const showNav = totalPages > 1; const paginationItems = buildPaginationItems(page, totalPages); const firstVisiblePage = paginationItems[0] ?? 1; const lastVisiblePage = paginationItems.at(-1) ?? totalPages; const hasFirstPage = paginationItems.includes(1); const hasLastPage = paginationItems.includes(totalPages); const hasPreviousPageGroup = firstVisiblePage > 1; const hasNextPageGroup = lastVisiblePage < totalPages; return (
{showNav ? ( ) : null}
); } function buildPaginationItems(currentPage: number, totalPages: number) { const startPage = Math.max(1, currentPage - 2); const endPage = Math.min(totalPages, currentPage + 2); return Array.from( { length: endPage - startPage + 1 }, (_, index) => startPage + index ); }