import React, { useState, useEffect } from 'react'; import { Link, Head, usePage } from '@inertiajs/react'; import { ChevronLeft, Menu, Search, CheckCircle, Circle, ChevronDown, ChevronRight, PlayCircle, FileText, HelpCircle } from 'lucide-react'; import { Button } from '@/Components/ui/button'; import { ScrollArea } from '@/Components/ui/scroll-area'; import { Sheet, SheetContent, SheetTrigger } from '@/Components/ui/sheet'; import { Progress } from '@/Components/ui/progress'; import { cn } from '@/lib/utils'; import { ModeToggle } from '@/Components/ModeToggle'; // Interfaces for Props interface Lesson { id: string; title: string; slug: string; type: 'video' | 'text' | 'quiz' | 'pdf'; is_completed: boolean; duration_seconds: number; } interface Module { id: string; title: string; lessons: Lesson[]; } interface Course { id: string; title: string; slug: string; progress_percentage: number; } interface CourseLayoutProps { children: React.ReactNode; course: Course; modules: Module[]; currentLesson?: Lesson; } export default function CourseLayout({ children, course, modules = [], currentLesson }: CourseLayoutProps) { const [isSidebarOpen, setIsSidebarOpen] = useState(true); const [openModules, setOpenModules] = useState([]); const { url } = usePage(); // Default open all modules or just the active one useEffect(() => { if (modules.length > 0) { // Find module containing current lesson const activeModule = modules.find(m => m.lessons.some(l => l.slug === currentLesson?.slug)); if (activeModule) { setOpenModules(prev => [...new Set([...prev, activeModule.id])]); } else { // If no active lesson (e.g. course home), open first module setOpenModules([modules[0].id]); } } }, [modules, currentLesson]); const toggleModule = (moduleId: string) => { setOpenModules(prev => prev.includes(moduleId) ? prev.filter(id => id !== moduleId) : [...prev, moduleId] ); }; const getLessonIcon = (type: string) => { switch (type) { case 'video': return ; case 'quiz': return ; case 'pdf': return ; default: return ; } }; return (
{/* Mobile Sheet Sidebar */}
{course.title}
{/* Desktop Sidebar */} {/* Main Content Area */}
{/* Desktop Topbar */}
Progress {course.progress_percentage}%
{/* Content Slot */}
{children}
); } function SidebarContent({ course, modules, currentLesson, openModules, toggleModule, getLessonIcon }: any) { return (
{/* Header */}
Kembali ke Dashboard
{course.title.charAt(0)}

{course.title}

{/* Curriculum List */}
{modules.map((module: any, index: number) => (
{openModules.includes(module.id) && (
{module.lessons.map((lesson: any) => { const isActive = currentLesson?.slug === lesson.slug; return (
{lesson.is_completed ? ( ) : ( )}
{lesson.title}
{getLessonIcon(lesson.type)} {lesson.type} {lesson.duration_seconds > 0 && ( <> {Math.ceil(lesson.duration_seconds / 60)} min )}
{isActive && (
)} ); })}
)}
))}
{/* Footer User Info */}
Built for Future Japan Enthusisasts
); }