import React from 'react'; import AceEditor from 'react-ace'; import 'brace/mode/plain_text'; import 'brace/mode/markdown'; import 'brace/mode/json'; import 'brace/mode/javascript'; import 'brace/mode/c_cpp'; import 'brace/mode/java'; import 'brace/theme/tomorrow_night_eighties'; import 'brace/ext/searchbox'; import faTrashAlt from '@fortawesome/fontawesome-free-solid/faTrashAlt'; import faUser from '@fortawesome/fontawesome-free-solid/faUser'; import { classes, extension } from '/common/util'; import { actions } from '/reducers'; import { connect } from 'react-redux'; import { languages } from '/common/config'; import { Button, Ellipsis } from '/components'; import styles from './stylesheet.scss'; @connect(({ env, player }) => ({ env, player }), actions, null, { withRef: true }) class CodeEditor extends React.Component { constructor(props) { super(props); this.aceEditorRef = React.createRef(); } handleChangeCode(code) { const { file } = this.props; this.props.modifyFile({ ...file, content: code }); if (extension(file.name) === 'md') this.props.shouldBuild(); } handleResize() { this.aceEditorRef.current.editor.resize(); } render() { const { className, file, onClickDelete } = this.props; const { user } = this.props.env; const { lineIndicator } = this.props.player; if (!file) return null; const fileExt = extension(file.name); const language = languages.find(language => language.ext === fileExt); const mode = language ? language.mode : fileExt === 'md' ? 'markdown' : fileExt === 'json' ? 'json' : 'plain_text'; return (
this.handleChangeCode(code)} markers={lineIndicator ? [{ startRow: lineIndicator.lineNumber, startCol: 0, endRow: lineIndicator.lineNumber, endCol: Infinity, className: styles.current_line_marker, type: 'line', inFront: true, _key: lineIndicator.cursor, }] : []} value={file.content} />
Contributed by { (file.contributors || [user || { login: 'guest', avatar_url: faUser }]).map(contributor => ( )) }
); } } export default CodeEditor;