+ <>
+ {/* Video Player - Full Width */}
+
+ {/* Timeline Chapters - Below video like WebinarRecording */}
{hasChapters && (
-
+
{
@@ -413,7 +430,7 @@ export default function Bootcamp() {
/>
)}
-
+ >
);
};
@@ -421,52 +438,166 @@ export default function Bootcamp() {
const totalLessons = modules.reduce((sum, m) => sum + m.lessons.length, 0);
const isBootcampCompleted = totalLessons > 0 && completedCount >= totalLessons;
+ // Toggle functions for collapsible modules and lessons
+ const toggleModule = (moduleId: string) => {
+ setCollapsedModules(prev => {
+ const newSet = new Set(prev);
+ if (newSet.has(moduleId)) {
+ newSet.delete(moduleId);
+ } else {
+ newSet.add(moduleId);
+ }
+ return newSet;
+ });
+ };
+
+ const toggleLesson = (lessonId: string) => {
+ setCollapsedLessons(prev => {
+ const newSet = new Set(prev);
+ if (newSet.has(lessonId)) {
+ newSet.delete(lessonId);
+ } else {
+ newSet.add(lessonId);
+ }
+ return newSet;
+ });
+ };
+
const renderSidebarContent = () => (
- {modules.map((module) => (
-
-
- {module.title}
-
-
- {module.lessons.map((lesson) => {
- const isCompleted = isLessonCompleted(lesson.id);
- const isSelected = selectedLesson?.id === lesson.id;
- const isReleased = !lesson.release_at || new Date(lesson.release_at) <= new Date();
+ {modules.map((module) => {
+ const isModuleCollapsed = collapsedModules.has(module.id);
- return (
-
- );
- })}
+ return (
+
+ {/* Module Header - Collapsible */}
+
+
+ {/* Lessons - Hidden if module is collapsed */}
+ {!isModuleCollapsed && (
+
+ {module.lessons.map((lesson) => {
+ const isCompleted = isLessonCompleted(lesson.id);
+ const isSelected = selectedLesson?.id === lesson.id;
+ const isReleased = !lesson.release_at || new Date(lesson.release_at) <= new Date();
+ const isLessonCollapsed = collapsedLessons.has(lesson.id);
+ const hasChapters = lesson.chapters && lesson.chapters.length > 0;
+
+ return (
+
+ {/* Lesson Button - Collapsible if has chapters */}
+
+
+ {/* Timeline Chapters - Shown if lesson is expanded */}
+ {hasChapters && !isLessonCollapsed && (
+
+ {lesson.chapters?.map((chapter, index) => {
+ const isChapterActive = currentTime >= chapter.time &&
+ (!lesson.chapters?.[index + 1] || currentTime < lesson.chapters[index + 1].time);
+
+ return (
+
+ );
+ })}
+
+ )}
+
+ );
+ })}
+
+ )}
-
- ))}
+ );
+ })}
);