From 7f5119e5aae1e2e65c4fa48ce9fe85985a5645e7 Mon Sep 17 00:00:00 2001 From: supalerk-ar66 Date: Thu, 12 Feb 2026 16:05:37 +0700 Subject: [PATCH] feat: Implement core classroom functionality including video player, learning and quiz pages, course detail view, and i18n support. --- .../classroom/AnnouncementModal.vue | 2 +- .../classroom/CurriculumSidebar.vue | 2 +- .../components/classroom/VideoPlayer.vue | 48 ++-- .../components/discovery/CourseDetailView.vue | 8 +- Frontend-Learner/i18n/locales/en.json | 9 + Frontend-Learner/i18n/locales/th.json | 9 + Frontend-Learner/pages/classroom/learning.vue | 228 +++++++++++++----- Frontend-Learner/pages/classroom/quiz.vue | 68 +++++- Frontend-Learner/pages/verify-email.vue | 24 +- 9 files changed, 289 insertions(+), 109 deletions(-) diff --git a/Frontend-Learner/components/classroom/AnnouncementModal.vue b/Frontend-Learner/components/classroom/AnnouncementModal.vue index aedb1177..7c0b8356 100644 --- a/Frontend-Learner/components/classroom/AnnouncementModal.vue +++ b/Frontend-Learner/components/classroom/AnnouncementModal.vue @@ -90,7 +90,7 @@ const getLocalizedText = (text: any) => {
-

{{ $t('classroom.noAnnouncements', 'ไม่มีประกาศในขณะนี้') }}

+

{{ $t('classroom.noAnnouncements') }}

diff --git a/Frontend-Learner/components/classroom/CurriculumSidebar.vue b/Frontend-Learner/components/classroom/CurriculumSidebar.vue index c9c2e11a..a7ccddab 100644 --- a/Frontend-Learner/components/classroom/CurriculumSidebar.vue +++ b/Frontend-Learner/components/classroom/CurriculumSidebar.vue @@ -61,7 +61,7 @@ const progressPercentage = computed(() => {
- {{ $t('course.progress', 'ความคืบหน้า') }} + {{ $t('course.progress') }} {{ progressPercentage }}%
diff --git a/Frontend-Learner/components/classroom/VideoPlayer.vue b/Frontend-Learner/components/classroom/VideoPlayer.vue index 03349185..4bd0af28 100644 --- a/Frontend-Learner/components/classroom/VideoPlayer.vue +++ b/Frontend-Learner/components/classroom/VideoPlayer.vue @@ -165,9 +165,21 @@ const togglePlay = () => { return; } if (!videoRef.value) return; - if (isPlaying.value) videoRef.value.pause(); - else videoRef.value.play(); - isPlaying.value = !isPlaying.value; + if (isPlaying.value) { + videoRef.value.pause(); + isPlaying.value = false; + } else { + const playPromise = videoRef.value.play(); + if (playPromise !== undefined) { + playPromise.then(() => { + isPlaying.value = true; + }).catch(error => { + // Auto-play was prevented or play was interrupted + // We can safely ignore this error + console.log("Video play request handled:", error.name); + }); + } + } }; const handleTimeUpdate = () => { @@ -238,12 +250,12 @@ watch([volume, isMuted], () => { > -
+