Gate student content by completion order, track per-video watch progress with seek enforcement, and auto-complete lessons at the configured threshold. Show ring progress in the lesson header, keep watch progress on rewatch, and sync progression locks client-side so the next item unlocks after completion.
37 lines
1.0 KiB
TypeScript
37 lines
1.0 KiB
TypeScript
import { ContentType } from '@cio/utils/constants/content';
|
|
import type { Course } from './types';
|
|
import { syncProgressionAccessToCourse } from './progression-utils';
|
|
|
|
export function updateLessonCompletionInCourseContent(course: Course, lessonId: string, isComplete: boolean): Course {
|
|
if (!course.content) return course;
|
|
|
|
let updatedCourse: Course;
|
|
|
|
if (course.content.grouped) {
|
|
updatedCourse = {
|
|
...course,
|
|
content: {
|
|
...course.content,
|
|
sections: course.content.sections.map((section) => ({
|
|
...section,
|
|
items: section.items.map((item) =>
|
|
item.type === ContentType.Lesson && item.id === lessonId ? { ...item, isComplete } : item
|
|
)
|
|
}))
|
|
}
|
|
};
|
|
} else {
|
|
updatedCourse = {
|
|
...course,
|
|
content: {
|
|
...course.content,
|
|
items: course.content.items.map((item) =>
|
|
item.type === ContentType.Lesson && item.id === lessonId ? { ...item, isComplete } : item
|
|
)
|
|
}
|
|
};
|
|
}
|
|
|
|
return syncProgressionAccessToCourse(updatedCourse);
|
|
}
|