diff --git a/src/components/Widgets/Markdown/MarkdownControl/RawEditor/index.js b/src/components/Widgets/Markdown/MarkdownControl/RawEditor/index.js index 8194dc5e..38cae645 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/RawEditor/index.js +++ b/src/components/Widgets/Markdown/MarkdownControl/RawEditor/index.js @@ -19,6 +19,9 @@ export default class RawEditor extends React.Component { } handleChange = change => { + if (!this.state.editorState.document.equals(change.state.document)) { + this.handleDocumentChange(change); + } this.setState({ editorState: change.state }); }; @@ -26,7 +29,7 @@ export default class RawEditor extends React.Component { * When the document value changes, serialize from Slate's AST back to plain * text (which is Markdown) and pass that up as the new value. */ - handleDocumentChange = debounce((doc, change) => { + handleDocumentChange = debounce(change => { const value = Plain.serialize(change.state); this.props.onChange(value); }, 150); @@ -61,7 +64,6 @@ export default class RawEditor extends React.Component { className={styles.rawEditor} state={this.state.editorState} onChange={this.handleChange} - onDocumentChange={this.handleDocumentChange} onPaste={this.handlePaste} /> diff --git a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.js b/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.js index 319baa73..5bab552c 100644 --- a/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.js +++ b/src/components/Widgets/Markdown/MarkdownControl/VisualEditor/index.js @@ -44,13 +44,6 @@ export default class Editor extends Component { return change.insertFragment(doc); } - handleDocumentChange = debounce((doc, change) => { - const raw = Raw.serialize(change.state, { terse: true }); - const plugins = this.state.shortcodePlugins; - const markdown = slateToMarkdown(raw, plugins); - this.props.onChange(markdown); - }, 150); - hasMark = type => this.state.editorState.marks.some(mark => mark.type === type); hasBlock = type => this.state.editorState.blocks.some(node => node.type === type); @@ -155,7 +148,17 @@ export default class Editor extends Component { return { onAction: e => handler(e, type), active: isActive(type) }; }; + handleDocumentChange = debounce(change => { + const raw = change.state.document.toJSON({ terse: true }); + const plugins = this.state.shortcodePlugins; + const markdown = slateToMarkdown(raw, plugins); + this.props.onChange(markdown); + }, 150); + handleChange = change => { + if (!this.state.editorState.document.equals(change.state.document)) { + this.handleDocumentChange(change); + } this.setState({ editorState: change.state }); }; @@ -196,7 +199,6 @@ export default class Editor extends Component { schema={this.state.schema} plugins={plugins} onChange={this.handleChange} - onDocumentChange={this.handleDocumentChange} onKeyDown={onKeyDown} onPaste={this.handlePaste} ref={ref => this.ref = ref}