/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ import React, {useState, useRef, useEffect, type ReactNode} from 'react'; import clsx from 'clsx'; import NavbarNavLink from '@theme/NavbarItem/NavbarNavLink'; import NavbarItem from '@theme/NavbarItem'; import type {Props} from '@theme/NavbarItem/DropdownNavbarItem/Desktop'; export default function DropdownNavbarItemDesktop({ items, position, className, onClick, ...props }: Props): ReactNode { const dropdownRef = useRef(null); const [showDropdown, setShowDropdown] = useState(false); useEffect(() => { const handleClickOutside = ( event: MouseEvent | TouchEvent | FocusEvent, ) => { if ( !dropdownRef.current || dropdownRef.current.contains(event.target as Node) ) { return; } setShowDropdown(false); }; document.addEventListener('mousedown', handleClickOutside); document.addEventListener('touchstart', handleClickOutside); document.addEventListener('focusin', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); document.removeEventListener('touchstart', handleClickOutside); document.removeEventListener('focusin', handleClickOutside); }; }, [dropdownRef]); return (
tag focusable in case no link target // See https://github.com/facebook/docusaurus/pull/6003 // There's probably a better solution though... href={props.to ? undefined : '#'} className={clsx('navbar__link', className)} {...props} onClick={props.to ? undefined : (e) => e.preventDefault()} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setShowDropdown(!showDropdown); } }}> {props.children ?? props.label}
); }