DraftJS Utils code block return

by Thibaud Colas

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.0/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.0/react-dom.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/draft-js/0.10.4/Draft.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/draft-js/0.10.4/Draft.css">
<div id="react-root"></div>
<script>
  window.startContent = {
    "entityMap": {},
    "blocks": [{
      "key": "1fv8t",
      "text": "Unstyled",
      "type": "unstyled",
      "depth": 0,
      "inlineStyleRanges": [],
      "entityRanges": [],
      "data": {}
    }, {
      "key": "f0898",
      "text": "List item",
      "type": "unordered-list-item",
      "depth": 0,
      "inlineStyleRanges": [],
      "entityRanges": [],
      "data": {}
    }, {
      "key": "9qh91",
      "text": "Code block",
      "type": "code-block",
      "depth": 0,
      "inlineStyleRanges": [],
      "entityRanges": [],
      "data": {}
    }]
  };

</script>
<script>
	require = (dep) => {
    switch(dep) {
    case 'draft-js': return Draft;
    case 'immutable': return Immutable;
    }
  };
  window.DraftUtils = function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=3)}([function(e,t){e.exports=require("draft-js")},function(e,t,n){"use strict";function r(e){var t=e.getSelection(),n=e.getCurrentContent(),r=t.getStartKey(),o=t.getEndKey(),i=n.getBlockMap();return i.toSeq().skipUntil(function(e,t){return...

CSS

body {
  font-family: Helvetica, sans-serif;
}

.container-root {
  border: 1px solid black;
  padding: 5px;
  margin: 5px;
  background-color: white;
}

Babel + JSX

const {Editor, EditorState, RichUtils, convertFromRaw} = Draft;

class Container extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      editorState: EditorState.createWithContent(convertFromRaw(window.startContent))
    };
  }
  
  toggleBlock(type, e) {
    const { editorState } = this.state;
    this._handleChange(RichUtils.toggleBlockType(editorState, type));
  }
    
  render() {
    return (
      <div className="container-root">
        <button onClick={this.toggleBlock.bind(this, 'unstyled')}>P</button>
        <button onClick={this.toggleBlock.bind(this, 'header-two')}>H2</button>
        <button onClick={this.toggleBlock.bind(this, 'code-block')}>Code</button>
        <button onClick={this.toggleBlock.bind(this, 'unordered-list-item')}>UL</button>
        <Editor 
          editorState={this.state.editorState}
          handleReturn={this.handleReturn.bind(this)}
          onChange={this._handleChange}
        />
      </div>
    );
  }
  handleReturn(e) {
  	const { editorState } = this.state;
    const newState = DraftUtils.handleNewLine(editorState, e);
    if (newState) {
      this._handleChange(newState);
      return true;
    }
    
    return false;
  }
  
  _handleChange = (editorState) => {
    this.setState({editorState});
  }
}

ReactDOM.render(<Container />, document.getElementById('react-root'))