From dda83e1e489cb0ec5cb0c19087f0bb3ac76397d1 Mon Sep 17 00:00:00 2001 From: haoliu716 Date: Sun, 7 Jul 2024 09:26:03 +0300 Subject: [PATCH 1/2] fix-menu-issues: fix menu issues --- package.json | 2 +- .../commerce/desktop-nav-menu-hanzo.tsx | 159 ++++++++++-------- packages/brand/components/header/desktop.tsx | 12 +- 3 files changed, 96 insertions(+), 77 deletions(-) diff --git a/package.json b/package.json index caad71eb..bc2f5e95 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "@types/react": "^18.3.2", "@types/react-dom": "^18.3.0", "supports-color": "8.1.1", - "@hanzo/brand": "0.1.16", + "@hanzo/brand": "link:./packages/brand", "@luxfi/data": "1.0.6", "@hanzo/auth": "2.4.12", "@hanzo/commerce": "7.1.5", diff --git a/packages/brand/components/commerce/desktop-nav-menu-hanzo.tsx b/packages/brand/components/commerce/desktop-nav-menu-hanzo.tsx index 57729415..d07b5170 100644 --- a/packages/brand/components/commerce/desktop-nav-menu-hanzo.tsx +++ b/packages/brand/components/commerce/desktop-nav-menu-hanzo.tsx @@ -17,83 +17,102 @@ import { import Warpcast from "../icons/warpcast"; import type { LinkDef } from "@hanzo/ui/types"; -const preventDefault = (e: WheelEvent | TouchEvent) => e.preventDefault(); -const handleMouseOver = () => { - document.addEventListener('wheel', preventDefault, { passive: false }); - document.addEventListener('touchmove', preventDefault, { passive: false }); -}; -const handleMouseOut = () => { - document.removeEventListener('wheel', preventDefault); - document.removeEventListener('touchmove', preventDefault); -}; +const DesktopNavHanzo: React.FC<{ + links: LinkDefExtended[], + className?: string, + isMenuOpened: boolean, + setIsMenuOpen: React.Dispatch> +}> = ({ links, className = '', isMenuOpened, setIsMenuOpen }) => { + React.useEffect(() => { + const preventScroll = (e: WheelEvent | TouchEvent) => { + e.preventDefault(); + }; + if (isMenuOpened) { + window.addEventListener('wheel', preventScroll, { passive: false }); + window.addEventListener('touchmove', preventScroll, { passive: false }); + window.addEventListener('keydown', preventScrollKeys, { passive: false }); + } else { + window.removeEventListener('wheel', preventScroll); + window.removeEventListener('touchmove', preventScroll); + window.removeEventListener('keydown', preventScrollKeys); + } -const DesktopNavHanzo: React.FC<{ - links: LinkDefExtended[], - className?: string, - menuFlag: boolean, - setMenuFlag: React.Dispatch> -}> = ({ links, className = '', setMenuFlag, menuFlag }) => ( - links.length > 0 ? ( - - - {links.map((el, index) => ( - - {el.title === 'Docs' || el.title === 'Pricing' ? ( - - - {el.title} - - - ) : ( - <> - { - setMenuFlag(true) - handleMouseOver() - }} - onMouseOut={ () => { - setMenuFlag(false) - handleMouseOut() - } } - onClick={ () => { - if (menuFlag) { - setMenuFlag(false) - handleMouseOut() - } else { - setMenuFlag(true) - handleMouseOver() + return () => { + window.removeEventListener('wheel', preventScroll); + window.removeEventListener('touchmove', preventScroll); + window.removeEventListener('keydown', preventScrollKeys); + }; + }, [isMenuOpened]); + + const preventScrollKeys = (e: KeyboardEvent) => { + if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', ' '].includes(e.key)) { + e.preventDefault(); + } + }; + + const handleMouseEnter = React.useCallback(() => { + setIsMenuOpen(true); + }, [setIsMenuOpen]); + + const handleMouseLeave = React.useCallback(() => { + setIsMenuOpen(false); + }, [setIsMenuOpen]); + + const menuHiddenClass = !isMenuOpened ? "invisible" : ""; + + return ( + links.length > 0 ? ( + + + {links.map((el, index) => ( + + {el.title === 'Docs' || el.title === 'Pricing' ? ( + + + {el.title} + + + ) : ( + <> + + { + el.href && el.href !== "" ? + + {el.title} + : <>{el.title} } - }} - >{el.title} - { - setMenuFlag(true) - handleMouseOver() - }} - onMouseOut={ () => { - setMenuFlag(false) - handleMouseOut() - } } - > -
- {GroupChildMenu(el.childMenu)} -
-
- - )} -
- ))} -
-
- ) : null -); +
+ +
+ {GroupChildMenu(el.childMenu)} +
+
+ + )} +
+ ))} +
+
+ ) : null + ) +}; export default DesktopNavHanzo; const ListItem = React.forwardRef< - React.ElementRef<"a">, + React.ElementRef<"a">, React.ComponentPropsWithoutRef<"a"> >(({ className, title, children, key, ...props }, ref) => (
  • @@ -101,7 +120,7 @@ const ListItem = React.forwardRef< { - const [menuFlag, setMenuFlag] = useState(false) + const [isMenuOpened, setIsMenuOpen] = React.useState(false); + const opendMenuClass = isMenuOpened ? " h-full" : "" // TODO move 13px into a size class and configure twMerge to recognize say, 'text-size-nav' // (vs be beat out by 'text-color-nav') return ( -
    {/* md or larger */}
    - +
    From f88d986f53f0cbb868c764927220c5cc39509b93 Mon Sep 17 00:00:00 2001 From: haoliu716 Date: Sun, 7 Jul 2024 09:32:44 +0300 Subject: [PATCH 2/2] fix-menu-issues: fix build issue --- .../brand/components/commerce/desktop-nav-menu-hanzo.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/brand/components/commerce/desktop-nav-menu-hanzo.tsx b/packages/brand/components/commerce/desktop-nav-menu-hanzo.tsx index d07b5170..8c70ce97 100644 --- a/packages/brand/components/commerce/desktop-nav-menu-hanzo.tsx +++ b/packages/brand/components/commerce/desktop-nav-menu-hanzo.tsx @@ -52,13 +52,13 @@ const DesktopNavHanzo: React.FC<{ } }; - const handleMouseEnter = React.useCallback(() => { + const handleMouseEnter = () => { setIsMenuOpen(true); - }, [setIsMenuOpen]); + }; - const handleMouseLeave = React.useCallback(() => { + const handleMouseLeave = () => { setIsMenuOpen(false); - }, [setIsMenuOpen]); + }; const menuHiddenClass = !isMenuOpened ? "invisible" : "";