// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import React, {useEffect, useState, useContext, CSSProperties, useRef} from 'react' import CompassIcon from '../../widgets/icons/compassIcon' import MenuUtil from './menuUtil' import Menu from '.' import './subMenuOption.scss' export const HoveringContext = React.createContext(false) type SubMenuOptionProps = { id: string name: string position?: 'bottom' | 'top' | 'left' | 'left-bottom' | 'auto' icon?: React.ReactNode children: React.ReactNode className?: string } function SubMenuOption(props: SubMenuOptionProps): JSX.Element { const [isOpen, setIsOpen] = useState(false) const isHovering = useContext(HoveringContext) const openLeftClass = props.position === 'left' || props.position === 'left-bottom' ? ' open-left' : '' useEffect(() => { if (isHovering !== undefined) { setIsOpen(isHovering) } }, [isHovering]) const ref = useRef(null) const styleRef = useRef({}) useEffect(() => { const newStyle: CSSProperties = {} if (props.position === 'auto' && ref.current) { const openUp = MenuUtil.openUp(ref) if (openUp.openUp) { newStyle.bottom = 0 } else { newStyle.top = 0 } } styleRef.current = newStyle }, [ref.current]) return (
{ e.preventDefault() e.stopPropagation() setIsOpen((open) => !open) }} ref={ref} > {props.icon ?
{props.icon}
:
}
{props.name}
{isOpen &&
{props.children}
undefined} />
}
) } export default React.memo(SubMenuOption)