From 1277bcbfc654b51becb256acaeacf5c910289700 Mon Sep 17 00:00:00 2001 From: Adeyemi Adetunji Date: Tue, 16 Apr 2024 08:51:53 +0100 Subject: [PATCH] feat: students should move to next lesson on click go to lesson (#230) * completion * completion * PR Fixes * PR Fixes * fix: progress bug on home page * chore: fix lesson completion issue --------- Co-authored-by: Rotimi Best --- .../components/CourseContainer/index.svelte | 2 + .../Courses/components/Card/index.svelte | 4 +- .../components/LMS/components/Learning.svelte | 6 ++- .../src/lib/utils/services/courses/index.ts | 13 ++++- .../routes/courses/[id]/lessons/+page.svelte | 47 +++++++++++++++++-- .../lessons/[...lessonParams]/+page.svelte | 30 +++++++----- supabase/seed.sql | 6 --- 7 files changed, 81 insertions(+), 27 deletions(-) diff --git a/apps/dashboard/src/lib/components/CourseContainer/index.svelte b/apps/dashboard/src/lib/components/CourseContainer/index.svelte index 6ac1617d..3f11df12 100644 --- a/apps/dashboard/src/lib/components/CourseContainer/index.svelte +++ b/apps/dashboard/src/lib/components/CourseContainer/index.svelte @@ -9,6 +9,7 @@ import { profile } from '$lib/utils/store/user'; import { fetchCourse } from '$lib/utils/services/courses'; import { globalStore } from '$lib/utils/store/app'; + import { lessons } from '../Course/components/Lesson/store/lessons'; export let courseId = ''; export let path = ''; @@ -23,6 +24,7 @@ isFetching = true; course.set(defaultCourse); + lessons.set([]); const { data: _data } = await fetchCourse(courseId); diff --git a/apps/dashboard/src/lib/components/Courses/components/Card/index.svelte b/apps/dashboard/src/lib/components/Courses/components/Card/index.svelte index 59459029..d9da9244 100644 --- a/apps/dashboard/src/lib/components/Courses/components/Card/index.svelte +++ b/apps/dashboard/src/lib/components/Courses/components/Card/index.svelte @@ -66,7 +66,7 @@
@@ -122,7 +122,7 @@ {#if isLMS} diff --git a/apps/dashboard/src/lib/components/LMS/components/Learning.svelte b/apps/dashboard/src/lib/components/LMS/components/Learning.svelte index c953162b..17d62922 100644 --- a/apps/dashboard/src/lib/components/LMS/components/Learning.svelte +++ b/apps/dashboard/src/lib/components/LMS/components/Learning.svelte @@ -7,7 +7,7 @@ const gotoCourse = (id: string | undefined) => { if (!id) return; - goto(`/courses/${id}`); + goto(`/courses/${id}/lessons?next=true`); }; @@ -41,7 +41,9 @@
diff --git a/apps/dashboard/src/lib/utils/services/courses/index.ts b/apps/dashboard/src/lib/utils/services/courses/index.ts index a4d25e9b..c1a0371f 100644 --- a/apps/dashboard/src/lib/utils/services/courses/index.ts +++ b/apps/dashboard/src/lib/utils/services/courses/index.ts @@ -175,8 +175,17 @@ export function updateLesson(lesson: any, lessonId: Lesson['id']) { .match({ id: lessonId }); } -export function updateLessonCompletion(completion: LessonCompletion) { - return supabase.from('lesson_completion').upsert(completion); +export function updateLessonCompletion(completion: LessonCompletion, shouldUpdate: boolean) { + if (shouldUpdate) { + return supabase + .from('lesson_completion') + .update({ + is_complete: completion.is_complete + }) + .eq('id', completion.id); + } else { + return supabase.from('lesson_completion').insert(completion); + } } export function deleteLesson(lessonId: Lesson['id']) { diff --git a/apps/dashboard/src/routes/courses/[id]/lessons/+page.svelte b/apps/dashboard/src/routes/courses/[id]/lessons/+page.svelte index 5c517a96..77c3b3e3 100644 --- a/apps/dashboard/src/routes/courses/[id]/lessons/+page.svelte +++ b/apps/dashboard/src/routes/courses/[id]/lessons/+page.svelte @@ -26,13 +26,17 @@ import { course, group } from '$lib/components/Course/store'; import DateField from '$lib/components/Form/Date.svelte'; import type { Lesson } from '$lib/utils/types'; + import { goto } from '$app/navigation'; export let data; + const query = new URLSearchParams($page.url.search); + let lessonEditing: string | undefined; let lessonToDelete: Lesson | undefined; - let isStudent = true; - let openDeleteModal = false; + let isStudent: boolean = true; + let openDeleteModal: boolean = false; + let isFetching: boolean = false; const flipDurationMs = 300; @@ -81,6 +85,30 @@ return index + 1; } } + + function findFirstIncompleteLesson() { + return $lessons.find( + (lesson) => + lesson.lesson_completion && + lesson.lesson_completion.length === 0 && + lesson.is_unlocked === true + ); + } + + function onNextQuery(lessons) { + if (!isFetching && lessons.length > 0) { + const incompleteLesson = findFirstIncompleteLesson(); + + if (incompleteLesson) { + goto(`/courses/${data.courseId}/lessons/${incompleteLesson.id}`); + } else { + goto(`/courses/${data.courseId}/lessons`); + } + } + } + + $: shouldGoToNextLesson = query.get('next') === 'true'; + $: shouldGoToNextLesson && onNextQuery($lessons); {#if $handleAddLessonWidget} @@ -94,7 +122,7 @@ /> - +
@@ -104,7 +132,18 @@ - {#if $lessons.length} + {#if shouldGoToNextLesson} + +
+ Lesson +

No lessons yet

+

+ Share your knowledge with the world by creating engaging lessons. Start by clicking on + the Add button. +

+
+
+ {:else if $lessons.length}
{ - if (_completion.profile_id === $profile.id) { - found = true; + let updatedCompletion: LessonCompletion; + + const completions: LessonCompletion[] = $lesson.lesson_completion.map((completion) => { + if (completion.profile_id === $profile.id) { + console.log('shouldUpdate'); + completion = { ...completion, - is_complete: _completion.is_complete + is_complete: !completion.is_complete }; + + updatedCompletion = completion; } - return _completion; + return completion; }); - if (!found) { - completions.push(completion); + + // @ts-ignore + if (updatedCompletion) { + await updateLessonCompletion(updatedCompletion, true); + } else { + completions.push(newCompletion); + await updateLessonCompletion(newCompletion, false); } $lesson.lesson_completion = completions; @@ -108,8 +118,6 @@ return l; }); - - await updateLessonCompletion(completion); snackbar.success('Marked as complete'); isMarkingComplete = false; } diff --git a/supabase/seed.sql b/supabase/seed.sql index 5105fb7a..e967908a 100644 --- a/supabase/seed.sql +++ b/supabase/seed.sql @@ -326,12 +326,6 @@ INSERT INTO "public"."lesson_comment" ("id", "created_at", "updated_at", "lesson -- Data for Name: lesson_completion; Type: TABLE DATA; Schema: public; Owner: postgres -- -INSERT INTO "public"."lesson_completion" ("id", "created_at", "lesson_id", "profile_id", "is_complete", "updated_at") VALUES - (1, '2023-12-18 00:00:00+00', '5e5c8221-4c11-4c40-8664-11743bb79579', '0c256e75-aa40-4f62-8d30-0217ca1c60d9', true, '2023-12-18 00:00:00+00'), - (2, '2023-12-18 00:00:00+00', '829da386-8ccd-4c81-b2fb-b9891102c83c', '0c256e75-aa40-4f62-8d30-0217ca1c60d9', true, '2023-12-18 00:00:00+00'), - (3, '2023-12-19 00:00:00+00', '829da386-8ccd-4c81-b2fb-b9891102c83c', '0c256e75-aa40-4f62-8d30-0217ca1c60d9', true, '2023-12-19 00:00:00+00'), - (4, '2023-12-19 00:00:00+00', '829da386-8ccd-4c81-b2fb-b9891102c83c', '0c256e75-aa40-4f62-8d30-0217ca1c60d9', true, '2023-12-19 00:00:00+00'); - -- -- Data for Name: lesson_progress; Type: TABLE DATA; Schema: public; Owner: postgres