import React from 'react';
import './index.less';
import { Link } from 'react-router-dom';
import Page from '@src/containers/Page';
import { asyncConfirm } from '@src/services/AsyncTools';
import { formatTreeData, getMap, formatSeconds, formatDate } from '@src/services/Tools';
import Continue from '../../../components/Continue';
import Step from '../../../components/Step';
import List from '../../../components/List';
import Tabs from '../../../components/Tabs';
import Module from '../../../components/Module';
import Input from '../../../components/Input';
import Button from '../../../components/Button';
import Division from '../../../components/Division';
import Card from '../../../components/Card';
import ListTable from '../../../components/ListTable';
import ProgressText from '../../../components/ProgressText';
import IconButton from '../../../components/IconButton';
import { Main } from '../../../stores/main';
import { My } from '../../../stores/my';
import { Sentence } from '../../../stores/sentence';
import { Question } from '../../../stores/question';
import { Course } from '../../../stores/course';
import { User } from '../../../stores/user';
const SENTENCE = 'sentence';
const PREVIEW = 'preview';
const PREVIEW_CLASS = 'PREVIEW_CLASS';
const PREVIEW_LIST = 'PREVIEW_LIST';
const exerciseColumns = [
{
title: '练习册',
width: 250,
align: 'left',
render: item => {
return (
);
},
},
{
title: '正确率',
width: 150,
align: 'left',
render: item => {
return (
--
{item.stat.totalCorrect / item.stat.totalNumber}
);
},
},
{
title: '全站用时',
width: 150,
align: 'left',
render: item => {
return (
--
全站{item.stat.totalTime / item.stat.totalNumber}s
);
},
},
{
title: '最近做题',
width: 150,
align: 'left',
render: () => {
return (
);
},
},
{
title: '操作',
width: 180,
align: 'left',
render: item => {
return (
{!item.report && (
this.start('preview', item)} />
)}
{item.report.id && !item.report.isFinish && (
this.continue('preview', item)}
/>
)}
{item.report.id && (
this.restart('preview', item)} />
)}
);
},
},
{
title: '报告',
width: 30,
align: 'right',
render: item => {
return (
{item.report.isFinish && this.viewReport(item)} />}
);
},
},
];
export default class extends Page {
constructor(props) {
super(props);
this.sentenceColums = [
{
title: '练习册',
width: 250,
align: 'left',
render: (record) => {
let progress = 0;
if (record.report) {
progress = record.report.userNumber * 100 / record.report.questionNumber;
}
return (
);
},
},
{
title: '正确率',
width: 150,
align: 'left',
render: (record) => {
let correct = '--';
if (record.report) {
correct = `${record.report.userCorrect * 100 / record.report.userNumber}%`;
}
return (
{correct}
全站{record.stat.totalCorrect * 100 / record.stat.totalNumber}%
);
},
},
{
title: '全站用时',
width: 150,
align: 'left',
render: (record) => {
let time = '--';
if (record.paper) {
time = record.paper.report.userTime / record.paper.report.userNumber;
}
return (
{formatSeconds(time)}
全站{formatSeconds(record.stat.totalTime / record.stat.totalNumber)}
);
},
},
{
title: '最近做题',
width: 150,
align: 'left',
render: (record) => {
if (!record.report) return null;
return (
{formatDate(record.report.updateTime, 'YYYY-MM-DD')}
{formatDate(record.report.updateTime, 'HH:mm')}
);
},
},
{
title: '操作',
width: 180,
align: 'left',
render: (record) => {
return (
{!record.report && {
this.start('sentence', record);
}} />}
{!record.report.isFinish && {
this.continue('sentence', record);
}} />}
{
this.restart(record);
}} />
);
},
},
{
title: '报告',
dataIndex: 'report',
width: 30,
align: 'right',
render: (text, record) => {
if (!record.report || !record.report.isFinish) return null;
return (
{
this.viewReport(record);
}} />
);
},
},
];
}
initState() {
this.code = null;
this.columns = exerciseColumns;
this.exerciseProgress = {};
this.inited = false;
return {
tab1: SENTENCE,
tab2: '',
pt: PREVIEW_CLASS,
tabs: [],
allClass: [],
classProcess: {},
};
}
init() {
Main.getExercise().then(result => {
const list = result.map((row) => {
row.title = `${row.titleZh}${row.titleEn}`;
row.key = row.extend;
return row;
});
const map = getMap(list, 'key');
const tabs = formatTreeData(list, 'id', 'title', 'parentId');
tabs.push({ key: PREVIEW, name: '预习作业' });
this.setState({ tabs, map });
this.inited = true;
this.refreshData();
});
}
initData() {
const { info = {} } = this.props.user;
if (info.latestExercise) {
// 获取最后一次做题记录
Question.baseReport(info.latestExercise).then((result) => {
this.setState({ latest: result });
});
}
const data = Object.assign(this.state, this.state.search);
this.setState(data);
if (this.inited) this.refreshData();
}
refreshData(tab) {
const { tab1 } = this.state;
switch (tab || tab1) {
case SENTENCE:
this.refreshSentence();
break;
case PREVIEW:
this.refreshPreview();
break;
default:
this.refreshExercise(tab || tab1);
}
}
refreshSentence() {
const { sentence } = this.state;
if (!sentence) {
// User.clearSentenceTrail();
Sentence.getInfo().then(result => {
// result.code = '123123';
result.trailPages = 20;
this.setState({ sentence: result });
return result;
})
.then(({ code, trailPages, chapters }) => {
return Sentence.listArticle().then(result => {
const chapterSteps = [];
const chapterMap = {};
const map = {};
const trailArticles = [];
let totalPage = 0;
let introduction = null;
let exerciseChapter = null;
let index = 0;
let lastChapter = -1;
chapters.forEach(row => {
chapterMap[row.value] = row;
if (row.exercise) exerciseChapter = row;
});
result.forEach((article) => {
if (article.chapter === 0) introduction = article;
if (!map[article.chapter]) {
map[article.chapter] = [];
}
article.startPage = totalPage + 1;
article.endPage = totalPage + article.pages;
if (article.chapter) {
article.position = `${article.chapter}.${article.part}`;
} else {
// 设置list中的样式
article.style = 'introduction';
}
totalPage += article.pages;
if (article.startPage < trailPages) {
if (lastChapter !== article.chapter) {
lastChapter = article.chapter;
trailArticles.push(Object.assign({ articles: [] }, chapterMap[article.chapter] || {}));
}
trailArticles[trailArticles.length - 1].articles.push(article);
}
map[article.chapter].push(article);
});
if (!code) {
chapterSteps.push(`「${index}」试用`);
}
// 添加前言
if (introduction) {
index += 1;
chapterSteps.push(`「${index}」${introduction.title}`);
chapterMap[0] = {
title: introduction.title,
value: 0,
};
}
index += 1;
chapters.forEach(row => {
chapterSteps.push(`「${index}」${row.short}`);
index += 1;
});
this.setState({ articleMap: map, trailArticles, chapterSteps, introduction, chapterMap, exerciseChapter });
});
})
.then(() => {
return Sentence.listPaper().then(result => {
this.setState({ paperList: result, paperFilterList: result });
});
});
}
}
refreshPreview() {
const { pt } = this.state;
switch (pt) {
case PREVIEW_LIST:
this.refreshListPreview();
break;
case PREVIEW_CLASS:
default:
this.refreshClassProcess();
break;
}
}
refreshClassProcess() {
Course.classProcess().then(result => {
const classProcess = {};
for (let i = 0; i < result.length; i += 1) {
const item = result[i];
classProcess[item.category].push(item);
}
this.setState({ classProcess });
});
}
refreshListPreview() {
Question.listPreview().then(result => {
this.setState({ previews: result });
});
}
refreshExercise(tab) {
const { map, tab1 } = this.state;
let { tab2 } = this.state;
if (!map) {
// 等待数据加载
return;
}
const subject = map[tab];
// 切换tab1的情况
if (tab2 === '' || tab1 !== tab) {
tab2 = subject.children[0].key;
this.setState({ tab2 });
}
const type = map[tab2];
Main.getExerciseChildren(type.id, true).then(result => {
const exerciseChild = result;
this.setState({ exerciseChild });
});
Question.getExerciseProgress(type.id).then((r => {
const exerciseProgress = getMap(r, 'id');
this.setState({ exerciseProgress });
}));
}
onChangePreviewType(type) {
this.setState({ pt: type });
this.refreshPreview();
}
onChangeTab(level, tab) {
const { tab1, tab2 } = this.state;
// this.refreshData(tab);
this.refreshQuery(Object.assign({ tab1, tab2 }, { [`tab${level}`]: tab }));
}
previewAction(type, item) {
switch (type) {
case 'start':
this.start('preview', item);
break;
case 'restart':
this.restart(item);
break;
case 'continue':
this.continue('preview', item);
break;
default:
break;
}
}
restart(item) {
asyncConfirm('提示', '是否重置', () => {
Question.restart(item.report.id).then(() => {
this.refresh();
});
});
}
start(type, item) {
linkTo(`/paper/process/${type}/${item.id}`);
}
continue(type, item) {
linkTo(`/paper/process/${type}/${item.id}?r=${item.report.id}`);
}
viewReport(item) {
linkTo(`/paper/report/${item.report.id}`);
}
activeSentence() {
Sentence.active(this.code)
.then(() => {
// 重新获取长难句信息
User.clearSentenceTrail();
this.setState({ sentence: null, articleMap: null, paperList: null });
this.refresh();
});
}
trailSentence() {
this.setState({ sentenceInput: false });
User.sentenceTrail();
}
sentenceRead(article) {
if (article) {
linkTo(`/sentence/read?chapter=${article.chapter}&part=${article.part}`);
} else {
linkTo('/sentence/read');
}
}
sentenceFilter(value) {
const { paperList } = this.state;
const list = paperList.filter(row => {
const finish = row.paper ? row.paper.times > 0 : false;
if (value === 0) {
return !finish;
}
return finish;
});
this.setState({ paperFilterList: list, paperChecked: value });
}
clearExercise() {
My.clearLatestExercise();
this.setState({ latest: null });
}
renderView() {
const { tab1 = {}, tab2 = {}, tabs, map = {}, latest } = this.state;
const children = (map[tab1] || {}).children || [];
return (
{latest &&
{
this.clearExercise();
}}
onContinue={() => {
}}
onRestart={() => {
}}
onNext={() => {
}} />}
{
this.onChangeTab(1, key);
}} />
{children.length > 1 && this.onChangeTab(2, key)} />}
{tab1 !== SENTENCE && tab1 !== PREVIEW && this.renderExercise()}
{tab1 === SENTENCE && this.renderSentence()}
{tab1 === PREVIEW && this.renderPreview()}
);
}
renderPreview() {
const { previewType } = this.state;
switch (previewType) {
case PREVIEW_CLASS:
return this.renderPreviewClass();
case PREVIEW_LIST:
return this.renderPreviewList();
default:
return ;
}
}
renderPreviewClass() {
const { allClass, classProcess } = this.state;
return (
完成情况
this.onChangePreviewType(PREVIEW_LIST)}>
全部作业 >
{allClass.map(item => {
return ;
})}
);
}
renderPreviewList() {
const { previews } = this.state;
return (
全部作业
this.onChangePreviewType(PREVIEW_CLASS)}>
我的课程 >
);
}
renderSentence() {
const { sentence = {}, sentenceInput } = this.state;
const { sentenceTrail } = this.props.user;
if (sentenceInput !== true && (sentence.code || sentenceTrail)) {
return this.renderSentenceArticle();
}
return this.renderInputCode();
}
renderSentenceArticle() {
const { sentence = {}, introduction, chapterSteps, chapterStep = 1, exerciseChapter = {}, chapterMap = {}, articleMap = {}, trailArticles = [], paperFilterList = [], paperList = [], paperChecked } = this.state;
const { sentenceTrail } = this.props.user;
let maxStep = 0;
if (sentenceTrail) {
// 试用只能访问第一step
maxStep = 1;
// 查找练习章节
}
// 减去前言计算chapter
const chapter = introduction ? chapterStep - 1 : chapterStep;
const chapterInfo = chapterMap[chapter] || {};
let isExercise = false;
if (chapterInfo && chapterInfo.exercise) {
isExercise = true;
}
return
{sentence.code &&
CODE: {sentence.code}
}
{sentenceTrail &&
}
{
this.setState({ chapterStep: step });
}}
message='请购买后访问'
maxStep={maxStep}
/>
{/* 正常前言 */}
{sentence.code && chapter === 0 &&
{
this.sentenceRead();
}}
/>}
{/* 正常文章 */}
{sentence.code && chapter && !isExercise && {
this.sentenceRead(part);
}}
/>}
{/* 正常练习 */}
{sentence.code && isExercise && {
this.sentenceFilter(item.key);
},
}]}
data={paperFilterList}
columns={this.sentenceColums}
/>}
{/* 试读文章 */}
{sentenceTrail && trailArticles.map((info) => {
return {
this.sentenceRead(part);
}}
/>;
})}
{/* 试练 */}
{sentenceTrail && }
;
}
renderInputCode() {
return (
输入《千行GMAT长难句》专属 Code,解锁在线练习功能。
{
this.code = value;
}} />
);
}
renderExercise() {
return ;
}
}