mirror of
https://github.com/ueberdosis/tiptap.git
synced 2025-06-07 09:25:29 +08:00
56 lines
1.4 KiB
TypeScript
56 lines
1.4 KiB
TypeScript
import { Editor } from '@tiptap/core'
|
|
import React, { createContext, ReactNode, useContext } from 'react'
|
|
|
|
import { Editor as ReactEditor } from './Editor.js'
|
|
import { EditorContent } from './EditorContent.js'
|
|
import { useEditor, UseEditorOptions } from './useEditor.js'
|
|
|
|
export type EditorContextValue = {
|
|
editor: Editor | null;
|
|
}
|
|
|
|
export const EditorContext = createContext<EditorContextValue>({
|
|
editor: null,
|
|
})
|
|
|
|
export const EditorConsumer = EditorContext.Consumer
|
|
|
|
/**
|
|
* A hook to get the current editor instance.
|
|
*/
|
|
export const useCurrentEditor = () => useContext(EditorContext)
|
|
|
|
export type EditorProviderProps = {
|
|
children?: ReactNode;
|
|
slotBefore?: ReactNode;
|
|
slotAfter?: ReactNode;
|
|
} & UseEditorOptions
|
|
|
|
/**
|
|
* This is the provider component for the editor.
|
|
* It allows the editor to be accessible across the entire component tree
|
|
* with `useCurrentEditor`.
|
|
*/
|
|
export function EditorProvider({
|
|
children, slotAfter, slotBefore, ...editorOptions
|
|
}: EditorProviderProps) {
|
|
const editor = useEditor(editorOptions)
|
|
|
|
if (!editor) {
|
|
return null
|
|
}
|
|
|
|
return (
|
|
<EditorContext.Provider value={{ editor }}>
|
|
{slotBefore}
|
|
<EditorConsumer>
|
|
{({ editor: currentEditor }) => (
|
|
<EditorContent editor={currentEditor as ReactEditor} />
|
|
)}
|
|
</EditorConsumer>
|
|
{children}
|
|
{slotAfter}
|
|
</EditorContext.Provider>
|
|
)
|
|
}
|