diff options
| author | Stanley Yip <stanley_yip@brown.edu> | 2020-01-17 15:45:05 -0500 | 
|---|---|---|
| committer | Stanley Yip <stanley_yip@brown.edu> | 2020-01-17 15:45:05 -0500 | 
| commit | 8667498929fce14295658f89c8787a1a9b1ce468 (patch) | |
| tree | c3d03768bf2b8d23e438479c67141fae43c63e1e /src/client/util/ProseMirrorEditorView.tsx | |
| parent | 4b0a056f1afaf20dea4be64c7b238748d99ad12e (diff) | |
| parent | 9620d149a2051bc9b42a037b1c65b61deebd11fa (diff) | |
Merge branch 'master' of https://github.com/browngraphicslab/Dash-Web into pen
Diffstat (limited to 'src/client/util/ProseMirrorEditorView.tsx')
| -rw-r--r-- | src/client/util/ProseMirrorEditorView.tsx | 74 | 
1 files changed, 74 insertions, 0 deletions
diff --git a/src/client/util/ProseMirrorEditorView.tsx b/src/client/util/ProseMirrorEditorView.tsx new file mode 100644 index 000000000..b42adfbb4 --- /dev/null +++ b/src/client/util/ProseMirrorEditorView.tsx @@ -0,0 +1,74 @@ +import React from "react"; +import { EditorView } from "prosemirror-view"; +import { EditorState } from "prosemirror-state"; + +export interface ProseMirrorEditorViewProps { +    /* EditorState instance to use. */ +    editorState: EditorState; +    /* Called when EditorView produces new EditorState. */ +    onEditorState: (editorState: EditorState) => any; +} + +/** + * This wraps ProseMirror's EditorView into React component. + * This code was found on https://discuss.prosemirror.net/t/using-with-react/904 + */ +export class ProseMirrorEditorView extends React.Component<ProseMirrorEditorViewProps>  { + +    private _editorView?: EditorView; + +    _createEditorView = (element: HTMLDivElement | null) => { +        if (element !== null) { +            this._editorView = new EditorView(element, { +                state: this.props.editorState, +                dispatchTransaction: this.dispatchTransaction, +            }); +        } +    } + +    dispatchTransaction = (tx: any) => { +        // In case EditorView makes any modification to a state we funnel those +        // modifications up to the parent and apply to the EditorView itself. +        const editorState = this.props.editorState.apply(tx); +        if (this._editorView) { +            this._editorView.updateState(editorState); +        } +        this.props.onEditorState(editorState); +    } + +    focus() { +        if (this._editorView) { +            this._editorView.focus(); +        } +    } + +    componentWillReceiveProps(nextProps: { editorState: EditorState<any>; }) { +        // In case we receive new EditorState through props — we apply it to the +        // EditorView instance. +        if (this._editorView) { +            if (nextProps.editorState !== this.props.editorState) { +                this._editorView.updateState(nextProps.editorState); +            } +        } +    } + +    componentWillUnmount() { +        if (this._editorView) { +            this._editorView.destroy(); +        } +    } + +    shouldComponentUpdate() { +        // Note that EditorView manages its DOM itself so we'd ratrher don't mess +        // with it. +        return false; +    } + +    render() { +        // Render just an empty div which is then used as a container for an +        // EditorView instance. +        return ( +            <div ref={this._createEditorView} /> +        ); +    } +}
\ No newline at end of file  | 
