You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/public/react/src/modules/page/layers/TaskResultLayer.js

248 lines
9.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import React, { Component } from 'react';
import { Redirect } from 'react-router';
import PropTypes from 'prop-types';
import Rate from 'rc-rate';
import Tooltip from 'material-ui/Tooltip';
import './TaskResultLayer.css'
import moment from 'moment';
import passallImg from '../../../images/tpi/passall.png'
import passpartImg from '../../../images/tpi/passpart.png'
import empiricgreenImg from '../../../images/tpi/empiricgreen.png'
import { trigger } from 'educoder';
import SecondTab from "../../paths/SchoolStatistics/SecondTab";
class TaskResultLayer extends Component {
constructor(props) {
super(props)
this.goNext = false;
this.state = {
stared: false,
timeRemain: 0,
}
}
componentWillReceiveProps(newProps, newContext) {
if (newProps.currentGamePassed && (!this.props.currentGamePassed
|| (newProps.currentGamePassed !== this.props.currentGamePassed ))) {
// this.fakeRanking = this._fakeRanking()
const $ = window.$;
let isLastGame = newProps.game_count === newProps.challenge.position;
setTimeout(()=>{
// true ||
if ( isLastGame) {
var dClass = 'zoomInDown' ;$('.passTaskContent').show().addClass(dClass + ' animated');
setTimeout( function(){$('.passTaskContent').removeClass(dClass + ' animated')}, 1000)
} else {
var dClass = 'zoomIn' ;$('.passTaskContent').show().addClass(dClass + ' animated');
setTimeout( function(){$('.passTaskContent').removeClass(dClass + ' animated')}, 1000)
}
}, 100)
if (newProps.challenge.showLanguagePictrue == true) {
// 开启倒计时
// this.initEffectDisplayServerTimer()
}
}
}
onStarChange(challenge, index, value) {
this.props.onStarChange(challenge, index, value);
this.setState({
stared: value ? true : false,
})
}
onFinish(goNext) {
const { stared } = this.state;
const { game, challenge, shixun, showSnackbar, next_game } = this.props;
if (!stared && !this.props.game.star && shixun.status >= 2 ) { // 没点评星 && 未评星 && 实训已发布(模拟实战可以继续)
showSnackbar('请先给该任务评星,谢谢。')
return;
}
// 点击了查看效果,而非查看下一关
if (!goNext) {
if (challenge.showWebDisplayButton === true && challenge.webDisplayUrl) {
// 打开web效果查看页面
window.open(challenge.webDisplayUrl, '_blank');
return;
} else {
trigger('showWebDisplayEvent')
}
}
if (!game.star) { // 当前关卡没有评星,评星后再跳转
this.props.saveChallengeStar(game, challenge.position);
}
// 跳转到下一关
// https://stackoverflow.com/questions/29244731/react-router-how-to-manually-invoke-link
// this.context.router.push('/sample');
if (goNext === true) {
if (next_game) { // https://www.trustie.net/issues/18573
this.goNext = true;
}
// 隐藏掉效果查看页面
window.$('#picture_display').hide()
}
this.props.onGamePassed();
this.setState({
stared: false
})
}
_fakeRanking() {
const { cost_time } = this.props.game
if (cost_time > 60 * 10) {
return Math.floor(Math.random()*11)+20
}
return Math.floor(( (600 - cost_time) / 600) * 100)
}
// componentDidUpdate(prevProps) {
// if (!this.props.challenge) {
// return;
// }
// const { showLanguagePictrue } = this.props.challenge;
// if ( prevProps.challenge.showLanguagePictrue != showLanguagePictrue &&
// showLanguagePictrue == true ) {
// }
// }
initEffectDisplayServerTimer = () => {
this.setState({ timeRemain: 5 * 60 }, () => {
this.intervalHandler = setInterval(() => {
let timeRemain = this.state.timeRemain
if (timeRemain > 0) {
timeRemain = timeRemain - 1;
} else {
clearInterval(this.intervalHandler);
}
this.setState({ timeRemain })
}, 1000)
})
}
componentWillUnmount() {
this.intervalHandler && clearInterval(this.intervalHandler);
}
render() {
if (!this.props.challenge || !this.props.challenge.id) {
return <div></div>
}
const { shixun } = this.props;
const { stared } = this.state;
let { currentGamePassed, currentPassedGameGainGold, currentPassedGameGainExperience,
game_count, challenge, next_game, game, closeTaskResultLayer } = this.props;
// TODO closeTaskResultLayer的时候没有调用评星接口
// 如果时最后一关,图片要换
let isLastGame = game_count === challenge.position; // false //
// TODO 这个用法有点蹩脚
if (this.goNext && next_game) {
this.goNext = false;
return <Redirect push to={`/tasks/${next_game}`} />;
}
if (shixun.status <= 1 || game.isPassThrough == true) { // 模拟实战
game.star = 8; // 跳过评星
}
const titleObj = {
title: game.star ? '' : '请先给该任务评星,谢谢。'
}
// const fakeRanking = this.fakeRanking;
return (
<div>
{currentGamePassed ?
<div className="taskResultLayer">
<div className="pr passTaskContent" style={{display:'none'}} >
<i className="far fa-times-circle closeIcon" onClick={closeTaskResultLayer} title="关闭"></i>
<img src={isLastGame? passallImg : passpartImg} width="652px" className="passTaskImg"/>
<div className="winpPerson expGold">
<p className="inline inlines"><span className=" goldring"/>
{currentPassedGameGainGold >= 0 ? `+${currentPassedGameGainGold}` : '+0'}
</p>
<p className="inline inlines exp">
<img src={empiricgreenImg} className="mr8 mt5 fl"/>
{currentPassedGameGainExperience >= 0 ? `+${currentPassedGameGainExperience}` : '+0'}
</p>
</div>
<div className="winPanel">
<style>
{
`
.page--body{
z-index: 0 !important;
}
`
}
</style>
<div className="cl"></div>
{ !game.star ?
<React.Fragment>
<p className="rateLabel ">您的评价决定老师的江湖地位~</p>
<Rate
defaultValue={0}
allowClear={false}
onChange={(value) => this.onStarChange(this.props.game, this.props.challenge.position, value)}
/>
</React.Fragment>
: ''}
<p>
{/*<a href="javascript:void(0)" className="passNext">下一关</a>*/}
<a href="javascript:void(0)" className={`passed ${ stared || game.star ? 'stared' : '' }`}
{...titleObj} onClick={()=>this.onFinish(true)}>{ next_game ? '下一关' : '完成'}</a>
{ challenge.showLanguagePictrue &&
<a href="javascript:void(0)" className={`passed ${ stared || game.star ? 'stared' : '' }`}
{...titleObj} onClick={()=>this.onFinish()}>
{ `查看效果` }
{/* ${ moment(this.state.timeRemain * 1000).format('mm:ss') } */}
</a>
}
{/*
(this.state.timeRemain ?
<Tooltip title={"注意效果查看服务只会保留5分钟"} disableFocusListener={true}>
</Tooltip>
:
<Tooltip title={"效果查看服务已被终止运行,需要重新评测后才能查看"} disableFocusListener={true}>
<a href="javascript:void(0)" className={`passed ${ stared || game.star ? 'stared' : '' }`}
{...titleObj} onClick={()=>{}} style={{ backgroundColor: 'gray'}}>
{ `查看效果` }
</a>
</Tooltip>
)
*/}
{/*
注意效果查看服务只会保留5分钟
效果查看服务已被终止运行,需要重新评测后才能查看
*/}
</p>
</div>
</div>
</div>
:
<div></div>
}
</div>
);
}
}
export default TaskResultLayer;