useProvideStepPaperNavigationService.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import {useProvidePaperNavigationService} from "@/components/mx-paper/usePaperNavigationServiceInjection";
  2. import _ from "lodash";
  3. import {fnPlaceholder} from "@/utils/uni-helper";
  4. export const useProvideStepPaperNavigationService = (paperService, questionService) => {
  5. const {
  6. goToQuestion, commitPaper, hasNext, hasPrev, tryGoNext, tryGoPrev,
  7. hasNextStep, hasPrevStep, tryGoNextStep, tryGoPrevStep, questions
  8. } = paperService
  9. const {
  10. unansweredQuestions, doChunk
  11. } = questionService
  12. const overrides = {
  13. uncompletedCheckForQuit: async (navigator) => {
  14. // 1 当前没有题,可能位于欢迎页,或者结论页,可直接退出
  15. if (!questions.value.length) return
  16. // 2 同样保存答案
  17. await doChunk()
  18. // 3 完成的判定有变化,需要没有下一步,且全部已完成才能算完成。
  19. // PS:用逻辑保证第一步完成了才能进入下一步
  20. return new Promise((resolve, reject) => {
  21. if (unansweredQuestions.value.length) {
  22. // a 还有未完成的题
  23. navigator.open(unansweredQuestions.value, '您还有未做的题', {
  24. left: '强制退出',
  25. right: '继续做题',
  26. onLeft: () => {
  27. navigator.close()
  28. resolve() // 允许用户继续执行后续逻辑
  29. },
  30. onRight: () => {
  31. navigator.close()
  32. goToQuestion(_.first(unansweredQuestions.value))
  33. reject('操作终止,用户选择继续做题')
  34. }
  35. })
  36. } else if (hasNextStep.value) {
  37. // b 还有未完成的部分
  38. navigator.open([], '您还有未做的题', {
  39. left: '强制退出',
  40. right: '继续下一部分',
  41. onLeft: () => {
  42. navigator.close()
  43. resolve() // 允许用户继续执行后续逻辑
  44. },
  45. onRight: () => {
  46. navigator.close()
  47. tryGoNextStep()
  48. reject('操作终止,用户选择继续做题')
  49. }
  50. })
  51. } else {
  52. // c 已经全部完成
  53. navigator.open([], '您已经做完所有题,是否提交生成报告', {
  54. left: '强制退出',
  55. right: '生成报告',
  56. onLeft: () => {
  57. navigator.close()
  58. resolve() // 允许用户继续执行后续逻辑
  59. },
  60. onRight: () => {
  61. navigator.close()
  62. commitPaper()
  63. reject('操作终止,用户选择生成报告')
  64. }
  65. })
  66. }
  67. })
  68. },
  69. uncompletedCheckForSubmit: (navigator) => {
  70. // 彻底重写该方法,该方法在为step-paper-navigator提供按钮响应逻辑。
  71. // 因为和题库试卷交互有异,这里是要直接引导用户做完多个步骤的所有题,最后生成报告
  72. const prev = {left: '上一题', leftType: 'primary'}, next = {right: '下一题'}
  73. if (!questions.value.length) {
  74. // 没有题时静默不动,不能随意推动step,
  75. // 因为当前逻辑只关心当前step的题是否做完,如果多跳步骤就会漏掉检测,可能产生错误提交
  76. prev.onLeft = fnPlaceholder
  77. next.onRight = fnPlaceholder
  78. return {...prev, ...next}
  79. }
  80. if (hasPrev.value) {
  81. // 没有题时也默认走这个分支
  82. prev.onLeft = () => {
  83. tryGoPrev()
  84. }
  85. } else {
  86. prev.onLeft = () => {
  87. tryGoPrevStep()
  88. }
  89. }
  90. if (hasNext.value) {
  91. next.onRight = () => {
  92. tryGoNext()
  93. }
  94. } else if (unansweredQuestions.value.length) {
  95. next.right = hasNextStep.value ? '下一题' : '生成报告'
  96. // 确保进入下一步之前完成了所有答题
  97. next.onRight = () => {
  98. navigator.open(unansweredQuestions.value, '您还有未完成的题', {
  99. left: '',
  100. right: '去做题',
  101. onRight: () => {
  102. navigator.close()
  103. goToQuestion(_.first(unansweredQuestions.value))
  104. }
  105. })
  106. }
  107. } else if (hasNextStep.value) {
  108. next.onRight = () => {
  109. doChunk()
  110. tryGoNextStep()
  111. }
  112. } else {
  113. next.right = '生成报告'
  114. next.onRight = () => {
  115. doChunk()
  116. commitPaper()
  117. }
  118. }
  119. return {...prev, ...next}
  120. }
  121. }
  122. return useProvidePaperNavigationService(paperService, questionService, overrides)
  123. }