'use client'; import { VscChevronDown } from '@react-icons/all-files/vsc/VscChevronDown'; import { VscVersions } from '@react-icons/all-files/vsc/VscVersions'; import { Menu, MenuButton, MenuItem, useMenuState } from 'ariakit/menu'; import type { PropsWithChildren, ReactNode } from 'react'; import { useCallback, useMemo, useState, useEffect } from 'react'; export interface OverloadSwitcherProps { methodName: string; overloads: ReactNode[]; } export default function OverloadSwitcher({ methodName, overloads, children, }: PropsWithChildren<{ readonly methodName: string; readonly overloads: ReactNode[] }>) { const [hash, setHash] = useState(() => (typeof window === 'undefined' ? '' : window.location.hash)); const hashChangeHandler = useCallback(() => { setHash(window.location.hash); }, []); const [overloadIndex, setOverloadIndex] = useState(1); const overloadedNode = overloads[overloadIndex - 1]!; const menu = useMenuState({ gutter: 8, sameWidth: true, fitViewport: true }); useEffect(() => { window.addEventListener('hashchange', hashChangeHandler); return () => { window.removeEventListener('hashchange', hashChangeHandler); }; }); useEffect(() => { if (hash) { const elementId = hash.replace('#', ''); const [name, idx] = elementId.split(':'); if (name && methodName === name) { if (idx) { const hashOverload = Number.parseInt(idx, 10); const resolvedOverload = Math.max(Math.min(hashOverload, overloads.length), 1); setOverloadIndex(Number.isNaN(resolvedOverload) ? 1 : resolvedOverload); } const element = document.querySelector(`[id^='${name}']`); if (element) { element.scrollIntoView({ behavior: 'smooth' }); } } } }, [hash, methodName, overloads.length]); const menuItems = useMemo( () => overloads.map((_, idx) => ( )), [overloads], ); return (