fix(editor): defer render and load content per chapter for WebKit

This commit is contained in:
pj committed 2026-06-20 13:28:25 -04:00
1 parent 0de442eab0
commit c4b69f3641
1 file changed
+16 -11
+16 -11
View File
@@ -1,4 +1,4 @@
import { useEffect } from "react"; import { useEffect, useRef } from "react";
import { EditorContent, useEditor, type Editor as TiptapEditor } from "@tiptap/react"; import { EditorContent, useEditor, type Editor as TiptapEditor } from "@tiptap/react";
import type { JSONContent } from "@tiptap/core"; import type { JSONContent } from "@tiptap/core";
import { editorExtensions } from "./extensions"; import { editorExtensions } from "./extensions";
@@ -11,20 +11,25 @@ interface EditorProps {
} }
export function Editor({ chapterId, content, onChange, onReady }: EditorProps) { export function Editor({ chapterId, content, onChange, onReady }: EditorProps) {
const editor = useEditor( const onChangeRef = useRef(onChange);
{ onChangeRef.current = onChange;
extensions: editorExtensions,
content, const editor = useEditor({
autofocus: "start", extensions: editorExtensions,
editorProps: { attributes: { class: "prose" } }, content,
onUpdate: ({ editor }) => onChange(editor.getJSON()), immediatelyRender: false,
}, editorProps: { attributes: { class: "prose" } },
[chapterId] onUpdate: ({ editor }) => onChangeRef.current(editor.getJSON()),
); });
useEffect(() => { useEffect(() => {
onReady(editor); onReady(editor);
}, [editor, onReady]); }, [editor, onReady]);
useEffect(() => {
if (editor) editor.commands.setContent(content, { emitUpdate: false });
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [chapterId, editor]);
return <EditorContent editor={editor} className="editor-host" />; return <EditorContent editor={editor} className="editor-host" />;
} }