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