115 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const path = require('path');
 | 
						|
const { dasherize } = require('..');
 | 
						|
 | 
						|
const { viewTypes } = require('../challengeTypes');
 | 
						|
 | 
						|
const backend = path.resolve(
 | 
						|
  __dirname,
 | 
						|
  '../../src/templates/Challenges/backend/Show.js'
 | 
						|
);
 | 
						|
const classic = path.resolve(
 | 
						|
  __dirname,
 | 
						|
  '../../src/templates/Challenges/classic/Show.js'
 | 
						|
);
 | 
						|
const project = path.resolve(
 | 
						|
  __dirname,
 | 
						|
  '../../src/templates/Challenges/project/Show.js'
 | 
						|
);
 | 
						|
const intro = path.resolve(
 | 
						|
  __dirname,
 | 
						|
  '../../src/templates/Introduction/Intro.js'
 | 
						|
);
 | 
						|
const superBlockIntro = path.resolve(
 | 
						|
  __dirname,
 | 
						|
  '../../src/templates/Introduction/SuperBlockIntro.js'
 | 
						|
);
 | 
						|
 | 
						|
const views = {
 | 
						|
  backend,
 | 
						|
  classic,
 | 
						|
  modern: classic,
 | 
						|
  project
 | 
						|
  // quiz: Quiz
 | 
						|
};
 | 
						|
 | 
						|
const getNextChallengePath = (node, index, nodeArray) => {
 | 
						|
  const next = nodeArray[index + 1];
 | 
						|
  return next ? next.node.fields.slug : '/';
 | 
						|
};
 | 
						|
const getTemplateComponent = challengeType => views[viewTypes[challengeType]];
 | 
						|
 | 
						|
const getIntroIfRequired = (node, index, nodeArray) => {
 | 
						|
  const next = nodeArray[index + 1];
 | 
						|
  const isEndOfBlock = next && next.node.challengeOrder === 0;
 | 
						|
  let nextSuperBlock = '';
 | 
						|
  let nextBlock = '';
 | 
						|
  if (next) {
 | 
						|
    const { superBlock, block } = next.node;
 | 
						|
    nextSuperBlock = superBlock;
 | 
						|
    nextBlock = block;
 | 
						|
  }
 | 
						|
  return isEndOfBlock
 | 
						|
    ? `/learn/${dasherize(nextSuperBlock)}/${dasherize(nextBlock)}`
 | 
						|
    : '';
 | 
						|
};
 | 
						|
 | 
						|
exports.createChallengePages = createPage => ({ node }, index, thisArray) => {
 | 
						|
  const {
 | 
						|
    fields: { slug },
 | 
						|
    required = [],
 | 
						|
    template,
 | 
						|
    challengeType,
 | 
						|
    id
 | 
						|
  } = node;
 | 
						|
  if (challengeType === 7) {
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
 | 
						|
  return createPage({
 | 
						|
    path: slug,
 | 
						|
    component: getTemplateComponent(challengeType),
 | 
						|
    context: {
 | 
						|
      challengeMeta: {
 | 
						|
        introPath: getIntroIfRequired(node, index, thisArray),
 | 
						|
        template,
 | 
						|
        required,
 | 
						|
        nextChallengePath: getNextChallengePath(node, index, thisArray),
 | 
						|
        id
 | 
						|
      },
 | 
						|
      slug
 | 
						|
    }
 | 
						|
  });
 | 
						|
};
 | 
						|
 | 
						|
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: dasherize(superBlock),
 | 
						|
      slug
 | 
						|
    }
 | 
						|
  });
 | 
						|
};
 |