@@ -6,7 +6,7 @@ import type { ChapterWithLessons } from '@/types';
66import { CourseGrid } from './components/CourseGrid' ;
77import { ChapterCard } from './components/ChapterCard' ;
88import { useStore } from '@/stores/store' ;
9- import { ChevronLeft , Lock } from 'lucide-react' ;
9+ import { ChevronLeft } from 'lucide-react' ;
1010import { useIsMobile , useLanguageCourse } from '@/hooks' ;
1111import { CBrandIcon } from '@/components/ui/CBrandIcon' ;
1212
@@ -42,7 +42,7 @@ export function LanguageCoursePage({ langOverride }: LanguageCoursePageProps = {
4242 const lang = langOverride ?? routeLang ;
4343 const navigate = useNavigate ( ) ;
4444 const setPageTitle = useStore ( ( s ) => s . setPageTitle ) ;
45- const appUser = useStore ( ( s ) => s . appUser ) ;
45+ const authLoading = useStore ( ( s ) => s . authLoading ) ;
4646
4747 // TanStack Query: loading, error, data 자동 관리
4848 const { data, isLoading, isError, error } = useLanguageCourse ( lang ) ;
@@ -106,8 +106,8 @@ export function LanguageCoursePage({ langOverride }: LanguageCoursePageProps = {
106106 const isMobile = useIsMobile ( ) ;
107107
108108 // 데이터에서 language와 chapters 추출
109- const language = data ;
110109 const chapters = data ?. chapters || [ ] ;
110+ const pageLoading = authLoading || isLoading ;
111111
112112 // 페이지 제목 설정
113113 useEffect ( ( ) => {
@@ -189,7 +189,7 @@ export function LanguageCoursePage({ langOverride }: LanguageCoursePageProps = {
189189 { langInfo . name }
190190 </ h1 >
191191 < p className = "text-[var(--theme-dashboard-text-muted)] text-sm" >
192- { isLoading ? t ( 'common.loading' ) : `${ chapters . length } ${ t ( 'courses.chapters' ) } · ${ totalLessons } ${ t ( 'courses.lessons' ) } ` }
192+ { pageLoading ? t ( 'common.loading' ) : `${ chapters . length } ${ t ( 'courses.chapters' ) } · ${ totalLessons } ${ t ( 'courses.lessons' ) } ` }
193193 </ p >
194194 < p className = "text-[var(--theme-dashboard-text-muted)] text-xs mt-1" >
195195 { langInfo . description }
@@ -202,7 +202,7 @@ export function LanguageCoursePage({ langOverride }: LanguageCoursePageProps = {
202202
203203 { /* 챕터 리스트 */ }
204204 < div style = { { marginTop : '80px' } } >
205- { isLoading ? (
205+ { pageLoading ? (
206206 < div className = "flex items-center justify-center py-20" >
207207 < div className = "text-center" >
208208 < div className = "animate-spin rounded-full h-12 w-12 border-b-2 border-[var(--theme-dashboard-accent)] mx-auto mb-4" > </ div >
@@ -236,30 +236,14 @@ export function LanguageCoursePage({ langOverride }: LanguageCoursePageProps = {
236236 // 백엔드에서 계산된 진행률 사용 (DRY 원칙)
237237 const { total, completed, percentage : progress } = getChapterProgress ( chapter ) ;
238238
239- // 이전 챕터들이 모두 완료되었는지 확인
240- const previousChaptersComplete = chapters . slice ( 0 , index ) . every ( ch => {
241- const { total : prevTotal , completed : prevCompleted } = getChapterProgress ( ch ) ;
242- return prevTotal > 0 && prevCompleted === prevTotal ;
243- } ) ;
244-
245- const isSequentialLocked = language ?. isSequential
246- ? index > 0 && ! previousChaptersComplete && completed === 0
247- : false ;
248-
249- // 비로그인: 챕터 2 이상 로그인 필요
250- const needsLogin = ! appUser && chapter . order >= 2 ;
251-
252239 return (
253240 < div key = { chapter . id } >
254241 < button
255- onClick = { ( ) => ! isSequentialLocked && navigate ( `/courses/${ lang } /${ chapter . id } ` ) }
256- disabled = { isSequentialLocked }
257- className = "w-full p-4 text-left transition-colors hover:bg-[var(--theme-layout-top-bar-button-hover)] disabled:opacity-50 disabled:cursor-not-allowed"
242+ onClick = { ( ) => navigate ( `/courses/${ lang } /${ chapter . id } ` ) }
243+ className = "w-full p-4 text-left transition-colors hover:bg-[var(--theme-layout-top-bar-button-hover)]"
258244 >
259245 < div className = "flex items-center justify-between gap-3" >
260246 < h3 className = "text-base font-semibold text-[#333] flex items-center gap-2 flex-shrink-0" >
261- { isSequentialLocked && < Lock className = "w-4 h-4 text-[var(--theme-dashboard-text-muted)]" /> }
262- { needsLogin && ! isSequentialLocked && < Lock className = "w-4 h-4 text-gray-400" /> }
263247 { chapter . title }
264248 </ h3 >
265249 < div className = "flex items-center gap-2 flex-shrink-0" >
@@ -295,22 +279,8 @@ export function LanguageCoursePage({ langOverride }: LanguageCoursePageProps = {
295279 { chapters . map ( ( chapter , index ) => {
296280 // 백엔드에서 계산된 진행률 사용 (DRY 원칙)
297281 const { total, completed } = getChapterProgress ( chapter ) ;
298-
299- // 이전 챕터들이 모두 완료되었는지 확인
300- const previousChaptersComplete = chapters . slice ( 0 , index ) . every ( ch => {
301- const { total : prevTotal , completed : prevCompleted } = getChapterProgress ( ch ) ;
302- return prevTotal > 0 && prevCompleted === prevTotal ;
303- } ) ;
304-
305282 const isComplete = total > 0 && completed === total ;
306- // isSequential이 false면 모든 챕터 즉시 열림
307- const isLocked = language ?. isSequential
308- ? index > 0 && ! previousChaptersComplete && completed === 0
309- : false ;
310- const isActive = ! isComplete && ! isLocked && ( index === 0 || previousChaptersComplete ) ;
311-
312- // 비로그인: 챕터 2 이상 로그인 필요
313- const needsLogin = ! appUser && chapter . order >= 2 ;
283+ const isActive = ! isComplete && index === 0 ;
314284
315285 return (
316286 < ChapterCard
@@ -319,9 +289,7 @@ export function LanguageCoursePage({ langOverride }: LanguageCoursePageProps = {
319289 languageId = { lang }
320290 lessonCount = { total }
321291 completedCount = { completed }
322- isLocked = { isLocked }
323292 isActive = { isActive }
324- needsLogin = { needsLogin }
325293 />
326294 ) ;
327295 } ) }
0 commit comments