diff --git a/frontend/src/pages/LearnHubPage.jsx b/frontend/src/pages/LearnHubPage.jsx index 5eaba32..3a1533a 100644 --- a/frontend/src/pages/LearnHubPage.jsx +++ b/frontend/src/pages/LearnHubPage.jsx @@ -10,6 +10,10 @@ import { COURSE_CATEGORIES, ALL_COURSES } from '../courseCatalog'; export default function LearnHubPage() { // 완료한 코스 slug들 — 포함 여부 확인이 잦으니 Set이 제격 (대시보드와 같은 패턴) const [completedSlugs, setCompletedSlugs] = useState(new Set()); + // 지금 보고 있는 카테고리. 처음엔 첫 카테고리(컴퓨터 기초)를 연다. + // 학습 포인트: 코스 83개를 한 번에 다 펼치면 압도적이라, 카테고리 하나씩만 보여준다. + // "한 화면에 담을 정보의 양"을 줄이는 게 직관성의 핵심이다. + const [activeCategory, setActiveCategory] = useState(COURSE_CATEGORIES[0].category); useEffect(() => { let cancelled = false; @@ -25,6 +29,10 @@ export default function LearnHubPage() { const totalCount = ALL_COURSES.length; const percent = totalCount === 0 ? 0 : Math.round((totalDone / totalCount) * 100); + // 선택된 카테고리 (없으면 첫 번째로 안전하게 폴백) + const group = + COURSE_CATEGORIES.find((g) => g.category === activeCategory) || COURSE_CATEGORIES[0]; + return (
@@ -56,7 +64,26 @@ export default function LearnHubPage() {

- {COURSE_CATEGORIES.map((group) => { + {/* 카테고리 선택 탭 — 누른 카테고리의 강좌만 아래에 보여준다. + 각 탭에 "이름 + 완료/전체"를 함께 표시해 어디를 얼마나 했는지 한눈에. */} +
+ {COURSE_CATEGORIES.map((g) => { + const gDone = g.items.filter((i) => i.slug && completedSlugs.has(i.slug)).length; + return ( + + ); + })} +
+ + {/* 선택된 카테고리 하나만 렌더 */} + {(() => { const groupDone = group.items.filter((i) => i.slug && completedSlugs.has(i.slug)).length; return (
@@ -113,7 +140,7 @@ export default function LearnHubPage() {
); - })} + })()} ); }