/* eslint-disable max-len */ import React from 'react'; import PropTypes from 'prop-types'; import { Link, graphql } from 'gatsby'; import Helmet from 'react-helmet'; import { connect } from 'react-redux'; import { ChallengeNode, AllChallengeNode, AllMarkdownRemark } from '../redux/propTypes'; import LearnLayout from '../components/layouts/Learn'; import Spacer from '../components/helpers/Spacer'; import Map from '../components/Map'; import './learn.css'; const mapStateToProps = () => ({}); const propTypes = { data: PropTypes.shape({ challengeNode: ChallengeNode, allChallengeNode: AllChallengeNode, allMarkdownRemark: AllMarkdownRemark }) }; const IndexPage = ({ data: { challengeNode: { fields: { slug } }, allChallengeNode: { edges }, allMarkdownRemark: { edges: mdEdges } } }) => (

Welcome to the freeCodeCamp curriculum

We have thousands of coding lessons to help you improve your skills.

You can earn each certification by completing its 5 final projects.

And yes - all of this is 100% free, thanks to the thousands of campers who{' '} donate {' '} to our nonprofit.

If you are new to coding, we recommend you{' '} start at the beginning.

node)} nodes={edges .map(({ node }) => node) .filter(({ isPrivate }) => !isPrivate)} />
); IndexPage.displayName = 'IndexPage'; IndexPage.propTypes = propTypes; export default connect(mapStateToProps)(IndexPage); export const query = graphql` query FirstChallenge { challengeNode(order: { eq: 0 }, challengeOrder: { eq: 0 }) { fields { slug } } allChallengeNode(sort: { fields: [superOrder, order, challengeOrder] }) { edges { node { fields { slug blockName } id block title isRequired superBlock dashedName } } } allMarkdownRemark(filter: { frontmatter: { block: { ne: null } } }) { edges { node { frontmatter { title block } fields { slug } } } } } `;