import { FC, MouseEvent, useCallback, useRef } from 'react'; import { Box, Image, Text, Heading, Flex, Icon, useDisclosure, Collapse, useMediaQuery, useColorMode, Button, } from '@chakra-ui/react'; import UseAnimations from 'react-useanimations'; import menu3 from 'react-useanimations/lib/menu3'; import { FiHome, FiArchive, FiUser, FiSun, FiMoon, FiSearch, } from 'react-icons/fi'; import useGetColors from 'lib/hooks/useGetColors'; import { useRouter } from 'next/router'; import dynamic from 'next/dynamic'; import { IconType } from 'react-icons'; import React from 'react'; const Search = dynamic(() => import('./search')); const ImageSpinner = dynamic(() => import('components/ImageSpinner')); const NavItem = dynamic(() => import('components/nav/NavItem')); export type MenuItem = { id: number; name: string; path?: string; icon: IconType; }; const menu: MenuItem[] = [ { id: 0, name: '首页', path: '/', icon: FiHome, }, { id: 1, name: '归档', path: '/archive', icon: FiArchive, }, { id: 4, name: '关于', path: '/about', icon: FiUser, }, { id: 5, name: '搜索', icon: FiSearch, }, ]; export type HandleMenuClick = ( // eslint-disable-next-line no-unused-vars e: MouseEvent, // eslint-disable-next-line no-unused-vars path?: string ) => void; interface MenuListProps { boxBg: string; handleMenuClick: HandleMenuClick; } const MenuList: FC = React.memo(function MenuList({ boxBg, handleMenuClick, }) { return ( {menu.map((menuItem) => ( ))} ); }); const NavBar: FC = () => { const router = useRouter(); const [isLargerThan640] = useMediaQuery('(min-width: 640px)'); // Menu toggle const { isOpen, onToggle } = useDisclosure({ defaultIsOpen: false }); // Modal toggle const { isOpen: isModalOpen, onOpen: onModalOpen, onClose: onModalClose, } = useDisclosure(); const { colorMode, toggleColorMode } = useColorMode(); const { boxBg, bioColor, textColor, headingColor } = useGetColors(); const iconRef = useRef(null); // Switch pages const handleMenuClick = useCallback( (e: MouseEvent, path?: string) => { e.preventDefault(); if (path) { !isLargerThan640 && // Click the animate icon. (iconRef.current?.children[0] as HTMLDivElement).click(); router.push(path); } else { onModalOpen(); } }, // eslint-disable-next-line react-hooks/exhaustive-deps [] ); return ( <> {/* avatar */} Avatar} /> {/* emoji on avatar */} ❤️ 肥羊 {/* Bio or something */} 恐惧是思维杀手... {/* Menu */} {/* Mobile menu (controled by collapse) */} {/* Desktop menu */} {/* Mobile menu icon */} {isModalOpen && ( )} ); }; export default NavBar;