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; |