Files
freeCodeCamp/client/src/pages/learn.js

156 lines
3.4 KiB
JavaScript
Raw Normal View History

2018-03-26 13:01:24 +01:00
import React from 'react';
import { Grid, Row, Col } from '@freecodecamp/react-bootstrap';
2018-04-06 14:51:52 +01:00
import PropTypes from 'prop-types';
import { createSelector } from 'reselect';
2019-02-21 20:55:36 +05:30
import { graphql } from 'gatsby';
2018-04-06 14:51:52 +01:00
import Helmet from 'react-helmet';
import { connect } from 'react-redux';
2018-03-26 13:01:24 +01:00
import {
userFetchStateSelector,
isSignedInSelector,
userSelector
} from '../redux';
import LearnLayout from '../components/layouts/Learn';
import Login from '../components/Header/components/Login';
import { Link, Spacer, Loader } from '../components/helpers';
import Map from '../components/Map';
import Welcome from '../components/welcome';
2018-04-06 14:51:52 +01:00
import {
ChallengeNode,
AllChallengeNode,
AllMarkdownRemark
} from '../redux/propTypes';
const mapStateToProps = createSelector(
userFetchStateSelector,
isSignedInSelector,
userSelector,
(fetchState, isSignedIn, user) => ({
fetchState,
isSignedIn,
user
})
);
2018-04-06 14:51:52 +01:00
const propTypes = {
data: PropTypes.shape({
challengeNode: ChallengeNode,
allChallengeNode: AllChallengeNode,
allMarkdownRemark: AllMarkdownRemark
}),
fetchState: PropTypes.shape({
pending: PropTypes.bool,
complete: PropTypes.bool,
errored: PropTypes.bool
}),
isSignedIn: PropTypes.bool,
user: PropTypes.shape({
name: PropTypes.string
})
};
const BigCallToAction = isSignedIn => {
if (!isSignedIn) {
return (
<>
<Row>
<Col sm={10} smOffset={1} xs={12}>
<Spacer />
<Login>Sign in to save your progress.</Login>
</Col>
</Row>
</>
);
}
return '';
2018-04-06 14:51:52 +01:00
};
export const LearnPage = ({
fetchState: { pending, complete },
isSignedIn,
user: { name = '' },
data: {
challengeNode: {
fields: { slug }
},
allChallengeNode: { edges },
allMarkdownRemark: { edges: mdEdges }
}
}) => {
if (pending && !complete) {
return <Loader fullScreen={true} />;
}
return (
<LearnLayout>
<Helmet title='Learn | freeCodeCamp.org' />
<Grid>
<Welcome name={name} />
<Row className='text-center'>
<Col sm={10} smOffset={1} xs={12}>
{BigCallToAction(isSignedIn)}
<Spacer />
<h3>
If you are new to coding, we recommend you{' '}
<Link to={slug}>start at the beginning</Link>.
</h3>
</Col>
</Row>
<Map
introNodes={mdEdges.map(({ node }) => node)}
nodes={edges
.map(({ node }) => node)
.filter(({ isPrivate }) => !isPrivate)}
/>
</Grid>
</LearnLayout>
);
};
2018-03-26 13:01:24 +01:00
LearnPage.displayName = 'LearnPage';
LearnPage.propTypes = propTypes;
2018-04-06 14:51:52 +01:00
export default connect(mapStateToProps)(LearnPage);
2018-04-06 14:51:52 +01:00
export const query = graphql`
query FirstChallenge {
challengeNode(order: { eq: 0 }, challengeOrder: { eq: 0 }) {
2018-04-06 14:51:52 +01:00
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
}
}
2018-04-06 14:51:52 +01:00
}
}
}
`;