feat: add new pages for course discovery, course details, classroom activities, user dashboard, password reset, and internationalization support.

This commit is contained in:
supalerk-ar66 2026-02-02 14:37:26 +07:00
parent 7ac1a5af0a
commit 4c9b6b0f3f
10 changed files with 570 additions and 175 deletions

View file

@ -506,9 +506,11 @@ export const useCourse = () => {
// ฟังก์ชันส่งคำตอบ Quiz
// Endpoint: POST /students/courses/:cid/lessons/:lid/quiz/submit
const submitQuiz = async (courseId: number, lessonId: number, answers: QuizAnswerSubmission[]) => {
const submitQuiz = async (courseId: number, lessonId: number, answers: QuizAnswerSubmission[], alreadyPassed: boolean = false) => {
try {
const body: QuizSubmitRequest = { answers }
// NOTE: Backend crashes with 500 if we send extra fields like 'already_passed'.
// Reverting to strict body structure.
const body = { answers }
const data = await $fetch<{ code: number; message: string; data: QuizResult }>(`${API_BASE_URL}/students/courses/${courseId}/lessons/${lessonId}/quiz/submit`, {
method: 'POST',
@ -587,6 +589,32 @@ export const useCourse = () => {
}
}
// ฟังก์ชันดึงประกาศของคอร์ส (Announcements)
// Endpoint: GET /student/courses/:id/announcements (Note: 'student' singular based on recent API update)
const fetchCourseAnnouncements = async (courseId: number) => {
try {
const data = await $fetch<{ code: number; message: string; data: any[] }>(`${API_BASE_URL}/student/courses/${courseId}/announcements`, {
method: 'GET',
headers: token.value ? {
Authorization: `Bearer ${token.value}`
} : {}
})
return {
success: true,
data: data.data
}
} catch (err: any) {
console.error('Fetch course announcements failed:', err)
return {
success: false,
error: err.data?.message || err.message || 'Error fetching announcements',
code: err.data?.code,
status: err.status
}
}
}
return {
fetchCourses,
fetchCourseById,
@ -600,7 +628,8 @@ export const useCourse = () => {
markLessonComplete,
submitQuiz,
generateCertificate,
getCertificate
getCertificate,
fetchCourseAnnouncements
}
}