Skip to content
Snippets Groups Projects
CustomEditor.tsx 1.72 KiB
Newer Older
  • Learn to ignore specific revisions
  • // import {  } from 'draft-js'
    import { stateToHTML } from 'draft-js-export-html'
    
    import { useCallback, useMemo, useState } from 'react'
    
    import { Editor, EditorState } from 'react-draft-wysiwyg'
    import CustomLink from './CustomLink'
    import './customEditor.scss'
    
    interface CustomEditorProps {
      baseState: EditorState
    
      editorType: 'info' | 'title' | 'content' | 'question' | 'link' | 'subject'
    
      handleChange: (
        value: string,
    
        type: 'info' | 'title' | 'content' | 'question' | 'link' | 'subject'
    
      ) => void
    }
    
    const CustomEditor: React.FC<CustomEditorProps> = ({
      baseState,
      handleChange,
      editorType,
    }: CustomEditorProps) => {
      const [editorState, setEditorState] = useState<EditorState>(baseState)
    
    
      const entityStyleFn = useMemo(
        () => (entity: any) => {
          const entityType = entity.get('type').toLowerCase()
          if (entityType === 'link') {
            const data = entity.getData()
            return {
              element: 'a',
              attributes: {
                title: data.title,
                href: data.href ? data.href : data.url,
              },
    
          }
        },
        []
      )
    
      const handleStateChange = useCallback(
        (state: EditorState) => {
          setEditorState(state)
          handleChange(
            stateToHTML(state.getCurrentContent(), { entityStyleFn }),
            editorType
          )
        },
        [editorType, handleChange, entityStyleFn]
      )
    
    
      return (
        <Editor
          editorState={editorState}
          onEditorStateChange={(state) => handleStateChange(state)}
    
          handlePastedText={() => false}
    
          wrapperClassName="wrapper-class"
          editorClassName="editor-class"
          toolbarClassName="toolbar-class"
          toolbarCustomButtons={[<CustomLink editorState={editorState} />]}
        />
      )
    }
    export default CustomEditor