diff --git a/src-ts/tools/learn/course-certificate/certificate-view/certificate/certificate-bg-pattern/CertificateBgPattern.module.scss b/src-ts/tools/learn/course-certificate/certificate-view/certificate/certificate-bg-pattern/CertificateBgPattern.module.scss
index 2075827eb..78fdf28b0 100644
--- a/src-ts/tools/learn/course-certificate/certificate-view/certificate/certificate-bg-pattern/CertificateBgPattern.module.scss
+++ b/src-ts/tools/learn/course-certificate/certificate-view/certificate/certificate-bg-pattern/CertificateBgPattern.module.scss
@@ -31,7 +31,7 @@
> div {
position: absolute;
top: 0;
- left: 0;
+ left: -1px;
width: 100%;
height: 100%;
z-index: 1;
@@ -42,7 +42,7 @@
}
&:global(.wave-bg) {
- background: url('./wave-bg.png') -1px 0 repeat-y;
+ background: url('./wave-bg.png') 0 0 repeat-y;
background-size: 400px 116px;
}
}
diff --git a/src-ts/tools/learn/free-code-camp/FreeCodeCamp.module.scss b/src-ts/tools/learn/free-code-camp/FreeCodeCamp.module.scss
index abf59cf76..4be0344b3 100644
--- a/src-ts/tools/learn/free-code-camp/FreeCodeCamp.module.scss
+++ b/src-ts/tools/learn/free-code-camp/FreeCodeCamp.module.scss
@@ -48,32 +48,3 @@
}
}
}
-
-.course-outline-pane {
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
-
- @include ltemd {
- position: relative;
- top: auto;
- left: auto;
- bottom: auto;
- flex: 0 0 auto;
- }
-}
-
-.course-outline-wrap {
- width: 406px;
-
- @include ltemd {
- width: 100%;
- }
-}
-
-.course-outline-title {
- @extend .body-main-bold;
- flex: 0 0 auto;
- margin-bottom: $space-xl;
-}
\ No newline at end of file
diff --git a/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx b/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx
index 7552abd1f..9f123afc7 100644
--- a/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx
+++ b/src-ts/tools/learn/free-code-camp/FreeCodeCamp.tsx
@@ -19,8 +19,6 @@ import {
ProfileContextData,
} from '../../../lib'
import {
- CollapsiblePane,
- CourseOutline,
CoursesProviderData,
LearnLesson,
LearnModule,
@@ -39,6 +37,7 @@ import {
import { getCertificationCompletedPath, getCoursePath, getLessonPathFromModule } from '../learn.routes'
import { FccFrame } from './fcc-frame'
+import { FccSidebar } from './fcc-sidebar'
import styles from './FreeCodeCamp.module.scss'
import { TitleNav } from './title-nav'
@@ -362,24 +361,13 @@ const FreeCodeCamp: FC<{}> = () => {
{lesson && (
-
-
isOpen && refetchProgress()}
- >
-
-
- {courseData?.title}
-
-
-
-
-
+
void
+}
+
+const FccSidebar: FC = (props: FccSidebarProps) => {
+ const [isOpen, setIsOpen]: [boolean, Dispatch>] = useState(false)
+
+ const handleToggle: (isOutlineOpen: boolean) => void = (isOutlineOpen: boolean) => {
+ setIsOpen(isOutlineOpen)
+ if (isOutlineOpen) {
+ props.refetchProgress()
+ }
+ }
+
+ return (
+
+
+
+
+ {props.courseData?.title}
+
+
setIsOpen(false)}
+ />
+
+
+
+ )
+}
+
+export default FccSidebar
diff --git a/src-ts/tools/learn/free-code-camp/fcc-sidebar/index.ts b/src-ts/tools/learn/free-code-camp/fcc-sidebar/index.ts
new file mode 100644
index 000000000..5f95796fc
--- /dev/null
+++ b/src-ts/tools/learn/free-code-camp/fcc-sidebar/index.ts
@@ -0,0 +1 @@
+export { default as FccSidebar } from './FccSidebar'
diff --git a/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.tsx b/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.tsx
index e73399a51..dadf18d74 100644
--- a/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.tsx
+++ b/src-ts/tools/learn/learn-lib/collapsible-pane/CollapsiblePane.tsx
@@ -1,13 +1,24 @@
import classNames from 'classnames'
import { noop } from 'lodash'
-import { Dispatch, FC, ReactNode, SetStateAction, useCallback, useState } from 'react'
+import {
+ Dispatch,
+ FC,
+ MutableRefObject,
+ ReactNode,
+ SetStateAction,
+ useCallback,
+ useEffect,
+ useRef,
+ useState,
+} from 'react'
-import { IconSolid } from '../../../../lib'
+import { IconSolid, useClickOutside } from '../../../../lib'
import styles from './CollapsiblePane.module.scss'
interface CollapsiblePaneProps {
children: ReactNode
+ isOpen?: boolean
onToggle?: (isOpen: boolean) => void
position?: 'to-left'|'to-right'
title: string
@@ -17,13 +28,26 @@ const CollapsiblePane: FC = (props: CollapsiblePaneProps)
const {onToggle = noop}: CollapsiblePaneProps = props
const [isOpen, setIsOpen]: [boolean, Dispatch>] = useState(false)
+ const elRef: MutableRefObject = useRef()
+
const toggle: () => void = useCallback(() => {
setIsOpen(!isOpen)
onToggle(!isOpen)
}, [isOpen, onToggle])
+ const close: () => void = useCallback(() => {
+ setIsOpen(false)
+ onToggle(false)
+ }, [onToggle])
+
+ useEffect(() => {
+ setIsOpen(!!props.isOpen)
+ }, [props.isOpen])
+
+ useClickOutside(elRef.current, close, isOpen)
+
return (
- void
progress?: LearnUserCertificationProgress
ready?: boolean
}
@@ -52,6 +53,7 @@ const CourseOutline: FC = (props: CourseOutlineProps) => {
progress={props.progress?.modules}
shortDescription={module.meta.introCopy}
title={module.meta.name}
+ onItemClick={props.onItemNavigate}
/>
))}
diff --git a/src-ts/tools/learn/learn-lib/course-outline/collapsible-item/CollapsibleItem.tsx b/src-ts/tools/learn/learn-lib/course-outline/collapsible-item/CollapsibleItem.tsx
index 2d91608c2..cac0bd7fc 100644
--- a/src-ts/tools/learn/learn-lib/course-outline/collapsible-item/CollapsibleItem.tsx
+++ b/src-ts/tools/learn/learn-lib/course-outline/collapsible-item/CollapsibleItem.tsx
@@ -21,6 +21,7 @@ interface CollapsibleItemProps {
items: Array
lessonsCount: number
moduleKey: string
+ onItemClick: (item: any) => void
path?: (item: any) => string
progress?: LearnUserCertificationProgress['modules']
shortDescription: Array
@@ -72,6 +73,7 @@ const CollapsibleItem: FC = (props: CollapsibleItemProps)
props.onItemClick(item)}
>
{props.path ? (