import React, { useState, useMemo } from 'react' import { Transforms, createEditor, Node } from 'slate' import { Slate, Editable, useEditor, withReact } from 'slate-react' import { withHistory } from 'slate-history' import { css } from 'emotion' import RichTextEditor from './richtext' import { Button, Icon, Toolbar } from '../components' const EditableVoidsExample = () => { const [value, setValue] = useState(initialValue) const editor = useMemo( () => withEditableVoids(withHistory(withReact(createEditor()))), [] ) return ( } placeholder="Enter some text..." /> ) } const withEditableVoids = editor => { const { isVoid } = editor editor.isVoid = element => { return element.type === 'editable-void' ? true : isVoid(element) } return editor } const insertEditableVoid = editor => { const text = { text: '' } const voidNode = { type: 'editable-void', children: [text] } Transforms.insertNodes(editor, voidNode) } const Element = props => { const { attributes, children, element } = props switch (element.type) { case 'editable-void': return default: return

{children}

} } const unsetWidthStyle = css` width: unset; ` const EditableVoidElement = ({ attributes, children, element }) => { const [inputValue, setInputValue] = useState('') return ( // Need contentEditable=false or Firefox has issues with certain input types.

Name:

{ setInputValue(e.target.value) }} />

Left or right handed:

{' '} Left
{' '} Right

Tell us about yourself:

{children}
) } const InsertEditableVoidButton = () => { const editor = useEditor() return ( ) } const initialValue = [ { type: 'paragraph', children: [ { text: 'In addition to nodes that contain editable text, you can insert void nodes, which can also contain editable elements, inputs, or an entire other Slate editor.', }, ], }, { type: 'editable-void', children: [{ text: '' }], }, { type: 'paragraph', children: [ { text: '', }, ], }, ] export default EditableVoidsExample