{"version":3,"file":"static/chunks/630-6f324c3ec11ecba2.js","mappings":"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","sources":["webpack://_N_E/./src/lib/currency.ts","webpack://_N_E/./src/modules/Course/courseStore.ts","webpack://_N_E/./src/modules/Home/homeStore.ts","webpack://_N_E/./src/modules/Course/VideoPlayer/EndedOverlay.tsx","webpack://_N_E/./src/modules/Course/courseApi.ts","webpack://_N_E/./src/modules/Course/mediaStore.ts","webpack://_N_E/./src/modules/Course/CourseVideoJs.tsx"],"sourcesContent":["export const formatCurrency = (number: number) =>\n new Intl.NumberFormat(\"id-ID\").format(number);\n\nexport const formatBankString = (str: string) => {\n try {\n str\n .split(\"_\")\n .map((s) => {\n return s[0].toUpperCase() + s.substring(1).toLowerCase();\n })\n .join(\" \");\n } catch {\n return \"\";\n }\n};\n","import { ArrayObjectSortBy } from \"lib/object\";\nimport createStore from \"zustand\";\n\nexport const courseTabItems = [\n \"Konten Kelas\",\n \"Overview\",\n \"Rekomendasi Kursus Lainnya\",\n];\n\ntype CourseTabItem = (typeof courseTabItems)[number];\n\nexport type Lesson = {\n content_url?: string;\n description?: string;\n duration?: string;\n is_free?: boolean;\n name?: string;\n slug?: string;\n sort_order?: number;\n type?:\n | \"Video\"\n | \"Quiz\"\n | \"SCORM\"\n | \"IFrame\"\n | \"Webinar\"\n | \"PDF\"\n | \"Assignment\"\n | \"Article\"\n | \"AWS\";\n webinar?: {\n id?: number;\n webinar_url?: string;\n };\n by_ai?: any;\n};\n\nexport type CourseAI = {\n id?: number;\n assignment_question?: string;\n assignment_answer?: string;\n passing_grade?: number;\n user_answer?: {\n id?: number;\n user_answer?: string;\n score?: number;\n feedback?: string;\n };\n};\n\nexport type Course = {\n slug?: string;\n name?: string;\n description?: string;\n image_cover_url?: string;\n video_trailer_url?: string;\n duration?: number;\n has_certificate?: boolean;\n is_paywall_enabled?: boolean;\n institution?: {\n slug?: string;\n name?: string;\n description?: string;\n image_url?: string;\n is_business?: boolean;\n };\n partnership?: {\n slug?: string;\n name?: string;\n image_url?: string;\n };\n skills?: {\n slug?: string;\n name?: string;\n }[];\n chapters?: {\n number?: number;\n name?: string;\n chapter_lesson_count?: number;\n chapter_lesson_done?: number;\n lessons?: {\n id?: number;\n sort_order?: number;\n slug?: string;\n name?: string;\n description?: string;\n type?: string;\n duration?: number;\n is_free?: boolean;\n is_premium?: boolean;\n }[];\n }[];\n total_reviews?: number;\n review_summary?: {\n star_avg?: number;\n star_5?: number;\n star_4?: number;\n star_3?: number;\n star_2?: number;\n star_1?: number;\n };\n total_learners?: number;\n};\n\nexport type CourseStatus = Course & {\n course_completion_rate?: number;\n course_last_lesson_slug?: string;\n course_lesson_count?: number;\n course_lesson_done?: number;\n is_paid?: boolean;\n id?: number;\n image_cover_url?: string;\n chapters?: {\n number: number;\n name: string;\n lessons?: {\n slug: string;\n progress: {\n course_lesson_progress_slug: string;\n created_at: string;\n id: number;\n is_active: boolean;\n is_done: boolean;\n updated_at: string;\n }[];\n }[];\n }[];\n};\n\nexport type Bundle = {\n title: string;\n slug: string;\n description: string;\n benefits: {\n desc: string;\n title: string;\n }[];\n features: string[];\n discount: number;\n price: number;\n certificate_sample_image: string;\n first_course_slug: string;\n first_course_name: string;\n institutions: {\n name: string;\n slug: string;\n image_url: string;\n }[];\n courses: {\n id: number;\n slug: string;\n name: string;\n description: string;\n image_cover_url: string;\n video_trailer_url: string;\n bootcamp_image_url: string;\n duration: number;\n has_certificate: number;\n original_price: number;\n discounted_price: number;\n bundle_price: number;\n total_learners: number;\n }[];\n total_learners_bundle: number;\n};\n\nexport type CourseStore = {\n // state\n currentTab: CourseTabItem;\n isLessonLoading: boolean;\n currentLesson: Lesson | null;\n isPaywallShown: boolean;\n isLock: boolean;\n courseStatus: CourseStatus | null;\n courseEnrollmentId: number | null;\n currentBundle: Bundle | null;\n allCourse: Course[] | null;\n currentCourse: Course | null;\n showBundlePaywall: boolean;\n showSuccesBundle: boolean;\n showModalReview: boolean;\n bundleEnrollmentId: string;\n mandatoryCount: number | null;\n showModalSubscribeBusiness: boolean;\n showModalSubscribeBusinessHR: boolean;\n showModalQuiz: boolean;\n\n // actions\n setCurrentTab: (tab: CourseTabItem | any) => void;\n setPaywallShown: (b: boolean) => void;\n setLock: (b: boolean) => void;\n setShowBundlePaywall: (b: boolean) => void;\n setShowSuccesBundle: (b: boolean) => void;\n setShowModalReview: (b: boolean) => void;\n setLessonLoading: (isLoading?: boolean) => void;\n setCurrentLesson: (lesson?: Lesson) => void;\n setAllCourse: (course?: Course[]) => void;\n setCurrentCourse: (course?: Course) => void;\n setCourseStatus: (courseStatus?: CourseStatus) => void;\n setCourseEnrollmentId: (id?: number) => void;\n setBundleEnrollmentId: (id?: string) => void;\n setBundle: (bundle?: Bundle) => void;\n setMandatoryCount: (count?: number) => void;\n setShowModalSubscribeBusiness: (b: boolean) => void;\n setShowModalSubscribeBusinessHR: (b: boolean) => void;\n setShowModalQuiz: (b: boolean) => void;\n};\n\nexport const useCourseStore = createStore((set) => ({\n // state\n currentTab: courseTabItems[0],\n isLessonLoading: false,\n currentLesson: null,\n isPaywallShown: false,\n isLock: false,\n courseStatus: null,\n courseEnrollmentId: null,\n currentBundle: null,\n allCourse: null,\n currentCourse: null,\n showBundlePaywall: false,\n showSuccesBundle: false,\n showModalReview: false,\n bundleEnrollmentId: \"\",\n mandatoryCount: 0,\n showModalSubscribeBusiness: false,\n showModalSubscribeBusinessHR: false,\n showModalQuiz: false,\n\n // actions\n setCurrentTab(tab) {\n set({\n currentTab: tab,\n });\n },\n setPaywallShown(b) {\n set({\n isPaywallShown: b,\n });\n },\n setLock(b) {\n set({\n isLock: b,\n });\n },\n setLessonLoading(isLoading = false) {\n set({\n isLessonLoading: isLoading,\n });\n },\n setCurrentLesson(lesson) {\n set({\n currentLesson: lesson,\n });\n },\n setAllCourse(course) {\n set({\n allCourse: course,\n });\n },\n setCurrentCourse(course) {\n set({\n currentCourse: course,\n });\n },\n setCourseStatus(courseStatus) {\n set({\n courseStatus: courseStatus,\n });\n },\n setCourseEnrollmentId(id) {\n set({\n courseEnrollmentId: id,\n });\n },\n setBundleEnrollmentId(id) {\n set({\n bundleEnrollmentId: id,\n });\n },\n setBundle(currentBundle) {\n set({\n currentBundle,\n });\n },\n setShowBundlePaywall(showBundlePaywall) {\n set({\n showBundlePaywall,\n });\n },\n setShowSuccesBundle(showSuccesBundle) {\n set({\n showSuccesBundle,\n });\n },\n setShowModalReview(showModalReview) {\n set({\n showModalReview,\n });\n },\n setMandatoryCount(count) {\n set({\n mandatoryCount: count,\n });\n },\n setShowModalSubscribeBusiness(showModal) {\n set({\n showModalSubscribeBusiness: showModal,\n });\n },\n setShowModalSubscribeBusinessHR(showModal) {\n set({\n showModalSubscribeBusinessHR: showModal,\n });\n },\n setShowModalQuiz(showModal) {\n set({\n showModalQuiz: showModal,\n });\n },\n}));\n\nexport const getChapter = (\n chapters: {\n number?: number;\n lessons?: Lesson[];\n }[],\n currentLessonSlug: string\n) => {\n const chapter =\n chapters && chapters.length\n ? chapters.find((c) => {\n const l = c.lessons?.find((l) => l.slug == currentLessonSlug);\n return !!l;\n })\n : [];\n return chapter;\n};\n\nexport const getNextLesson = (\n chapters: {\n number?: number;\n lessons?: Lesson[];\n }[],\n currentLessonSlug: string | null\n) => {\n const sortedChapters =\n chapters && chapters.length\n ? ArrayObjectSortBy(chapters, \"number\").map((c) => {\n return {\n ...c,\n lessons: ArrayObjectSortBy(c.lessons, \"sort_order\"),\n };\n })\n : [];\n\n let sortedLessons: (Lesson & { chapter: number })[] = [];\n sortedChapters.forEach((c) => {\n c.lessons.forEach((l) => sortedLessons.push({ ...l, chapter: c.number }));\n });\n\n let nextLesson: Lesson | null = null;\n\n for (let index = 0; index < sortedLessons.length - 1; index++) {\n if (sortedLessons[index].slug == currentLessonSlug) {\n nextLesson = sortedLessons[index + 1];\n break;\n }\n }\n\n return nextLesson;\n};\n\nexport const getPrevLesson = (\n chapters: {\n number?: number;\n lessons?: Lesson[];\n }[],\n currentLessonSlug: string | null\n) => {\n const sortedChapters =\n chapters && chapters.length\n ? ArrayObjectSortBy(chapters, \"number\").map((c) => {\n return {\n ...c,\n lessons: ArrayObjectSortBy(c.lessons, \"sort_order\"),\n };\n })\n : [];\n\n let sortedLessons: (Lesson & { chapter: number })[] = [];\n sortedChapters.forEach((c) => {\n c.lessons.forEach((l) => sortedLessons.push({ ...l, chapter: c.number }));\n });\n\n let prevLesson: Lesson | null = null;\n\n for (let index = 1; index < sortedLessons.length; index++) {\n if (sortedLessons[index].slug == currentLessonSlug) {\n prevLesson = sortedLessons[index - 1];\n break;\n }\n }\n\n return prevLesson;\n};\n\nexport const isHasWebinar = (\n chapters: {\n number?: number;\n lessons?: Lesson[];\n }[]\n) => {\n return chapters.some((c) => c.lessons.some((l) => l.type === \"Webinar\"));\n};\n\nexport const getFirstUnfinishedLesson = (courseStatus: CourseStatus) => {\n const sortedChapters =\n courseStatus.chapters && courseStatus.chapters.length\n ? ArrayObjectSortBy(courseStatus.chapters, \"number\").map((c) => {\n return {\n ...c,\n lessons: ArrayObjectSortBy(c.lessons, \"sort_order\"),\n };\n })\n : [];\n\n let sortedLessons: {\n slug: string;\n progress: {\n course_lesson_progress_slug: string;\n created_at: string;\n id: number;\n is_active: boolean;\n is_done: boolean;\n updated_at: string;\n }[];\n }[] = [];\n\n sortedChapters.forEach((c) => {\n c.lessons.forEach((l) => sortedLessons.push({ ...l }));\n });\n\n const unfinishedLesson = sortedLessons.find(\n (l) => l.progress[0]?.is_done == false\n );\n\n return unfinishedLesson;\n};\n\n// get lesson number from slug name\nexport const getLessonNumberBySlug = (\n slug: string,\n courseStatus: CourseStatus\n) => {\n let allArray = [];\n if (courseStatus && courseStatus.chapters && courseStatus.chapters.length) {\n courseStatus.chapters.forEach((el) => {\n el.lessons.forEach((a, i) => {\n allArray.push({\n number: el.number,\n slug: a.slug,\n });\n });\n });\n }\n if (allArray.length) {\n allArray = [...allArray].map((a, idx) => {\n return {\n ...a,\n lesson_num: idx + 1,\n };\n });\n }\n\n return allArray.find((a) => a.slug == slug)?.lesson_num;\n};\n\nexport const getLessonIdBySlug = (chapters = [], slug: string) => {\n // Iterate through the chapters array\n for (const chapter of chapters) {\n // Iterate through the lessons in each chapter\n for (const lesson of chapter.lessons) {\n // Check if the lesson's slug matches the given slug\n if (lesson.slug === slug) {\n // Return the ID of the matching lesson\n return {\n lessonId: lesson.id,\n chapterNum: chapter.number,\n };\n }\n }\n }\n // If no matching lesson is found, return null or an appropriate value\n return null;\n};\n","import createStore from \"zustand\";\nimport { paths } from \"lib/__generatedApiSpec\";\nimport { OpReturnType } from \"openapi-typescript-fetch\";\nimport { SetStateAction } from \"react\";\n\n//@ts-ignore\ntype NotifData = OpReturnType[\"data\"];\n\nexport type HomeStore = {\n // States\n userNotifications: NotifData | null;\n newLessonComplete: Boolean;\n renderingStep: number;\n isShowSearchModal: boolean;\n\n // Actions\n setNotification: (notif: NotifData) => void;\n setNewLessonComplete: (lessonCompleted: Boolean) => void;\n setRenderingStep: (step: SetStateAction) => void;\n setIsShowSearchModal: (isShow: SetStateAction) => void;\n};\n\nexport const useHomeStore = createStore((set) => ({\n // States\n userNotifications: null,\n newLessonComplete: false,\n renderingStep: 1,\n isShowSearchModal: true,\n\n // Actions\n setNotification(userNotifications) {\n set({\n userNotifications,\n });\n },\n setNewLessonComplete(newLessonComplete) {\n set({\n newLessonComplete,\n });\n },\n setRenderingStep: (step) =>\n set((state) => ({\n renderingStep:\n typeof step === \"function\" ? step(state.renderingStep) : step,\n })),\n setIsShowSearchModal: (isShow) =>\n set((state) => ({\n isShowSearchModal:\n typeof isShow === \"function\" ? isShow(state.isShowSearchModal) : isShow,\n })),\n}));\n","import Button from \"components/Button\";\nimport Link from \"next/link\";\nimport { useRouter } from \"next/router\";\nimport { useEffect, useState } from \"react\";\nimport {\n useCourseDetailApi,\n useCourseGetStatus,\n useCourseSetLessonDone,\n} from \"../courseApi\";\nimport {\n CourseStatus,\n getLessonNumberBySlug,\n getNextLesson,\n useCourseStore,\n} from \"../courseStore\";\nimport { trackEvent, trackEventGA, trackEventGTM } from \"lib/amplitude\";\nimport { formatCurrency } from \"lib/currency\";\nimport { useAuthStore } from \"modules/Auth/authStore\";\nimport useTranslation from \"next-translate/useTranslation\";\nimport { useIsSubdomain, useIsTenant } from \"lib/host\";\nimport { useHomeStore } from \"modules/Home/homeStore\";\n\nexport const EndedOverlay: React.FC<{ onClickNext: () => void }> = (props) => {\n const { t } = useTranslation(\"course\");\n const router = useRouter();\n const courseSlug =\n typeof router.query.courseSlug == \"string\" ? router.query.courseSlug : \"\";\n\n const lessonSlug =\n typeof router.query.lesson == \"string\" ? router.query.lesson : \"\";\n\n const bundleSlug =\n typeof router.query.lesson == \"string\" ? router.query.bundle : \"\";\n\n const { setCurrentTab, currentTab, setShowModalQuiz, currentCourse } =\n useCourseStore((s) => ({\n setCurrentTab: s.setCurrentTab,\n currentTab: s.currentTab,\n setShowModalQuiz: s.setShowModalQuiz,\n currentCourse: s.currentCourse,\n }));\n\n const currentUser = useAuthStore((state) => state.currentUser);\n const isEnterprisePlus =\n currentUser?.tenant !== undefined &&\n [\n \"Enterprise Plus\",\n \"Pro Plus\",\n `Pro Custom (${currentUser?.referral})`,\n ].includes((currentUser?.tenant as any)?.plan?.name);\n\n const courseChapters = currentCourse?.chapters || [];\n const courseSetLessonDone = useCourseSetLessonDone();\n const courseGetStatus = useCourseGetStatus(courseSlug);\n\n const setNewLessonComplete = useHomeStore((state) => state.setNewLessonComplete);\n\n const isCourseFree: boolean =\n // @ts-ignore\n currentCourse?.discounted_price === 0 ||\n // @ts-ignore\n currentCourse?.original_price === 0;\n\n const isB2B = useIsSubdomain() || useIsTenant();\n const isAnyQuizLesson =\n (currentCourse as any)?.chapters &&\n (currentCourse as any)?.chapters.some((a) =>\n a.lessons.some((x) => x.type === \"Quiz\")\n );\n const nextLesson = getNextLesson(courseChapters as any, lessonSlug);\n\n const [\n courseStatus,\n setPaywallShown,\n currentLesson,\n courseEnrollmentId,\n setCourseStatus,\n ] = useCourseStore((c) => [\n c.courseStatus,\n c.setPaywallShown,\n c.currentLesson,\n c.courseEnrollmentId,\n c.setCourseStatus,\n ]);\n\n const hasUserPaid = courseStatus?.is_paid;\n const hasPaywall: boolean =\n currentCourse?.is_paywall_enabled === undefined\n ? true\n : currentCourse?.is_paywall_enabled;\n const [counter, setCounter] = useState(1);\n\n // TODO: Only use if countdown being used again\n // useEffect(() => {\n // let setCounterInterval;\n\n // if ( (nextLesson?.is_free && nextLesson?.type !== \"Webinar\") || (!nextLesson?.is_free && hasUserPaid)) {\n // setCounterInterval = setInterval(() => {\n // setCounter((c) => c - 1);\n // }, 1000);\n // } else {\n // clearInterval(setCounterInterval);\n // }\n\n // if(counter==0) {\n // courseSetLessonDone.doFetch(\n // {\n // slug: lessonSlug,\n // },\n // {\n // onSuccess(data) {\n // courseGetStatus.doFetch({\n // slug: courseSlug,\n // });\n // },\n // }\n // );\n // }\n\n // return () => clearInterval(setCounterInterval);\n // }, [nextLesson]);\n\n const redirectNextLesson = () => {\n props.onClickNext();\n if (nextLesson) {\n let queriesCourse = {\n courseSlug: courseSlug,\n lesson: nextLesson?.slug,\n };\n /// Set showmodalquiz in store to Show Quiz directly after countdown\n if (nextLesson?.type == \"Quiz\" || nextLesson?.type == \"Assignment\") {\n setShowModalQuiz(true);\n }\n\n router.replace(\n nextLesson?.type == \"Webinar\" && !hasUserPaid\n ? {\n pathname: \"/course/webinar/[courseSlug]/[lessonSlug]\",\n query: {\n courseSlug: courseSlug,\n lessonSlug: nextLesson?.slug,\n },\n }\n : {\n pathname: \"/course/[courseSlug]\",\n query: queriesCourse,\n },\n undefined,\n {\n shallow: true,\n }\n );\n }\n };\n\n const isSubdomainTenant = useIsSubdomain();\n const isTenatURL = useIsTenant();\n\n const getAccess = (lesson: any) => {\n if (isSubdomainTenant || isTenatURL) {\n if (lesson?.is_free || isEnterprisePlus || hasUserPaid) return true;\n else if (lesson?.is_premium || !isEnterprisePlus) return false;\n } else {\n if (!lesson?.is_free || lesson?.is_premium) return false;\n else if (lesson?.is_free || hasUserPaid) return true;\n }\n };\n\n useEffect(() => {\n // if (counter === 0) {\n /// Hit API Course done & redirect directly after video finished\n courseSetLessonDone.doFetch(\n {\n slug: lessonSlug,\n },\n {\n onSuccess(data) {\n setNewLessonComplete(true);\n courseGetStatus.doFetch({\n slug: courseSlug,\n });\n trackEventGTM({\n event: \"lms_video_next_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n },\n });\n trackEventGA({\n event: \"lms_video_next_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n },\n }); \n },\n }\n );\n\n if (getAccess(nextLesson)) redirectNextLesson();\n\n // }\n }, [counter]);\n\n useEffect(() => {\n // if (!isCourseFree && !nextLesson?.is_free && !hasUserPaid) {\n // setPaywallShown(true);\n // }\n if (\n (!isCourseFree &&\n (!nextLesson?.is_free ||\n !nextLesson ||\n nextLesson?.type == \"Webinar\") &&\n !hasUserPaid) ||\n (!nextLesson && isCourseFree)\n ) {\n if (currentTab !== \"Rekomendasi Kursus Lainnya\") {\n setCurrentTab(\"Rekomendasi Kursus Lainnya\");\n\n trackEvent({\n event: \"lms_recommended_auto_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n },\n });\n }\n }\n }, [nextLesson?.is_free, nextLesson?.type, hasUserPaid, isCourseFree]);\n\n useEffect(() => {\n if (!nextLesson) {\n courseSetLessonDone.doFetch(\n {\n slug: lessonSlug,\n },\n {\n onSuccess(data) {\n setNewLessonComplete(true);\n courseGetStatus.doFetch(\n { slug: courseSlug },\n {\n onSuccess(data) {\n setCourseStatus(data?.data as CourseStatus);\n },\n }\n );\n },\n }\n );\n }\n }, []);\n\n return (\n \n {(nextLesson?.is_free && nextLesson?.type !== \"Webinar\") ||\n (!nextLesson?.is_free && hasUserPaid) ? (\n
\n
\n Materi Selanjutnya dalam{\" \"}\n {counter}\n
\n
\n
{nextLesson?.name}
\n
\n
\n {/* {\n // @ts-ignore\n trackEvent({\n event: \"lms_video_next_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n },\n });\n trackEvent({\n // @ts-ignore\n event: \"lms_lesson_view_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: currentLesson?.slug,\n course_enrollment_id: courseEnrollmentId,\n type: currentLesson?.type,\n bundle_slug: bundleSlug,\n //@ts-ignore\n lesson_num: getLessonNumberBySlug(currentLesson?.slug, courseStatus)\n },\n });\n setShowModalQuiz(true);\n props.onClickNext();\n }}\n shallow\n href={\n nextLesson?.type == \"Webinar\" && !hasUserPaid\n ? {\n pathname: \"/course/webinar/[courseSlug]/[lessonSlug]\",\n query: {\n courseSlug: courseSlug,\n lessonSlug: nextLesson?.slug,\n },\n }\n : {\n pathname: \"/course/[courseSlug]\",\n query: {\n courseSlug: courseSlug,\n lesson: nextLesson?.slug,\n },\n }\n }\n > */}\n {\n redirectNextLesson();\n }}\n >\n {t(\"startNow\")}\n \n {/* */}\n {/*
Cancel
*/}\n
\n
\n ) : !isCourseFree &&\n (!(nextLesson?.is_free === false) ||\n !nextLesson ||\n nextLesson?.type === \"Webinar\") &&\n !hasUserPaid &&\n hasPaywall &&\n !isEnterprisePlus &&\n // Hide certificate option if b2b & doesn't have quiz type lesson\n (!isB2B || isAnyQuizLesson) ? (\n
\n
\n Dapatkan Sertifikat Resmi {/* @ts-ignore */}\n {currentCourse?.institution?.name} hanya dengan Rp\n {formatCurrency(\n // @ts-ignore\n\n currentCourse?.discounted_price ||\n //@ts-ignore\n currentCourse?.original_priceoriginal_price\n )}\n !\n
\n
\n {\n setPaywallShown(true);\n }}\n >\n Upgrade Kursus\n \n
\n ) : !isCourseFree &&\n !nextLesson &&\n courseStatus?.course_lesson_count - courseStatus?.course_lesson_done >\n 1 &&\n hasPaywall &&\n // Hide certificate option if b2b & doesn't have quiz type lesson\n (!isB2B || isAnyQuizLesson) ? (\n
\n
\n Selesaikan pelajaranmu dan dapatkan sertifikat!\n
\n
\n ) : !nextLesson &&\n courseStatus?.course_lesson_count ===\n courseStatus?.course_lesson_done ? (\n
\n
Materi telah selesai
\n
\n \n router.replace({\n pathname: \"/course/[courseSlug]\",\n query: {\n courseSlug,\n },\n })\n }\n >\n {t(\"rewatch\")}\n \n
\n ) : (\n
\n
Materi telah selesai
\n
\n \n router.replace({\n pathname: \"/course/[courseSlug]\",\n query: {\n courseSlug,\n },\n })\n }\n >\n {t(\"rewatch\")}\n \n
\n )}\n \n );\n};\n","import { useApi } from \"lib/apiFetcher\";\n\nexport const useCourseDetailApi = (additionalKey: string) =>\n useApi(\"get\", \"/courses/{slug}\", additionalKey);\n\nexport const useCourseLessonDetailApi = (additionalKey: string) =>\n useApi(\"get\", \"/lessons/{slug}\", additionalKey);\n\nexport const useCourseEnrollApi = (param?: string) =>\n // @ts-ignore\n useApi(\"post\", `/courses/{slug}/enroll${param ? `?${param}` : \"\"}`);\n\nexport const useCourseGetQuiz = (additionalKey: string) =>\n useApi(\"get\", \"/lessons/{slug}/quiz\", additionalKey);\n\nexport const useCourseAnswerQuiz = () => useApi(\"post\", \"/lessons/{slug}/quiz\");\nexport const useCourseGetAnswerQuiz = (k: string) =>\n // @ts-ignore\n useApi(\"get\", \"/lessons/{slug}/quiz/user-answers\", k);\n\nexport const useCourseGetStatus = (additionalKey: string) =>\n useApi(\"get\", \"/courses/{slug}/status\", additionalKey);\n\nexport const useCourseSetLessonDone = () =>\n useApi(\"get\", \"/lessons/{slug}/done\");\n\nexport const useCourseGetOfflineVideo = () =>\n // @ts-ignore\n useApi(\"get\", \"/lessons/{slug}/offline/video\");\n\nexport const useCourseGenerateCertificate = () =>\n useApi(\"post\", \"/courses/{id}/certificate\");\n\nexport const useCourseGetCertificate = () =>\n useApi(\"get\", \"/courses/{uuid}/download-certificate\");\n\nexport const useCourseReview = () => useApi(\"post\", \"/courses/{slug}/review\");\n\nexport const useCourseWebinar = () =>\n useApi(\"get\", \"/webinar/{course_slug}/{lesson_slug}\");\n\nexport const useCourseGetReview = () => useApi(\"get\", \"/courses/{slug}/review\");\n\nexport const useCourseGetAssignments = () =>\n useApi(\"get\", \"/lessons/{slug}/assignment\");\n\nexport const useCourseSendAssignments = () =>\n useApi(\"post\", \"/lessons/{slug}/assignment\");\n\nexport const useCourseGetAssignmentUserAnswers = () =>\n // @ts-ignore\n useApi(\"get\", \"/lessons/{slug}/assignment/user-answers\");\n\nexport const useCourseGetArticle = (additionalKey: string) =>\n // @ts-ignore\n useApi(\"get\", \"/lesson/{slug}/article\", additionalKey);\n\nexport const useCourseGetCategories = () => useApi(\"get\", \"/course-categories\");\n","import { MediaPlayerInstance } from \"@vidstack/react\";\nimport { MutableRefObject, SetStateAction } from \"react\";\nimport Player from \"video.js/dist/types/player\";\nimport createStore from \"zustand\";\n\nexport type MediaStore = {\n // state\n player: MutableRefObject;\n playerVideoJs: MutableRefObject;\n isPlayerReady: boolean;\n\n // actions\n setPlayer: (player: MutableRefObject) => void;\n setPlayerVideoJs: (player: MutableRefObject) => void;\n setIsPlayerReady: (isReady: SetStateAction) => void;\n};\n\nexport const useMediaStore = createStore((set) => ({\n // state\n player: null,\n playerVideoJs: null,\n isPlayerReady: false,\n\n // actions\n setPlayer(player) {\n set({ player });\n },\n setPlayerVideoJs(player) {\n set({ playerVideoJs: player });\n },\n setIsPlayerReady: (isReady) =>\n set((state) => ({\n isPlayerReady:\n typeof isReady === \"function\" ? isReady(state.isPlayerReady) : isReady,\n })),\n}));\n","import { CONST } from \"lib/const\";\nimport { useAuthStore } from \"modules/Auth/authStore\";\nimport { useRouter } from \"next/router\";\nimport { useEffect, useRef, useState } from \"react\";\nimport videojs from \"video.js\";\nimport Player from \"video.js/dist/types/player\";\n// import { VideoJsPlayerOptions } from \"video.js\";\nimport \"video.js/dist/video-js.css\";\nimport \"videojs-contrib-quality-levels\";\nimport \"videojs-hls-quality-selector\";\nimport \"videojs-mux\";\nimport { EndedOverlay } from \"./VideoPlayer/EndedOverlay\";\nimport { trackEvent, trackEventGA, trackEventGTM } from \"lib/amplitude\";\nimport {\n getLessonIdBySlug,\n getLessonNumberBySlug,\n useCourseStore,\n} from \"./courseStore\";\nimport { useIsSubdomain, useIsTenant, isMalukuURL, isGateURL } from \"lib/host\";\nimport \"videojs-youtube\";\nimport Hls from \"hls.js\";\n// import {\n// deleteVideoFromIndexedDB,\n// getVideoFromIndexedDB,\n// saveVideoToIndexedDB,\n// } from \"lib/video\";\nimport { useToastStore } from \"components/Toast/toastStore\";\nimport { useMediaStore } from \"./mediaStore\";\n\nexport const VideoJS = ({ url, isHovering = false, handleInterrupt }) => {\n const videoRef = useRef(null);\n const playerRef = useRef(null);\n const isSubdomainTenant = useIsSubdomain();\n const isMoodle = useIsTenant();\n const isMalukuTenant =\n typeof window !== \"undefined\" && isMalukuURL(window.location.hostname);\n const isGate =\n typeof window !== \"undefined\" && isGateURL(window.location.hostname);\n // const currentLesson = useCourseStore((state) => state.currentLesson);\n\n const [courseStatus, courseEnrollmentId, currentLesson] = useCourseStore(\n (state) => [\n state.courseStatus,\n state.courseEnrollmentId,\n state.currentLesson,\n ]\n );\n const showToast = useToastStore((state) => state.showToast);\n\n const [isEnded, setEnded] = useState(false);\n\n const router = useRouter();\n\n const currentUserId = useAuthStore((s) => s?.currentUser?.id);\n\n const lessonSlug =\n typeof router.query.lesson == \"string\" ? router.query.lesson : \"\";\n const courseSlug =\n typeof router.query.courseSlug == \"string\" ? router.query.courseSlug : \"\";\n // const { options, onReady } = props;\n\n const videoTitle = lessonSlug || courseSlug;\n\n const getVideoTitle = (title: string, name: any) => {\n if (name) return name;\n\n return (\n title\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \") || \"untitled\"\n );\n };\n\n let videoCDN = \"Cloudflare\";\n // let videoCDN = \"Cloudfront\";\n let videoStreamingType = \"VOD\";\n\n if (url?.includes(\"fast.gokampus.com\")) videoCDN = \"Fastly\";\n else if (url?.includes(\"gokampus.cachefly.net\")) videoCDN = \"CacheFly\";\n\n const currentSource = url?.includes(\"youtube\")\n ? { src: url, type: \"video/youtube\" }\n : url?.includes(\"blob\")\n ? { src: url, type: \"video/mp4\" }\n : { src: url };\n\n let playerName = \"GoKampus Player\";\n\n if (isGate) {\n playerName = \"GoKampus App Player\";\n }\n\n if (isMalukuTenant) {\n playerName = \"GoKampus Maluku Player\";\n }\n\n if (isHovering) {\n playerName += \" (Hover)\";\n }\n\n const options = {\n autoplay: url !== \"\",\n controls: !isHovering,\n // Change to false to show playbackRates on mobile\n responsive: false,\n playsinline: true,\n // Docs: https://videojs.com/guides/options/#playbackrates\n playbackRates: [2, 1.5, 1, 0.5],\n controlBar: {\n skipButtons: {\n backward: 10,\n forward: 10,\n },\n pictureInPictureToggle: true,\n },\n userActions: {\n // default hotkeys:\n // - 'f' for toggle fullscreen\n // - 'space' for toggle play/pause\n // - 'm' for toggle mute\n hotkeys: true,\n },\n // fluid: true,\n // https://stackoverflow.com/questions/49930680/how-to-handle-uncaught-in-promise-domexception-play-failed-because-the-use/50742427#50742427\n muted: isHovering,\n preload: true,\n sources: [currentSource],\n plugins: {\n mux: {\n debug: false,\n data: {\n env_key: CONST.MUX_ENV_KEY,\n // Metadata\n player_name: playerName,\n viewer_user_id: currentUserId,\n video_id: lessonSlug,\n video_cdn: videoCDN,\n video_stream_type: videoStreamingType,\n video_title: lessonSlug,\n },\n },\n },\n html5: {\n hls: {\n enableLowInitialPlaylist: true,\n smoothQualityChange: true,\n overrideNative: true,\n },\n },\n };\n\n const { setPlayerVideoJs } = useMediaStore();\n\n useEffect(() => {\n if (playerRef) {\n setPlayerVideoJs(playerRef);\n }\n // Make sure Video.js player is only initialized once\n if (!playerRef.current) {\n // The Video.js player needs to be _inside_ the component el for React 18 Strict Mode.\n const videoElement = document.createElement(\"video-js\");\n\n videoElement.classList.add(\"vjs-big-play-centered\");\n videoRef.current.appendChild(videoElement);\n\n const player: any = (playerRef.current = videojs(\n videoElement,\n options,\n () => {\n // videojs.log(\"player is ready\");\n // onReady && onReady(player);\n }\n ));\n\n player.hlsQualitySelector({\n displayCurrentQuality: true,\n });\n\n // Initialize quality levels\n const qualityLevels = player.qualityLevels();\n\n // Example: Log available quality levels\n qualityLevels.on(\"addqualitylevel\", (event) => {\n console.log(\"New quality level added:\", event.qualityLevel);\n trackEventGTM({\n event: \"lms_video_setting_quality_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n },\n });\n trackEventGA({\n event: \"lms_video_setting_quality_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n },\n });\n });\n\n // Example: Log when quality level changes\n qualityLevels.on(\"change\", () => {\n const selectedQuality = qualityLevels[qualityLevels.selectedIndex];\n console.log(\"Selected quality level:\", selectedQuality);\n trackEventGTM({\n event: \"lms_video_setting_quality_selected_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n quality: selectedQuality,\n },\n });\n trackEventGA({\n event: \"lms_video_setting_quality_selected_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n quality: selectedQuality,\n },\n });\n });\n\n // Example: Enable/disable specific quality levels\n for (let i = 0; i < qualityLevels.length; i++) {\n const quality = qualityLevels[i];\n if (quality.height >= 720) {\n quality.enabled = true;\n } else {\n quality.enabled = false;\n }\n }\n\n // You could update an existing player in the `else` block here\n // on prop change, for example:\n } else {\n const player = playerRef.current;\n\n player.autoplay(options.autoplay);\n player.src(options.sources);\n }\n }, [videoRef, isHovering, url, playerRef]);\n\n // const displayVideo = async () => {\n // try {\n // const videoBlob: any = await getVideoFromIndexedDB(videoTitle);\n // if (videoBlob) {\n // const url = URL.createObjectURL(videoBlob.blob);\n // playerRef.current.src({ type: videoBlob.type, src: url });\n // }\n // } catch (error) {\n // console.error(\"Failed to load video from IndexedDB\", error);\n // }\n // };\n\n let hls;\n const videoEl = videoRef.current;\n\n const fetchVideoFromNetwork = (url) => {\n console.log(\"🚀 2 url \", url);\n\n var dataStream = {\n video: [],\n audio: [],\n };\n if (url.includes(\".m3u8\")) {\n if (Hls.isSupported()) {\n hls = new Hls();\n\n // @ts-ignore\n window.hls = hls;\n\n hls.loadSource(url);\n hls.attachMedia(videoEl);\n hls.on(Hls.Events.MANIFEST_PARSED, function (event, a) {\n console.log(\"🚀 3 apending data\", a);\n\n videoEl.play();\n hls.on(Hls.Events.BUFFER_APPENDING, function (event, data) {\n console.log(\"🚀 3 apending\", data);\n dataStream[data.type].push(data.data);\n });\n });\n }\n }\n\n console.log(\"🚀 4 dataStream\", dataStream);\n };\n\n const fetchVideo = (url?: string) => {\n fetchVideoFromNetwork(url);\n };\n\n useEffect(() => {\n if (url) {\n console.log(\"🚀 1\", url);\n fetchVideo(url);\n }\n // else {\n // displayVideo();\n // }\n }, [url]);\n\n // useEffect(() => {\n // const player = playerRef.current;\n\n // if (!isHovering) player.pause()\n // }, [isHovering])\n\n // Dispose the Video.js player when the functional component unmounts\n useEffect(() => {\n const player = playerRef.current;\n\n const onPlay = () => {\n handleInterrupt();\n trackEventGTM({\n event: \"lms_video_playpause_a\",\n property: {\n course_slug: courseSlug,\n is_play: true,\n lesson_slug: lessonSlug,\n current_video_time: player.currentTime(),\n },\n });\n trackEventGA({\n event: \"lms_video_playpause_a\",\n property: {\n course_slug: courseSlug,\n is_play: true,\n lesson_slug: lessonSlug,\n current_video_time: player.currentTime(),\n },\n });\n };\n const onPause = () => {\n trackEventGTM({\n event: \"lms_video_playpause_a\",\n property: {\n course_slug: courseSlug,\n is_play: false,\n lesson_slug: lessonSlug,\n current_video_time: player.currentTime(),\n },\n });\n trackEventGA({\n event: \"lms_video_playpause_a\",\n property: {\n course_slug: courseSlug,\n is_play: false,\n lesson_slug: lessonSlug,\n current_video_time: player.currentTime(),\n },\n });\n };\n const onEnterPip = () => {\n trackEventGTM({\n event: \"lms_video_pip_a\",\n property: {\n course_slug: courseSlug,\n is_pip: true,\n lesson_slug: lessonSlug,\n current_video_time: player.currentTime(),\n },\n });\n trackEventGA({\n event: \"lms_video_pip_a\",\n property: {\n course_slug: courseSlug,\n is_pip: true,\n lesson_slug: lessonSlug,\n current_video_time: player.currentTime(),\n },\n });\n };\n const onLeavePip = () => {\n trackEventGTM({\n event: \"lms_video_pip_a\",\n property: {\n course_slug: courseSlug,\n is_pip: false,\n lesson_slug: lessonSlug,\n current_video_time: player.currentTime(),\n },\n });\n trackEventGA({\n event: \"lms_video_pip_a\",\n property: {\n course_slug: courseSlug,\n is_pip: false,\n lesson_slug: lessonSlug,\n current_video_time: player.currentTime(),\n },\n });\n };\n const onEnded = () => {\n setEnded(true);\n trackEventGTM({\n event: \"lms_lesson_complete_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n course_enrollment_id: courseEnrollmentId,\n type: currentLesson?.type,\n lesson_num: getLessonNumberBySlug(lessonSlug, courseStatus),\n is_marked_as_done: false,\n marked_lesson_slug: lessonSlug,\n },\n });\n trackEventGA({\n event: \"lms_lesson_complete_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n course_enrollment_id: courseEnrollmentId,\n type: currentLesson?.type,\n lesson_num: getLessonNumberBySlug(lessonSlug, courseStatus),\n is_marked_as_done: false,\n marked_lesson_slug: lessonSlug,\n },\n });\n };\n\n const onClickSeekbar = () => {\n trackEventGTM({\n event: \"lms_video_timeline_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n current_video_time: player.currentTime(),\n },\n });\n trackEventGA({\n event: \"lms_video_timeline_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n current_video_time: player.currentTime(),\n },\n });\n };\n\n const onVolumeChange = () => {\n trackEventGTM({\n event: \"lms_video_volume_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n current_video_time: player.volume(),\n },\n });\n trackEventGA({\n event: \"lms_video_volume_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n current_video_time: player.volume(),\n },\n });\n };\n\n const onFullScreenChange = () => {\n trackEventGTM({\n event: \"lms_video_fullscreen_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n is_fullscreen: player.isFullscreen(),\n },\n });\n trackEventGA({\n event: \"lms_video_fullscreen_a\",\n property: {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n is_fullscreen: player.isFullscreen(),\n },\n });\n };\n const onPlaybackChange = () => {\n const eventProperties = {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n course_enrollment_id: courseEnrollmentId,\n type: currentLesson?.type,\n course_id: courseStatus.id,\n chapter_num: getLessonIdBySlug(courseStatus.chapters, lessonSlug)\n ?.chapterNum,\n lesson_id: getLessonIdBySlug(courseStatus.chapters, lessonSlug)\n ?.lessonId,\n lesson_num: getLessonNumberBySlug(currentLesson?.slug, courseStatus),\n speed: player.playbackRate(),\n };\n trackEventGTM({\n event: \"lms_video_setting_speed_selected_a\",\n property: eventProperties,\n });\n trackEventGA({\n event: \"lms_video_setting_speed_selected_a\",\n property: eventProperties,\n });\n };\n\n const onSkipBackward = () => {\n const eventProperties = {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n course_enrollment_id: courseEnrollmentId,\n type: currentLesson?.type,\n course_id: courseStatus.id,\n chapter_num: getLessonIdBySlug(courseStatus.chapters, lessonSlug)\n ?.chapterNum,\n lesson_id: getLessonIdBySlug(courseStatus.chapters, lessonSlug)\n ?.lessonId,\n lesson_num: getLessonNumberBySlug(currentLesson?.slug, courseStatus),\n current_video_time: player.currentTime(),\n };\n trackEventGTM({\n event: \"lms_video_backward_a\",\n property: eventProperties,\n });\n trackEventGA({\n event: \"lms_video_backward_a\",\n property: eventProperties,\n });\n };\n\n const onSkipForward = () => {\n const eventProperties = {\n course_slug: courseSlug,\n lesson_slug: lessonSlug,\n course_enrollment_id: courseEnrollmentId,\n type: currentLesson?.type,\n course_id: courseStatus.id,\n chapter_num: getLessonIdBySlug(courseStatus.chapters, lessonSlug)\n ?.chapterNum,\n lesson_id: getLessonIdBySlug(courseStatus.chapters, lessonSlug)\n ?.lessonId,\n lesson_num: getLessonNumberBySlug(currentLesson?.slug, courseStatus),\n current_video_time: player.currentTime(),\n };\n trackEventGTM({\n event: \"lms_video_forward_a\",\n property: eventProperties,\n });\n trackEventGA({\n event: \"lms_video_forward_a\",\n property: eventProperties,\n });\n };\n\n player.on(\"play\", onPlay);\n player.on(\"pause\", onPause);\n player.on(\"enterpictureinpicture\", onEnterPip);\n player.on(\"leavepictureinpicture\", onLeavePip);\n player.on(\"ended\", onEnded);\n player.on(\"volumechange\", onVolumeChange);\n player.on(\"fullscreenchange\", onFullScreenChange);\n player.on(\"ratechange\", onPlaybackChange);\n\n // @ts-ignore\n player.controlBar?.skipBackward?.on(\"click\", onSkipBackward);\n\n // @ts-ignore\n player.controlBar?.skipForward?.on(\"click\", onSkipForward);\n\n // @ts-ignore\n player.controlBar?.progressControl?.seekBar?.on(\"click\", onClickSeekbar);\n\n return () => {\n if (player && !player.isDisposed()) {\n player.off(\"play\", onPlay);\n player.off(\"pause\", onPause);\n player.off(\"enterpictureinpicture\", onEnterPip);\n player.off(\"leavepictureinpicture\", onLeavePip);\n player.off(\"ended\", onEnded);\n player.off(\"volumechange\", onVolumeChange);\n player.off(\"fullscreenchange\", onFullScreenChange);\n\n // @ts-ignore\n player.controlBar?.progressControl?.seekBar?.off(\n \"click\",\n onClickSeekbar\n );\n\n player.dispose();\n playerRef.current = null;\n }\n };\n }, [playerRef]);\n\n return isEnded && !isHovering ? (\n
\n {\n setEnded(false);\n }}\n />\n
\n ) : (\n
\n
\n
\n );\n};\n"],"names":["formatCurrency","number","Intl","NumberFormat","format","courseTabItems","useCourseStore","createStore","set","currentTab","isLessonLoading","currentLesson","isPaywallShown","isLock","courseStatus","courseEnrollmentId","currentBundle","allCourse","currentCourse","showBundlePaywall","showSuccesBundle","showModalReview","bundleEnrollmentId","mandatoryCount","showModalSubscribeBusiness","showModalSubscribeBusinessHR","showModalQuiz","setCurrentTab","tab","setPaywallShown","b","setLock","setLessonLoading","isLoading","setCurrentLesson","lesson","setAllCourse","course","setCurrentCourse","setCourseStatus","setCourseEnrollmentId","id","setBundleEnrollmentId","setBundle","setShowBundlePaywall","setShowSuccesBundle","setShowModalReview","setMandatoryCount","count","setShowModalSubscribeBusiness","showModal","setShowModalSubscribeBusinessHR","setShowModalQuiz","getLessonNumberBySlug","slug","allArray","chapters","length","forEach","el","lessons","a","i","push","map","idx","lesson_num","find","getLessonIdBySlug","chapter","lessonId","chapterNum","useHomeStore","userNotifications","newLessonComplete","renderingStep","isShowSearchModal","setNotification","setNewLessonComplete","setRenderingStep","step","state","setIsShowSearchModal","isShow","EndedOverlay","props","t","useTranslation","router","useRouter","courseSlug","query","lessonSlug","bundle","s","currentUser","useAuthStore","isEnterprisePlus","undefined","tenant","referral","includes","plan","name","courseChapters","courseSetLessonDone","useApi","courseGetStatus","additionalKey","isCourseFree","discounted_price","original_price","isB2B","useIsSubdomain","useIsTenant","isAnyQuizLesson","some","x","type","nextLesson","currentLessonSlug","sortedChapters","ArrayObjectSortBy","c","sortedLessons","l","index","getNextLesson","hasUserPaid","is_paid","hasPaywall","is_paywall_enabled","counter","setCounter","useState","redirectNextLesson","onClickNext","queriesCourse","replace","pathname","shallow","isSubdomainTenant","isTenatURL","useEffect","doFetch","onSuccess","data","trackEventGTM","event","property","course_slug","lesson_slug","trackEventGA","is_free","is_premium","getAccess","trackEvent","div","className","style","backgroundImage","image_cover_url","span","Button","variant","onClick","course_lesson_count","course_lesson_done","institution","original_priceoriginal_price","useMediaStore","player","playerVideoJs","isPlayerReady","setPlayer","setPlayerVideoJs","setIsPlayerReady","isReady","VideoJS","url","isHovering","handleInterrupt","videoRef","useRef","playerRef","isMalukuTenant","isMalukuURL","window","location","hostname","isGate","isGateURL","isEnded","setEnded","useToastStore","showToast","currentUserId","videoCDN","currentSource","src","playerName","options","autoplay","controls","responsive","playsinline","playbackRates","controlBar","skipButtons","backward","forward","pictureInPictureToggle","userActions","hotkeys","muted","preload","sources","plugins","mux","debug","env_key","CONST","player_name","viewer_user_id","video_id","video_cdn","video_stream_type","video_title","html5","hls","enableLowInitialPlaylist","smoothQualityChange","overrideNative","current","videoElement","document","createElement","classList","add","appendChild","videojs","hlsQualitySelector","displayCurrentQuality","qualityLevels","on","selectedQuality","selectedIndex","quality","height","enabled","videoEl","fetchVideo","dataStream","video","audio","Hls","loadSource","attachMedia","play","fetchVideoFromNetwork","onPlay","is_play","current_video_time","currentTime","onPause","onEnterPip","is_pip","onLeavePip","onEnded","course_enrollment_id","is_marked_as_done","marked_lesson_slug","onClickSeekbar","onVolumeChange","volume","onFullScreenChange","is_fullscreen","isFullscreen","eventProperties","course_id","chapter_num","lesson_id","speed","playbackRate","skipBackward","skipForward","progressControl","seekBar","isDisposed","off","dispose","data-vjs-player","ref"],"sourceRoot":""}