import { convertToRaw } from 'draft-js' import draftToHtml from 'draftjs-to-html' import React, { useCallback, useState } from 'react' import { Editor, EditorState } from 'react-draft-wysiwyg' import CustomLink from './CustomLink' import './customEditor.scss' export type EditorType = | 'info' | 'title' | 'content' | 'question' | 'link' | 'subject' | 'image' | 'custom_popup' interface CustomEditorProps { baseState: EditorState type: EditorType handleChange: (value: string, type: EditorType) => void } const CustomEditor: React.FC<CustomEditorProps> = ({ baseState, handleChange, type, }) => { const [editorState, setEditorState] = useState<EditorState>(baseState) const convertStateToHTML = (state: EditorState) => { const parseElements = ({ type, data }: { type: string; data: any }) => { // properly align images (see: https://github.com/jpuri/draftjs-to-html/issues/28#issuecomment-607344551) if (type === 'IMAGE') { const alignment = data.alignment || 'none' const textAlign = alignment === 'none' ? 'center' : alignment const alt = data.alt ? data.alt : '' return `<p style="text-align:${textAlign};"><img src="${data.src}" alt="${alt}" style="height: ${data.height};width: ${data.width}"/></p>` } } return state.getCurrentContent().hasText() ? draftToHtml( convertToRaw(state.getCurrentContent()), {}, false, parseElements ) : '' } const handleStateChange = useCallback( (state: EditorState) => { setEditorState(state) const htmlState = convertStateToHTML(state) handleChange(htmlState, type) }, [type, handleChange] ) return ( <Editor editorState={editorState} onEditorStateChange={(state) => handleStateChange(state)} handlePastedText={() => false} wrapperClassName="wrapper-class" editorClassName="editor-class" toolbarClassName="toolbar-class" toolbarCustomButtons={[ <CustomLink key="customLink" editorState={editorState} />, ]} /> ) } export default CustomEditor