diff --git a/src/components/CourseView.tsx b/src/components/CourseView.tsx index fd62dea..cea1aad 100644 --- a/src/components/CourseView.tsx +++ b/src/components/CourseView.tsx @@ -48,6 +48,7 @@ export default function CourseView({ courseId, token, onBack, initialLessonId }: const [course, setCourse] = useState(null); const [modules, setModules] = useState([]); const [activeLesson, setActiveLesson] = useState(null); + const [expandedModules, setExpandedModules] = useState([]); const [noteContent, setNoteContent] = useState(''); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); @@ -95,8 +96,7 @@ export default function CourseView({ courseId, token, onBack, initialLessonId }: } if (selectedLsn) { - setActiveLesson(selectedLsn); - setNoteContent(selectedLsn.note || ''); + handleSelectLesson(selectedLsn, data.modules.find((m: any) => m.lessons.some((l: any) => l.id === selectedLsn.id))?.id); } } } catch (err: any) { @@ -106,12 +106,31 @@ export default function CourseView({ courseId, token, onBack, initialLessonId }: } }; - const handleSelectLesson = (lesson: Lesson) => { + const handleSelectLesson = (lesson: Lesson, moduleId?: string) => { setActiveLesson(lesson); setNoteContent(lesson.note || ''); setSaveStatus('idle'); + if (moduleId) { + setExpandedModules(prev => prev.includes(moduleId) ? prev : [...prev, moduleId]); + } else { + // Find module if not passed + const parentMod = modules.find(m => m.lessons.some(l => l.id === lesson.id)); + if (parentMod) { + setExpandedModules(prev => prev.includes(parentMod.id) ? prev : [...prev, parentMod.id]); + } + } }; + const toggleModule = (moduleId: string) => { + setExpandedModules(prev => + prev.includes(moduleId) ? prev.filter(id => id !== moduleId) : [...prev, moduleId] + ); + }; + + const totalLessonsCount = modules.reduce((acc, mod) => acc + mod.lessons.length, 0); + const completedLessonsCount = modules.reduce((acc, mod) => acc + mod.lessons.filter(l => l.progress?.completed).length, 0); + const overallProgress = totalLessonsCount === 0 ? 0 : Math.round((completedLessonsCount / totalLessonsCount) * 100); + const handleProgressUpdate = async (watchedPercentage: number) => { if (!activeLesson) return; @@ -351,88 +370,113 @@ export default function CourseView({ courseId, token, onBack, initialLessonId }: )} + {/* Overall Progress Block */} +
+
+ + + + +
+

Meu progresso - {overallProgress}%

+

{completedLessonsCount} de {totalLessonsCount} {totalLessonsCount === 1 ? 'aula' : 'aulas'}

+
+
+
+
- {modules.map((mod, modIdx) => ( -
- {/* Module Title bar */} -
-
- M{modIdx + 1} -

- {mod.title} -

-
- - {mod.lessons.length} {mod.lessons.length === 1 ? 'aula' : 'aulas'} - -
+ {modules.map((mod, modIdx) => { + const isExpanded = expandedModules.includes(mod.id); + const moduleTotal = mod.lessons.length; + const moduleCompleted = mod.lessons.filter(l => l.progress?.completed).length; + const isModuleFullyCompleted = moduleTotal > 0 && moduleTotal === moduleCompleted; - {/* Lessons list inside module */} -
- {mod.lessons.length === 0 ? ( -
Nenhuma aula neste módulo.
- ) : ( - mod.lessons.map(lesson => { - const isActive = activeLesson?.id === lesson.id; - const isLsnCompleted = lesson.progress?.completed; + return ( +
+ {/* Module Title bar (Clickable) */} + - return ( -
- - ); - }) - )} + + ); + }) + )} - {/* Module Activity Button */} - {mod.lessons.length > 0 && ( -
- + {/* Module Activity Button (End of Timeline) */} + {mod.lessons.length > 0 && ( +
+
+ +
+ )} +
)}
-
- ))} + ); + })}