Advertisement
xcage88

Component CKEditor

Aug 14th, 2024
876
0
49 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { config } from '@/configs';
  2. import { postData, postFile } from '@/utils/fetch';
  3. import { Editor } from '@ckeditor/ckeditor5-core';
  4. import { regexDescription } from '@/utils/regex-message';
  5. import { FileLoader, UploadAdapter } from '@ckeditor/ckeditor5-upload/src/filerepository';
  6. import { useEffect, useRef, useState } from 'react';
  7. import {Image, ImageResizeButtons, ImageResizeEditing, ImageResizeHandles} from '@ckeditor/ckeditor5-image'
  8.  
  9. const CKEditorComp = ({ name, formDesc, setFormDesc, register, error }: any) => {
  10.     const [editorLoaded, setEditorLoaded] = useState(false);
  11.     const [errorMsg, setErrorMsg] = useState('')
  12.     const [isValid, setIsValid] = useState<boolean>(false)
  13.  
  14.     useEffect(() => {
  15.         setEditorLoaded(true);
  16.     }, []);
  17.     const editorRef: any = useRef();
  18.     const { CKEditor, ClassicEditor } = editorRef.current || {};
  19.  
  20.     function uploadAdapter(loader: FileLoader): UploadAdapter {
  21.         return {
  22.             upload: () => {
  23.                 return new Promise(async (resolve, reject) => {
  24.                     try {
  25.                         const file: any = await loader.file;
  26.                         const { data } = await postFile(`?folder_path=images/blog&save_to=AWS&max_size=${config.MAX_FILE}`, { images: file });
  27.  
  28.                         resolve({
  29.                             default: `${data.files[0].path}`,
  30.                         });
  31.                     } catch (error) {
  32.                         // reject('Hello');
  33.                         console.log(error)
  34.                     }
  35.                 });
  36.             },
  37.             abort: () => {},
  38.         };
  39.     }
  40.     function uploadPlugin(editor: Editor) {
  41.         /* @ts-ignore */
  42.         editor.plugins.get('FileRepository').createUploadAdapter = (loader: any) => {
  43.             return uploadAdapter(loader);
  44.         };
  45.     }
  46.  
  47.     useEffect(() => {
  48.         editorRef.current = {
  49.             CKEditor: require('@ckeditor/ckeditor5-react').CKEditor,
  50.             ClassicEditor: require('@ckeditor/ckeditor5-build-classic'),
  51.         };
  52.         // console.log(ClassicEditor.builtinPlugins.map((plugin: any) => plugin.pluginName))
  53.     }, []);
  54.  
  55.     // ClassicEditor.builtinPlugins = [uploadPlugin, Heading];
  56.     const removeHtmlTags = (input: string) => {
  57.         return input.replace(/<\/?(?!br|ul|li|ol)[^>]+>/g, "");
  58.     }
  59.  
  60.     const handleChange = (value: any) => {
  61.         // const textOnly = removeHtmlTags(value)
  62.         const check = regexDescription.regex.test(value)
  63.         if(check){
  64.             setIsValid(true)
  65.             return setErrorMsg('Jangan menggunakan tag html atau semacamnya')
  66.         }else{
  67.             setIsValid(false)
  68.             setErrorMsg('')
  69.         }
  70.        
  71.         setFormDesc(value)
  72.     };
  73.  
  74.     return editorLoaded ? (
  75.         <div className="rich-text-editor cursor-bold">
  76.             <CKEditor
  77.                 config={{
  78.                     extraPlugins: [uploadPlugin],
  79.                     removePlugins: ['MediaEmbed'],
  80.                     heading: {
  81.                         options: [
  82.                             {
  83.                                 model: 'paragraph',
  84.                                 title: 'Paragraph',
  85.                                 class: 'ck-heading_paragraph',
  86.                             },
  87.                             {
  88.                                 model: 'heading1',
  89.                                 view: 'h1',
  90.                                 title: 'Heading 1',
  91.                                 class: 'ck-heading_heading1',
  92.                             },
  93.                             {
  94.                                 model: 'heading2',
  95.                                 view: 'h2',
  96.                                 title: 'Heading 2',
  97.                                 class: 'ck-heading_heading2',
  98.                             },
  99.                             {
  100.                                 model: 'heading3',
  101.                                 view: 'h3',
  102.                                 title: 'Heading 3',
  103.                                 class: 'ck-heading_heading3',
  104.                             },
  105.                             {
  106.                                 model: 'heading4',
  107.                                 view: 'h4',
  108.                                 title: 'Heading 4',
  109.                                 class: 'ck-heading_heading4',
  110.                             },
  111.                             {
  112.                                 model: 'heading5',
  113.                                 view: 'h5',
  114.                                 title: 'Heading 5',
  115.                                 class: 'ck-heading_heading5',
  116.                             },
  117.                             {
  118.                                 model: 'heading6',
  119.                                 view: 'h6',
  120.                                 title: 'Heading 6',
  121.                                 class: 'ck-heading_heading6',
  122.                             },
  123.                         ],
  124.                     },
  125.                     link: {
  126.                         addTargetToExternalLinks: true,
  127.                     }
  128.                 }}
  129.                 editor={ClassicEditor}
  130.                 data={formDesc}
  131.                 onChange={(event: any, editor: any) => {
  132.                     handleChange(editor.getData());
  133.                 }}
  134.             />
  135.  
  136.         {isValid && errorMsg && (<p className="text-sm text-red-500">{errorMsg}</p>)}
  137.         </div>
  138.     ) : null;
  139.    
  140. };
  141.  
  142. export default CKEditorComp;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement