Editor.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. 'use client';
  2. /**
  3. * @author: Kim Jino
  4. * @since: 2025.03.31
  5. * @description: CKEditor component for Next.js using Script component for loading CKEditor script
  6. */
  7. // @/app/component/editor.tsx
  8. import '@/styles/editor.scss';
  9. import Script from 'next/script';
  10. import React, { useRef, useState, useEffect } from 'react';
  11. import { CKEditor } from '@ckeditor/ckeditor5-react';
  12. import Loading from '@/app/component/Loading';
  13. interface EditorProps {
  14. data?: string;
  15. onChange?: (data: string) => void;
  16. }
  17. export default function Editor({ data = '', onChange }: EditorProps)
  18. {
  19. const editorRef = useRef<typeof window.Editor|null>(null);
  20. const [ready, setReady] = useState(false);
  21. useEffect(() => {
  22. if (typeof window !== 'undefined' && window.Editor) {
  23. editorRef.current = window.Editor;
  24. setReady(true);
  25. }
  26. }, []);
  27. const handleScriptLoad = () => {
  28. if (typeof window !== 'undefined' && window.Editor) {
  29. editorRef.current = window.Editor;
  30. setReady(true);
  31. } else {
  32. console.error('CKEditor script not loaded properly.');
  33. }
  34. };
  35. return (
  36. <>
  37. <Script src="/editor/editor.min.js" strategy="afterInteractive" onLoad={handleScriptLoad}/>
  38. {ready && editorRef.current ? (
  39. <CKEditor
  40. editor={editorRef.current}
  41. data={data}
  42. config={{
  43. placeholder: '내용을 입력하세요.',
  44. maxWordCount: 3000,
  45. // 이미지 설정
  46. allowImage: true,
  47. imageUploadLimit: 1,
  48. imageUploadMaxSize: 5120,
  49. // 미디어어 설정
  50. allowMedia: true,
  51. mediaUploadLimit: 1
  52. }}
  53. onReady={(editor) => {
  54. console.log('Editor was initialized');
  55. // 최소 높이 설정
  56. editor.editing.view.change(writer => {
  57. const root = editor.editing.view.document.getRoot();
  58. if (root) {
  59. writer.setStyle('min-height', '300px', root);
  60. }
  61. });
  62. }}
  63. onChange={(_, editor) => {
  64. onChange?.(editor.getData());
  65. }}
  66. />
  67. ) : (
  68. <Loading/>
  69. )}
  70. </>
  71. );
  72. }