/* * @Description: 微信端代码编辑器 * @Author: tangjiang * @Github: * @Date: 2020-01-15 09:56:34 * @LastEditors : tangjiang * @LastEditTime : 2020-01-18 11:51:42 */ import './index.scss'; import React, {useState, useEffect, useRef} from 'react'; import MonacoEditor from '@monaco-editor/react'; import { Input, Icon } from 'antd'; import { connect } from 'react-redux'; import actions from '../../redux/actions'; import cookie from 'react-cookies'; const { TextArea } = Input; const App = (props) => { const { isShow, wxCode, path, showLoading, showDialog, gold, experience, next_game, // userCode, testCase = [], getWXCode, last_compile_output, test_sets_count, sets_error_count, getWXCodeTestCase, restoreWXCode, updateWXCodeForEditor, updateWXCodeForInterval, evaluateWxCode, showWXCodeTextCase, changeWXCodeEvaluateLoading, changeWXCodeEvaluateDialog } = props; const {identifier} = props.match.params; // 获取路径参数 const setCookier = () => { const _params = window.location.search; if (_params) { let _search = _params.split('?')[1]; _search.split('&').forEach(item => { // console.log(item); const _arr = item.split('='); cookie.remove(_arr[0], { path: '/', domain: '.educoder.net' }); cookie.save(_arr[0], _arr[1], { path: '/', domain: '.educoder.net' }); }); } } setCookier(); const [isActive, setIsActive] = useState(-1); const [tip, setTip] = useState(''); const [codes, setCodes] = useState(wxCode); // const [showInfo, setShowInfo] = useState(false); // const [isVisible, setIsVisible] = useState(false); useEffect(() => { if (codes !== props.wxCode) { setCodes(props.wxCode); } }, [props]); const editorRef = useRef(null); let timer = null; const loadResult = (identifier) => { // 加载代码块内容 getWXCode(identifier); // 加载测试集 const params = { path, status: 0, retry: 1 }; getWXCodeTestCase(identifier, params); } useEffect(() => { setTimeout(() => { setCookier(); loadResult(identifier); }, 0); }, []); // 关闭 const handleCloseTestCase = () => { // setIsVisible(false); showWXCodeTextCase(false) } // 测试集 const handleClickTestCase = () => { // setIsVisible(true); showWXCodeTextCase(true) } // 编辑器代码 const handleEditorChange = (origin, monaco) => { editorRef.current = monaco; // 获取当前monaco实例 // setEditCode(origin); // 保存编辑器初始值 editorRef.current.onDidChangeModelContent(e => { // 监听编辑器内容的变化 // TODO 需要优化 节流 const val = editorRef.current.getValue(); // console.log('编辑器代码====>>>>', val); // updateWXCodeForEditor(val); codeChange(val); }); }; const codeChange = (code) => { // console.log(code); updateWXCodeForEditor(code); if (!timer) { timer = setInterval(function () { clearInterval(timer); timer = null; // 调用更新代码 updateWXCodeForInterval(identifier, path); }, 5000); } } // 关闭单个测试集 const handleCloseItem = (i, flag) => { if (!flag) return; setIsActive(isActive === i ? -1 : i); } // 初始化 const handleResetCode = () => { clearInterval(timer); timer = null; const result = window.confirm('你在本文件中修改的内容将丢失, 是否确定重新加载初始代码?'); if (result) { setTip('初始化中...'); changeWXCodeEvaluateLoading(true); identifier && restoreWXCode(identifier, { path }); } } // 评测 const handleEvalateCode = () => { changeWXCodeEvaluateLoading(true); evaluateWxCode(identifier, path); setTip('评测中...'); } // 关闭弹框 const handleCloseDialog = () => { changeWXCodeEvaluateDialog(false); } // 查看测试集 const handleClickShowResult = () => { showWXCodeTextCase(true); changeWXCodeEvaluateDialog(false); } // 下一关 const handleClickNext = () => { changeWXCodeEvaluateDialog(false); loadResult(next_game); } const tcclasses = isShow ? `wx-code-test-case active` : 'wx-code-test-case'; const loading = showLoading ? 'code-evaluate-loading active' : 'code-evaluate-loading'; const dialog = showDialog ? 'pass-dialog active' : 'pass-dialog'; const _val = +sets_error_count === 0; let resultTxt = (_val) ? '全部通过' : `${sets_error_count}组测试结果不匹配`; const iclasses = _val ? 'iconfont icon-wancheng icon success' : 'iconfont icon-tishi1 icon fail'; const tclasses = _val ? 'result-txt success' : 'result-txt fail'; const ulClasses = !!last_compile_output ? 'case-list hasResult' : 'case-list'; const resultFlag = !!last_compile_output ? 'wxcode-test-result active' : 'wxcode-test-result'; // console.log('==========>>>>>>>> 评测结果样式', last_compile_output, resultFlag); return (
初始化 测试集
{/* */}
{/* 测试集 */}
共{testCase.length}个测试用例 关闭
{test_sets_count - sets_error_count}/{test_sets_count} {resultTxt}
    { testCase.map((item, i) => { const {input, output, actual_output, is_public, result, compile_success} = item; const _classes = isActive === i ? 'case-item-desc active' : 'case-item-desc'; const iconclasses = isActive === i ? 'iconfont icon-sanjiaoxing-down icon active' : 'iconfont icon-triangle icon'; const headerClasses = is_public ? 'item-header-desc active' : 'item-header-desc'; // console.log(_classes); return (
  • handleCloseItem(i, is_public)}>

    测试集{i + 1}

    { is_public ? compile_success > 0 ? result ? : : '' : 隐藏测试集,暂不支持解锁和查看 // is_public // ? result ? // : ) // : ( // 隐藏测试集,暂不支持解锁和查看 // {/* {result // ? // : // } */} // ) }
    测试输入 {input || '-'} 预期输出 {/* */} */} 实际输出