@@ -15,7 +15,7 @@ import { HYPER_LINK_KEY } from "../hyper-link/types";
15
15
import { LINE_HEIGHT_KEY } from "../line-height/types" ;
16
16
import { useMemoFn } from "../shared/hooks/preset" ;
17
17
import { MenuItems } from "./components/menu" ;
18
- import { execSelectMarks , getSelectionRect , maskMenuToolBar , Portal } from "./utils/selection" ;
18
+ import { execSelectMarks , getSelectionRect , Portal } from "./utils/selection" ;
19
19
20
20
const TOOLBAR_OFFSET_HEIGHT = 40 ;
21
21
const TOOLBAR_OFFSET_WIDTH = 340 ;
@@ -29,36 +29,38 @@ export const MenuToolBar: FC<{
29
29
} > = props => {
30
30
const editor = props . editor ;
31
31
const keepStatus = useRef ( false ) ;
32
+ const [ top , setTop ] = useState ( 0 ) ;
33
+ const [ left , setLeft ] = useState ( 0 ) ;
34
+ const [ visible , setVisible ] = useState ( false ) ;
32
35
const toolbarRef = useRef < HTMLDivElement > ( null ) ;
36
+ const [ isMouseDown , setIsMouseDown ] = useState ( false ) ;
33
37
const [ selectedMarks , setSelectedMarks ] = useState < string [ ] > ( [ ] ) ;
34
38
35
39
const wakeUpToolbar = useMemoFn ( ( wakeUp : boolean ) => {
36
- const toolbar = toolbarRef . current ;
37
- if ( ! toolbar ) return void 0 ;
38
40
if ( ReactEditor . isFocused ( editor . raw ) && wakeUp ) {
39
41
setSelectedMarks (
40
42
Collection . omit ( Object . keys ( Editor . marks ( editor . raw ) || [ ] ) , NOT_INIT_SELECT )
41
43
) ;
42
44
const rect = getSelectionRect ( ) ;
43
45
if ( rect ) {
44
- toolbar . style . top = ` ${ rect . top + window . pageYOffset - TOOLBAR_OFFSET_HEIGHT - 10 } px` ;
45
- toolbar . style . left = ` ${
46
- rect . left + window . pageXOffset - TOOLBAR_OFFSET_WIDTH / 2 + rect . width / 2
47
- } px` ;
46
+ const t = rect . top + window . scrollY - TOOLBAR_OFFSET_HEIGHT - 10 ;
47
+ const l = rect . left + window . scrollX - TOOLBAR_OFFSET_WIDTH / 2 + rect . width / 2 ;
48
+ setTop ( t ) ;
49
+ setLeft ( l ) ;
48
50
}
51
+ setVisible ( true ) ;
49
52
} else {
50
- maskMenuToolBar ( toolbar ) ;
53
+ setVisible ( false ) ;
51
54
}
52
55
} ) ;
53
56
54
57
useEffect ( ( ) => {
55
- const toolbar = toolbarRef . current ;
56
- if ( ! toolbar || props . readonly ) return void 0 ;
58
+ if ( props . readonly ) return void 0 ;
57
59
const mouseUpHandler = ( ) => {
58
- ! keepStatus . current && ( toolbar . style . display = "" ) ;
60
+ ! keepStatus . current && setIsMouseDown ( false ) ;
59
61
} ;
60
62
const mouseDownHandler = ( ) => {
61
- ! keepStatus . current && ( toolbar . style . display = "none" ) ;
63
+ ! keepStatus . current && setIsMouseDown ( true ) ;
62
64
} ;
63
65
const selectionChangeHandler = ( ) => {
64
66
if ( keepStatus . current ) return void 0 ;
@@ -72,7 +74,7 @@ export const MenuToolBar: FC<{
72
74
return ( ) => {
73
75
document . removeEventListener ( EVENT_ENUM . MOUSE_UP , mouseUpHandler ) ;
74
76
document . removeEventListener ( EVENT_ENUM . MOUSE_DOWN , mouseDownHandler ) ;
75
- document . addEventListener ( EVENT_ENUM . SELECTION_CHANGE , selectionChangeHandler ) ;
77
+ document . removeEventListener ( EVENT_ENUM . SELECTION_CHANGE , selectionChangeHandler ) ;
76
78
} ;
77
79
} , [ editor , wakeUpToolbar , props . readonly ] ) ;
78
80
@@ -115,9 +117,10 @@ export const MenuToolBar: FC<{
115
117
[ exec , selectedMarks ]
116
118
) ;
117
119
118
- return props . readonly ? null : (
120
+ // 只读状态 / 不可见 / 鼠标按下 时隐藏
121
+ return props . readonly || ! visible || isMouseDown ? null : (
119
122
< Portal >
120
- < div ref = { toolbarRef } className = "hover-menu-container" >
123
+ < div ref = { toolbarRef } style = { { left , top } } className = "hover-menu-container" >
121
124
{ HoverMenu }
122
125
</ div >
123
126
</ Portal >
0 commit comments