diff --git a/client/src/templates/Introduction/components/block-header.test.tsx b/client/src/templates/Introduction/components/block-header.test.tsx index bafa7cf8f05..f20ea097647 100644 --- a/client/src/templates/Introduction/components/block-header.test.tsx +++ b/client/src/templates/Introduction/components/block-header.test.tsx @@ -34,6 +34,7 @@ describe('', () => { {...defaultProps} accordion={true} blockUrl='/learn/test-block' + onLinkClick={() => {}} /> ); diff --git a/client/src/templates/Introduction/components/block-header.tsx b/client/src/templates/Introduction/components/block-header.tsx index 517fa33f217..581e105b974 100644 --- a/client/src/templates/Introduction/components/block-header.tsx +++ b/client/src/templates/Introduction/components/block-header.tsx @@ -10,7 +10,7 @@ import CheckMark from './check-mark'; import BlockLabel from './block-label'; import BlockIntros from './block-intros'; -interface BlockHeaderProps { +interface BaseBlockHeaderProps { blockDashed: string; blockTitle: string; blockLabel: BlockLabelType | null; @@ -22,9 +22,19 @@ interface BlockHeaderProps { percentageCompleted: number; blockIntroArr?: string[]; accordion?: boolean; - blockUrl?: string; } +interface BlockHeaderButtonProps extends BaseBlockHeaderProps { + blockUrl?: never; + onLinkClick?: never; +} + +interface BlockHeaderLinkProps extends BaseBlockHeaderProps { + blockUrl: string; + onLinkClick: () => void; +} + +type BlockHeaderProps = BlockHeaderButtonProps | BlockHeaderLinkProps; function BlockHeader({ blockDashed, blockTitle, @@ -37,7 +47,8 @@ function BlockHeader({ percentageCompleted, blockIntroArr, accordion, - blockUrl + blockUrl, + onLinkClick }: BlockHeaderProps): JSX.Element { const InnerBlockHeader = () => ( <> @@ -68,7 +79,7 @@ function BlockHeader({ <>

{accordion && blockUrl ? ( - + ) : ( diff --git a/client/src/templates/Introduction/components/block.tsx b/client/src/templates/Introduction/components/block.tsx index 9d6cab88e8e..053361b371c 100644 --- a/client/src/templates/Introduction/components/block.tsx +++ b/client/src/templates/Introduction/components/block.tsx @@ -82,7 +82,7 @@ export class Block extends Component { super(props); this.handleBlockClick = this.handleBlockClick.bind(this); - this.handleBlockHover = this.handleBlockHover.bind(this); + this.handleChallengeClick = this.handleChallengeClick.bind(this); } handleBlockClick = (): void => { @@ -91,13 +91,8 @@ export class Block extends Component { toggleBlock(block); }; - /* - * This function handles the block hover event. - * It also updates the URL hash to reflect the current block. - */ - handleBlockHover = (): void => { + handleChallengeClick = (): void => { const { block } = this.props; - // Convert block to dashed format const dashedBlock = block .toLowerCase() .replace(/\s+/g, '-') @@ -181,11 +176,7 @@ export class Block extends Component { */ const LegacyChallengeListBlock = ( -
+

{blockTitle}

{blockLabel && } @@ -224,7 +215,12 @@ export class Block extends Component {
- {isExpanded && } + {isExpanded && ( + + )}
); @@ -236,11 +232,7 @@ export class Block extends Component { */ const ProjectListBlock = ( -
+

{blockTitle}

{blockLabel && } @@ -255,7 +247,10 @@ export class Block extends Component {
)}
- +
); @@ -267,11 +262,7 @@ export class Block extends Component { */ const LegacyChallengeGridBlock = ( -
+
{ challenges={extendedChallenges} isProjectBlock={isProjectBlock} blockTitle={blockTitle} + onChallengeClick={this.handleChallengeClick} />
@@ -353,6 +345,7 @@ export class Block extends Component { challenges={extendedChallenges} blockTitle={blockTitle} jumpLink={!accordion} + onChallengeClick={this.handleChallengeClick} />
@@ -368,11 +361,7 @@ export class Block extends Component { */ const LegacyLinkBlock = ( -
+
@@ -477,8 +466,6 @@ export class Block extends Component {
{ challenges={extendedChallenges} blockTitle={blockTitle} isProjectBlock={isProjectBlock} + onChallengeClick={this.handleChallengeClick} /> ) : ( - + )}
@@ -539,6 +530,7 @@ export class Block extends Component { completedCount={completedCount} courseCompletionStatus={courseCompletionStatus()} handleClick={this.handleBlockClick} + onLinkClick={this.handleChallengeClick} isCompleted={isBlockCompleted} isExpanded={isExpanded} percentageCompleted={percentageCompleted} diff --git a/client/src/templates/Introduction/components/challenges.tsx b/client/src/templates/Introduction/components/challenges.tsx index 376fd97f40b..83a416aa41d 100644 --- a/client/src/templates/Introduction/components/challenges.tsx +++ b/client/src/templates/Introduction/components/challenges.tsx @@ -20,6 +20,7 @@ interface ChallengeInfo { interface ChallengesProps { challenges: ChallengeInfo[]; + onChallengeClick: () => void; } interface JumpLinkProps { @@ -37,25 +38,44 @@ interface IsProjectBlockProps { const CheckMark = ({ isCompleted }: { isCompleted: boolean }) => isCompleted ? : ; -const ListChallenge = ({ challenge }: { challenge: ChallengeInfo }) => ( - - - - - {challenge.title} - -); +const ListChallenge = ({ + challenge, + onChallengeClick +}: { + challenge: ChallengeInfo; + onChallengeClick: () => void; +}) => { + return ( + + + + + {challenge.title} + + ); +}; -const CertChallenge = ({ challenge }: { challenge: ChallengeInfo }) => ( - - {challenge.title} - - - - -); +const CertChallenge = ({ + challenge, + onChallengeClick +}: { + challenge: ChallengeInfo; + onChallengeClick: () => void; +}) => { + return ( + + {challenge.title} + + + + + ); +}; -export function ChallengesList({ challenges }: ChallengesProps): JSX.Element { +export function ChallengesList({ + challenges, + onChallengeClick +}: ChallengesProps): JSX.Element { return (
    {challenges.map(challenge => ( @@ -64,7 +84,10 @@ export function ChallengesList({ challenges }: ChallengesProps): JSX.Element { id={challenge.dashedName} key={'map-challenge' + challenge.fields.slug} > - + ))}
@@ -73,16 +96,19 @@ export function ChallengesList({ challenges }: ChallengesProps): JSX.Element { // Step or Task challenge const GridChallenge = ({ challenge, - isTask = false + isTask = false, + onChallengeClick }: { challenge: ChallengeInfo; isTask?: boolean; + onChallengeClick: () => void; }) => { const { t } = useTranslation(); return ( { const { t } = useTranslation(); @@ -113,7 +140,11 @@ const LinkToFirstIncompleteChallenge = ({ ); return firstIncompleteChallenge ? (
- + {!isChallengeStarted ? t('buttons.start-project') : t('buttons.resume-project')}{' '} @@ -127,7 +158,8 @@ export const GridMapChallenges = ({ challenges, blockTitle, isProjectBlock, - jumpLink + jumpLink, + onChallengeClick }: ChallengesProps & BlockTitleProps & IsProjectBlockProps & JumpLinkProps) => { const { t } = useTranslation(); return ( @@ -136,6 +168,7 @@ export const GridMapChallenges = ({ )}