import React, { useMemo, useCallback } from 'react'; import { createEditor, Descendant, Editor } from 'slate'; import { Slate, Editable, withReact as withReactPlugin, useSlate, RenderElementProps, RenderLeafProps, } from 'slate-react'; import { withHistory } from 'slate-history'; import { CustomEditor, CustomTextKey } from './custom-types'; import { BlockButton, Button, Icon, Leaf, SlateRenderElement, Toolbar, withHtml, } from './slate-editor-components'; export interface RichTextEditorProps { value: Descendant[]; onChange: (value: Descendant[]) => void; placeholder?: string; readOnly?: boolean; className?: string; } interface MarkButtonProps { format: CustomTextKey; icon: string; } const isMarkActive = (editor: CustomEditor, format: CustomTextKey) => { const marks = Editor.marks(editor); return marks ? marks[format] === true : false; }; const toggleMark = (editor: CustomEditor, format: CustomTextKey) => { const isActive = isMarkActive(editor, format); if (isActive) { Editor.removeMark(editor, format); } else { Editor.addMark(editor, format, true); } }; const MarkButton = ({ format, icon }: MarkButtonProps) => { const editor = useSlate(); return ( ); }; const RichTextEditor: React.FC = ({ value, onChange, placeholder = 'Type something...', readOnly = false, className = '', }) => { const editor = useMemo(() => withHtml(withHistory(withReactPlugin(createEditor()))), []); const renderElement = useCallback( (props: RenderElementProps) => , [] ); // const renderElement = useCallback((props: any) => { // switch (props.element.type) { // case "block-quote": // return
{props.children}
; // case "bulleted-list": // return ; // case "list-item": // return
  • {props.children}
  • ; // case "numbered-list": // return
      {props.children}
    ; // default: // return

    {props.children}

    ; // } // }, []); const renderLeaf = useCallback((props: RenderLeafProps) => , []); return (
    ); }; export default RichTextEditor;