remove react-page and add editorjs
This commit is contained in:
parent
87dc1a8f50
commit
efef39f0c2
16
package.json
16
package.json
|
|
@ -11,22 +11,32 @@
|
||||||
"gen-types": "sh ./scripts/gen-types-from-pb.sh"
|
"gen-types": "sh ./scripts/gen-types-from-pb.sh"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@editorjs/editorjs": "^2.27.0",
|
||||||
|
"@editorjs/header": "^2.7.0",
|
||||||
|
"@editorjs/image": "^2.8.1",
|
||||||
|
"@editorjs/list": "^1.8.0",
|
||||||
|
"@editorjs/paragraph": "^2.9.0",
|
||||||
|
"@editorjs/simple-image": "^1.5.1",
|
||||||
|
"@editorjs/table": "^2.2.1",
|
||||||
"@emotion/react": "^11.11.0",
|
"@emotion/react": "^11.11.0",
|
||||||
"@emotion/styled": "^11.11.0",
|
"@emotion/styled": "^11.11.0",
|
||||||
"@prisma/client": "^4.14.0",
|
"@prisma/client": "^4.14.0",
|
||||||
"@react-page/editor": "^5.4.4",
|
|
||||||
"@react-page/plugins-image": "^5.4.4",
|
|
||||||
"@react-page/plugins-slate": "^5.4.4",
|
|
||||||
"@tanstack/react-query": "^4.29.5",
|
"@tanstack/react-query": "^4.29.5",
|
||||||
"@trpc/client": "^10.25.1",
|
"@trpc/client": "^10.25.1",
|
||||||
"@trpc/next": "^10.25.1",
|
"@trpc/next": "^10.25.1",
|
||||||
"@trpc/react-query": "^10.25.1",
|
"@trpc/react-query": "^10.25.1",
|
||||||
"@trpc/server": "^10.25.1",
|
"@trpc/server": "^10.25.1",
|
||||||
"add": "^2.0.6",
|
"add": "^2.0.6",
|
||||||
|
"editorjs-button": "^1.0.4",
|
||||||
|
"editorjs-drag-drop": "^1.1.13",
|
||||||
|
"editorjs-inline-tool": "^0.4.0",
|
||||||
|
"editorjs-text-color-plugin": "^2.0.2",
|
||||||
|
"editorjs-undo": "^2.0.22",
|
||||||
"next": "13.4.1",
|
"next": "13.4.1",
|
||||||
"pocketbase": "^0.14.4",
|
"pocketbase": "^0.14.4",
|
||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-dom": "18.2.0",
|
"react-dom": "18.2.0",
|
||||||
|
"react-editor-js": "^2.1.0",
|
||||||
"react-icons": "^4.8.0",
|
"react-icons": "^4.8.0",
|
||||||
"superjson": "1.9.1",
|
"superjson": "1.9.1",
|
||||||
"zod": "^3.21.4"
|
"zod": "^3.21.4"
|
||||||
|
|
|
||||||
1087
pnpm-lock.yaml
1087
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,39 @@
|
||||||
|
import { memo, useEffect, useRef } from "react";
|
||||||
|
import EditorJS, { OutputData } from "@editorjs/editorjs";
|
||||||
|
import { EDITOR_JS_TOOLS } from "@/utils/tools";
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
data?: OutputData;
|
||||||
|
onChange(val: OutputData): void;
|
||||||
|
holder: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
const EditorBlock = ({ data, onChange, holder }: Props) => {
|
||||||
|
const ref = useRef<EditorJS>();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!ref.current) {
|
||||||
|
const editor = new EditorJS({
|
||||||
|
holder: holder,
|
||||||
|
tools: EDITOR_JS_TOOLS,
|
||||||
|
data,
|
||||||
|
async onChange(api, event) {
|
||||||
|
const data = await api.saver.save();
|
||||||
|
onChange(data);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
ref.current = editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
if (ref.current && ref.current.destroy) {
|
||||||
|
ref.current.destroy();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return <div id={holder} />;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(EditorBlock);
|
||||||
|
|
||||||
|
|
@ -3,7 +3,6 @@ import { type AppType } from "next/app";
|
||||||
import { api } from "../utils/api";
|
import { api } from "../utils/api";
|
||||||
|
|
||||||
import "../styles/globals.css";
|
import "../styles/globals.css";
|
||||||
import '@react-page/editor/lib/index.css';
|
|
||||||
|
|
||||||
const MyApp: AppType = ({ Component, pageProps }) => {
|
const MyApp: AppType = ({ Component, pageProps }) => {
|
||||||
return <Component {...pageProps} />;
|
return <Component {...pageProps} />;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
import dynamic from 'next/dynamic'
|
||||||
|
import Layout from '@/layouts/Home'
|
||||||
|
import { useState } from 'react'
|
||||||
|
import { OutputData } from "@editorjs/editorjs";
|
||||||
|
|
||||||
|
const ReactEditorJS = dynamic(() => import('@/components/ReactEditor'), {
|
||||||
|
ssr: false
|
||||||
|
})
|
||||||
|
|
||||||
|
export default function Editor() {
|
||||||
|
const [data, setData] = useState<OutputData>()
|
||||||
|
return (
|
||||||
|
<Layout title='React EditorJS'>
|
||||||
|
<h1>React EditorJS</h1>
|
||||||
|
<div className="container mx-auto p-8">
|
||||||
|
<h2>EditorJS with React</h2>
|
||||||
|
<div>
|
||||||
|
<ReactEditorJS data={data} onChange={setData} holder='editorjs' />
|
||||||
|
</div>
|
||||||
|
<h2>Output</h2>
|
||||||
|
<pre>{JSON.stringify(data, null, 2)}</pre>
|
||||||
|
</div>
|
||||||
|
</Layout>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
import Paragraph from "@editorjs/paragraph";
|
||||||
|
import Header from "@editorjs/header";
|
||||||
|
import List from "@editorjs/list";
|
||||||
|
import SimpleImage from "@editorjs/simple-image";
|
||||||
|
import Table from "@editorjs/table";
|
||||||
|
import Button from "editorjs-button";
|
||||||
|
import Undo from "editorjs-undo";
|
||||||
|
import DragDrop from "editorjs-drag-drop";
|
||||||
|
import Color from "editorjs-text-color-plugin";
|
||||||
|
import { ItalicInlineTool, StrongInlineTool, UnderlineInlineTool } from "editorjs-inline-tool";
|
||||||
|
|
||||||
|
export const EDITOR_JS_TOOLS = {
|
||||||
|
paragraph: {
|
||||||
|
class: Paragraph,
|
||||||
|
inlineToolbar: true,
|
||||||
|
},
|
||||||
|
header: Header,
|
||||||
|
list: {
|
||||||
|
class: List,
|
||||||
|
inlineToolbar: true,
|
||||||
|
},
|
||||||
|
image: SimpleImage,
|
||||||
|
table: Table,
|
||||||
|
button: Button,
|
||||||
|
undo: Undo,
|
||||||
|
dragDrop: DragDrop,
|
||||||
|
italic: ItalicInlineTool,
|
||||||
|
strong: StrongInlineTool,
|
||||||
|
underline: UnderlineInlineTool,
|
||||||
|
color: Color,
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue