From 190f105901e73c089a5f46ace3404fd5c814d2b1 Mon Sep 17 00:00:00 2001 From: hiba-aldalaty Date: Fri, 7 Jan 2022 17:04:39 +0000 Subject: [PATCH] Add open delay for submenus in sidebar Signed-off-by: hiba-aldalaty --- .../src/layout/Sidebar/SidebarSubmenu.tsx | 27 ++++++++++++++++--- .../src/layout/Sidebar/config.ts | 13 +-------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx b/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx index 1e9afe86ef..223065cfc9 100644 --- a/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx +++ b/packages/core-components/src/layout/Sidebar/SidebarSubmenu.tsx @@ -1,3 +1,4 @@ +/* eslint-disable no-console */ /* * Copyright 2021 The Backstage Authors * @@ -16,7 +17,13 @@ import { makeStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; import classnames from 'classnames'; -import React, { ReactNode, useContext } from 'react'; +import React, { + ReactNode, + useContext, + useEffect, + useRef, + useState, +} from 'react'; import { SidebarItemWithSubmenuContext, sidebarConfig, @@ -48,7 +55,6 @@ const useStyles = (props: { left: number }) => scrollbarWidth: 'none', cursor: 'default', width: submenuConfig.drawerWidthClosed, - borderRight: `1px solid #383838`, '& > *': { flexShrink: 0, }, @@ -91,10 +97,25 @@ export const SidebarSubmenu = (props: SidebarSubmenuProps) => { const classes = useStyles({ left: left })(); const { isHoveredOn } = useContext(SidebarItemWithSubmenuContext); + const [isSubmenuOpen, setIsSubmenuOpen] = useState(false); + const hoverTimerRef = useRef(); + + useEffect(() => { + if (hoverTimerRef.current) { + clearTimeout(hoverTimerRef.current); + hoverTimerRef.current = undefined; + } + if (isHoveredOn) { + hoverTimerRef.current = window.setTimeout(() => { + hoverTimerRef.current = undefined; + setIsSubmenuOpen(true); + }, submenuConfig.defaultOpenDelayMs); + } + }, [isHoveredOn]); return (
diff --git a/packages/core-components/src/layout/Sidebar/config.ts b/packages/core-components/src/layout/Sidebar/config.ts index dbcdb7d788..3796898fc7 100644 --- a/packages/core-components/src/layout/Sidebar/config.ts +++ b/packages/core-components/src/layout/Sidebar/config.ts @@ -40,18 +40,7 @@ export const sidebarConfig = { export const submenuConfig = { drawerWidthClosed: 0, drawerWidthOpen: 202, - // As per NN/g's guidance on timing for exposing hidden content - // See https://www.nngroup.com/articles/timing-exposing-content/ - defaultOpenDelayMs: 100, - defaultCloseDelayMs: 0, - defaultFadeDuration: 200, - logoHeight: 32, - iconContainerWidth: drawerWidthClosed, - iconSize: drawerWidthClosed - iconPadding * 2, - iconPadding, - selectedIndicatorWidth: 3, - userBadgePadding, - userBadgeDiameter: drawerWidthClosed - userBadgePadding * 2, + defaultOpenDelayMs: sidebarConfig.defaultOpenDelayMs + 200, }; export const SIDEBAR_INTRO_LOCAL_STORAGE =