import { useMemo, useRef, useCallback } from 'react' import ReactQuill from 'react-quill-new' import 'react-quill-new/dist/quill.snow.css' const Quill = ReactQuill.Quill if (!(Quill as any).__bohaRegistered) { const Font = Quill.import('attributors/class/font') as any Font.whitelist = [ 'arial', 'tahoma', 'verdana', 'georgia', 'times-new-roman', 'courier-new', 'trebuchet-ms', 'impact', 'comic-sans-ms', 'lucida-console', 'palatino-linotype', 'garamond' ] Quill.register(Font, true) const SizeStyle = Quill.import('attributors/style/size') as any SizeStyle.whitelist = [ '8px', '9px', '10px', '11px', '12px', '14px', '16px', '18px', '20px', '24px', '28px', '32px', '36px', '48px' ] Quill.register(SizeStyle, true) ;(Quill as any).__bohaRegistered = true } const Font = Quill.import('attributors/class/font') as any const SIZE_WHITELIST = [ '8px', '9px', '10px', '11px', '12px', '14px', '16px', '18px', '20px', '24px', '28px', '32px', '36px', '48px' ] const COLORS = [ '#000000', '#1a1a1a', '#333333', '#555555', '#777777', '#999999', '#bbbbbb', '#dddddd', '#ffffff', '#de3a3a', '#e57373', '#c62828', '#1565c0', '#42a5f5', '#0d47a1', '#2e7d32', '#66bb6a', '#1b5e20', '#f57f17', '#ffca28', '#e65100', '#6a1b9a', '#ab47bc', '#4a148c', '#00695c', '#26a69a', '#004d40', '#37474f', '#78909c', '#263238', ] const TOOLBAR = [ [{ font: Font.whitelist }], [{ size: SIZE_WHITELIST }], ['bold', 'italic', 'underline', 'strike'], [{ color: COLORS }, { background: COLORS }], [{ list: 'ordered' }, { list: 'bullet' }], [{ indent: '-1' }, { indent: '+1' }], [{ align: [] }], ['link'], ['clean'] ] const FORMATS = [ 'font', 'size', 'bold', 'italic', 'underline', 'strike', 'color', 'background', 'list', 'indent', 'align', 'link' ] interface RichEditorProps { value: string onChange: (value: string) => void placeholder?: string minHeight?: string readOnly?: boolean } export default function RichEditor({ value, onChange, placeholder = 'Obsah...', minHeight = '120px', readOnly = false, }: RichEditorProps) { const quillRef = useRef(null) const lastValueRef = useRef(value) const modules = useMemo(() => ({ toolbar: readOnly ? false : TOOLBAR, clipboard: { matchVisual: false, }, }), [readOnly]) const handleChange = useCallback((content: string, _delta: any, source: string) => { if (source !== 'user') return if (content === lastValueRef.current) return lastValueRef.current = content onChange(content) }, [onChange]) return (
) }