feat(ux): 학습센터를 카테고리 선택 방식으로 (83강좌 한번에 → 카테고리별 12개)

강좌 83개가 한 화면에 다 펼쳐져 압도적이던 문제.
- 카테고리 탭(7개, 각 '이름 완료/전체' 표시) 추가, 선택한 카테고리 강좌만 렌더
- 처음엔 첫 카테고리(컴퓨터 기초)를 열어 둠, .tabs/.tab 기존 스타일 재사용
- 전체 진도율 바는 히어로에 그대로 유지

검증: 초기 컴퓨터기초 12개만 노출, '앱 개발' 탭 클릭 시 앱 12강좌로 전환, 콘솔에러0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
AWESOMEDEV 2026-07-17 15:55:42 +09:00
parent d9bd1a55c6
commit 1867c050c4

View File

@ -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 (
<div>
<div className="hero">
@ -56,7 +64,26 @@ export default function LearnHubPage() {
</p>
</div>
{COURSE_CATEGORIES.map((group) => {
{/* .
탭에 "이름 + 완료/전체" 함께 표시해 어디를 얼마나 했는지 한눈에. */}
<div className="tabs">
{COURSE_CATEGORIES.map((g) => {
const gDone = g.items.filter((i) => i.slug && completedSlugs.has(i.slug)).length;
return (
<button
key={g.category}
type="button"
className={`tab${g.category === activeCategory ? ' active' : ''}`}
onClick={() => setActiveCategory(g.category)}
>
{g.category} {gDone}/{g.items.length}
</button>
);
})}
</div>
{/* 선택된 카테고리 하나만 렌더 */}
{(() => {
const groupDone = group.items.filter((i) => i.slug && completedSlugs.has(i.slug)).length;
return (
<div key={group.category}>
@ -113,7 +140,7 @@ export default function LearnHubPage() {
</div>
</div>
);
})}
})()}
</div>
);
}