Files
notesnook/packages/editor/src/hooks/use-editor.ts

43 lines
934 B
TypeScript
Raw Normal View History

2022-07-01 18:02:53 +05:00
import { EditorOptions, Editor } from "@tiptap/core";
import { DependencyList, useEffect, useState } from "react";
import { Editor as EditorType } from "../types";
function useForceUpdate() {
const [, setValue] = useState(0);
return () => setValue((value) => value + 1);
}
export const useEditor = (
options: Partial<EditorOptions> = {},
deps: DependencyList = []
) => {
const [editor, setEditor] = useState<Editor | null>(null);
const forceUpdate = useForceUpdate();
useEffect(() => {
let isMounted = true;
const instance = new Editor(options);
setEditor(instance);
instance.on("transaction", () => {
requestAnimationFrame(() => {
requestAnimationFrame(() => {
if (isMounted) {
forceUpdate();
}
});
});
});
return () => {
instance.destroy();
isMounted = false;
};
}, deps);
return editor as EditorType;
};