You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
4.4 KiB

4 years ago
import {
chakra,
Flex,
HStack,
IconButton,
useColorModeValue,
useDisclosure,
useUpdateEffect,
Box,
VStack,
useMediaQuery,
Text
4 years ago
} from "@chakra-ui/react"
import siteConfig from "configs/site-config"
import NextLink from "next/link"
4 years ago
import React, { useEffect, useState } from "react"
4 years ago
import { FaBell, FaGithub, FaSearch } from "react-icons/fa"
4 years ago
import Logo, { LogoIcon } from "src/components/logo"
import { MobileNavButton, MobileNavContent } from "./mobile-nav"
import AlgoliaSearch from "src/components/search/algolia-search"
import { useRouter } from "next/router"
import { ReserveUrls } from "src/data/reserve-urls"
import Link from "next/link"
import DarkMode from "components/dark-mode"
4 years ago
import AccountMenu from "components/user-menu"
import { getSvgIcon } from "components/svg-icon"
4 years ago
import { navLinks } from "src/data/links"
4 years ago
import { requestApi } from "utils/axios/request"
4 years ago
import Notification from "components/notification"
4 years ago
4 years ago
4 years ago
function HeaderContent() {
const router = useRouter()
const { asPath } = router
const mobileNav = useDisclosure()
4 years ago
const [navs,setNavs] = useState(navLinks)
useEffect(() => {
requestApi.get("/navbars").then(res => {
const nvs = []
res.data.forEach(nv => nvs.push({
title: nv.label,
url: nv.value
}))
setNavs(nvs)
})
},[])
4 years ago
const mobileNavBtnRef = React.useRef<HTMLButtonElement>()
const [isLargerThan768] = useMediaQuery("(min-width: 768px)")
useUpdateEffect(() => {
mobileNavBtnRef.current?.focus()
}, [mobileNav.isOpen])
4 years ago
const isActive = url => {
if (url === '/') {
return asPath === url
}
return asPath.startsWith(url)
}
4 years ago
return (
<>
<Flex className="vertical-nav" h="100%" align="center" justify="space-between" px={[2,2,6,6]} direction="column" py="8">
<VStack align="center">
<NextLink href="/" passHref>
<chakra.a style={{ marginTop: '-5px' }} aria-label="Chakra UI, Back to homepage">
{isLargerThan768 ? <Logo width="130" /> : <Logo width="105" />}
</chakra.a>
</NextLink>
<VStack pt="6" ml={{ base: 1, md: 4, lg: 12 }} fontSize="1rem" alignItems="left">
4 years ago
{navs.map(link =>
4 years ago
<Link href={link.url} key={link.title}>
4 years ago
<HStack cursor="pointer" px="4" py="0.7rem" rounded="md" key={link.url} color={useColorModeValue("gray.700", "whiteAlpha.900")} aria-current={isActive(link.baseUrl??link.url) ? "page" : undefined} _activeLink={{ bg: useColorModeValue("transparent", "rgba(48, 140, 122, 0.3)"), color: useColorModeValue("teal.500", "teal.200"), fontWeight: "bold", }} >
{/* <Box width="25px">{link.icon}</Box> */}
<Text fontWeight="600">{link.title}</Text>
</HStack>
</Link>
)}
4 years ago
</VStack>
</VStack>
<VStack
spacing="4"
align="center"
color={useColorModeValue("gray.500", "gray.400")}
>
<Link
aria-label="Go to Chakra UI GitHub page"
href={siteConfig.repo.url}
>
<IconButton
size="md"
fontSize="1.4rem"
aria-label="go to github"
variant="ghost"
color="current"
_focus={null}
icon={<FaGithub />}
/>
</Link>
4 years ago
<Notification />
4 years ago
<DarkMode fontSize="1.4rem"/>
<AccountMenu />
{/* <MobileNavButton
ref={mobileNavBtnRef}
aria-label="Open Menu"
onClick={mobileNav.onOpen}
/> */}
</VStack>
</Flex>
4 years ago
{/* <MobileNavContent isOpen={mobileNav.isOpen} onClose={mobileNav.onClose} /> */}
4 years ago
</>
)
}
function VerticalNav(props) {
const ref = React.useRef<HTMLHeadingElement>()
return (
<chakra.header
ref={ref}
transition="box-shadow 0.2s"
pos="fixed"
top="0"
zIndex="3"
left="0"
bottom="0"
4 years ago
bg={useColorModeValue('gray.50', 'gray.800')}
4 years ago
{...props}
>
<chakra.div height="100%">
<HeaderContent />
</chakra.div>
</chakra.header>
)
}
export default VerticalNav