/* eslint-disable react/no-string-refs */ import React from 'react'; import { Editor, EditorState, RichUtils, getDefaultKeyBinding, ContentState } from 'draft-js'; import 'draft-js/dist/Draft.css'; import { stateToHTML } from 'draft-js-export-html'; // Custom overrides for "code" style. const styleMap = { CODE: { backgroundColor: 'rgba(0, 0, 0, 0.05)', fontFamily: '"Inconsolata", "Menlo", "Consolas", monospace', fontSize: 16, padding: 2, }, }; function getBlockStyle(block) { switch (block.getType()) { case 'blockquote': return 'RichEditor-blockquote'; default: return null; } } class StyleButton extends React.Component { constructor() { super(); this.onToggle = (e) => { e.preventDefault(); this.props.onToggle(this.props.style); }; } render() { let className = 'RichEditor-styleButton'; if (this.props.active) { className += ' RichEditor-activeButton'; } return ( {this.props.label} ); } } const HEADINGS = [ { label: 'H1', style: 'header-one' }, { label: 'H2', style: 'header-two' }, { label: 'H3', style: 'header-three' }, { label: 'H4', style: 'header-four' }, { label: 'H5', style: 'header-five' }, { label: 'H6', style: 'header-six' }, ]; const BLOCK_TYPES = [ { label: , style: 'blockquote', }, { label: , style: 'unordered-list-item', }, { label: , style: 'ordered-list-item', }, { label: , style: 'code-block', }, ]; const BlockStyleControls = (props) => { const { editorState } = props; const selection = editorState.getSelection(); const blockType = editorState.getCurrentContent().getBlockForKey(selection.getStartKey()).getType(); return ( <>
{HEADINGS.map((type) => ( ))}
{BLOCK_TYPES.map((type) => ( ))} ); }; var INLINE_STYLES = [ { label: , style: 'BOLD', }, { label: , style: 'ITALIC', }, { label: , style: 'UNDERLINE', }, ]; const InlineStyleControls = (props) => { const currentStyle = props.editorState.getCurrentInlineStyle(); return ( <> {INLINE_STYLES.map((type) => ( ))} ); }; class DraftEditor extends React.Component { constructor(props) { super(props); this.state = { editorState: EditorState.createWithContent(ContentState.createFromText(this.props.defaultValue)), }; this.focus = () => this.refs.editor.focus(); this.onChange = (editorState) => { let html = stateToHTML(editorState.getCurrentContent()); this.props.handleChange(html); this.setState({ editorState }); }; this.handleKeyCommand = this._handleKeyCommand.bind(this); this.mapKeyToEditorCommand = this._mapKeyToEditorCommand.bind(this); this.toggleBlockType = this._toggleBlockType.bind(this); this.toggleInlineStyle = this._toggleInlineStyle.bind(this); } componentDidUpdate(prevProps) { if (prevProps.defaultValue !== this.props.defaultValue) { const newContentState = ContentState.createFromText(this.props.defaultValue); const newEditorState = EditorState.createWithContent(newContentState); const newEditorStateWithFocus = EditorState.moveFocusToEnd(newEditorState); const html = stateToHTML(newContentState); this.props.handleChange(html); this.setState({ editorState: newEditorStateWithFocus }); } } _handleKeyCommand(command, editorState) { const newState = RichUtils.handleKeyCommand(editorState, command); if (newState) { this.onChange(newState); return true; } return false; } _mapKeyToEditorCommand(e) { if (e.keyCode === 9 /* TAB */) { const newEditorState = RichUtils.onTab(e, this.state.editorState, 4 /* maxDepth */); if (newEditorState !== this.state.editorState) { this.onChange(newEditorState); } return; } return getDefaultKeyBinding(e); } _toggleBlockType(blockType) { this.onChange(RichUtils.toggleBlockType(this.state.editorState, blockType)); } _toggleInlineStyle(inlineStyle) { this.onChange(RichUtils.toggleInlineStyle(this.state.editorState, inlineStyle)); } render() { const { editorState } = this.state; // If the user changes block type before entering any text, we can // either style the placeholder or hide it. Let's just hide it now. let className = 'RichEditor-editor'; var contentState = editorState.getCurrentContent(); if (!contentState.hasText()) { if (contentState.getBlockMap().first().getType() !== 'unstyled') { className += ' RichEditor-hidePlaceholder'; } } return (
); } } export { DraftEditor };