import { chakra, Flex, Button, HStack, Icon, IconButton, Link, useColorMode, useColorModeValue, useDisclosure, useUpdateEffect, Menu, MenuButton, MenuList, MenuItem, MenuDivider, Image, Modal, ModalOverlay, ModalContent, ModalBody, ModalCloseButton, Text, Box, VStack, } from "@chakra-ui/react" import siteConfig from "configs/site-config" import { useViewportScroll } from "framer-motion" import NextLink from "next/link" import React from "react" import { FaMoon, FaSun, FaUserAlt, FaRegSun, FaSignOutAlt, FaRegBookmark, FaChartBar, FaHome, FaArrowRight, FaGithub } from "react-icons/fa" import Logo, { LogoIcon } from "src/components/logo" import { MobileNavButton, MobileNavContent } from "./mobile-nav" import AlgoliaSearch from "src/components/search/algolia-search" import useSession from "hooks/use-session" import { requestApi } from "utils/axios/request" import { removeToken, saveToken } from "utils/axios/getToken" import { Session } from "src/types/session" import navLinks from "./nav-links" import { useRouter } from "next/router" const DiscordIcon = (props) => ( ) const GithubIcon = (props) => ( ) function HeaderContent() { const { pathname } = useRouter() const mobileNav = useDisclosure() const [session, storeSession]: [Session, any] = useSession() const { isOpen: isLoginOpen, onOpen: onLoginOpen, onClose: onLoginClose } = useDisclosure() const { toggleColorMode: toggleMode } = useColorMode() const text = useColorModeValue("dark", "light") const SwitchIcon = useColorModeValue(FaMoon, FaSun) const mobileNavBtnRef = React.useRef() useUpdateEffect(() => { mobileNavBtnRef.current?.focus() }, [mobileNav.isOpen]) const login = async () => { const res = await requestApi.post("/login") saveToken(res.data.token) storeSession(res.data) onLoginClose() } const logout = async () => { await requestApi.post("/logout") removeToken() storeSession(null) } return ( <> {navLinks.map(link => {link.title})} } /> {session ? : } aria-label="Options" ml={{ base: "0", md: "2" }} /> }> Sunface }>Dashboard }>Bookmarks }>Account Settings logout()} icon={}>Log out : } 欢迎加入im.dev,一起打造全世界最好的开发者社区 从世界各地精选最优秀的内容 丰富的功能特性等待你的探索 充分展示自我并获得猎头关注 如果继续,则表示你同意im.dev的服务条款和隐私政策 {/* */} ) } function Header(props) { const bg = useColorModeValue("white", "gray.800") const ref = React.useRef() const [y, setY] = React.useState(0) const { height = 0 } = ref.current?.getBoundingClientRect() ?? {} const { scrollY } = useViewportScroll() React.useEffect(() => { return scrollY.onChange(() => setY(scrollY.get())) }, [scrollY]) return ( height ? "sm" : undefined} transition="box-shadow 0.2s" pos="fixed" top="0" zIndex="3" bg={bg} left="0" right="0" borderTop="4px solid" borderTopColor="teal.400" width="full" {...props} > ) } export default Header