Files
freeCodeCamp/client/utils/gatsby/challengePageCreator.js

121 lines
2.6 KiB
JavaScript
Raw Normal View History

2018-11-29 12:12:15 +00:00
const path = require('path');
const { dasherize } = require('../../../utils/slugs');
2018-11-29 12:12:15 +00:00
const { viewTypes } = require('../challengeTypes');
const backend = path.resolve(
__dirname,
'../../src/templates/Challenges/projects/backend/Show.tsx'
2018-11-29 12:12:15 +00:00
);
const classic = path.resolve(
__dirname,
'../../src/templates/Challenges/classic/Show.tsx'
2018-11-29 12:12:15 +00:00
);
const frontend = path.resolve(
2018-11-29 12:12:15 +00:00
__dirname,
'../../src/templates/Challenges/projects/frontend/Show.tsx'
2018-11-29 12:12:15 +00:00
);
const codeally = path.resolve(
__dirname,
'../../src/templates/Challenges/codeally/show.tsx'
);
2018-11-29 12:12:15 +00:00
const intro = path.resolve(
__dirname,
'../../src/templates/Introduction/Intro.js'
);
const superBlockIntro = path.resolve(
__dirname,
'../../src/templates/Introduction/SuperBlockIntro.js'
);
const video = path.resolve(
__dirname,
'../../src/templates/Challenges/video/Show.tsx'
);
2018-11-29 12:12:15 +00:00
const views = {
backend,
classic,
modern: classic,
frontend,
video,
codeally
2018-11-29 12:12:15 +00:00
// quiz: Quiz
};
const getNextChallengePath = (node, index, nodeArray) => {
const next = nodeArray[index + 1];
return next ? next.node.fields.slug : '/learn';
2018-11-29 12:12:15 +00:00
};
const getPrevChallengePath = (node, index, nodeArray) => {
const prev = nodeArray[index - 1];
return prev ? prev.node.fields.slug : '/learn';
};
2018-11-29 12:12:15 +00:00
const getTemplateComponent = challengeType => views[viewTypes[challengeType]];
exports.createChallengePages =
createPage =>
({ node }, index, thisArray) => {
const {
superBlock,
block,
fields: { slug },
required = [],
template,
challengeType,
id
} = node;
// TODO: challengeType === 7 and isPrivate are the same, right? If so, we
// should remove one of them.
2018-11-29 12:12:15 +00:00
return createPage({
path: slug,
component: getTemplateComponent(challengeType),
context: {
challengeMeta: {
superBlock,
block,
template,
required,
nextChallengePath: getNextChallengePath(node, index, thisArray),
prevChallengePath: getPrevChallengePath(node, index, thisArray),
id
},
slug
}
});
};
2018-11-29 12:12:15 +00:00
exports.createBlockIntroPages = createPage => edge => {
const {
fields: { slug },
frontmatter: { block }
} = edge.node;
return createPage({
path: slug,
component: intro,
context: {
block: dasherize(block),
slug
}
});
};
exports.createSuperBlockIntroPages = createPage => edge => {
const {
fields: { slug },
frontmatter: { superBlock }
} = edge.node;
return createPage({
path: slug,
component: superBlockIntro,
context: {
superBlock,
2018-11-29 12:12:15 +00:00
slug
}
});
};