import { useCallback, useEffect, useRef, useState } from 'react' import cx from 'classnames' import { useRouter } from 'next/router' import { AnchoredOverlay, IconButton } from '@primer/react' import { KebabHorizontalIcon, LinkExternalIcon, MarkGithubIcon, SearchIcon, XIcon, } from '@primer/octicons-react' import { DEFAULT_VERSION, useVersion } from 'components/hooks/useVersion' import { Link } from 'components/Link' import { useMainContext } from 'components/context/MainContext' import { useHasAccount } from 'components/hooks/useHasAccount' import { LanguagePicker } from './LanguagePicker' import { HeaderNotifications } from 'components/page-header/HeaderNotifications' import { ApiVersionPicker } from 'components/sidebar/ApiVersionPicker' import { useTranslation } from 'components/hooks/useTranslation' import { Search } from 'components/Search' import { VersionPicker } from 'components/page-header/VersionPicker' import styles from './Header.module.scss' export const Header = () => { const router = useRouter() const { error } = useMainContext() const { currentProduct, allVersions } = useMainContext() const { currentVersion } = useVersion() const { t } = useTranslation(['header']) const isRestPage = currentProduct && currentProduct.id === 'rest' const [isSearchOpen, setIsSearchOpen] = useState(false) const [scroll, setScroll] = useState(false) const { hasAccount } = useHasAccount() const [isMenuOpen, setIsMenuOpen] = useState(false) const openMenuOverlay = useCallback(() => setIsMenuOpen(true), [setIsMenuOpen]) const closeMenuOverlay = useCallback(() => setIsMenuOpen(false), [setIsMenuOpen]) const isMounted = useRef(false) const menuButtonRef = useRef(null) const signupCTAVisible = hasAccount === false && // don't show if `null` (currentVersion === DEFAULT_VERSION || currentVersion === 'enterprise-cloud@latest') useEffect(() => { function onScroll() { setScroll(window.scrollY > 10) } window.addEventListener('scroll', onScroll) return () => { window.removeEventListener('scroll', onScroll) } }, []) useEffect(() => { const close = (e: { key: string }) => { if (e.key === 'Escape') { setIsSearchOpen(false) } } window.addEventListener('keydown', close) return () => window.removeEventListener('keydown', close) }, []) // For the UI in smaller browswer widths, and focus the picker menu button when the search // input is closed. useEffect(() => { if (!isSearchOpen && isMounted.current && menuButtonRef.current) { menuButtonRef.current.focus() } if (!isMounted.current) { isMounted.current = true } }, [isSearchOpen]) return ( <>
{error !== '404' && }
{/* */} {error !== '404' && (
)}
{signupCTAVisible && ( )} setIsSearchOpen(!isSearchOpen)} aria-label="Open Search Bar" aria-expanded={isSearchOpen ? 'true' : 'false'} icon={SearchIcon} /> setIsSearchOpen(!isSearchOpen)} aria-label="Close Search Bar" aria-expanded={isSearchOpen ? 'true' : 'false'} icon={XIcon} /> {/* The ... navigation menu at medium and smaller widths */}
) }