import React, { Component } from 'react'; import axios from 'axios' import { Spin, Icon } from 'antd' import ClipboardJS from 'clipboard' import VNCDisplay from './VNCDisplay' import FloatButton from './component/FloatButton' import SecondDrawer from './component/SecondDrawer' import RepoTree from './component/repo/RepoTree' import TPIMonaco from './component/monaco/TPIMonaco' import notEditablePathImg from '../../images/tpi/notEditablePath.png' import { Drawer } from "antd"; import './VNC.css' const $ = window.$; const firstDrawerWidth = 260; class VNCContainer extends Component { constructor(props) { super(props) this.state = { fileTreeSelectedKeys: [], repositoryCode: '', displayKey: 1, vnc_reseting: false, saving: false, } } componentDidMount() { if (!this.clipboard) { const clipboard = new ClipboardJS('.copybtn'); clipboard.on('success', (e) => { this.props.showSnackbar('复制成功') }); this.clipboard = clipboard } } // shouldComponentUpdate () { // return false; // } getSecondDrawerWidth = () => { return $('#game_right_contents').width() - firstDrawerWidth } onEditBlur = () => { console.log('blurblur') this.doFileUpdateRequestOnCodeMirrorBlur() } doFileUpdateRequestOnCodeMirrorBlur = () => { if (!this.currentPath) { console.error('未找到文件path') return; } const { myshixun, game } = this.props var url = `/myshixuns/${myshixun.identifier}/update_file.json` const codeContent = window.editor_monaco.getValue() this.setState({saving: true}) axios.post(url, { content: codeContent, // 评测的时候传1,其它情况不用传,主要是为了区分是用户自己提交还是自动提交 // evaluate: 0, game_id : game.id, path: this.currentPath } ).then(res => { this.setState({saving: false}) }).catch(e => { this.setState({saving: false}) console.error('update_file error') }) } renderSecondDrawerChildren = () => { const { readingCodeLoading, repositoryCode, saving } = this.state; const { shixun } = this.props const height = $(window).height() - 130 const isEditablePath = false; return (
{/* (isEditablePath ? 'none' : 'block') */}
); } fetchReadRepositoryCode = (path) => { this.currentPath = path; const status = 1 const fetchRepoCodeUrl = `/tasks/${this.props.game.identifier}/rep_content.json?path=${path}&status=${status}` this.setState({ readingCodeLoading: true }); axios.get(fetchRepoCodeUrl, { }).then((fetchReadRepositoryCodeResponse) => { if (fetchReadRepositoryCodeResponse.data.content || fetchReadRepositoryCodeResponse.data.content == "") { this.setState({ repositoryCode: fetchReadRepositoryCodeResponse.data.content, readingCodeLoading: false }) } else { this.setState({ readingCodeLoading: false }); } // this.setState({ isEditablePath, currentPath: path }); }).catch(error =>{ console.log(error) this.setState({ readingCodeLoading: false }); this.props.showSnackbar(`服务端异常,请联系管理员!`); }) } onTreeSelect = (selectedKeys, info) => { const isLeaf = info.node.isLeaf(); if (isLeaf) { // 叶子节点 selectedKeys.length && this.setState({ fileTreeSelectedKeys: selectedKeys }) this.refs["secondDrawer"].showSecondDrawer() console.log('leaf clicked') const nodePath = info.node.props.eventKey; if (nodePath) { const filetype = nodePath.split('.').pop().toLowerCase(); if (filetype == 'jpg' || filetype == 'png' || filetype == 'gif' || filetype == 'jpeg' || filetype == 'jar' || filetype == 'exe' || filetype == 'doc' || filetype == 'pdf' || filetype == 'xsl' || filetype == 'ppt') { this.props.showSnackbar(`不支持加载${filetype}类型的文件。`) return; } this.fetchReadRepositoryCode(nodePath); } else { console.error('no eventKey:', info.node) } } } onBottomDrawerClose = () => { this.setState({ bottomDrawer: false }) } swtichBottomDrawer = () => { this.setState({ bottomDrawer: !this.state.bottomDrawer }) } showCodeEvaluate = () => { this.setState({ bottomDrawer: true }) } onResetVNC = () => { if (this.state.vnc_reseting) return; // 桌面系统将恢复到初始状态,您在系统中创建的数据可能会丢失 // 请确保您的数据已保存(如:版本库代码已推送到服务器) // 是否确认重置? this.props.confirm({ content:
桌面系统将恢复到初始状态,您在系统中创建的数据可能会丢失
请确保您的数据已保存(如:版本库代码已推送到服务器)
是否确认重置?
, onOk: () => { const url = `/tasks/${this.props.game.identifier}/reset_vnc_link.json` this.setState({ vnc_reseting: true }) axios.get(url, { }).then((response) => { if (response.data.data && response.data.data.vnc_url) { // reset this.setState({ displayKey: this.state.displayKey + 1, vnc_url: response.data.data.vnc_url, vnc_reseting: false }) } else { } // this.setState({ isEditablePath, currentPath: path }); }).catch(error =>{ console.log(error) this.setState({ vnc_reseting: false }); this.props.showSnackbar(`服务端异常,请联系管理员!`); }) console.log('doooo') }, onCancel() { console.log('Cancel'); }, }) } /* selectedKeys={fileTreeSelectedKeys} onSelect={onTreeSelect} */ render() { const { challenge, vnc_url, git_url } = this.props const secondDrawerChildren = this.renderSecondDrawerChildren(); return (
网址克隆
{/* */} {this.state.vnc_reseting ? : } 重置桌面系统 {/* */} { if (visible) { const canvas = $('.vncDisply canvas')[0] canvas && canvas.focus() } }} > { this.props.codeEvaluate } 测试集
); } } export default VNCContainer;