kanban / webapp /src /widgets /menu /subMenuOption.tsx
Leon4gr45's picture
Upload folder using huggingface_hub
13555f3 verified
// 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<HTMLDivElement>(null)
const styleRef = useRef<CSSProperties>({})
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 (
<div
id={props.id}
className={`MenuOption SubMenuOption menu-option${openLeftClass}${isOpen ? ' menu-option-active' : ''}${props.className ? ' ' + props.className : ''}`}
onClick={(e: React.MouseEvent) => {
e.preventDefault()
e.stopPropagation()
setIsOpen((open) => !open)
}}
ref={ref}
>
{props.icon ? <div className='menu-option__icon'>{props.icon}</div> : <div className='noicon'/>}
<div className='menu-name'>{props.name}</div>
<CompassIcon icon='chevron-right'/>
{isOpen &&
<div
className={'SubMenu Menu noselect ' + (props.position || 'bottom')}
style={styleRef.current}
>
<div className='menu-contents'>
<div className='menu-options'>
{props.children}
</div>
<div className='menu-spacer hideOnWidescreen'/>
<div className='menu-options hideOnWidescreen'>
<Menu.Text
id='menu-cancel'
name={'Cancel'}
className='menu-cancel'
onClick={() => undefined}
/>
</div>
</div>
</div>
}
</div>
)
}
export default React.memo(SubMenuOption)