sourcebot/src/hooks/useExtensionWithDependency.ts
2024-08-29 21:38:48 -07:00

28 lines
No EOL
808 B
TypeScript

'use client';
import { Compartment, Extension } from "@codemirror/state";
import { EditorView } from "@codemirror/view";
import { useEffect, useMemo } from "react";
/**
* @see https://thetrevorharmon.com/blog/codemirror-and-react/
*/
export function useExtensionWithDependency(
view: EditorView | null,
extensionFactory: () => Extension,
deps: unknown[],
) {
const compartment = useMemo(() => new Compartment(), []);
const extension = useMemo(() => compartment.of(extensionFactory()), [compartment, extensionFactory]);
useEffect(() => {
if (view) {
view.dispatch({
effects: compartment.reconfigure(extensionFactory()),
});
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, deps);
return extension;
}