UNPKG

@diagramers/admin

Version:

Diagramers Admin Template - React starter for admin dashboards.

73 lines (63 loc) 2.73 kB
import React, { useRef } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import classNames from 'classnames'; import { MENU_BEHAVIOUR, MENU_PLACEMENT } from 'constants.js'; import NavUserMenu from './NavUserMenu'; import NavIconMenu from './NavIconMenu'; import MainMenu from './main-menu/MainMenu'; import NavLogo from './NavLogo'; import NavMobileButtons from './NavMobileButtons'; import { menuChangeAttrMenuAnimate, menuChangeCollapseAll } from './main-menu/menuSlice'; import NavLanguageSwitcher from './NavLanguageSwitcher'; const DELAY = 80; const Nav = () => { const dispatch = useDispatch(); const { navClasses, placementStatus, behaviourStatus, attrMobile, menuPadding } = useSelector((state) => state.menu); const mouseActionTimer = useRef(null); // Vertical menu semihidden state showing // Only works when the vertical menu is active and mobile menu closed const onMouseEnterDelay = () => { if (placementStatus.placementHtmlData === MENU_PLACEMENT.Vertical && behaviourStatus.behaviourHtmlData === MENU_BEHAVIOUR.Unpinned && attrMobile !== true) { dispatch(menuChangeCollapseAll(false)); dispatch(menuChangeAttrMenuAnimate('show')); } }; // Delayed one that hides or shows the menu. It's required to prevent collapse animation getting stucked const onMouseEnter = () => { if (mouseActionTimer.current) clearTimeout(mouseActionTimer.current); mouseActionTimer.current = setTimeout(() => { onMouseEnterDelay(); }, DELAY); }; // Vertical menu semihidden state hiding // Only works when the vertical menu is active and mobile menu closed const onMouseLeaveDelay = () => { if (placementStatus.placementHtmlData === MENU_PLACEMENT.Vertical && behaviourStatus.behaviourHtmlData === MENU_BEHAVIOUR.Unpinned && attrMobile !== true) { dispatch(menuChangeCollapseAll(true)); dispatch(menuChangeAttrMenuAnimate('hidden')); } }; const onMouseLeave = () => { if (mouseActionTimer.current) clearTimeout(mouseActionTimer.current); mouseActionTimer.current = setTimeout(() => { onMouseLeaveDelay(); }, DELAY); }; return ( <div id="nav" className={classNames('nav-container d-flex', navClasses)} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave}> <div className="nav-content d-flex" style={placementStatus.placementHtmlData === MENU_PLACEMENT.Horizontal && menuPadding ? { paddingRight: menuPadding } : {}} > <NavLogo /> <NavLanguageSwitcher /> <NavUserMenu /> <NavIconMenu /> <MainMenu /> <NavMobileButtons /> </div> <div className="nav-shadow" /> </div> ); }; export default React.memo(Nav);