diff --git a/src-ts/tools/learn/Learn.tsx b/src-ts/tools/learn/Learn.tsx index 6a7b52d31..4175dcfc3 100644 --- a/src-ts/tools/learn/Learn.tsx +++ b/src-ts/tools/learn/Learn.tsx @@ -7,6 +7,8 @@ import { RouteContextData, } from '../../lib' +import { LearnSwr } from './learn-lib' + export const toolTitle: string = ToolTitle.learn const Learn: FC<{}> = () => { @@ -14,12 +16,12 @@ const Learn: FC<{}> = () => { const { getChildRoutes }: RouteContextData = useContext(routeContext) return ( - <> + {getChildRoutes(toolTitle)} - + ) } diff --git a/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.tsx b/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.tsx index 3fb376920..c5cd582b9 100644 --- a/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.tsx +++ b/src-ts/tools/learn/course-certificate/certificate-view/CertificateView.tsx @@ -15,10 +15,10 @@ import { import { AllCertificationsProviderData, CoursesProviderData, - useAllCertifications, - useCourses, + useGetCertification, + useGetCourses, + useGetUserCompletedCertifications, UserCompletedCertificationsProviderData, - useUserCompletedCertifications, } from '../../learn-lib' import { getCoursePath, getUserCertificateSsr } from '../../learn.routes' @@ -54,7 +54,7 @@ const CertificateView: FC = (props: CertificateViewProps) const { course, ready: courseReady, - }: CoursesProviderData = useCourses(props.provider, props.certification) + }: CoursesProviderData = useGetCourses(props.provider, props.certification) function getCertTitle(user: string): string { return `${user} - ${course?.title} Certification` @@ -72,7 +72,7 @@ const CertificateView: FC = (props: CertificateViewProps) const { certifications: [completedCertificate], ready: completedCertificateReady, - }: UserCompletedCertificationsProviderData = useUserCompletedCertifications( + }: UserCompletedCertificationsProviderData = useGetUserCompletedCertifications( props.profile.userId, props.provider, props.certification @@ -82,9 +82,9 @@ const CertificateView: FC = (props: CertificateViewProps) const { certification: certificate, ready: certificateReady, - }: AllCertificationsProviderData = useAllCertifications( + }: AllCertificationsProviderData = useGetCertification( props.provider, - course?.certificationId, + course?.certificationId ?? '', { enabled: !!course?.certificationId } ) diff --git a/src-ts/tools/learn/course-completed/CourseCompletedPage.tsx b/src-ts/tools/learn/course-completed/CourseCompletedPage.tsx index cfb81ec4d..d2a44c00d 100755 --- a/src-ts/tools/learn/course-completed/CourseCompletedPage.tsx +++ b/src-ts/tools/learn/course-completed/CourseCompletedPage.tsx @@ -14,12 +14,12 @@ import { AllCertificationsProviderData, CoursesProviderData, CourseTitle, - useAllCertifications, - useCourses, + useGetCertification, + useGetCourses, + useGetUserCertificationProgress, useLearnBreadcrumb, UserCertificationProgressProviderData, - UserCertificationProgressStatus, - useUserCertificationProgress + UserCertificationProgressStatus } from '../learn-lib' import { getCertificatePath, getCoursePath, LEARN_PATHS, rootRoute } from '../learn.routes' @@ -38,12 +38,12 @@ const CourseCompletedPage: FC<{}> = () => { const { course: courseData, ready: courseDataReady, - }: CoursesProviderData = useCourses(providerParam, certificationParam) + }: CoursesProviderData = useGetCourses(providerParam, certificationParam) const { certificationProgress: progress, ready: progressReady, - }: UserCertificationProgressProviderData = useUserCertificationProgress( + }: UserCertificationProgressProviderData = useGetUserCertificationProgress( profile?.userId, routeParams.provider, routeParams.certification @@ -52,8 +52,8 @@ const CourseCompletedPage: FC<{}> = () => { const { certification, ready: certifReady, - }: AllCertificationsProviderData = useAllCertifications(providerParam, progress?.certificationId, { - enabled: progressReady && !!progress, + }: AllCertificationsProviderData = useGetCertification(providerParam, progress?.certificationId ?? '', { + enabled: progressReady && !!progress?.certificationId, }) /* tslint:disable:cyclomatic-complexity */ diff --git a/src-ts/tools/learn/course-details/CourseDetailsPage.tsx b/src-ts/tools/learn/course-details/CourseDetailsPage.tsx index 1795fecfd..2b37e5c14 100644 --- a/src-ts/tools/learn/course-details/CourseDetailsPage.tsx +++ b/src-ts/tools/learn/course-details/CourseDetailsPage.tsx @@ -15,13 +15,13 @@ import { CoursesProviderData, CourseTitle, ResourceProviderData, - useAllCertifications, - useCourses, + useGetCertification, + useGetCourses, + useGetResourceProvider, + useGetUserCertificationProgress, useLearnBreadcrumb, UserCertificationProgressProviderData, - UserCertificationProgressStatus, - useResourceProvider, - useUserCertificationProgress + UserCertificationProgressStatus } from '../learn-lib' import { getCoursePath } from '../learn.routes' @@ -36,17 +36,17 @@ const CourseDetailsPage: FC<{}> = () => { const { provider: resourceProvider, - }: ResourceProviderData = useResourceProvider(routeParams.provider) + }: ResourceProviderData = useGetResourceProvider(routeParams.provider) const { course, ready: courseReady, - }: CoursesProviderData = useCourses(routeParams.provider ?? '', routeParams.certification) + }: CoursesProviderData = useGetCourses(routeParams.provider ?? '', routeParams.certification) const { certificationProgress: progress, ready: progressReady, - }: UserCertificationProgressProviderData = useUserCertificationProgress( + }: UserCertificationProgressProviderData = useGetUserCertificationProgress( profile?.userId, routeParams.provider, routeParams.certification, @@ -55,8 +55,8 @@ const CourseDetailsPage: FC<{}> = () => { const { certification: certificate, ready: certificateReady, - }: AllCertificationsProviderData = useAllCertifications(routeParams.provider, course?.certificationId, { - enabled: courseReady, + }: AllCertificationsProviderData = useGetCertification(routeParams.provider, course?.certificationId ?? '', { + enabled: courseReady && !!course?.certificationId, }) // this looks better than finding workarounds for cyclomatic-complexity diff --git a/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx b/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx index 83af1a695..0fb6cc346 100644 --- a/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx +++ b/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx @@ -24,16 +24,16 @@ import { LearnModule, LearnModuleProgress, LessonProviderData, - useCourses, + useGetCourses, + useGetLesson, + useGetUserCertificationProgress, useLearnBreadcrumb, - useLessonProvider, userCertificationProgressCompleteCourseAsync, UserCertificationProgressProviderData, userCertificationProgressStartAsync, UserCertificationProgressStatus, userCertificationProgressUpdateAsync, UserCertificationUpdateProgressActions, - useUserCertificationProgress, } from '../learn-lib' import { getCertificationCompletedPath, getCoursePath, getLessonPathFromModule } from '../learn.routes' @@ -63,7 +63,7 @@ const FreeCodeCamp: FC<{}> = () => { setCertificateProgress, ready: progressReady, refetch: refetchProgress, - }: UserCertificationProgressProviderData = useUserCertificationProgress( + }: UserCertificationProgressProviderData = useGetUserCertificationProgress( profile?.userId, routeParams.provider, certificationParam @@ -72,9 +72,9 @@ const FreeCodeCamp: FC<{}> = () => { const { course: courseData, ready: courseDataReady, - }: CoursesProviderData = useCourses(providerParam, certificationParam) + }: CoursesProviderData = useGetCourses(providerParam, certificationParam) - const { lesson, ready: lessonReady }: LessonProviderData = useLessonProvider( + const { lesson, ready: lessonReady }: LessonProviderData = useGetLesson( providerParam, certificationParam, moduleParam, diff --git a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/all-certifications.store.ts b/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/all-certifications.store.ts deleted file mode 100755 index c10906b3b..000000000 --- a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/all-certifications.store.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { learnUrlGet, learnXhrGetAsync } from '../../functions' - -import { LearnCertification } from './learn-certification.model' - -export function getAsync( - providerName: string = 'freeCodeCamp', - certificationId?: string -): Promise> { - - const url: string = learnUrlGet( - 'certifications', - ...(certificationId ? [certificationId] : []), - `?providerName=${providerName}` - ) - return learnXhrGetAsync>(url) -} diff --git a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/index.ts b/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/index.ts deleted file mode 100755 index a6d1bb07a..000000000 --- a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export { - getAsync as allCertificationsGetAsync, -} from './all-certifications.store' -export * from './learn-certification.model' -export * from './learn-certificate-track-type' diff --git a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications.provider.tsx b/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications.provider.tsx deleted file mode 100644 index ed27651e5..000000000 --- a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications.provider.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { Dispatch, SetStateAction, useEffect, useState } from 'react' - -import { allCertificationsGetAsync, LearnCertification } from './all-certifications-functions' -import { AllCertificationsProviderData } from './all-certifications-provider-data.model' - -interface CertificationsAllProviderOptions { - enabled?: boolean -} - -export function useAllCertifications( - provider?: string, - certificationId?: string, - options?: CertificationsAllProviderOptions -): AllCertificationsProviderData { - const [state, setState]: - [AllCertificationsProviderData, Dispatch>] - = useState({ - certifications: [], - loading: false, - ready: false, - }) - - useEffect(() => { - setState((prevState) => ({ - ...prevState, - loading: true, - })) - - if (options?.enabled === false) { - return - } - - allCertificationsGetAsync(provider, certificationId) - .then((certifications) => { - setState((prevState) => ({ - ...prevState, - certification: !certificationId ? undefined : certifications as unknown as LearnCertification, - certifications: certificationId ? [] : [...certifications], - loading: false, - ready: true, - })) - }) - }, [provider, certificationId, options?.enabled]) - - return state -} diff --git a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/course.store.ts b/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/course.store.ts deleted file mode 100755 index 91975316a..000000000 --- a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/course.store.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { learnUrlGet, learnXhrGetAsync } from '../../functions' - -import { LearnCourse } from './learn-course.model' - -export function getAsync(provider: string, certification: string): - Promise { - - const url: string = learnUrlGet('courses', `?certification=${certification}&provider=${provider}`) - - return learnXhrGetAsync>(url) - .then(courses => courses[0]) -} diff --git a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/index.ts b/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/index.ts deleted file mode 100755 index e6c6a0a63..000000000 --- a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { getAsync as courseGetAsync } from './course.store' -export * from './learn-course.model' diff --git a/src-ts/tools/learn/learn-lib/courses-provider/courses.provider.tsx b/src-ts/tools/learn/learn-lib/courses-provider/courses.provider.tsx deleted file mode 100644 index 5c001c51f..000000000 --- a/src-ts/tools/learn/learn-lib/courses-provider/courses.provider.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { Dispatch, SetStateAction, useEffect, useState } from 'react' - -import { courseGetAsync } from './courses-functions' -import { CoursesProviderData } from './courses-provider-data.model' - -export function useCourses(provider: string, certification?: string): CoursesProviderData { - - const defaultProviderData: CoursesProviderData = { - loading: false, - ready: false, - } - - const [state, setState]: [CoursesProviderData, Dispatch>] - = useState(defaultProviderData) - - useEffect(() => { - - let mounted: boolean = true - - if (!certification) { - setState((prevState) => ({ - ...prevState, - course: undefined, - loading: false, - ready: false, - })) - return - } - - setState((prevState) => ({ - ...prevState, - loading: true, - })) - - courseGetAsync(provider, certification) - .then((course) => { - if (!mounted) { - return - } - setState((prevState) => ({ - ...prevState, - course, - loading: false, - ready: true, - })) - }) - - return () => { - mounted = false - } - - }, [provider, certification]) - - return state -} diff --git a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-provider-data.model.ts b/src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/all-certifications-provider-data.model.ts old mode 100755 new mode 100644 similarity index 67% rename from src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-provider-data.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/all-certifications-provider-data.model.ts index 6c5dcb1b1..991e7727d --- a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-provider-data.model.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/all-certifications-provider-data.model.ts @@ -1,8 +1,9 @@ -import { LearnCertification } from './all-certifications-functions' +import { LearnCertification } from './learn-certification.model' export interface AllCertificationsProviderData { certification?: LearnCertification certifications: Array + error: boolean loading: boolean ready: boolean } diff --git a/src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/all-certifications.provider.tsx b/src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/all-certifications.provider.tsx new file mode 100644 index 000000000..7eb1f8ea2 --- /dev/null +++ b/src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/all-certifications.provider.tsx @@ -0,0 +1,58 @@ +import useSWR, { SWRConfiguration, SWRResponse } from 'swr' + +import { learnUrlGet } from '../../functions' +import { useSwrCache } from '../../learn-swr' + +import { AllCertificationsProviderData } from './all-certifications-provider-data.model' + +interface CertificationsAllProviderOptions { + enabled?: boolean +} + +export function useGetAllCertifications( + providerName: string = 'freeCodeCamp', + options?: CertificationsAllProviderOptions +): AllCertificationsProviderData { + + const url: string = learnUrlGet( + 'certifications', + `?providerName=${providerName}` + ) + const swrCacheConfig: SWRConfiguration = useSwrCache(url) + + const {data, error}: SWRResponse = useSWR(url, { + ...swrCacheConfig, + isPaused: () => options?.enabled === false, + }) + + return { + certifications: data ?? [], + error: !!error, + loading: !data, + ready: !!data, + } +} + +export function useGetCertification( + providerName: string = 'freeCodeCamp', + certificationId: string, + options?: CertificationsAllProviderOptions +): AllCertificationsProviderData { + + const url: string = learnUrlGet( + 'certifications', + certificationId, + `?providerName=${providerName}` + ) + + const {data, error}: SWRResponse = useSWR(url, { + isPaused: () => options?.enabled === false, + }) + return { + certification: data ?? undefined, + certifications: [], + error: !!error, + loading: !data, + ready: !!data, + } +} diff --git a/src-ts/tools/learn/learn-lib/all-certifications-provider/index.ts b/src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/index.ts old mode 100755 new mode 100644 similarity index 53% rename from src-ts/tools/learn/learn-lib/all-certifications-provider/index.ts rename to src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/index.ts index f8e61f839..02ae1d59d --- a/src-ts/tools/learn/learn-lib/all-certifications-provider/index.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/index.ts @@ -1,3 +1,4 @@ -export * from './all-certifications-functions' export * from './all-certifications-provider-data.model' export * from './all-certifications.provider' +export * from './learn-certificate-track-type' +export * from './learn-certification.model' diff --git a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/learn-certificate-track-type.ts b/src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/learn-certificate-track-type.ts similarity index 100% rename from src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/learn-certificate-track-type.ts rename to src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/learn-certificate-track-type.ts diff --git a/src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/learn-certification.model.ts b/src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/learn-certification.model.ts similarity index 100% rename from src-ts/tools/learn/learn-lib/all-certifications-provider/all-certifications-functions/learn-certification.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/all-certifications-provider/learn-certification.model.ts diff --git a/src-ts/tools/learn/learn-lib/courses-provider/courses-provider-data.model.ts b/src-ts/tools/learn/learn-lib/data-providers/courses-provider/courses-provider-data.model.ts old mode 100755 new mode 100644 similarity index 67% rename from src-ts/tools/learn/learn-lib/courses-provider/courses-provider-data.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/courses-provider/courses-provider-data.model.ts index 9fec0a898..b80d78557 --- a/src-ts/tools/learn/learn-lib/courses-provider/courses-provider-data.model.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/courses-provider/courses-provider-data.model.ts @@ -1,4 +1,4 @@ -import { LearnCourse } from './courses-functions' +import { LearnCourse } from './learn-course.model' export interface CoursesProviderData { course?: LearnCourse diff --git a/src-ts/tools/learn/learn-lib/data-providers/courses-provider/courses.provider.tsx b/src-ts/tools/learn/learn-lib/data-providers/courses-provider/courses.provider.tsx new file mode 100644 index 000000000..304b53e96 --- /dev/null +++ b/src-ts/tools/learn/learn-lib/data-providers/courses-provider/courses.provider.tsx @@ -0,0 +1,32 @@ +import { get } from 'lodash' +import useSWR, { SWRConfiguration, SWRResponse } from 'swr' + +import { learnUrlGet } from '../../functions' +import { useSwrCache } from '../../learn-swr' + +import { CoursesProviderData } from './courses-provider-data.model' +import { LearnCourse } from './learn-course.model' + +export function useGetCourses( + provider: string, + certification?: string +): CoursesProviderData { + + const params: string = [ + `certification=${certification}`, + `provider=${provider}`, + ] + .filter(Boolean) + .join('&') + + const url: string = learnUrlGet('courses', `?${params}`) + const swrCacheConfig: SWRConfiguration = useSwrCache(url) + + const {data, error}: SWRResponse> = useSWR(url, swrCacheConfig) + + return { + course: get(data, [0]), + loading: !data && !error, + ready: !!data || !!error, + } +} diff --git a/src-ts/tools/learn/learn-lib/courses-provider/index.ts b/src-ts/tools/learn/learn-lib/data-providers/courses-provider/index.ts old mode 100755 new mode 100644 similarity index 68% rename from src-ts/tools/learn/learn-lib/courses-provider/index.ts rename to src-ts/tools/learn/learn-lib/data-providers/courses-provider/index.ts index 7b9eaf3f1..90af1d40e --- a/src-ts/tools/learn/learn-lib/courses-provider/index.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/courses-provider/index.ts @@ -1,3 +1,3 @@ -export * from './courses-functions' export * from './courses-provider-data.model' export * from './courses.provider' +export * from './learn-course.model' diff --git a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/learn-course.model.ts b/src-ts/tools/learn/learn-lib/data-providers/courses-provider/learn-course.model.ts similarity index 90% rename from src-ts/tools/learn/learn-lib/courses-provider/courses-functions/learn-course.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/courses-provider/learn-course.model.ts index b9c7010a4..aae27afb8 100644 --- a/src-ts/tools/learn/learn-lib/courses-provider/courses-functions/learn-course.model.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/courses-provider/learn-course.model.ts @@ -1,5 +1,5 @@ import { LearnModelBase } from '../../functions' -import { LearnModule } from '../../lesson-provider' +import { LearnModule } from '../lesson-provider' export interface LearnCourse extends LearnModelBase { certification: string diff --git a/src-ts/tools/learn/learn-lib/data-providers/index.ts b/src-ts/tools/learn/learn-lib/data-providers/index.ts new file mode 100644 index 000000000..ae66884e9 --- /dev/null +++ b/src-ts/tools/learn/learn-lib/data-providers/index.ts @@ -0,0 +1,6 @@ +export * from './all-certifications-provider' +export * from './courses-provider' +export * from './lesson-provider' +export * from './resource-provider-provider' +export * from './user-certifications-provider' +export * from './user-completed-certifications-provider' diff --git a/src-ts/tools/learn/learn-lib/lesson-provider/index.ts b/src-ts/tools/learn/learn-lib/data-providers/lesson-provider/index.ts old mode 100755 new mode 100644 similarity index 100% rename from src-ts/tools/learn/learn-lib/lesson-provider/index.ts rename to src-ts/tools/learn/learn-lib/data-providers/lesson-provider/index.ts diff --git a/src-ts/tools/learn/learn-lib/lesson-provider/learn-lesson-meta.model.ts b/src-ts/tools/learn/learn-lib/data-providers/lesson-provider/learn-lesson-meta.model.ts similarity index 100% rename from src-ts/tools/learn/learn-lib/lesson-provider/learn-lesson-meta.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/lesson-provider/learn-lesson-meta.model.ts diff --git a/src-ts/tools/learn/learn-lib/lesson-provider/learn-lesson.model.ts b/src-ts/tools/learn/learn-lib/data-providers/lesson-provider/learn-lesson.model.ts similarity index 100% rename from src-ts/tools/learn/learn-lib/lesson-provider/learn-lesson.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/lesson-provider/learn-lesson.model.ts diff --git a/src-ts/tools/learn/learn-lib/lesson-provider/learn-module-meta.model.ts b/src-ts/tools/learn/learn-lib/data-providers/lesson-provider/learn-module-meta.model.ts similarity index 100% rename from src-ts/tools/learn/learn-lib/lesson-provider/learn-module-meta.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/lesson-provider/learn-module-meta.model.ts diff --git a/src-ts/tools/learn/learn-lib/lesson-provider/learn-module.model.ts b/src-ts/tools/learn/learn-lib/data-providers/lesson-provider/learn-module.model.ts similarity index 100% rename from src-ts/tools/learn/learn-lib/lesson-provider/learn-module.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/lesson-provider/learn-module.model.ts diff --git a/src-ts/tools/learn/learn-lib/lesson-provider/lesson-provider-data.model.ts b/src-ts/tools/learn/learn-lib/data-providers/lesson-provider/lesson-provider-data.model.ts old mode 100755 new mode 100644 similarity index 100% rename from src-ts/tools/learn/learn-lib/lesson-provider/lesson-provider-data.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/lesson-provider/lesson-provider-data.model.ts diff --git a/src-ts/tools/learn/learn-lib/data-providers/lesson-provider/lesson.provider.tsx b/src-ts/tools/learn/learn-lib/data-providers/lesson-provider/lesson.provider.tsx new file mode 100644 index 000000000..ed1f00879 --- /dev/null +++ b/src-ts/tools/learn/learn-lib/data-providers/lesson-provider/lesson.provider.tsx @@ -0,0 +1,44 @@ +import { CoursesProviderData, useGetCourses } from '../courses-provider' + +import { LearnLesson } from './learn-lesson.model' +import { LearnModule } from './learn-module.model' +import { LessonProviderData } from './lesson-provider-data.model' + +export function useGetLesson( + provider: string, + course?: string, + module?: string, + lesson?: string, +): LessonProviderData { + + const { course: courseData, loading, ready }: CoursesProviderData = useGetCourses(provider, course) + + const moduleData: LearnModule | undefined = courseData?.modules.find(m => m.key === module) + const lessonData: LearnLesson | undefined = moduleData?.lessons.find(l => l.dashedName === lesson) + + const lessonUrl: string = [ + 'learn', + courseData?.key ?? course, + module, + lesson, + ].filter(Boolean).join('/') + + return { + lesson: !lessonData ? undefined : { + ...lessonData, + course: { + certification: courseData?.certification ?? '', + certificationId: courseData?.certificationId ?? '', + id: courseData?.id ?? '', + title: courseData?.title ?? '', + }, + lessonUrl, + module: { + dashedName: moduleData?.meta.dashedName ?? '', + title: moduleData?.meta.name ?? '', + }, + }, + loading, + ready, + } +} diff --git a/src-ts/tools/learn/learn-lib/resource-provider-provider/index.ts b/src-ts/tools/learn/learn-lib/data-providers/resource-provider-provider/index.ts old mode 100755 new mode 100644 similarity index 66% rename from src-ts/tools/learn/learn-lib/resource-provider-provider/index.ts rename to src-ts/tools/learn/learn-lib/data-providers/resource-provider-provider/index.ts index c1577421a..f8934bcf9 --- a/src-ts/tools/learn/learn-lib/resource-provider-provider/index.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/resource-provider-provider/index.ts @@ -1,3 +1,3 @@ -export * from './resource-provider-functions' export * from './resource-provider-data.model' export * from './resource-provider.provider' +export * from './resource-provider.model' diff --git a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-data.model.ts b/src-ts/tools/learn/learn-lib/data-providers/resource-provider-provider/resource-provider-data.model.ts old mode 100755 new mode 100644 similarity index 100% rename from src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-data.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/resource-provider-provider/resource-provider-data.model.ts diff --git a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.model.ts b/src-ts/tools/learn/learn-lib/data-providers/resource-provider-provider/resource-provider.model.ts old mode 100755 new mode 100644 similarity index 100% rename from src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/resource-provider-provider/resource-provider.model.ts diff --git a/src-ts/tools/learn/learn-lib/data-providers/resource-provider-provider/resource-provider.provider.tsx b/src-ts/tools/learn/learn-lib/data-providers/resource-provider-provider/resource-provider.provider.tsx new file mode 100644 index 000000000..a100e0ffc --- /dev/null +++ b/src-ts/tools/learn/learn-lib/data-providers/resource-provider-provider/resource-provider.provider.tsx @@ -0,0 +1,22 @@ +import { find } from 'lodash' +import useSWR, { SWRConfiguration, SWRResponse } from 'swr' + +import { learnUrlGet } from '../../functions' +import { useSwrCache } from '../../learn-swr' + +import { ResourceProviderData } from './resource-provider-data.model' +import { ResourceProvider } from './resource-provider.model' + +export function useGetResourceProvider(providerName?: string): ResourceProviderData { + + const url: string = learnUrlGet('providers') + const swrCacheConfig: SWRConfiguration = useSwrCache(url) + + const {data, error}: SWRResponse> = useSWR(url, swrCacheConfig) + + return { + loading: !data && !error, + provider: find(data, {name: providerName}), + ready: !!data || !!error, + } +} diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/index.ts b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/index.ts old mode 100755 new mode 100644 similarity index 100% rename from src-ts/tools/learn/learn-lib/user-certifications-provider/index.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/index.ts diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-completed.model.ts b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certification-completed.model.ts similarity index 100% rename from src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-completed.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certification-completed.model.ts diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-in-progress.model.ts b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certification-in-progress.model.ts similarity index 100% rename from src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-in-progress.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certification-in-progress.model.ts diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress-provider-data.model.ts b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certification-progress-provider-data.model.ts old mode 100755 new mode 100644 similarity index 100% rename from src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress-provider-data.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certification-progress-provider-data.model.ts diff --git a/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certification-progress.provider.tsx b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certification-progress.provider.tsx new file mode 100644 index 000000000..949505428 --- /dev/null +++ b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certification-progress.provider.tsx @@ -0,0 +1,37 @@ +import { find } from 'lodash' +import useSWR, { SWRResponse } from 'swr' + +import { learnUrlGet } from '../../functions' + +import { UserCertificationProgressProviderData } from './user-certification-progress-provider-data.model' +import { LearnUserCertificationProgress } from './user-certifications-functions' + +export function useGetUserCertificationProgress( + userId?: number, + provider?: string, + certification?: string +): + UserCertificationProgressProviderData { + + const params: string = [ + `?userId=${userId}`, + provider && `provider=${provider}`, + certification && `certification=${certification}`, + ] + .filter(Boolean) + .join('&') + + const url: string = learnUrlGet('certification-progresses', params) + + const { data, error, mutate }: SWRResponse> = useSWR(url, { + isPaused: () => !userId || !certification, + }) + + return { + certificationProgress: find(data, {certification}), + loading: !!userId && !data && !error, + ready: !userId || data || error, + refetch: () => mutate(), + setCertificateProgress: (progress) => mutate([progress]), + } +} diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/index.ts b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/index.ts old mode 100755 new mode 100644 similarity index 90% rename from src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/index.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/index.ts index 9b8dd3889..8c6a98dc8 --- a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/index.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/index.ts @@ -4,7 +4,6 @@ export * from './user-certification-progress-status.enum' export * from './user-certification-update-progress-actions.enum' export { completeCourse as userCertificationProgressCompleteCourseAsync, - getAsync as userCertificationProgressGetAsync, startAsync as userCertificationProgressStartAsync, updateAsync as userCertificationProgressUpdateAsync } from './user-certification-progress.store' diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/learn-module-progress.model.ts b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/learn-module-progress.model.ts similarity index 100% rename from src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/learn-module-progress.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/learn-module-progress.model.ts diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/learn-user-certification-progress.model.ts b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/learn-user-certification-progress.model.ts similarity index 92% rename from src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/learn-user-certification-progress.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/learn-user-certification-progress.model.ts index 2d9dc6f78..5c39b423c 100644 --- a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/learn-user-certification-progress.model.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/learn-user-certification-progress.model.ts @@ -1,4 +1,4 @@ -import { LearnModelBase } from '../../functions' +import { LearnModelBase } from '../../../functions' import { LearnModuleProgress } from './learn-module-progress.model' import { UserCertificationProgressStatus } from './user-certification-progress-status.enum' diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/user-certification-progress-status.enum.ts b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/user-certification-progress-status.enum.ts old mode 100755 new mode 100644 similarity index 100% rename from src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/user-certification-progress-status.enum.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/user-certification-progress-status.enum.ts diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/user-certification-progress.store.ts b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/user-certification-progress.store.ts old mode 100755 new mode 100644 similarity index 71% rename from src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/user-certification-progress.store.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/user-certification-progress.store.ts index 4642d1f3d..34c55e9cd --- a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/user-certification-progress.store.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/user-certification-progress.store.ts @@ -1,6 +1,6 @@ -import { LearnConfig } from '../../../learn-config' -import { getUserCertificateUrl } from '../../../learn.routes' -import { learnUrlGet, learnXhrGetAsync, learnXhrPostAsync, learnXhrPutAsync } from '../../functions' +import { LearnConfig } from '../../../../learn-config' +import { getUserCertificateUrl } from '../../../../learn.routes' +import { learnUrlGet, learnXhrPostAsync, learnXhrPutAsync } from '../../../functions' import { LearnUserCertificationProgress } from './learn-user-certification-progress.model' import { UserCertificationUpdateProgressActions } from './user-certification-update-progress-actions.enum' @@ -30,21 +30,6 @@ export function completeCourse( ) } -export function getAsync(userId: number, provider?: string, certification?: string): Promise> { - - const params: string = [ - `?userId=${userId}`, - provider && `provider=${provider}`, - certification && `certification=${certification}`, - ] - .filter(Boolean) - .join('&') - - const url: string = learnUrlGet(certProgressPath, params) - - return learnXhrGetAsync>(url) -} - export function startAsync(userId: number, certificationId: string, courseId: string, data: any): Promise { const url: string = learnUrlGet(certProgressPath, `${userId}`, certificationId, courseId) diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/user-certification-update-progress-actions.enum.ts b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/user-certification-update-progress-actions.enum.ts similarity index 100% rename from src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-functions/user-certification-update-progress-actions.enum.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-functions/user-certification-update-progress-actions.enum.ts diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-provider-data.model.ts b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-provider-data.model.ts old mode 100755 new mode 100644 similarity index 100% rename from src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications-provider-data.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications-provider-data.model.ts diff --git a/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications.provider.tsx b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications.provider.tsx new file mode 100644 index 000000000..529f22aa6 --- /dev/null +++ b/src-ts/tools/learn/learn-lib/data-providers/user-certifications-provider/user-certifications.provider.tsx @@ -0,0 +1,59 @@ +import { useContext, useMemo } from 'react' +import useSWR, { SWRResponse } from 'swr' + +import { errorHandle, profileContext, ProfileContextData } from '../../../../../lib' +import { learnUrlGet } from '../../functions' + +import { UserCertificationCompleted } from './user-certification-completed.model' +import { UserCertificationInProgress } from './user-certification-in-progress.model' +import { LearnUserCertificationProgress, UserCertificationProgressStatus } from './user-certifications-functions' +import { UserCertificationsProviderData } from './user-certifications-provider-data.model' + +export function useGetUserCertifications( + provider: string = 'freeCodeCamp', +): UserCertificationsProviderData { + const profileContextData: ProfileContextData = useContext(profileContext) + const userId: number | undefined = profileContextData?.profile?.userId + + const params: string = [ + `?userId=${userId}`, + provider && `provider=${provider}`, + ] + .filter(Boolean) + .join('&') + + const url: string = learnUrlGet('certification-progresses', params) + + const { data, error }: SWRResponse> = useSWR(url, { + isPaused: () => !userId, + }) + const loading: boolean = !data && !error + + const completed: ReadonlyArray = useMemo(() => data + ?.filter(c => c.status === UserCertificationProgressStatus.completed) + .map(c => c as UserCertificationCompleted) + .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()) ?? [] + , [data]) + + const inProgress: ReadonlyArray = useMemo(() => data + ?.filter(c => c.status === UserCertificationProgressStatus.inProgress) + .map(c => c as UserCertificationInProgress) + .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()) ?? [] + , [data]) + + if (error) { + errorHandle(error, 'There was an error getting your course progress.') + } + + return { + completed, + inProgress, + loading: !!userId && loading, + + // ready when: + // profile context was initialized and + // user is logged out, or + // data or error is available + ready: profileContextData.initialized && (!userId || !loading), + } +} diff --git a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/index.ts b/src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/index.ts similarity index 68% rename from src-ts/tools/learn/learn-lib/user-completed-certifications-provider/index.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/index.ts index 0b86d900a..ddf12865e 100644 --- a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/index.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/index.ts @@ -1,3 +1,3 @@ -export * from './user-completed-certifications-functions' export * from './user-completed-certifications-provider-data.model' export * from './user-completed-certifications.provider' +export * from './user-completed-certification.model' diff --git a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.model.ts b/src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/user-completed-certification.model.ts similarity index 72% rename from src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/user-completed-certification.model.ts index d3a97e55c..e74b44573 100644 --- a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.model.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/user-completed-certification.model.ts @@ -1,6 +1,6 @@ -import { LearnCertificateTrackType } from '../../all-certifications-provider' import { LearnModelBase } from '../../functions' -import { UserCertificationProgressStatus } from '../../user-certifications-provider' +import { LearnCertificateTrackType } from '../all-certifications-provider' +import { UserCertificationProgressStatus } from '../user-certifications-provider' export interface LearnUserCompletedCertification extends LearnModelBase { certification: string, diff --git a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-provider-data.model.ts b/src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/user-completed-certifications-provider-data.model.ts similarity index 74% rename from src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-provider-data.model.ts rename to src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/user-completed-certifications-provider-data.model.ts index 763c6b780..f5791b508 100644 --- a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-provider-data.model.ts +++ b/src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/user-completed-certifications-provider-data.model.ts @@ -1,7 +1,7 @@ import { LearnUserCompletedCertification } from './user-completed-certifications-functions' export interface UserCompletedCertificationsProviderData { - certifications: Array + certifications: ReadonlyArray loading: boolean ready: boolean } diff --git a/src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/user-completed-certifications.provider.tsx b/src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/user-completed-certifications.provider.tsx new file mode 100644 index 000000000..7a44f8ddb --- /dev/null +++ b/src-ts/tools/learn/learn-lib/data-providers/user-completed-certifications-provider/user-completed-certifications.provider.tsx @@ -0,0 +1,32 @@ +import useSWR, { SWRResponse } from 'swr' + +import { learnUrlGet } from '../../functions' + +import { LearnUserCompletedCertification } from './user-completed-certification.model' +import { UserCompletedCertificationsProviderData } from './user-completed-certifications-provider-data.model' + +export function useGetUserCompletedCertifications( + userId?: number, + provider?: string, + certification?: string +): UserCompletedCertificationsProviderData { + + const url: string = learnUrlGet('completed-certifications', `${userId}`) + + const {data, error}: SWRResponse> = useSWR(url) + + let certifications: ReadonlyArray = data ?? [] + + if (provider || certification) { + certifications = certifications.filter((c) => { + return (!provider || c.provider === provider) && + (!certification || c.certification === certification) + }) + } + + return { + certifications, + loading: !data && !error, + ready: !!data || !!error, + } +} diff --git a/src-ts/tools/learn/learn-lib/index.ts b/src-ts/tools/learn/learn-lib/index.ts index ccec7d560..6a21a12f8 100755 --- a/src-ts/tools/learn/learn-lib/index.ts +++ b/src-ts/tools/learn/learn-lib/index.ts @@ -1,15 +1,11 @@ -export * from './all-certifications-provider' export * from './collapsible-pane' export * from './course-badge' export * from './course-outline' export * from './course-title' -export * from './courses-provider' export * from './curriculum-summary' +export * from './data-providers' export * from './learn-breadcrumb-provider' -export * from './lesson-provider' +export * from './learn-swr' export * from './my-course-card' -export * from './resource-provider-provider' export * from './svgs' -export * from './user-certifications-provider' -export * from './user-completed-certifications-provider' export * from './wave-hero' diff --git a/src-ts/tools/learn/learn-lib/learn-swr/LearnSwr.tsx b/src-ts/tools/learn/learn-lib/learn-swr/LearnSwr.tsx new file mode 100644 index 000000000..532fdd52a --- /dev/null +++ b/src-ts/tools/learn/learn-lib/learn-swr/LearnSwr.tsx @@ -0,0 +1,26 @@ +import { FC, ReactNode } from 'react' +import { SWRConfig } from 'swr' + +import { learnXhrGetAsync } from '../functions' + +interface LearnSwrProps { + children: ReactNode +} + +const LearnSwr: FC = (props: LearnSwrProps) => { + + return ( + learnXhrGetAsync(resource), + refreshInterval: 0, + revalidateOnFocus: false, + revalidateOnMount: true, + }} + > + {props.children} + + ) +} + +export default LearnSwr diff --git a/src-ts/tools/learn/learn-lib/learn-swr/index.ts b/src-ts/tools/learn/learn-lib/learn-swr/index.ts new file mode 100644 index 000000000..831dd7f3c --- /dev/null +++ b/src-ts/tools/learn/learn-lib/learn-swr/index.ts @@ -0,0 +1,2 @@ +export { default as LearnSwr } from './LearnSwr' +export * from './use-swr-cache' diff --git a/src-ts/tools/learn/learn-lib/learn-swr/use-swr-cache.tsx b/src-ts/tools/learn/learn-lib/learn-swr/use-swr-cache.tsx new file mode 100644 index 000000000..2e13c599e --- /dev/null +++ b/src-ts/tools/learn/learn-lib/learn-swr/use-swr-cache.tsx @@ -0,0 +1,31 @@ +import { mutate, SWRConfiguration } from 'swr' + +let cacheMap: any = {} as any + +if (typeof window !== 'undefined') { + try { + // load all cached data from localstorage + cacheMap = JSON.parse(localStorage.getItem('swr-cached') ?? '{}') + } catch {} + + // parse the loaded data, and load it into swr's in-memory cache + if (cacheMap) { + Object.entries(cacheMap).forEach(([key, data]) => { + mutate(key, data, {revalidate: false}) + }) + } +} + +export function useSwrCache(key: string): SWRConfiguration { + // return handlers to store and clear localstorage data + return { + onError(): void { + cacheMap[key] = undefined + localStorage.setItem('swr-cached', JSON.stringify(cacheMap)) + }, + onSuccess(data: T): void { + cacheMap[key] = data + localStorage.setItem('swr-cached', JSON.stringify(cacheMap)) + }, + } +} diff --git a/src-ts/tools/learn/learn-lib/lesson-provider/lesson.provider.tsx b/src-ts/tools/learn/learn-lib/lesson-provider/lesson.provider.tsx deleted file mode 100644 index 3a42f0a11..000000000 --- a/src-ts/tools/learn/learn-lib/lesson-provider/lesson.provider.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { Dispatch, SetStateAction, useEffect, useState } from 'react' - -import { courseGetAsync } from '../courses-provider' - -import { LearnLesson } from './learn-lesson.model' -import { LearnModule } from './learn-module.model' -import { LessonProviderData } from './lesson-provider-data.model' - -export function useLessonProvider( - provider: string, - course?: string, - module?: string, - lesson?: string, -): LessonProviderData { - const [state, setState]: [LessonProviderData, Dispatch>] = useState({ - loading: false, - ready: false, - }) - - useEffect(() => { - let mounted: boolean = true - - if (!course || !module || !lesson) { - setState((prevState) => ({ - ...prevState, - lesson: undefined, - loading: false, - ready: false, - })) - return - } - - setState((prevState) => ({ - ...prevState, - loading: true, - })) - - courseGetAsync(provider, course) - .then((courseData) => { - - if (!mounted) { - return - } - - const moduleData: LearnModule | undefined = courseData?.modules.find(m => m.key === module) - const lessonData: LearnLesson | undefined = moduleData?.lessons.find(l => l.dashedName === lesson) - - const lessonUrl: string = [ - 'learn', - courseData?.key ?? course, - module, - lesson, - ].filter(Boolean).join('/') - - setState((prevState) => ({ - ...prevState, - lesson: lessonData && { - ...lessonData, - course: { - certification: courseData?.certification ?? '', - certificationId: courseData?.certificationId ?? '', - id: courseData?.id ?? '', - title: courseData?.title ?? '', - }, - lessonUrl, - module: { - dashedName: moduleData?.meta.dashedName ?? '', - title: moduleData?.meta.name ?? '', - }, - }, - loading: false, - ready: true, - })) - }) - - return () => { mounted = false } - }, [provider, course, module, lesson]) - - return state -} diff --git a/src-ts/tools/learn/learn-lib/my-course-card/in-progress/InProgress.tsx b/src-ts/tools/learn/learn-lib/my-course-card/in-progress/InProgress.tsx index b05b64269..5526f87ba 100644 --- a/src-ts/tools/learn/learn-lib/my-course-card/in-progress/InProgress.tsx +++ b/src-ts/tools/learn/learn-lib/my-course-card/in-progress/InProgress.tsx @@ -11,7 +11,7 @@ import { CoursesProviderData, CourseTitle, LearnCertification, - useCourses, + useGetCourses, } from '../../../learn-lib' import { getCoursePath, getLessonPathFromCurrentLesson } from '../../../learn.routes' import { CurriculumSummary } from '../../curriculum-summary' @@ -34,7 +34,7 @@ const InProgress: FC = (props: InProgressProps) => { const certification: string = props.certification?.certification ?? '' const provider: string = props.certification?.providerName ?? '' - const { course }: CoursesProviderData = useCourses(provider, certification) + const { course }: CoursesProviderData = useGetCourses(provider, certification) const resumeCourse: () => void = () => { if (!props.currentLesson) { diff --git a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/index.ts b/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/index.ts deleted file mode 100755 index 6e52546b1..000000000 --- a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './resource-provider.model' -export * from './resource-provider.store' diff --git a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.store.ts b/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.store.ts deleted file mode 100755 index f845874d3..000000000 --- a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider-functions/resource-provider.store.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { learnUrlGet, learnXhrGetAsync } from '../../functions' - -import { ResourceProvider } from './resource-provider.model' - -export function getResourceProvidersAsync(): Promise | undefined> { - - const url: string = learnUrlGet('providers') - return learnXhrGetAsync>(url) -} diff --git a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider.provider.tsx b/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider.provider.tsx deleted file mode 100755 index 3f799b3c9..000000000 --- a/src-ts/tools/learn/learn-lib/resource-provider-provider/resource-provider.provider.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { Dispatch, SetStateAction, useEffect, useState } from 'react' - -import { ResourceProviderData } from './resource-provider-data.model' -import { getResourceProvidersAsync } from './resource-provider-functions/resource-provider.store' - -export function useResourceProvider(providerName?: string): ResourceProviderData { - const [state, setState]: [ResourceProviderData, Dispatch>] = useState({ - loading: false, - ready: false, - }) - - useEffect(() => { - if (!providerName) { - setState((prevState) => ({ - ...prevState, - loading: false, - provider: undefined, - ready: false, - })) - return - } - - setState((prevState) => ({ - ...prevState, - loading: true, - })) - - getResourceProvidersAsync().then((providers) => { - setState((prevState) => ({ - ...prevState, - loading: false, - provider: providers?.find(p => p.name === providerName), - ready: true, - })) - }) - }, [providerName]) - - return state -} diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress.provider.tsx b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress.provider.tsx deleted file mode 100644 index 8a951e979..000000000 --- a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certification-progress.provider.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { Dispatch, MutableRefObject, SetStateAction, useCallback, useEffect, useRef, useState } from 'react' - -import { UserCertificationProgressProviderData } from './user-certification-progress-provider-data.model' -import { LearnUserCertificationProgress, userCertificationProgressGetAsync } from './user-certifications-functions' - -export function useUserCertificationProgress(userId?: number, provider?: string, certification?: string): - UserCertificationProgressProviderData { - const callCounter: MutableRefObject = useRef(0) - - function setCertificateProgress(progress: LearnUserCertificationProgress): void { - setState((prevState) => ({ ...prevState, certificationProgress: progress })) - callCounter.current++ - } - - const fetchProgress: () => void = useCallback(() => { - if (!userId) { - return - } - - const currentCallCounter: number = ++callCounter.current - - userCertificationProgressGetAsync(userId, provider, certification) - .then((myCertifications) => { - // if another call to fetchProgress or to setCertificateProgress - // was made before we got the api response - // return, and do not update state - if (callCounter.current !== currentCallCounter) { - return - } - - setState((prevState) => ({ - ...prevState, - certificationProgress: myCertifications.find(c => c.certification === certification), - loading: false, - ready: true, - })) - }) - }, [certification, provider, userId]) - - const [state, setState]: - [UserCertificationProgressProviderData, Dispatch>] - = useState({ - certificationProgress: undefined, - loading: false, - ready: false, - refetch: fetchProgress, - setCertificateProgress, - }) - - useEffect(() => { - setState((prevState) => ({ - ...prevState, - loading: true, - })) - - fetchProgress() - }, [certification, fetchProgress]) - - return state -} diff --git a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications.provider.tsx b/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications.provider.tsx deleted file mode 100644 index f1ef3dad1..000000000 --- a/src-ts/tools/learn/learn-lib/user-certifications-provider/user-certifications.provider.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { Dispatch, SetStateAction, useContext, useEffect, useState } from 'react' - -import { errorHandle, profileContext, ProfileContextData } from '../../../../lib' - -import { UserCertificationCompleted } from './user-certification-completed.model' -import { UserCertificationInProgress } from './user-certification-in-progress.model' -import { userCertificationProgressGetAsync, UserCertificationProgressStatus } from './user-certifications-functions' -import { UserCertificationsProviderData } from './user-certifications-provider-data.model' - -const defaultProviderData: UserCertificationsProviderData = { - completed: [], - inProgress: [], - loading: false, - ready: false, -} - -export function useUserCertifications(): UserCertificationsProviderData { - - const profileContextData: ProfileContextData = useContext(profileContext) - const [state, setState]: [UserCertificationsProviderData, Dispatch>] - = useState(defaultProviderData) - - useEffect(() => { - - let mounted: boolean = true - - setState((prevState) => ({ - ...prevState, - loading: true, - })) - - const userId: number | undefined = profileContextData?.profile?.userId - if (!userId) { - if (profileContextData.initialized) { - // user is logged out, - // we're not going to fetch any progress, data is ready as is - setState((prevState) => ({ - ...prevState, - loading: false, - ready: true, - })) - } - return - } - - userCertificationProgressGetAsync(userId) - .then((myCertifications) => { - - if (!mounted) { - return - } - - const completed: ReadonlyArray = myCertifications - .filter(c => c.status === UserCertificationProgressStatus.completed) - .map(c => c as UserCertificationCompleted) - .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime()) - - const inProgress: ReadonlyArray = myCertifications - .filter(c => c.status === UserCertificationProgressStatus.inProgress) - .map(c => c as UserCertificationInProgress) - .sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime()) - - setState((prevState) => ({ - ...prevState, - completed, - inProgress, - loading: false, - ready: true, - })) - }) - .catch((err: any) => { - errorHandle(err, 'There was an error getting your course progress.') - setState((prevState) => ({ - ...prevState, - completed: [], - inProgress: [], - loading: false, - ready: true, - })) - }) - - return () => { - mounted = false - } - }, [profileContextData]) - - return state -} diff --git a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/index.ts b/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/index.ts deleted file mode 100644 index 371041a0b..000000000 --- a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './user-completed-certification.model' -export { - getAsync as userCompletedCertificationGetAsync -} from './user-completed-certification.store' diff --git a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.store.ts b/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.store.ts deleted file mode 100644 index 5a8388b13..000000000 --- a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications-functions/user-completed-certification.store.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { learnUrlGet, learnXhrGetAsync } from '../../functions' - -import { LearnUserCompletedCertification } from './user-completed-certification.model' - -export function getAsync(userId: number): Promise> { - - const url: string = learnUrlGet('completed-certifications', `${userId}`) - return learnXhrGetAsync>(url) -} diff --git a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications.provider.tsx b/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications.provider.tsx deleted file mode 100644 index f3131b8ff..000000000 --- a/src-ts/tools/learn/learn-lib/user-completed-certifications-provider/user-completed-certifications.provider.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { Dispatch, SetStateAction, useEffect, useState } from 'react' - -import { LearnUserCompletedCertification, userCompletedCertificationGetAsync } from './user-completed-certifications-functions' -import { UserCompletedCertificationsProviderData } from './user-completed-certifications-provider-data.model' - -export function useUserCompletedCertifications(userId?: number, provider?: string, certification?: string): - UserCompletedCertificationsProviderData { - - const [state, setState]: - [UserCompletedCertificationsProviderData, Dispatch>] - = useState({ - certifications: [], - loading: false, - ready: false, - }) - - useEffect(() => { - let mounted: boolean = true - - setState((prevState) => ({ - ...prevState, - loading: true, - })) - - if (!userId) { - return - } - - userCompletedCertificationGetAsync(userId) - .then((completedCertifications) => { - - if (!mounted) { - return - } - - let certifications: Array = completedCertifications - - if (provider || certification) { - certifications = completedCertifications.filter((c) => { - return (!provider || c.provider === provider) && - (!certification || c.certification === certification) - }) - } - - setState((prevState) => ({ - ...prevState, - certifications, - loading: false, - ready: true, - })) - }) - - return () => { - mounted = false - } - }, [ - certification, - provider, - userId, - ]) - - return state -} diff --git a/src-ts/tools/learn/my-learning/MyLearning.tsx b/src-ts/tools/learn/my-learning/MyLearning.tsx index b97350f30..ffbc935fe 100755 --- a/src-ts/tools/learn/my-learning/MyLearning.tsx +++ b/src-ts/tools/learn/my-learning/MyLearning.tsx @@ -4,10 +4,10 @@ import { Breadcrumb, BreadcrumbItemModel, ContentLayout, LoadingSpinner, Portal, import { AllCertificationsProviderData, LearnCertification, - useAllCertifications, + useGetAllCertifications, + useGetUserCertifications, useLearnBreadcrumb, UserCertificationsProviderData, - useUserCertifications, WaveHero } from '../learn-lib' import { LEARN_PATHS } from '../learn.routes' @@ -25,8 +25,8 @@ interface CertificatesByIdType { const MyLearning: FC<{}> = () => { const { profile, initialized: profileReady }: ProfileContextData = useContext(profileContext) - const { completed, inProgress, ready: coursesReady }: UserCertificationsProviderData = useUserCertifications() - const { certifications, ready: certificatesReady }: AllCertificationsProviderData = useAllCertifications() + const { completed, inProgress, ready: coursesReady }: UserCertificationsProviderData = useGetUserCertifications() + const { certifications, ready: certificatesReady }: AllCertificationsProviderData = useGetAllCertifications() const [activeTab, setActiveTab]: [MyTabsViews|undefined, Dispatch>] = useState() const ready: boolean = profileReady && coursesReady && certificatesReady diff --git a/src-ts/tools/learn/welcome/WelcomePage.tsx b/src-ts/tools/learn/welcome/WelcomePage.tsx index ac36d3356..7278bd716 100644 --- a/src-ts/tools/learn/welcome/WelcomePage.tsx +++ b/src-ts/tools/learn/welcome/WelcomePage.tsx @@ -5,9 +5,9 @@ import { ContentLayout, LoadingSpinner, Portal } from '../../../lib' import '../../../lib/styles/index.scss' import { AllCertificationsProviderData, - useAllCertifications, + useGetAllCertifications, + useGetUserCertifications, UserCertificationsProviderData, - useUserCertifications, WaveHero, } from '../learn-lib' @@ -18,8 +18,8 @@ import styles from './WelcomePage.module.scss' const WelcomePage: FC<{}> = () => { - const allCertsData: AllCertificationsProviderData = useAllCertifications() - const userCertsData: UserCertificationsProviderData = useUserCertifications() + const allCertsData: AllCertificationsProviderData = useGetAllCertifications() + const userCertsData: UserCertificationsProviderData = useGetUserCertifications() const coursesReady: boolean = allCertsData.ready && userCertsData.ready