import * as React from "react" ; import * as ReactDOM from "react-dom" ; import { IConstructor } from "../../common/constructor" ; import { CONTEXTMENU_WARN_DECORATOR_NEEDS_REACT_ELEMENT , CONTEXTMENU_WARN_DECORATOR_NO_METHOD , } from "../../common/errors" ; import { getDisplayName , isFunction } from "../../common/utils" ; import { isDarkTheme } from "../../common/utils/isDarkTheme" ; import * as ContextMenu from "./contextMenu" ; export interface IContextMenuTargetComponent extends React . Component { render ( ) : React . ReactElement < any > | null | undefined ; renderContextMenu : ( e : React . MouseEvent < HTMLElement > ) => JSX . Element | undefined ; onContextMenuClose ? : ( ) => void ; } deprecated export function ContextMenuTarget < T extends IConstructor < IContextMenuTargetComponent > > ( WrappedComponent ) { if ( ! isFunction ( WrappedComponent . prototype . renderContextMenu ) ) { console . warn ( CONTEXTMENU_WARN_DECORATOR_NO_METHOD ) ; } return class ContextMenuTargetClass extends WrappedComponent { public static displayName = `ContextMenuTarget(${ getDisplayName ( WrappedComponent ) })` ; public render ( ) { const element = super . render ( ) ; if ( element == null ) { return element ; } if ( ! React . isValidElement < any > ( element ) ) { console . warn ( CONTEXTMENU_WARN_DECORATOR_NEEDS_REACT_ELEMENT ) ; return element ; } const oldOnContextMenu = element . props . onContextMenu as React . MouseEventHandler < HTMLElement > ; const onContextMenu = ( e ) => { if ( e . defaultPrevented ) { return ; } if ( isFunction ( this . renderContextMenu ) ) { const menu = this . renderContextMenu ( e ) ; if ( menu != null ) { const darkTheme = isDarkTheme ( ReactDOM . findDOMNode ( this ) ) ; e . preventDefault ( ) ; ContextMenu . show ( menu , { left : e . clientX , top : e . clientY } , this . onContextMenuClose , darkTheme ) ; } } oldOnContextMenu ?. ( e ) ; } ; return React . cloneElement ( element , { onContextMenu } ) ; } } ; }