import React from 'react'; import Fullscreen from 'react-fullscreen-crossbrowser'; import './index.less'; import Page from '@src/containers/Page'; import { randomList, sortListWithOrder, resortListWithOrder } from '@src/services/Tools'; import { Question } from '../../../stores/question'; import Base from './base'; import Sentence from './sentence'; import { ExaminationOrder } from '../../../../Constant'; import { Main } from '../../../stores/main'; import { My } from '../../../stores/my'; export default class extends Page { init() { this.singleTime = null; this.singleInterval = null; this.stages = {}; this.stage = ''; this.stageInterval = null; this.stageTime = 0; this.stageNumber = 0; this.stageProcess = { number: 0, time: 0 }; this.relaxProcess = { time: 0 }; this.startInterval = null; this.startTime = 0; this.baseRef = null; this.sentenceRef = null; } initState() { return { setting: {}, report: {}, question: {}, userQuestion: {}, paper: {}, scene: null, }; } initData() { const { type, id } = this.params; // type 是获取基础paper的表信息 // 等同于PaperOrigin Question.getPaper(type, id).then(paper => { this.setState({ paper }); let handler = null; if (paper.paperModule === 'examination') { // 模考获取配置信息 handler = Main.getExaminationNumber().then(result => { Object.keys(result).forEach(key => { result[key].time = Number(result[key].time); result[key].number = Number(result[key].number); }); this.stages = result; this.relaxProcess = { time: 8 * 60 }; }); } else { handler = Promise.resolve(); } const { r } = this.state.search; if (r) { handler.then(() => { this.continue(r); }); } else if (paper.paperModule === 'sentence') { // 长难句没有设置,直接开始 handler.then(() => { this.start({}); }); } else { this.setState({ scene: 'start' }); // 模考cat1分钟自动开始 if (paper.isAdapt > 1) { this.startWaitTime(); } } handler.catch(() => { goBack(); }); }); } setSetting(newSetting) { const { setting } = this.state; this.setState({ setting: Object.assign(setting, newSetting) }); } start(setting) { const { type, id } = this.params; return Question.start(type, id, setting).then(report => { if (report.isFinish) { return this.finish(); } this.setState({ report, scene: 'question' }); // 开始统计做题进度 if (report.paperModule === 'examination') { const { order } = setting; this.initStage(order[0], 0, 0); } return this.next(); }); } continue(reportId) { return Question.continue(reportId) .then(report => { if (report.isFinish) { throw new Error('做题结束,请先重置'); } this.setState({ report, scene: 'questionn' }); // 更新当前做题进度 if (report.paperModule === 'examination') { const { stage, time, number } = report.setting; this.initStage(stage, time[stage], number[stage]); } return this.next(); }) .catch(() => { Question.reportLink({ report: { id: reportId } }, false); }); } next() { const { report, scene } = this.state; const { setting = {} } = report; if (scene === 'relax') { this.nextStage(); } return Question.next(report.id) .then(userQuestion => { const questionSetting = {}; if (setting.disorder) { const { questions } = userQuestion.question.content; if (questions) { // 乱序显示选项 questionSetting.questions = []; questions.forEach(q => { const order = randomList(q.select.length); q.select = sortListWithOrder(q.select, order); questionSetting.questions.push(order); }); } } this.setState({ userQuestion, question: userQuestion.question, questionSetting, scene: 'question', }); this.singleQuestionTime(); return true; }) .catch(err => { if (err.message === 'finish') { // 考试结束 return this.finish(); } return false; }); } submit(answer) { const { report, userQuestion, questionSetting, singleTime } = this.state; const { setting = {} } = report; if (setting.disorder) { const { questions } = answer; if (questions) { // 还原乱序选项 questions.forEach((q, index) => { const order = questionSetting.questions[index]; Object.keys(q).forEach(k => { if (q[k]) q[k] = resortListWithOrder(q[k], order); }); }); } } return Question.submit(userQuestion.id, answer, singleTime, questionSetting).then(() => { this.singleQuestionTime(true); // 更新模考做题进度 if (report.paperModule === 'examination') { this.stageNumber += 1; if (this.stageNumber >= this.stageProcess.number) { // 进入休息 this.relaxStage(); } } }); } // 主动进入下一阶段 stage() { const { report } = this.state; return Question.stage(report.id) .then(() => { this.baseRef.expireTime(() => { this.relaxStage(); }); }); } finish() { const { report } = this.state; return Question.finish(report.id) .then(() => { // 跳转到报告页 Question.reportLink({ report }, false); // this.setState({ scene: 'finish' }); }) .catch(() => { Question.reportLink({ report }, false); }); } singleQuestionTime(stop) { if (this.singleInterval) { clearInterval(this.singleInterval); this.singleInterval = null; } if (!stop) { this.singleTime = 0; this.singleInterval = setInterval(() => { this.singleTime += 1; this.setState({ singleTime: this.singleTime }); }, 1000); } } stageQuestionTime(initTime, stop) { if (this.stageInterval) { clearInterval(this.stageInterval); this.stageInterval = null; this.stageTime = initTime; } if (!stop) { this.stageInterval = setInterval(() => { this.stageTime += 1; if (this.stageTime >= this.stageProcess.time) { this.stageQuestionTime(0, true); const { scene } = this.state; if (scene === 'relax') { // 进入下一阶段,获取下一题 this.next(); } else { // 提交当前阶段 this.stage(); } } this.setState({ stageTime: this.targetProcess.time - this.stageTime }); }, 1000); } } startWaitTime() { if (this.startInterval) { clearInterval(this.startInterval); this.startInterval = null; } this.startInterval = setInterval(() => { this.startTime += 1; // 1分钟等待: 自动提交第一选择 const { scene } = this.state; if (scene !== 'start') { clearInterval(this.startInterval); this.startInterval = null; } else if (this.startTime >= 60) { clearInterval(this.startInterval); this.startInterval = null; this.start(Object.assign({ order: ExaminationOrder[0].value }, this.state.setting)); } this.setState({ startTime: 60 - this.startTime }); }, 1000); } nextStage() { const { report } = this.state; // 进入下一阶段 const { order } = report.setting; this.stage = order[order.indexOf(this.stage) + 1]; this.stageProcess = this.stages[this.stage]; this.stageNumber = 0; this.stageQuestionTime(0); } relaxStage() { this.stageProcess = this.relaxProcess; this.stageNumber = 0; this.stageQuestionTime(0); this.setState({ scene: 'relax', }); } initStage(stage, time, number) { this.stage = stage; this.stageProcess = this.stages[stage]; this.stageTime = time; this.stageNumber = number; this.stageQuestionTime(time); } toggleFullscreen() { const { isFullscreenEnabled } = this.state; this.setState({ isFullscreenEnabled: !isFullscreenEnabled }); } toggleCollect() { const { userQuestion = {} } = this.state; if (!userQuestion.collect) { My.addQuestionCollect(userQuestion.questionNoId).then(() => { userQuestion.collect = true; this.setState({ userQuestion }); }); } else { My.delQuestionCollect(userQuestion.questionNoId).then(() => { userQuestion.collect = false; this.setState({ userQuestion }); }); } } renderView() { return ( this.setState({ isFullscreenEnabled })} > {this.renderDetail()} ); } renderDetail() { const { scene, paper, userQuestion } = this.state; if (!paper.id || !scene) return null; switch (paper.paperModule) { case 'sentence': return { this.sentenceRef = ref; }} key={userQuestion.id} {...this.state} flow={this} mode='process' />; default: return { this.baseRef = ref; }} key={userQuestion.id} {...this.state} flow={this} mode='process' />; } } }