@@ -21,15 +21,18 @@ const tableCellClass = (alignRight: boolean) =>
2121
2222type ButtonProps = React . ButtonHTMLAttributes < HTMLButtonElement > ;
2323
24- export const VSCodeLink = React . memo ( ( { children, style, className, ...rest } : ButtonProps ) => (
25- < button
26- type = "button"
27- className = { className }
28- style = { { ...baseLinkStyle , ...style } }
29- { ...rest } >
30- { children }
31- </ button >
32- ) ) ;
24+ export const VSCodeLink = React . forwardRef < HTMLButtonElement , ButtonProps > (
25+ ( { children, style, className, ...rest } : ButtonProps , ref ) => (
26+ < button
27+ ref = { ref }
28+ type = "button"
29+ className = { className }
30+ style = { { ...baseLinkStyle , ...style } }
31+ { ...rest } >
32+ { children }
33+ </ button >
34+ )
35+ ) ;
3336
3437export const EmptyLine = ( ) => < div style = { { marginTop : '1em' } } /> ;
3538
@@ -47,33 +50,35 @@ export const CodePositionLink = React.memo(({line, filepath, position}: CodePosi
4750 }
4851
4952 const location = { 'line' : position . line , 'character' : position . character } ;
50- const stopEvent = ( event : React . MouseEvent < HTMLButtonElement > ) => {
51- event . preventDefault ( ) ;
52- event . stopPropagation ( ) ;
53- const nativeEvent = event . nativeEvent as { stopImmediatePropagation ?: ( ) => void } ;
54- nativeEvent . stopImmediatePropagation ?.( ) ;
55- } ;
56-
57- const openFileAtLocation = ( event : React . MouseEvent < HTMLButtonElement > ) => {
58- stopEvent ( event ) ;
59- const treeItem = event . currentTarget . closest ( 'vscode-tree-item' ) as HTMLElement & { open ?: boolean } | null ;
60- if ( treeItem ) {
61- if ( typeof treeItem . open === 'boolean' ) {
62- treeItem . open = true ;
63- } else {
64- treeItem . setAttribute ( 'open' , '' ) ;
65- }
53+ const buttonRef = React . useRef < HTMLButtonElement > ( null ) ;
54+
55+ React . useEffect ( ( ) => {
56+ const button = buttonRef . current ;
57+ if ( ! button ) {
58+ return ;
6659 }
67- vscode . openFile ( filepath , location ) ;
68- } ;
69- const handleMouseDown = ( event : React . MouseEvent < HTMLButtonElement > ) => stopEvent ( event ) ;
70- const handleClickCapture = ( event : React . MouseEvent < HTMLButtonElement > ) => stopEvent ( event ) ;
60+
61+ const handleNativeClick = ( event : MouseEvent ) => {
62+ event . preventDefault ( ) ;
63+ event . stopPropagation ( ) ;
64+
65+ const treeItem = button . closest ( 'vscode-tree-item' ) as HTMLElement & { open ?: boolean } | null ;
66+ if ( treeItem ) {
67+ if ( typeof treeItem . open === 'boolean' ) {
68+ treeItem . open = true ;
69+ } else {
70+ treeItem . setAttribute ( 'open' , '' ) ;
71+ }
72+ }
73+ vscode . openFile ( filepath , location ) ;
74+ } ;
75+
76+ button . addEventListener ( 'click' , handleNativeClick , true ) ;
77+ return ( ) => button . removeEventListener ( 'click' , handleNativeClick , true ) ;
78+ } , [ filepath , position . line , position . character ] ) ;
79+
7180 return (
72- < VSCodeLink
73- onClick = { openFileAtLocation }
74- onClickCapture = { handleClickCapture }
75- onMouseDown = { handleMouseDown }
76- onPointerDown = { handleMouseDown } >
81+ < VSCodeLink ref = { buttonRef } >
7782 { line }
7883 </ VSCodeLink >
7984 ) ;
0 commit comments