import styles from './styles.module.scss'; // components import SidebarTrigger from '@ui/SidebarTrigger'; import Headroom from 'react-headroom'; import Logo from '@components/Logo'; import AppBar from "@mui/material/AppBar"; import {useSidebar} from "@contexts/sidebarContext"; import {useThemeProvider} from "@contexts/themeContext"; import {useEffect, useRef, useState} from 'react'; import styled from 'styled-components/macro'; import {Tab, Tabs} from "@mui/material"; // import LINKS from "@constants/links"; import Button from "@mui/material/Button"; import {NavLink, useLocation, useNavigate} from "react-router-dom"; import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; import ToggleButton from "@mui/material/ToggleButton"; import symbol from "@assets/symbol-defs.svg"; import symbol_m from "@assets/symbol-mobile.svg"; import {string} from "prop-types"; import IconButton from "@mui/material/IconButton"; import {animated,easings} from "@react-spring/web"; import {useSpring} from "@react-spring/core"; import {useWindowSize} from "react-use"; import ResizeObserver from "resize-observer-polyfill"; import {useSelector} from "react-redux"; import {allTopNavs, getRoute, getRouteChain, isLogin, isLogined} from "@features/mainSlice"; const i18n=global.i18n; const StyledToggleGroup= styled(ToggleButtonGroup)` border-radius: 0px !important; gap: 12px; `; const StyledToggle=styled(ToggleButton)` gap: 12px; text-transform:none !important; border: none !important; border-radius: var(--border-radius) !important; padding: 0px !important; &:hover, &:focus ,&.Mui-selected, &.active { background-color: var(--nav-item-hover) !important; a { color: var(--header); font-weight: 700; .icon { fill:${props => props.fill}; } } } a { display: flex; align-items: center; color: var(--text); padding: 12px !important; transition: all var(--transition); font-family: var(--heading-font); gap: 8px; .icon { display: flex; align-items: center; justify-content: center; width: 18px; height: 18px; fill: var(--text); } } `; const DesktopNavToggle=()=>{ const LINKS=useSelector(allTopNavs); const links=LINKS.slice(0,4); const {pathname} = useLocation(); const [alignment, setAlignment] = useState(pathname); const currRoute=useSelector(getRoute(pathname)); const getRootRoute=(pathname)=>{ let route=""; if (currRoute){ let clv=currRoute.lv; if (clv==null)return route; for (let i = 0; i < LINKS.length; i++) { let link=LINKS[i]; let lv=link.lv; if (clv.startsWith(lv)){ route=link.path; break; } } } return route; } useEffect(() => { setAlignment(getRootRoute(pathname)); }, [pathname]); const handleChange = (event, newAlignment) => { // setAlignment(newAlignment); }; return ( { links.map((link, index) => ( {i18n.t(link.title)} )) } ) } const DesktopSignInUp=()=>{ const navigate=useNavigate(); const isLogin=useSelector(isLogined); return (
{ !isLogin?( <> ):(<>) }
) } const DesktopNav = () => { const {open} = useSidebar(); const navstyle=open?styles.nav_open:""; return (
); } const MobileSignInUp=()=>{ const navigate=useNavigate(); const isLogin=useSelector(isLogined); return (
{ !isLogin?( <> ):( <> ) } {/**/}
); } const MobileNav=()=>{ return (
) } const PageHeader = () => { const LINKS=useSelector(allTopNavs); const {initHeaderHeight} = useThemeProvider(); const {pathname} = useLocation(); const navigate=useNavigate(); const barRef = useRef(null); const currRoute=useSelector(getRoute(pathname)); const chain=useSelector(getRouteChain(pathname)); const {isMobile,showHeader,setShowHeader} = useThemeProvider(); const [showMHeader, setShowMHeader] = useState(true); let lastscroll=0; const checkNavActive=(lv)=>{ if (currRoute&&currRoute.lv)return currRoute.lv.startsWith(lv); else return false; } const getHeaderHeight = () => { const header = document.querySelector('#appbar'); if (header!=null)return `${header.offsetHeight || 0}px` else return '0px'; } const handleScroll=()=>{ if (!barRef.showHeader)return; let scrollTop = document.documentElement.scrollTop; //滚动条滚动高度 let dt=scrollTop-lastscroll; lastscroll=scrollTop; let show=false; if (dt>20){ show=false; setShowMHeader(show); } else if (dt<-20){ show=true; setShowMHeader(show); } } const changeHeaderHeight=()=>{ document.documentElement.style.setProperty('--header-active', getHeaderHeight()); initHeaderHeight(getHeaderHeight()); } const resizeObserver = new ResizeObserver(entries => { for (let entry of entries) { // 获取目标元素的高度 const { height } = entry.contentRect; // 可在这里处理高度变化的逻辑 changeHeaderHeight(); } }); useEffect(() => { // 这里的代码会在组件挂载时执行 // console.log('Component mounted'); window.addEventListener('scroll', handleScroll); if (barRef.current) { resizeObserver.observe(barRef.current); } return () => { // 可选的清除函数,当组件卸载时执行 // console.log('Component unmounted'); window.removeEventListener('scroll', handleScroll); if (barRef.current) { resizeObserver.unobserve(barRef.current); } }; }, [pathname]); useEffect(()=>{ setShowMHeader(showHeader); barRef.showHeader=showHeader; },[showHeader]); useEffect(()=>{ let len=chain.length; setShowHeader(len<=1); },[pathname]); const headerAni=useSpring({ from: {transform: 'translateY(-100%) translateZ(0px)'}, transform:showMHeader?'translateY(0%) translateZ(0px)':'translateY(-100%) translateZ(0px)', config: { easing: easings.easeOutBack, duration:300 }, }); const changePath=(path)=>{ navigate(path); } const renderHeaderRoom=()=>{ const active=styles.active; return (
{ LINKS.map((link, index) => ( )) }
); } const renderMobile=()=>{ return ( <> { renderHeaderRoom() } ) } const renderDesktop=()=>{ return ( ); } return (
{ isMobile()?renderMobile():renderDesktop() }
) } export default PageHeader