diff --git a/client/src/components/Progress/index.tsx b/client/src/components/Progress/index.tsx new file mode 100644 index 00000000000..ac4fa34bec7 --- /dev/null +++ b/client/src/components/Progress/index.tsx @@ -0,0 +1 @@ +export { default } from './progress'; diff --git a/client/src/components/Progress/progress-bar.tsx b/client/src/components/Progress/progress-bar.tsx new file mode 100644 index 00000000000..167aae16077 --- /dev/null +++ b/client/src/components/Progress/progress-bar.tsx @@ -0,0 +1,14 @@ +import React from 'react'; + +export function ProgressBar({ now }: { now: number }) { + return ( + <> +
+
+ + ); +} diff --git a/client/src/components/ProgressBar/progress-bar-inner.tsx b/client/src/components/Progress/progress-inner.tsx similarity index 62% rename from client/src/components/ProgressBar/progress-bar-inner.tsx rename to client/src/components/Progress/progress-inner.tsx index 9a233ae69f6..0a47d9894c9 100644 --- a/client/src/components/ProgressBar/progress-bar-inner.tsx +++ b/client/src/components/Progress/progress-inner.tsx @@ -1,8 +1,9 @@ import React, { useState, useEffect, useRef, useMemo } from 'react'; import BezierEasing from 'bezier-easing'; +import { ProgressBar } from './progress-bar'; -interface ProgressBarInnerProps { +interface ProgressInnerProps { completedPercent: number; title: string; meta: string; @@ -32,18 +33,17 @@ function useIsInViewport(ref: React.RefObject) { return isIntersecting; } -function ProgressBarInner({ +function ProgressInner({ completedPercent, title, meta -}: ProgressBarInnerProps): JSX.Element { +}: ProgressInnerProps): JSX.Element { const [shownPercent, setShownPercent] = useState(0); - const [progressBarInnerWidth, setProgressBarInnerWidth] = useState(0); const [lastShopwnPercent, setLastShownPercent] = useState(0); - const progressBarInnerWrap = useRef(null); - const isProgressBarInViewport = useIsInViewport(progressBarInnerWrap); + const progressInnerWrap = useRef(null); + const isProgressInViewport = useIsInViewport(progressInnerWrap); - const animateProgressBarInner = (completedPercent: number) => { + const animateProgressInner = (completedPercent: number) => { if (completedPercent > 100) completedPercent = 100; if (completedPercent < 0) completedPercent = 0; @@ -66,17 +66,12 @@ function ProgressBarInner({ }, intervalLength); }; useEffect(() => { - if (lastShopwnPercent !== completedPercent && isProgressBarInViewport) { + if (lastShopwnPercent !== completedPercent && isProgressInViewport) { setLastShownPercent(completedPercent); - animateProgressBarInner(completedPercent); + animateProgressInner(completedPercent); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isProgressBarInViewport]); - - useEffect(() => { - if (progressBarInnerWrap.current) - setProgressBarInnerWidth(progressBarInnerWrap.current.offsetWidth); - }, [progressBarInnerWrap]); + }, [isProgressInViewport]); return ( <> @@ -84,25 +79,15 @@ function ProgressBarInner({
{meta}
); } -ProgressBarInner.displayName = 'ProgressBarInner'; +ProgressInner.displayName = 'ProgressInner'; -export default ProgressBarInner; +export default ProgressInner; diff --git a/client/src/components/ProgressBar/progress-bar.tsx b/client/src/components/Progress/progress.tsx similarity index 89% rename from client/src/components/ProgressBar/progress-bar.tsx rename to client/src/components/Progress/progress.tsx index 6055ff8a5a9..2c0e53a034e 100644 --- a/client/src/components/ProgressBar/progress-bar.tsx +++ b/client/src/components/Progress/progress.tsx @@ -10,7 +10,7 @@ import { completedPercentageSelector } from '../../templates/Challenges/redux/selectors'; import { liveCerts } from '../../../config/cert-and-project-map'; -import ProgressBarInner from './progress-bar-inner'; +import ProgressInner from './progress-inner'; const mapStateToProps = createSelector( currentBlockIdsSelector, @@ -42,10 +42,10 @@ const mapStateToProps = createSelector( type StateProps = ReturnType; -interface ProgressBarProps extends StateProps { +interface ProgressProps extends StateProps { t: TFunction; } -function ProgressBar({ +function Progress({ currentBlockIds, block, id, @@ -53,7 +53,7 @@ function ProgressBar({ completedChallengesInBlock, completedPercent, t -}: ProgressBarProps): JSX.Element { +}: ProgressProps): JSX.Element { const blockTitle = t(`intro:${superBlock}.blocks.${block}.title`); // Always false for legacy full stack, since it has no projects. const isCertificationProject = liveCerts.some( @@ -75,7 +75,7 @@ function ProgressBar({ className='progress-bar-container' data-playwright-test-label='progress-bar-container' > -
- +
)} diff --git a/client/src/templates/Challenges/components/completion-modal.css b/client/src/templates/Challenges/components/completion-modal.css index 69f4abba8f2..17f18c50c6a 100644 --- a/client/src/templates/Challenges/components/completion-modal.css +++ b/client/src/templates/Challenges/components/completion-modal.css @@ -97,22 +97,13 @@ } .progress-bar-percent { - width: 0; + height: 10px; overflow: hidden; position: relative; background-color: var(--primary-color); transition: width 0ms linear; } -.progress-bar-foreground { - color: var(--primary-background); - width: 400px; - height: 10px; - display: flex; - align-items: center; - justify-content: center; -} - @media screen and (max-width: 991px) { .challenge-success-modal .btn-lg { font-size: 1rem; diff --git a/client/src/templates/Challenges/components/completion-modal.test.tsx b/client/src/templates/Challenges/components/completion-modal.test.tsx index 1469a053c27..ce6553f6ada 100644 --- a/client/src/templates/Challenges/components/completion-modal.test.tsx +++ b/client/src/templates/Challenges/components/completion-modal.test.tsx @@ -18,7 +18,7 @@ import CompletionModal from './completion-modal'; jest.mock('../../../analytics'); jest.mock('../../../utils/fire-confetti'); -jest.mock('../../../components/ProgressBar'); +jest.mock('../../../components/Progress'); jest.mock('../redux/selectors'); jest.mock('../utils/build'); const mockFireConfetti = fireConfetti as jest.Mock; diff --git a/client/src/templates/Challenges/components/completion-modal.tsx b/client/src/templates/Challenges/components/completion-modal.tsx index 40ea4aa6c34..f23df9fe421 100644 --- a/client/src/templates/Challenges/components/completion-modal.tsx +++ b/client/src/templates/Challenges/components/completion-modal.tsx @@ -24,7 +24,7 @@ import { challengeMetaSelector, isSubmittingSelector } from '../redux/selectors'; -import ProgressBar from '../../../components/ProgressBar'; +import Progress from '../../../components/Progress'; import GreenPass from '../../../assets/icons/green-pass'; import './completion-modal.css'; @@ -189,7 +189,7 @@ class CompletionModal extends Component< />
- +
diff --git a/client/src/templates/Introduction/components/block.tsx b/client/src/templates/Introduction/components/block.tsx index dea63e6d466..0a3f5c1cdf1 100644 --- a/client/src/templates/Introduction/components/block.tsx +++ b/client/src/templates/Introduction/components/block.tsx @@ -1,11 +1,11 @@ import React, { Component } from 'react'; import type { DefaultTFuncReturn, TFunction } from 'i18next'; import { withTranslation } from 'react-i18next'; -import { ProgressBar } from '@freecodecamp/react-bootstrap'; import { connect } from 'react-redux'; import ScrollableAnchor from 'react-scrollable-anchor'; import { bindActionCreators, Dispatch } from 'redux'; import { createSelector } from 'reselect'; + import { SuperBlocks } from '../../../../../shared/config/superblocks'; import envData from '../../../../config/env.json'; import { isAuditedSuperBlock } from '../../../../../shared/utils/is-audited'; @@ -13,6 +13,7 @@ import Caret from '../../../assets/icons/caret'; import DropDown from '../../../assets/icons/dropdown'; import GreenNotCompleted from '../../../assets/icons/green-not-completed'; import GreenPass from '../../../assets/icons/green-pass'; +import { ProgressBar } from '../../../components/Progress/progress-bar'; import { Link, Spacer } from '../../../components/helpers'; import { completedChallengesSelector } from '../../../redux/selectors'; import { ChallengeNode, CompletedChallenge } from '../../../redux/prop-types'; @@ -153,7 +154,9 @@ class Block extends Component { const progressBarRender = ( ); diff --git a/client/src/templates/Introduction/intro.css b/client/src/templates/Introduction/intro.css index d62adedfee4..d709c8028fa 100644 --- a/client/src/templates/Introduction/intro.css +++ b/client/src/templates/Introduction/intro.css @@ -443,8 +443,10 @@ ToDo: find out why, and remove the need for it */ margin-bottom: 14px; } -.block-grid .progress-wrapper span { - color: var(--quaternary-color); +.block-grid .progress-wrapper > div { + position: relative; + width: 80%; + padding-inline-end: 0.25em; } .block-grid .progress {