'use client'; import { useState, useMemo, useEffect } from "react"; import AdminSidebar from "@/app/components/AdminSidebar"; import CourseRegistrationModal from "./CourseRegistrationModal"; import ChevronDownSvg from "@/app/svgs/chevrondownsvg"; import { getCourses, type Course } from "./mockData"; export default function AdminCoursesPage() { const [courses, setCourses] = useState([]); const [isLoading, setIsLoading] = useState(true); const [isModalOpen, setIsModalOpen] = useState(false); const [editingCourse, setEditingCourse] = useState(null); const [currentPage, setCurrentPage] = useState(1); const [showToast, setShowToast] = useState(false); // API에서 과목 리스트 가져오기 useEffect(() => { async function fetchCourses() { try { setIsLoading(true); const data = await getCourses(); console.log('📋 [AdminCoursesPage] 받은 데이터:', data); console.log('📋 [AdminCoursesPage] 데이터 개수:', data.length); setCourses(data); } catch (error) { console.error('과목 리스트 로드 오류:', error); setCourses([]); } finally { setIsLoading(false); } } fetchCourses(); }, []); const totalCount = useMemo(() => courses.length, [courses]); const ITEMS_PER_PAGE = 10; const sortedCourses = useMemo(() => { return [...courses].sort((a, b) => { // 생성일 내림차순 정렬 (최신 날짜가 먼저) return b.createdAt.localeCompare(a.createdAt); }); }, [courses]); const totalPages = Math.ceil(sortedCourses.length / ITEMS_PER_PAGE); const paginatedCourses = useMemo(() => { const startIndex = (currentPage - 1) * ITEMS_PER_PAGE; const endIndex = startIndex + ITEMS_PER_PAGE; return sortedCourses.slice(startIndex, endIndex); }, [sortedCourses, currentPage]); const handleSaveCourse = async (courseName: string, instructorName: string) => { if (editingCourse) { // 수정 모드 - TODO: API 호출로 변경 필요 setCourses(prev => prev.map(course => course.id === editingCourse.id ? { ...course, courseName, instructorName } : course )); } else { // 등록 모드 - TODO: API 호출로 변경 필요 const newCourse: Course = { id: String(Date.now()), courseName, instructorName, createdAt: new Date().toISOString().split('T')[0], createdBy: '', // API에서 받아오도록 변경 필요 hasLessons: false, // 기본값: 미포함 }; setCourses(prev => [...prev, newCourse]); } setIsModalOpen(false); setEditingCourse(null); // 저장 후 리스트 새로고침 try { const data = await getCourses(); setCourses(data); } catch (error) { console.error('과목 리스트 새로고침 오류:', error); } }; const handleRowClick = (course: Course) => { setEditingCourse(course); setIsModalOpen(true); }; const handleModalClose = () => { setIsModalOpen(false); setEditingCourse(null); }; const handleRegisterClick = () => { setEditingCourse(null); setIsModalOpen(true); }; const handleDeleteCourse = async () => { if (editingCourse) { // TODO: API 호출로 삭제 처리 필요 setCourses(prev => prev.filter(course => course.id !== editingCourse.id)); setEditingCourse(null); setShowToast(true); setTimeout(() => { setShowToast(false); }, 3000); // 삭제 후 리스트 새로고침 try { const data = await getCourses(); setCourses(data); } catch (error) { console.error('과목 리스트 새로고침 오류:', error); } } }; return (
{/* 메인 레이아웃 */}
{/* 사이드바 */}
{/* 메인 콘텐츠 */}
{/* 제목 영역 */}

교육과정 관리

{/* 헤더 영역 (제목과 콘텐츠 사이) */}

총 {totalCount}건

{/* 콘텐츠 영역 */}
{isLoading ? (

로딩 중...

) : courses.length === 0 ? (

등록된 교육과정이 없습니다.
과목을 등록해주세요.

) : (
{paginatedCourses.map((course) => ( handleRowClick(course)} > ))}
교육과정명 강사명 생성일 강좌포함여부
{course.courseName} {course.instructorName} {course.createdAt} {course.hasLessons ? (
포함
) : (
미포함
)}
)} {/* 페이지네이션 - 10개 초과일 때만 표시 */} {courses.length > ITEMS_PER_PAGE && (() => { // 페이지 번호를 10단위로 표시 const pageGroup = Math.floor((currentPage - 1) / 10); const startPage = pageGroup * 10 + 1; const endPage = Math.min(startPage + 9, totalPages); const visiblePages = Array.from({ length: endPage - startPage + 1 }, (_, i) => startPage + i); return (
{/* First (맨 앞으로) */} {/* Prev */} {/* Numbers */} {visiblePages.map((n) => { const active = n === currentPage; return ( ); })} {/* Next */} {/* Last (맨 뒤로) */}
); })()}
{/* 삭제 완료 토스트 */} {showToast && (

교육과정을 삭제했습니다.

)}
); }