92 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var React = require('react'),
 | |
|   debug = require('debug')('freecc:comp:editor'),
 | |
|   jshint = require('jshint').JSHINT,
 | |
|   Tailspin = require('tailspin');
 | |
| 
 | |
| var Editor = React.createClass({
 | |
| 
 | |
|   propTypes: {
 | |
|     onValueChange: React.PropTypes.func,
 | |
|     value: React.PropTypes.string
 | |
|   },
 | |
| 
 | |
|   getDefaultProps: function() {
 | |
|     return {
 | |
|       value: 'console.log(\'freeCodeCamp is awesome\')'
 | |
|     };
 | |
|   },
 | |
| 
 | |
|   getInitialState: function() {
 | |
|     return {
 | |
|       value: this.props.value
 | |
|     };
 | |
|   },
 | |
| 
 | |
|   render: function() {
 | |
|     var options = {
 | |
|       autoCloseBrackets: true,
 | |
|       gutters: ['CodeMirror-lint-markers'],
 | |
|       lint: true,
 | |
|       linter: jshint,
 | |
|       lineNumbers: true,
 | |
|       lineWrapping: true,
 | |
|       mode: 'javascript',
 | |
|       matchBrackets: true,
 | |
|       runnable: true,
 | |
|       scrollbarStyle: 'null',
 | |
|       theme: 'monokai',
 | |
|       textAreaClassName: 'hide-textarea',
 | |
|       value: this.state.value,
 | |
|       onChange: e => {
 | |
|         this.setState({ value: e.target.value});
 | |
|         if (typeof this.props.onValueChange === 'function') {
 | |
|           this.props.onValueChange(e.target.value);
 | |
|         }
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     var config = {
 | |
|       setSize: ['100%', 'auto'],
 | |
|       extraKeys: {
 | |
|         Tab: function(cm) {
 | |
|           debug('tab pressed');
 | |
|           if (cm.somethingSelected()) {
 | |
|             cm.indentSelection('add');
 | |
|           } else {
 | |
|             var spaces = new Array(cm.getOption('indentUnit') + 1).join(' ');
 | |
|             cm.replaceSelection(spaces);
 | |
|           }
 | |
|         },
 | |
|         'Shift-Tab': function(cm) {
 | |
|           debug('shift-tab pressed');
 | |
|           if (cm.somethingSelected()) {
 | |
|             cm.indentSelection('subtract');
 | |
|           } else {
 | |
|             var spaces = new Array(cm.getOption('indentUnit') + 1).join(' ');
 | |
|             cm.replaceSelection(spaces);
 | |
|           }
 | |
|         },
 | |
|         'Ctrl-Enter': function() {
 | |
|           debug('C-enter pressed');
 | |
|           // execute bonfire action
 | |
|           return false;
 | |
|         }
 | |
|       }
 | |
|     };
 | |
| 
 | |
|     return (
 | |
|       <div id='mainEditorPanel'>
 | |
|         <form className='code'>
 | |
|           <div className='form-group codeMirrorView'>
 | |
|             <Tailspin
 | |
|               { ...options }
 | |
|               config={ config }/>
 | |
|           </div>
 | |
|         </form>
 | |
|       </div>
 | |
|     );
 | |
|   }
 | |
| });
 | |
| 
 | |
| module.exports = Editor;
 |