import { useEffect, useCallback, useState, useRef } from "react"; import { useTheme } from "nextra-theme-docs"; import Link from "next/link"; import classNames from "classnames"; import { VercelLogo } from "./icons"; import { PRODUCT_MENU_ITEMS, PLATFORM_MENU_ITEMS } from "./items"; import type { MenuItemProps } from "./types"; import { MouseEvent } from "react"; import { useTurboSite } from "../SiteSwitcher"; function MenuDivider({ children, ...other }: { children: string }) { return (

{children}

); } function MenuItem({ children, prefix, className, type, href, onClick, closeMenu, disabled, ...other }: MenuItemProps) { const [copied, setCopied] = useState(false); const handleClick = () => { if (onClick) { onClick(); } if (type === "copy") { setCopied(true); } else { closeMenu(); } }; useEffect(() => { if (copied) { const timeout = setTimeout(() => { setCopied(false); closeMenu(); }, 2000); return () => clearTimeout(timeout); } }, [copied, closeMenu]); const classes = classNames( className, "group flex items-center px-4 py-2 text-sm dark:hover:bg-gray-800 hover:bg-gray-200 w-full rounded-md" ); if (type === "internal") { return ( {prefix} {children} ); } if (type === "external") { return ( {prefix} {children} ); } if (type === "copy") { return ( ); } } export function LogoContext() { const [open, setOpen] = useState(false); const site = useTurboSite(); const menu = useRef(null); const { theme = "dark" } = useTheme(); const toggleMenu = (e: MouseEvent) => { e.preventDefault(); if (e.type === "contextmenu") { setOpen((prev) => !prev); } else { setOpen(false); window.open(`https://vercel.com`, "_blank"); } }; const onClickOutside: EventListener = useCallback( (e) => { if (menu.current && open && !menu.current.contains(e.target)) { setOpen(false); } }, [open] ); useEffect(() => { document.addEventListener("click", onClickOutside, true); return () => { document.removeEventListener("click", onClickOutside, true); }; }, [onClickOutside]); return (
{open && (
Platform {PLATFORM_MENU_ITEMS({ theme, site }).map((item) => ( setOpen(false)} {...item} > {item.children} ))} Products {PRODUCT_MENU_ITEMS({ theme, site }).map((item) => ( setOpen(false)} {...item} > {item.children} ))}
)}
); }