feat: implement classroom learning interface for video lessons and progress tracking

This commit is contained in:
supalerk-ar66 2026-02-09 15:55:36 +07:00
parent 75d1ef069d
commit fe8f7dd51b

View file

@ -99,13 +99,51 @@ const toggleSidebar = () => {
sidebarOpen.value = !sidebarOpen.value
}
// Helper (Hard Reload)
const resetAndNavigate = (path: string) => {
if (import.meta.client) {
// 1. (Whitelist)
const whitelist: Record<string, string> = {}
const keepKeys = ['remembered_email', 'theme', 'auth_token'] // auth_token login
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i)
if (!key) continue
// key whitelist /
if (keepKeys.includes(key) || key.startsWith('read_announcements:')) {
const value = localStorage.getItem(key)
if (value !== null) whitelist[key] = value
}
}
// 2. localStorage
localStorage.clear()
// 3.
Object.entries(whitelist).forEach(([key, value]) => {
localStorage.setItem(key, value)
})
// 4. (Hard Reload) path
window.location.href = path
} else {
// Fallback SSR
router.push(path)
}
}
// Logic loadLesson
const handleLessonSelect = (lessonId: number) => {
loadLesson(lessonId)
// Close sidebar on mobile when selecting a lesson
if (import.meta.client && window.innerWidth <= 1024) {
sidebarOpen.value = false
}
if (currentLesson.value?.id === lessonId) return
const url = new URL(window.location.href)
url.searchParams.set('lesson_id', lessonId.toString())
resetAndNavigate(url.toString())
}
// Logic
const handleExit = (path: string) => {
resetAndNavigate(path)
}
// Data Fetching
@ -472,13 +510,13 @@ onBeforeUnmount(() => {
round
dense
icon="arrow_back"
class="text-slate-600 dark:text-slate-300 hover:text-blue-600 transition-colors"
@click="$router.push('/dashboard/my-courses')"
class="mr-2 text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/30 border border-blue-100 dark:border-blue-800/50 hover:bg-blue-100 dark:hover:bg-blue-800/50 transition-all"
@click="handleExit('/dashboard/my-courses')"
>
<q-tooltip>{{ $t('classroom.backToDashboard') }}</q-tooltip>
</q-btn>
<div class="hidden sm:flex items-center gap-2 cursor-pointer group" @click="$router.push('/dashboard')">
<div class="hidden sm:flex items-center gap-2 cursor-pointer group" @click="handleExit('/dashboard')">
<div class="w-8 h-8 rounded-lg bg-blue-600 flex items-center justify-center text-white font-black shadow-lg shadow-blue-600/30 group-hover:scale-110 transition-transform">
E
</div>