UNPKG

19.2 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../src/compute-next-step/compute-next-step.js"],"names":["selectRule","updateVariables","updateState","hasNoMoreLives","config","state","livesDisabled","lives","getContentRef","hasRemainingLifeRequests","remainingLifeRequests","stepIsAlreadyExtraLife","hasRulesToApply","chapterContent","Array","isArray","rules","nextSlidePool","availableContent","nextContent","type","content","ref","currentChapterContent","nextChapterContent","temporaryNextContent","lastSlideRef","_currentIndex","slides","_id","currentIndex","currentChapterPool","currentChapterSlideIds","slidesAnsweredForThisChapter","isChapterCompleted","Math","min","slidesToComplete","hasRules","shouldChangeChapter","_getChapterContent","firstContent","getChapterContent","res","sortByPosition","slide","position","pickNextSlide","isTargetingIsCorrect","condition","target","scope","field","getIsCorrect","isCorrect","chapterRule","conditions","some","computeNextSlide","remainingSlides","slideId","prepareStateToSwitchChapters","instructions","destination","computeNextStepForNewChapter","nextStep","computeNextStep","concat","extendPartialAction","action","payload","answer","godMode","_state","partialAction","allAnswers","slideRef","length","stateWithDecrementedLives"],"mappings":"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","sourcesContent":["// @flow\nimport {\n map,\n get,\n find,\n pipe,\n head,\n size,\n slice,\n last,\n filter,\n sortBy,\n isEqual,\n isEmpty,\n shuffle,\n includes,\n findIndex,\n intersection\n} from 'lodash/fp';\n\nimport type {\n Action,\n Answer,\n AnswerRecord,\n AvailableContent,\n ChapterContent,\n Config,\n Content,\n Slide,\n State\n} from '../types';\nimport type {ChapterRule, Instruction, Condition} from '../rule-engine/types';\nimport selectRule from '../rule-engine/select-rule';\nimport updateVariables from '../rule-engine/apply-instructions';\nimport updateState from '../update-state';\n\nconst hasNoMoreLives = (config: Config, state: State): boolean =>\n !config.livesDisabled && state.lives <= 0;\nconst getContentRef: State => string = get('content.ref');\nconst hasRemainingLifeRequests = (state: State): boolean => state.remainingLifeRequests > 0;\nconst stepIsAlreadyExtraLife = (state: State): boolean => getContentRef(state) === 'extraLife';\n\nconst hasRulesToApply = (chapterContent: ChapterContent | null): boolean => {\n return !!(\n chapterContent &&\n Array.isArray(chapterContent.rules) &&\n !isEmpty(chapterContent.rules)\n );\n};\n\nexport type PartialAnswerActionWithIsCorrect = {\n type: 'answer',\n payload: {\n answer: Answer,\n content: Content,\n godMode: boolean,\n isCorrect: boolean\n }\n};\nexport type PartialExtraLifeAcceptedAction = {\n type: 'extraLifeAccepted'\n};\n\ntype PartialAction = PartialAnswerActionWithIsCorrect | PartialExtraLifeAcceptedAction | null;\n\ntype ChapterContentSelection = {\n currentChapterContent: ChapterContent | null,\n nextChapterContent: ChapterContent | null,\n temporaryNextContent: Content\n};\n\nexport const nextSlidePool = (\n config: Config,\n availableContent: AvailableContent,\n state: State\n): ChapterContentSelection => {\n if (state.nextContent.type === 'chapter') {\n const content = find({ref: state.nextContent.ref}, availableContent) || null;\n return {\n currentChapterContent: content,\n nextChapterContent: content,\n temporaryNextContent: {type: 'slide', ref: ''}\n };\n }\n const lastSlideRef = pipe(get('slides'), last)(state);\n const _currentIndex: number = findIndex(\n ({slides}: ChapterContent): boolean => !!find({_id: lastSlideRef}, slides),\n availableContent\n );\n const currentIndex = _currentIndex !== -1 ? _currentIndex : 0;\n const currentChapterPool: ChapterContent | null = availableContent[currentIndex] || null;\n\n const currentChapterSlideIds = pipe(get('slides'), map('_id'))(currentChapterPool || []);\n const slidesAnsweredForThisChapter = intersection(state.slides, currentChapterSlideIds);\n const isChapterCompleted =\n size(slidesAnsweredForThisChapter) >=\n Math.min(config.slidesToComplete, size(currentChapterSlideIds));\n const hasRules = hasRulesToApply(currentChapterPool);\n const shouldChangeChapter = !hasRules && isChapterCompleted;\n\n if (shouldChangeChapter) {\n const nextChapterContent = pipe(\n slice(currentIndex + 1, size(availableContent)),\n filter(content => !isEmpty(content.slides)),\n head\n )(availableContent);\n return {\n currentChapterContent: currentChapterPool,\n nextChapterContent,\n temporaryNextContent: {type: 'slide', ref: ''}\n };\n }\n\n return {\n currentChapterContent: currentChapterPool,\n nextChapterContent: currentChapterPool,\n temporaryNextContent: state.nextContent\n };\n};\n\nconst _getChapterContent = (\n config: Config,\n availableContent: AvailableContent,\n state: State | null\n): ChapterContentSelection => {\n const firstContent = pipe(\n filter(content => !isEmpty(content.slides)),\n head\n )(availableContent);\n if (!state) {\n return {\n currentChapterContent: firstContent,\n nextChapterContent: firstContent,\n temporaryNextContent: {type: 'slide', ref: ''}\n };\n }\n return nextSlidePool(config, availableContent, state);\n};\n\nconst getChapterContent = (\n config: Config,\n availableContent: AvailableContent,\n state: State | null\n): ChapterContentSelection | null => {\n const res = _getChapterContent(config, availableContent, state);\n if (!res.currentChapterContent) {\n return null;\n }\n return res;\n};\n\nconst sortByPosition = sortBy((slide: Slide) =>\n typeof slide.position === 'number' ? -slide.position : 0\n);\n\nconst pickNextSlide = pipe(shuffle, sortByPosition, head);\n\nconst isTargetingIsCorrect = (condition: Condition): boolean =>\n condition.target.scope === 'slide' && condition.target.field === 'isCorrect';\n\nconst getIsCorrect = (isCorrect: boolean, chapterRule: ChapterRule): ?boolean => {\n if (chapterRule.conditions.some(isTargetingIsCorrect)) return isCorrect;\n return null;\n};\n\ntype Result = {\n nextContent: Content,\n instructions: Array<Instruction> | null,\n isCorrect: ?boolean\n} | null;\n\nconst computeNextSlide = (\n config: Config,\n chapterContent: ChapterContent,\n state: State | null\n): Content => {\n const remainingSlides = filter(\n pipe(get('_id'), (slideId: string) => !state || !includes(slideId, state.slides)),\n chapterContent.slides\n );\n return {\n type: 'slide',\n ref: pickNextSlide(remainingSlides)._id\n };\n};\n\nexport const prepareStateToSwitchChapters = (\n chapterRule: ChapterRule,\n state: State | null\n): State | null => {\n if (!state) {\n return state;\n }\n return updateVariables(chapterRule.instructions)({\n ...state,\n nextContent: chapterRule.destination\n });\n};\n\nexport const computeNextStepForNewChapter = (\n config: Config,\n state: State | null,\n chapterRule: ChapterRule,\n isCorrect: boolean,\n availableContent: AvailableContent\n): Result => {\n // eslint-disable-next-line no-use-before-define\n const nextStep = computeNextStep(\n config,\n prepareStateToSwitchChapters(chapterRule, state),\n availableContent,\n null\n );\n if (!nextStep) {\n return null;\n }\n\n return {\n nextContent: nextStep.nextContent,\n instructions: chapterRule.instructions.concat(nextStep.instructions || []),\n isCorrect: getIsCorrect(isCorrect, chapterRule)\n };\n};\n\nconst extendPartialAction = (action: PartialAction, state: State | null): Action | null => {\n if (!action) {\n return null;\n }\n\n switch (action.type) {\n case 'answer': {\n const nextContent: Content =\n action.payload.content || (state ? state.nextContent : {ref: '', type: 'node'});\n return {\n type: 'answer',\n payload: {\n answer: action.payload.answer,\n godMode: action.payload.godMode,\n isCorrect: action.payload.isCorrect,\n content: nextContent,\n nextContent,\n instructions: null\n }\n };\n }\n\n case 'extraLifeAccepted': {\n const nextContent = state ? state.nextContent : {ref: '', type: 'node'};\n return {\n type: 'extraLifeAccepted',\n payload: {\n content: nextContent,\n nextContent,\n instructions: null\n }\n };\n }\n\n default:\n return null;\n }\n};\n\nconst computeNextStep = (\n config: Config,\n _state: State | null,\n availableContent: AvailableContent,\n partialAction: PartialAction\n): Result => {\n const action = extendPartialAction(partialAction, _state);\n const isCorrect = !!action && action.type === 'answer' && !!action.payload.isCorrect;\n const answer = (!!action && action.type === 'answer' && action.payload.answer) || [];\n const state = !_state || !action ? _state : updateState(config, _state, [action]);\n const chapterContent = getChapterContent(config, availableContent, state);\n if (!chapterContent) {\n return null;\n }\n\n const {currentChapterContent, nextChapterContent, temporaryNextContent} = chapterContent;\n const hasRules = hasRulesToApply(nextChapterContent);\n\n if (!hasRules) {\n if (state && hasNoMoreLives(config, state)) {\n return {\n nextContent:\n !stepIsAlreadyExtraLife(state) && hasRemainingLifeRequests(state)\n ? {type: 'node', ref: 'extraLife'}\n : {type: 'failure', ref: 'failExitNode'},\n instructions: null,\n isCorrect\n };\n } else if (!nextChapterContent) {\n // If user has answered all questions, return success endpoint\n return {\n nextContent: {\n type: 'success',\n ref: 'successExitNode'\n },\n instructions: null,\n isCorrect\n };\n }\n }\n\n if (hasRules) {\n const allAnswers: Array<AnswerRecord> = (!!state && state.allAnswers) || [];\n // $FlowFixMe nextChapterContent.rules = array not emtpy -> checked by hasRulesToApply\n const chapterRule = selectRule(nextChapterContent.rules, {\n ...state,\n nextContent: temporaryNextContent,\n allAnswers: [\n ...allAnswers,\n {\n slideRef: temporaryNextContent.ref,\n answer,\n isCorrect\n }\n ]\n });\n if (!chapterRule) {\n return null;\n }\n\n if (chapterRule.destination.type === 'chapter') {\n return computeNextStepForNewChapter(config, state, chapterRule, isCorrect, availableContent);\n }\n\n return {\n nextContent: chapterRule.destination,\n instructions: chapterRule.instructions,\n isCorrect: isEqual(currentChapterContent, nextChapterContent)\n ? getIsCorrect(isCorrect, chapterRule)\n : isCorrect\n };\n }\n\n if (\n nextChapterContent &&\n Array.isArray(nextChapterContent.slides) &&\n nextChapterContent.slides.length > 0\n ) {\n const stateWithDecrementedLives = state\n ? {\n ...state,\n nextContent: temporaryNextContent\n }\n : state;\n\n const nextContent = computeNextSlide(config, nextChapterContent, stateWithDecrementedLives);\n return {\n nextContent,\n instructions: null,\n isCorrect\n };\n }\n\n return null;\n};\n\nexport default computeNextStep;\n"],"file":"compute-next-step.js"}
\No newline at end of file