'use client'; import { useEffect, useState } from 'react'; import { useParams, useRouter } from 'next/navigation'; import Image from 'next/image'; import apiService from '../../lib/apiService'; import BackCircleSvg from '../../svgs/backcirclesvg'; const imgPlay = '/imgs/play.svg'; const imgMusicAudioPlay = '/imgs/music-audio-play.svg'; type Lesson = { id: string; title: string; duration: string; // "12:46" 형식 state: "제출완료" | "제출대기"; action: "복습하기" | "이어서 수강하기" | "수강하기"; }; type CourseDetail = { id: string; status: "수강 중" | "수강 예정" | "수강 완료"; title: string; goal: string; method: string; summary: string; // VOD · 총 n강 · n시간 n분 submitSummary: string; // 학습 제출 n/n thumbnail: string; lessons: Lesson[]; }; export default function CourseDetailPage() { const params = useParams(); const router = useRouter(); const [course, setCourse] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const fetchCourse = async () => { if (!params?.id) return; try { setLoading(true); setError(null); let data: any = null; // 먼저 getLecture 시도 try { const response = await apiService.getLecture(params.id as string); data = response.data; } catch (lectureErr) { console.warn('getLecture 실패, getSubjects로 재시도:', lectureErr); // getLecture 실패 시 getSubjects로 폴백 try { const subjectsResponse = await apiService.getSubjects(); let subjectsData: any[] = []; if (Array.isArray(subjectsResponse.data)) { subjectsData = subjectsResponse.data; } else if (subjectsResponse.data && typeof subjectsResponse.data === 'object') { subjectsData = subjectsResponse.data.items || subjectsResponse.data.courses || subjectsResponse.data.data || subjectsResponse.data.list || subjectsResponse.data.subjects || subjectsResponse.data.subjectList || []; } // ID로 과목 찾기 data = subjectsData.find((s: any) => String(s.id || s.subjectId) === String(params.id)); if (!data) { // getLectures로도 시도 try { const lecturesResponse = await apiService.getLectures(); const lectures = Array.isArray(lecturesResponse.data) ? lecturesResponse.data : lecturesResponse.data?.items || lecturesResponse.data?.lectures || lecturesResponse.data?.data || []; data = lectures.find((l: any) => String(l.id || l.lectureId) === String(params.id)); } catch (lecturesErr) { console.error('getLectures 실패:', lecturesErr); } } } catch (subjectsErr) { console.error('getSubjects 실패:', subjectsErr); } } if (!data) { throw new Error('강좌를 찾을 수 없습니다.'); } // 썸네일 이미지 가져오기 let thumbnail = '/imgs/talk.png'; if (data.imageKey) { try { const imageUrl = await apiService.getFile(data.imageKey); if (imageUrl) { thumbnail = imageUrl; } } catch (imgErr) { console.error('이미지 다운로드 실패:', imgErr); } } // 강좌의 차시(lessons) 정보 가져오기 let lessons: any[] = []; if (data.lessons && Array.isArray(data.lessons)) { lessons = data.lessons; } else if (data.lectureId) { // lectureId가 있으면 해당 강좌의 차시 정보 가져오기 시도 try { const lectureResponse = await apiService.getLecture(data.lectureId); if (lectureResponse.data?.lessons) { lessons = lectureResponse.data.lessons; } } catch (err) { console.warn('차시 정보 가져오기 실패:', err); } } // API 응답 데이터를 CourseDetail 타입으로 변환 const courseDetail: CourseDetail = { id: String(data.id || params.id), status: data.status || "수강 예정", title: data.title || data.lectureName || data.subjectName || '', goal: data.objective || data.goal || '', method: data.method || '', summary: data.summary || `VOD · 총 ${lessons.length || 0}강`, submitSummary: data.submitSummary || '', thumbnail: thumbnail, lessons: lessons.map((lesson: any, index: number) => ({ id: String(lesson.id || lesson.lessonId || index + 1), title: `${index + 1}. ${lesson.title || lesson.lessonName || ''}`, duration: lesson.duration || '00:00', state: lesson.isCompleted ? "제출완료" : "제출대기", action: lesson.isCompleted ? "복습하기" : (index === 0 ? "수강하기" : "이어서 수강하기"), })), }; setCourse(courseDetail); } catch (err) { console.error('강좌 조회 실패:', err); setError(err instanceof Error ? err.message : '강좌를 불러오는데 실패했습니다.'); } finally { setLoading(false); } }; fetchCourse(); }, [params?.id]); if (loading) { return (

교육 과정 상세보기

로딩 중...

); } if (error || !course) { return (

교육 과정 상세보기

{error || '강좌를 찾을 수 없습니다.'}

); } return (
{/* 헤더 */}

교육 과정 상세보기

{/* 메인 콘텐츠 */}
{/* 상단 정보 카드 */}
{/* 이미지 컨테이너 */}
{course.title}
{/* 교육과정 정보 */}
{/* 제목 영역 */}

{course.status}

{course.title}

{/* 학습 목표 및 방법 */}

학습 목표: {` ${course.goal}`}

학습 방법: {` ${course.method}`}

{/* 통계 정보 */}
{/* VOD 정보 */}

{course.summary}

{/* 학습 제출 정보 */} {course.submitSummary && (

{course.submitSummary}

)}
{/* 차시 리스트 */}
{course.lessons.map((l) => { const isSubmitted = l.state === "제출완료"; const submitBtnBorder = isSubmitted ? "border-transparent" : (l.action === "이어서 수강하기" || l.action === "수강하기" ? "border-[#b1b8c0]" : "border-[#8c95a1]"); const submitBtnText = isSubmitted ? "text-[#384fbf]" : (l.action === "이어서 수강하기" || l.action === "수강하기" ? "text-[#b1b8c0]" : "text-[#4c5561]"); const rightBtnStyle = l.action === "이어서 수강하기" || l.action === "수강하기" ? "bg-[#ecf0ff] text-[#384fbf]" : "bg-[#f1f3f5] text-[#4c5561]"; return (
{/* 차시 정보 */}

{l.title}

{l.duration}

{/* 버튼 영역 */}
{/* 학습 제출 버튼 */} {/* 수강/복습 버튼 */}
); })}
); }