1
- import { useMemo , type ReactNode , useState , useEffect , useRef , forwardRef } from "react" ;
2
- import { EditorProvider , type EditorProviderProps , type JSONContent } from "@tiptap/react" ;
1
+ import {
2
+ useMemo ,
3
+ type ReactNode ,
4
+ useState ,
5
+ useEffect ,
6
+ useRef ,
7
+ forwardRef ,
8
+ } from "react" ;
9
+ import {
10
+ EditorProvider ,
11
+ type EditorProviderProps ,
12
+ type JSONContent ,
13
+ } from "@tiptap/react" ;
3
14
import { Provider , createStore } from "jotai" ;
4
15
import { simpleExtensions } from "../extensions" ;
5
16
import { startImageUpload } from "../plugins/upload-images" ;
6
17
import { Editor } from "@tiptap/core" ;
18
+ import tunnel from "tunnel-rat" ;
19
+ import { EditorCommandTunnelContext } from "./editor-command" ;
7
20
export interface EditorProps {
8
21
children : ReactNode ;
9
22
className ?: string ;
10
23
}
11
24
12
25
export const novelStore = createStore ( ) ;
13
26
14
- export const EditorRoot = ( { children } : { children : ReactNode } ) : JSX . Element => {
15
- return < Provider store = { novelStore } > { children } </ Provider > ;
27
+ export const EditorRoot = ( {
28
+ children,
29
+ } : {
30
+ children : ReactNode ;
31
+ } ) : JSX . Element => {
32
+ const tunnelInstance = useRef ( tunnel ( ) ) . current ;
33
+
34
+ return (
35
+ < Provider store = { novelStore } >
36
+ < EditorCommandTunnelContext . Provider value = { tunnelInstance } >
37
+ { children }
38
+ </ EditorCommandTunnelContext . Provider >
39
+ </ Provider >
40
+ ) ;
16
41
} ;
17
42
18
43
export type EditorContentProps = {
@@ -29,7 +54,11 @@ export const EditorContent = forwardRef<HTMLDivElement, EditorContentProps>(
29
54
30
55
return (
31
56
< div ref = { ref } className = { className } >
32
- < EditorProvider { ...rest } content = { initialContent } extensions = { extensions } >
57
+ < EditorProvider
58
+ { ...rest }
59
+ content = { initialContent }
60
+ extensions = { extensions }
61
+ >
33
62
{ children }
34
63
</ EditorProvider >
35
64
</ div >
@@ -50,7 +79,11 @@ export const defaultEditorProps: EditorProviderProps["editorProps"] = {
50
79
} ,
51
80
} ,
52
81
handlePaste : ( view , event ) => {
53
- if ( event . clipboardData && event . clipboardData . files && event . clipboardData . files [ 0 ] ) {
82
+ if (
83
+ event . clipboardData &&
84
+ event . clipboardData . files &&
85
+ event . clipboardData . files [ 0 ]
86
+ ) {
54
87
event . preventDefault ( ) ;
55
88
const file = event . clipboardData . files [ 0 ] ;
56
89
const pos = view . state . selection . from ;
@@ -61,7 +94,12 @@ export const defaultEditorProps: EditorProviderProps["editorProps"] = {
61
94
return false ;
62
95
} ,
63
96
handleDrop : ( view , event , _slice , moved ) => {
64
- if ( ! moved && event . dataTransfer && event . dataTransfer . files && event . dataTransfer . files [ 0 ] ) {
97
+ if (
98
+ ! moved &&
99
+ event . dataTransfer &&
100
+ event . dataTransfer . files &&
101
+ event . dataTransfer . files [ 0 ]
102
+ ) {
65
103
event . preventDefault ( ) ;
66
104
const file = event . dataTransfer . files [ 0 ] ;
67
105
const coordinates = view . posAtCoords ( {
0 commit comments