import {useProvidePaperNavigationService} from "@/components/mx-paper/usePaperNavigationServiceInjection"; import _ from "lodash"; import {fnPlaceholder} from "@/utils/uni-helper"; export const useProvideStepPaperNavigationService = (paperService, questionService) => { const { goToQuestion, commitPaper, hasNext, hasPrev, tryGoNext, tryGoPrev, hasNextStep, hasPrevStep, tryGoNextStep, tryGoPrevStep, questions } = paperService const { unansweredQuestions, doChunk } = questionService const overrides = { uncompletedCheckForQuit: async (navigator) => { // 1 当前没有题,可能位于欢迎页,或者结论页,可直接退出 if (!questions.value.length) return // 2 同样保存答案 await doChunk() // 3 完成的判定有变化,需要没有下一步,且全部已完成才能算完成。 // PS:用逻辑保证第一步完成了才能进入下一步 return new Promise((resolve, reject) => { if (unansweredQuestions.value.length) { // a 还有未完成的题 navigator.open(unansweredQuestions.value, '您还有未做的题', { left: '强制退出', right: '继续做题', onLeft: () => { navigator.close() resolve() // 允许用户继续执行后续逻辑 }, onRight: () => { navigator.close() goToQuestion(_.first(unansweredQuestions.value)) reject('操作终止,用户选择继续做题') } }) } else if (hasNextStep.value) { // b 还有未完成的部分 navigator.open([], '您还有未做的题', { left: '强制退出', right: '继续下一部分', onLeft: () => { navigator.close() resolve() // 允许用户继续执行后续逻辑 }, onRight: () => { navigator.close() tryGoNextStep() reject('操作终止,用户选择继续做题') } }) } else { // c 已经全部完成 navigator.open([], '您已经做完所有题,是否提交生成报告', { left: '强制退出', right: '生成报告', onLeft: () => { navigator.close() resolve() // 允许用户继续执行后续逻辑 }, onRight: () => { navigator.close() commitPaper() reject('操作终止,用户选择生成报告') } }) } }) }, uncompletedCheckForSubmit: (navigator) => { // 彻底重写该方法,该方法在为step-paper-navigator提供按钮响应逻辑。 // 因为和题库试卷交互有异,这里是要直接引导用户做完多个步骤的所有题,最后生成报告 const prev = {left: '上一题', leftType: 'primary'}, next = {right: '下一题'} if (!questions.value.length) { // 没有题时静默不动,不能随意推动step, // 因为当前逻辑只关心当前step的题是否做完,如果多跳步骤就会漏掉检测,可能产生错误提交 prev.onLeft = fnPlaceholder next.onRight = fnPlaceholder return {...prev, ...next} } if (hasPrev.value) { // 没有题时也默认走这个分支 prev.onLeft = () => { tryGoPrev() } } else { prev.onLeft = () => { tryGoPrevStep() } } if (hasNext.value) { next.onRight = () => { tryGoNext() } } else if (unansweredQuestions.value.length) { next.right = hasNextStep.value ? '下一题' : '生成报告' // 确保进入下一步之前完成了所有答题 next.onRight = () => { navigator.open(unansweredQuestions.value, '您还有未完成的题', { left: '', right: '去做题', onRight: () => { navigator.close() goToQuestion(_.first(unansweredQuestions.value)) } }) } } else if (hasNextStep.value) { next.onRight = () => { doChunk() tryGoNextStep() } } else { next.right = '生成报告' next.onRight = () => { doChunk() commitPaper() } } return {...prev, ...next} } } return useProvidePaperNavigationService(paperService, questionService, overrides) }