123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- 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)
- }
|