loading

How to implement Ckeditor 5 with Next js

Ck editor is a rich content editor which is used for editing or blog setup.
while implementing sometimes this may give window not defined error or hydration error.

The following two packages will be required to work

npm i @ckeditor/ckeditor5-build-classic
npm i @ckeditor/ckeditor5-react

After installing make a component for CKEditor

import ClassicEditor from "@ckeditor/ckeditor5-build-classic";
import { CKEditor } from "@ckeditor/ckeditor5-react";
const Contenteditor = ({ setcontent, content }) => {

  return (
    <>
      <CKEditor
        editor={ClassicEditor}
        data={content}
        onChange={(event, editor) => {
          const data = editor.getData();
          setcontent(data);
        }}
        config={{
           placeholder: "Add Your Post here...",
        }}
      />
    </>
  );
};

export default Contenteditor;

Now we will use this component wherever we have a requirement for CKEditor in our application

import dynamic from "next/dynamic";
const Contenteditor = dynamic(() => import("@/components/ui/ckeditor"), {
  ssr: false,
});

const demo = () => {
  return (
    <>
      <Contenteditor 
      // setcontent={setcontent} //additional props to setcontent
      // content={content}
        />
    </>
  );
};

export default demo;

Now you can use CKEditor in your application ๐Ÿ˜Š

CKEditor provides a plugin for image upload. There are two ways in which you can add upload image functionality in CKEditor

  • Ckfinder
  • Simple adapter with API hosted on your server

The simplest and best way will be second, in which we can use our own API to upload images on our server. create a function to upload images with your API

  function uploadAdapter(loader) {
    return {
      upload: () => {
        return new Promise((resolve, reject) => {
          const body = new FormData();
          loader.file.then((file) => {
            body.append("file", file);
            fetch(`/api/upload`, {
              method: "post",
              body: body,
            })
              .then((res) => res.json())
              .then((res) => {
                console.log(res);
                resolve({
                  default: res.file.url,
                });
              })
              .catch((err) => {
                reject(err);
              });
          });
        });
      },
    };
  }

add upload plugin in CKEditor, so the final code will be

import ClassicEditor from "@ckeditor/ckeditor5-build-classic";
import { CKEditor } from "@ckeditor/ckeditor5-react";
const Contenteditor = ({ setcontent, content }) => {
  function uploadAdapter(loader) {
    return {
      upload: () => {
        return new Promise((resolve, reject) => {
          const body = new FormData();
          loader.file.then((file) => {
            body.append("file", file);
            fetch(`/api/upload`, {
              method: "post",
              body: body,
            })
              .then((res) => res.json())
              .then((res) => {
                console.log(res);
                resolve({
                  default: res.file.url,
                });
              })
              .catch((err) => {
                reject(err);
              });
          });
        });
      },
    };
  }
  function uploadPlugin(editor) {
    editor.plugins.get("FileRepository").createUploadAdapter = (loader) => {
      return uploadAdapter(loader);
    };
  }
  return (
    <>
      <CKEditor
        editor={ClassicEditor}
        data={content}
        onChange={(event, editor) => {
          const data = editor.getData();
          setcontent(data);
        }}
        config={{
          extraPlugins: [uploadPlugin],
          placeholder: "Add Your Post here...",
        }}
      />
    </>
  );
};

export default Contenteditor;

Loading...

About Author

Loading...

Loading...

๐Ÿ‘จโ€๐Ÿ’ป

Frontend development

Learn frontend development with examples and practical exercise of HTML,CSS,JS,React.js.