import React, {useState, useRef, useEffect, type HTMLProps, useCallback} from 'react' import clsx from 'clsx' import Link from 'next/link' import {ArrowUpRightIcon, TriangleDownIcon} from '@primer/octicons-react' import {Text} from '@primer/react-brand' import styles from './LinksDropdown.module.css' import type {ConfigContextLink} from '../../context/useConfig' export type LinksDropdownProps = { items: ConfigContextLink[] } & HTMLProps export const LinksDropdown = ({items, className, ...props}: LinksDropdownProps) => { const [isOpen, setIsOpen] = useState(false) const buttonRef = useRef(null) const menuRef = useRef(null) useEffect(() => { const closeDropdown = (event: MouseEvent) => { if ( menuRef.current && !menuRef.current.contains(event.target as Node) && buttonRef.current && !buttonRef.current.contains(event.target as Node) ) { setIsOpen(false) buttonRef.current.focus() } } document.addEventListener('mousedown', closeDropdown) return () => { document.removeEventListener('mousedown', closeDropdown) } }, [menuRef, buttonRef]) useEffect(() => { const menu = menuRef.current if (!menu) return const handleKeyDown = (e: KeyboardEvent) => { switch (e.key) { case 'Escape': e.preventDefault() setIsOpen(false) buttonRef.current?.focus() break case 'Tab': setTimeout(() => { if (!menu.contains(document.activeElement)) { setIsOpen(false) } }, 0) break } } menu.addEventListener('keydown', handleKeyDown) return () => { menu.removeEventListener('keydown', handleKeyDown) } }, [menuRef]) const handleToggle = useCallback(() => { const nextIsOpen = !isOpen setIsOpen(nextIsOpen) if (nextIsOpen) { setTimeout(() => { document.querySelector(`#dropdown-item-0 a`)?.focus() }, 0) } else { buttonRef.current?.focus() } }, [isOpen]) const activeItem = items.find(item => item.isActive) || items[0] return (
) }