import { Table, Button, DropdownButton, MenuItem } from '@freecodecamp/react-bootstrap'; import { Link, navigate } from 'gatsby'; import { find, first } from 'lodash-es'; import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { withTranslation } from 'react-i18next'; import { createSelector } from 'reselect'; import { projectMap, legacyProjectMap } from '../../resources/cert-and-project-map'; import { maybeUrlRE } from '../../utils'; import ProjectModal from '../SolutionViewer/ProjectModal'; import { FullWidthRow, Spacer } from '../helpers'; import SectionHeader from './section-header'; import './certification.css'; const propTypes = { completedChallenges: PropTypes.arrayOf( PropTypes.shape({ id: PropTypes.string, solution: PropTypes.string, githubLink: PropTypes.string, challengeType: PropTypes.number, completedDate: PropTypes.number, challengeFiles: PropTypes.array }) ), createFlashMessage: PropTypes.func.isRequired, is2018DataVisCert: PropTypes.bool, isApisMicroservicesCert: PropTypes.bool, isBackEndCert: PropTypes.bool, isDataAnalysisPyCertV7: PropTypes.bool, isDataVisCert: PropTypes.bool, isFrontEndCert: PropTypes.bool, isFrontEndLibsCert: PropTypes.bool, isFullStackCert: PropTypes.bool, isHonest: PropTypes.bool, isInfosecCertV7: PropTypes.bool, isInfosecQaCert: PropTypes.bool, isJsAlgoDataStructCert: PropTypes.bool, isMachineLearningPyCertV7: PropTypes.bool, isQaCertV7: PropTypes.bool, isRespWebDesignCert: PropTypes.bool, isSciCompPyCertV7: PropTypes.bool, t: PropTypes.func.isRequired, username: PropTypes.string, verifyCert: PropTypes.func.isRequired }; const certifications = Object.keys(projectMap); const legacyCertifications = Object.keys(legacyProjectMap); const isCertSelector = ({ is2018DataVisCert, isApisMicroservicesCert, isJsAlgoDataStructCert, isBackEndCert, isDataVisCert, isFrontEndCert, isInfosecQaCert, isQaCertV7, isInfosecCertV7, isFrontEndLibsCert, isFullStackCert, isRespWebDesignCert, isSciCompPyCertV7, isDataAnalysisPyCertV7, isMachineLearningPyCertV7 }) => ({ is2018DataVisCert, isApisMicroservicesCert, isJsAlgoDataStructCert, isBackEndCert, isDataVisCert, isFrontEndCert, isInfosecQaCert, isQaCertV7, isInfosecCertV7, isFrontEndLibsCert, isFullStackCert, isRespWebDesignCert, isSciCompPyCertV7, isDataAnalysisPyCertV7, isMachineLearningPyCertV7 }); const isCertMapSelector = createSelector( isCertSelector, ({ is2018DataVisCert, isApisMicroservicesCert, isJsAlgoDataStructCert, isInfosecQaCert, isQaCertV7, isInfosecCertV7, isFrontEndLibsCert, isRespWebDesignCert, isDataVisCert, isFrontEndCert, isBackEndCert, isSciCompPyCertV7, isDataAnalysisPyCertV7, isMachineLearningPyCertV7 }) => ({ 'Responsive Web Design': isRespWebDesignCert, 'JavaScript Algorithms and Data Structures': isJsAlgoDataStructCert, 'Front End Libraries': isFrontEndLibsCert, 'Data Visualization': is2018DataVisCert, 'APIs and Microservices': isApisMicroservicesCert, 'Quality Assurance': isQaCertV7, 'Information Security': isInfosecCertV7, 'Scientific Computing with Python': isSciCompPyCertV7, 'Data Analysis with Python': isDataAnalysisPyCertV7, 'Machine Learning with Python': isMachineLearningPyCertV7, 'Legacy Front End': isFrontEndCert, 'Legacy Data Visualization': isDataVisCert, 'Legacy Back End': isBackEndCert, 'Legacy Information Security and Quality Assurance': isInfosecQaCert }) ); const honestyInfoMessage = { type: 'info', message: 'flash.honest-first' }; const initialState = { solutionViewer: { projectTitle: '', challengeFiles: null, solution: null, isOpen: false } }; export class CertificationSettings extends Component { constructor(props) { super(props); this.state = { ...initialState }; } createHandleLinkButtonClick = to => e => { e.preventDefault(); return navigate(to); }; handleSolutionModalHide = () => this.setState({ ...initialState }); getUserIsCertMap = () => isCertMapSelector(this.props); getProjectSolution = (projectId, projectTitle) => { const { completedChallenges, t } = this.props; const completedProject = find( completedChallenges, ({ id }) => projectId === id ); if (!completedProject) { return null; } const { solution, githubLink, challengeFiles } = completedProject; const onClickHandler = () => this.setState({ solutionViewer: { projectTitle, challengeFiles, solution, isOpen: true } }); if (challengeFiles?.length) { return ( ); } if (githubLink) { return (
{t('settings.labels.project-name')} | {t('settings.labels.solution')} |
---|
{t('settings.claim-legacy', { cert: 'Legacy Full Stack Certification' })}