import React, { Component } from 'react'; import { Link } from 'react-router-dom'; import {CopyToClipboard} from 'react-copy-to-clipboard'; import AceEditor from 'react-ace'; import { Toast } from "antd-mobile" import {HeaderBar} from '@/common'; import { browser, http, getParam, wxShare } from '@/utils'; import './index.scss'; import 'ace-builds/src-noconflict/mode-python'; import 'ace-builds/src-noconflict/theme-dracula'; class MLClass extends Component { constructor(props) { super(props); this.state = { isWechat: browser.isWeixin, isShare: true, type: '1', // 1:课后习题,2:课堂习题 entryMode: 0, // 0:扫码页,1:落地页 isGuide: false, // 是否展示引导 isExecute: false, isCopy: false, command: '', data: {} } } componentDidMount() { this.handleFetchInfo(); this.initPageStatus(); this.initCommand(); } initCommand = () => { this.setState({ command: `${API.m}/mlShare?id=${getParam('id')}&type=${getParam('type')}&ques=${getParam('ques')}&origin=ml` }) } initPageStatus = () => { if(getParam('origin') === 'barcode') { this.setState({ entryMode: 0 }); } if(getParam('origin') === 'ml') { this.setState({ entryMode: 1 }); } if(getParam('type') === '1') { this.setState({ isShare: true }); } if(getParam('type') === '2') { this.setState({ isShare: false }); } this.setState({ type: getParam('ques') || '1' }); } handleFetchInfo = () => { const id = getParam('id') || 10; http.get(`${API.home}/m/it/share/show`, { params: { id } }).then(res => { const { code, data } = res.data; if(code === 200) { this.setState({ data, }); } }) } handleToSend = (params) => { const { history } = this.props; const { isShare } = this.state; if(browser.isWeixin) { history.push(`/mlShare?id=${getParam('id')}&type=${getParam('type')}&ques=${getParam('ques')}&origin=ml`); this.setState({ isGuide: true }); wxShare({ title: isShare? `我已在【${params.course_name}】上运行了行代码了${params.code_lines}` : `我在${params.course_name}的${this.formatTitle(params)}遇到了困难`, desc: this.formatTitle(params), link: encodeURI(location.href), imgUrl: params.course_img, }); } } formatTitle = (params) => { const { type } = this.state; if(type === '1') { return `练习-${params.ques_name}`; } if(type === '2') { return `课堂-${params.video_name}`; } } copyToSuccess = () => { Toast.info('已复制链接,快去粘贴发给好友吧~'); this.setState({ isCopy: true }); } handleToExecute = () => { this.setState({ isExecute: true }); } handleToHide = () => { this.setState({ isGuide: false }); } render() { const { isWechat, isShare, isExecute, entryMode, command, isCopy, isGuide, data } = this.state; return ( <> <HeaderBar title='机器学习小课 第一期' arrow={true} home={true} /> <PythonContent isWechat={isWechat} isShare={isShare} isExecute={isExecute} entryMode={entryMode} isGuide={isGuide} isCopy={isCopy} command={command} data={data} labelName={this.formatTitle(data)} handleToExecute={this.handleToExecute} handleToSend={() => this.handleToSend(data)} copyToSuccess={this.copyToSuccess} handleToHide={this.handleToHide} /> </> ); } } function SelfAceEditor(props) { return ( <AceEditor mode="python" theme="dracula" readOnly={true} showPrintMargin={false} value={props.code} style={{ width: '100%', height: '100%' }} /> ) } function PythonContent(props) { const { isWechat, isShare, isExecute, entryMode, isCopy, command, labelName, isGuide, data: { head_img, nickname, code_lines, code, result, course_name, course_id }, handleToSend, copyToSuccess, handleToExecute, handleToHide } = props; return ( <div className="python-container"> { isGuide && <div className="python-popup" onClick={handleToHide}> <div className="python-header"> <p className="python-wechat__title">请点击右上角分享</p> <i className="iconfont"></i> </div> </div> } <div className="python-content"> <div className="python-user"> <i className="python-user__portrait" style={{backgroundImage: `url(${head_img})`}}></i> <h2 className="python-user__id">{nickname}</h2> {/* 分享 */} { (entryMode === 0 && isShare) && <p className="python-user__desc"> 完成了 <span>【{labelName}】</span> </p> } { (entryMode === 1 && isShare) && <p className="python-user__desc"> 在 <span>【{course_name}】</span>完成了<br /> {labelName} </p> } {/* 求助 */} { (entryMode === 0 && !isShare) && <p className="python-user__desc"> 在 <span>【{labelName}】</span> 遇到了困难 </p> } { (entryMode === 1 && !isShare) && <p className="python-user__desc"> 在 <span>【{course_name}】</span>的<br /> <span>{labelName}</span>遇到了困难 </p> } </div> <h4 className="python-code__title"> {entryMode === 1 && isShare? `这是Ta的第${code_lines}行代码` : '运行结果'} </h4> <div className="python-code__content"> <SelfAceEditor code={entryMode === 1 && isShare? code : result} /> </div> <h4 className="python-code__title"> {entryMode === 1 && isShare? '运行结果' : '代码'} </h4> <div className="python-code__content"> { entryMode === 1 && isShare ? <SelfAceEditor code={isExecute? result : ''} /> : <SelfAceEditor code={code} /> } { (entryMode === 1 && isShare && !isExecute) && <button className="python-button python-button__execute" onClick={handleToExecute}>运行看看</button> } </div> </div> { (entryMode === 0 && isWechat) && <button className="python-button python-button__study" onClick={handleToSend}> {isShare? '分享给好友' : '发给好友求助'} </button> } { (entryMode === 0 && !isWechat && !isCopy) && <CopyToClipboard text={command} onCopy={copyToSuccess} > <button className="python-button python-button__study"> {isShare? '分享给好友' : '发给好友求助'} </button> </CopyToClipboard> } { (entryMode === 0 && !isWechat && isCopy) && <p className="python-button__tip">已复制链接,快去粘贴发给好友吧~</p> } { entryMode === 1 && <Link className="python-button python-button__study" to={`/ml?id=${course_id}`}>我也要学 机器学习</Link> } </div> ); } export default MLClass;