From d8708caca57f3743e32e4eee56fb3d01ad8a48b9 Mon Sep 17 00:00:00 2001 From: AWESOMEDEV Date: Mon, 20 Jul 2026 12:19:50 +0900 Subject: [PATCH] =?UTF-8?q?fix(learn):=20=EA=B3=BC=EC=A0=95=20=EC=85=80?= =?UTF-8?q?=EB=A0=89=ED=8A=B8=EB=A5=BC=20=ED=95=99=EC=8A=B5=20=EC=84=BC?= =?UTF-8?q?=ED=84=B0(/learn)=EC=97=90=EC=84=9C=EB=A7=8C=20=EB=85=B8?= =?UTF-8?q?=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 대시보드·과제·코딩 등 학습과 무관한 화면에서는 과정 셀렉트를 숨긴다. useLocation으로 /learn 경로에서만 렌더 — 도구는 쓰이는 자리에서만 보인다. 운영 검증: 대시보드에 셀렉트 없음, 학습 센터에서 노출·선택 유지 브라우저 확인. Co-Authored-By: Claude Opus 4.8 --- frontend/src/App.jsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 7476dd7..b98d610 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -4,7 +4,7 @@ // 학습 포인트: 코스 라우트는 여기 일일이 쓰지 않는다 — courseCatalog.jsx의 데이터를 .map으로 돌려 // 자동 생성한다. 코스가 100개가 되어도 이 파일은 그대로다. import { Suspense } from 'react'; -import { Routes, Route, NavLink, Navigate, Outlet, useNavigate } from 'react-router-dom'; +import { Routes, Route, NavLink, Navigate, Outlet, useNavigate, useLocation } from 'react-router-dom'; import { useAuth } from './AuthContext'; import { ALL_COURSES } from './courseCatalog'; import { LEVEL_COURSES } from './levelCatalog'; @@ -53,12 +53,20 @@ function RequireMentor() { return ; } -// 과정(수습용/초급/중급/고급/특급) 선택 셀렉트 박스 — 헤더에 산다. -// 학습 포인트: 바꾸는 순간 학습 센터로 이동한다 — "과정을 골랐으면 그 과정의 강좌를 -// 바로 보여 준다"가 자연스러운 기대이기 때문. 선택은 localStorage에 저장돼 유지된다. +// 과정(수습용/초급/중급/고급/특급) 선택 셀렉트 박스 — 헤더에 살되, +// 학습 센터 영역(/learn…)에 있을 때만 보인다. +// 학습 포인트: 도구는 쓰이는 자리에서만 보여 준다 — 대시보드·과제 화면에서 과정 셀렉트는 +// 지금 하는 일과 무관한 소음이다(관련 없는 선택지는 치우는 게 UI의 배려). +// 바꾸는 순간 학습 센터 허브로 이동하고, 선택은 localStorage에 저장돼 유지된다. function TrackSelect() { const { track, setTrack } = useTrack(); const navigate = useNavigate(); + const location = useLocation(); + + // 학습 센터(/learn, /learn/코스, /learn/코스/quiz) 밖에서는 그리지 않는다. + if (!location.pathname.startsWith('/learn')) { + return null; + } function onChange(e) { setTrack(e.target.value);