1
1
import * as React from 'react' ;
2
- import { useCallback , useEffect , useRef } from 'react' ;
2
+ import { useRef } from 'react' ;
3
3
import { classNames } from 'mo/common/className' ;
4
4
import { IActivityBarItem } from 'mo/model/workbench/activityBar' ;
5
- import { useContextMenu } from 'mo/components/contextMenu' ;
6
5
import { IMenuItemProps , Menu } from 'mo/components/menu' ;
7
6
import { IActivityBarController } from 'mo/controller/activityBar' ;
8
7
@@ -13,6 +12,8 @@ import {
13
12
itemCheckedClassName ,
14
13
itemDisabledClassName ,
15
14
} from './base' ;
15
+ import { DropDown } from 'mo/components' ;
16
+ import { DropDownRef } from 'mo/components/dropdown' ;
16
17
17
18
export function ActivityBarItem (
18
19
props : IActivityBarItem & IActivityBarController
@@ -30,53 +31,38 @@ export function ActivityBarItem(
30
31
className,
31
32
onContextMenuClick,
32
33
} = props ;
33
- let content : React . ReactNode = '' ;
34
- if ( render ) {
35
- content = render ( ) ;
36
- }
37
34
38
- let contextViewMenu ;
39
- const currentElem = useRef < HTMLLIElement > ( null ) ;
35
+ const contextMenuRef = useRef < DropDownRef > ( null ) ;
40
36
41
- const onClickMenuItem = useCallback (
42
- ( e : React . MouseEvent , item : IMenuItemProps | undefined ) => {
43
- onContextMenuClick ?.( e , item ) ;
44
- contextViewMenu ?. dispose ( ) ;
45
- } ,
46
- [ contextMenu ]
47
- ) ;
48
- const renderContextMenu = ( ) => (
49
- < Menu onClick = { onClickMenuItem } data = { contextMenu } />
50
- ) ;
51
-
52
- useEffect ( ( ) => {
53
- if ( contextMenu . length > 0 ) {
54
- contextViewMenu = useContextMenu ( {
55
- anchor : currentElem . current ,
56
- render : renderContextMenu ,
57
- } ) ;
58
- }
59
- return function cleanup ( ) {
60
- contextViewMenu ?. dispose ( ) ;
61
- } ;
62
- } ) ;
37
+ const onClickMenuItem = (
38
+ e : React . MouseEvent ,
39
+ item : IMenuItemProps | undefined
40
+ ) => {
41
+ onContextMenuClick ?.( e , item ) ;
42
+ contextMenuRef . current ?. dispose ( ) ;
43
+ } ;
63
44
64
45
const onClickItem = function ( event ) {
65
46
if ( onClick ) {
66
47
onClick ( props . id , props ) ;
67
48
}
68
- if ( contextMenu . length > 0 && contextViewMenu ) {
69
- contextViewMenu . show ( {
70
- x : event . clientX ,
71
- y : event . clientY ,
72
- } ) ;
73
- }
74
49
} ;
75
50
51
+ const content = (
52
+ < a
53
+ title = { title }
54
+ className = { classNames ( labelClassName , 'codicon' , iconName ) }
55
+ >
56
+ { render ?.( ) || null }
57
+ </ a >
58
+ ) ;
59
+ const overlay = < Menu onClick = { onClickMenuItem } data = { contextMenu } /> ;
60
+
61
+ const hasContextMenu = contextMenu . length > 0 ;
62
+
76
63
return (
77
64
< li
78
65
id = { id }
79
- ref = { currentElem }
80
66
onClick = { onClickItem }
81
67
className = { classNames (
82
68
className ,
@@ -86,12 +72,18 @@ export function ActivityBarItem(
86
72
) }
87
73
data-id = { data . id }
88
74
>
89
- < a
90
- title = { title }
91
- className = { classNames ( labelClassName , 'codicon' , iconName ) }
92
- >
93
- { content }
94
- </ a >
75
+ { hasContextMenu ? (
76
+ < DropDown
77
+ ref = { contextMenuRef }
78
+ trigger = "click"
79
+ placement = "rightBottom"
80
+ overlay = { overlay }
81
+ >
82
+ { content }
83
+ </ DropDown >
84
+ ) : (
85
+ content
86
+ ) }
95
87
{ checked ? < div className = { indicatorClassName } > </ div > : null }
96
88
</ li >
97
89
) ;
0 commit comments