import { createContext, Dispatch, FC, PropsWithChildren, SetStateAction, useContext, } from 'react' import { EditorView } from '@codemirror/view' import useExposedState from '@/shared/hooks/use-exposed-state' export type EditorContextValue = { view: EditorView | null setView: Dispatch> } // This provides access to the CodeMirror EditorView instance outside the editor // component itself, including external extensions (in particular, Writefull) export const EditorViewContext = createContext( undefined ) export const EditorViewProvider: FC = ({ children }) => { const [view, setView] = useExposedState( null, 'editor.view' ) const value = { view, setView, } return ( {children} ) } export const useEditorViewContext = (): EditorContextValue => { const context = useContext(EditorViewContext) if (!context) { throw new Error( 'useEditorViewContext is only available inside EditorViewProvider' ) } return context }