import React, { useCallback, useEffect, useRef, useState } from 'react' import classnames from 'classnames' import { reduxSet } from './utils' import { MenuList } from './menu-list' import { MenuItemT } from './menu-list-item' export interface MenuT { label: string submenu: MenuItemT[] } export interface MenuBarProps { menu: MenuT[] } export const MenuBar: React.FC = ({ menu: propMenu }) => { const [clicked, setClicked] = useState(false) const [focusing, setFocusing] = useState(0) const [menu, setMenu] = useState(propMenu) const lock = useRef(false) const menuItems = useRef<{ [i: number]: HTMLDivElement }>({}) const onButtonMouseOver = useCallback( (i: number) => { if (clicked) { setFocusing(i) } }, [clicked] ) const onButtonClick = useCallback( (i) => { if (lock.current) { lock.current = false return } setClicked(!(focusing === i && clicked)) }, [clicked, focusing] ) const onTouchStart = useCallback( (i) => { if (i !== focusing && clicked) { lock.current = true } }, [clicked, focusing] ) const onMouseMove = (i: number) => { setFocusing(i) } const setRefs = (ref: HTMLDivElement, i: number) => { menuItems.current[i] = ref } useEffect(() => { setMenu(propMenu) }, [propMenu]) const changeCheckState = (mainIndex: number, subIndex: number, checked: boolean, isRadio = false) => { if (!isRadio) { setMenu(reduxSet(menu, [mainIndex, 'submenu', subIndex, 'checked'], checked) as MenuT[]) } else { let newMenu = [...menu] const menuLength = menu[mainIndex].submenu.length for (let i = 0; i < menuLength; i++) { if (menu[mainIndex].submenu[i].type === 'radio') { newMenu = reduxSet(newMenu, [mainIndex, 'submenu', i, 'checked'], i === subIndex) as MenuT[] } } setMenu(newMenu) } } return ( ) }