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, getUserInfo, isLogin, isLogined} from "@features/mainSlice"; import LazyImage from "@components/LazyImage"; import {numFormatter, sleep} from "@utils/helpers"; import {ROUTE_PATH} from "@constants/routes"; import {toast} from "react-toastify"; import LazyImgix from "@components/Imgix/LazyImgix"; 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: 600; .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); const {setIsShowLang} = useThemeProvider(); return (
{/**/} {/* */} {/* */} {/* */} {/**/} { !isLogin?( <> ):( <> ) } {/**/} { 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 UserInfo=()=>{ const isLogin=useSelector(isLogined); const user=useSelector(getUserInfo); const navigate=useNavigate(); return ( <> { isLogin?(
{ navigate(ROUTE_PATH.SETTINGS); }}>
{user.NickName}
{global.DOLLAR+" "+numFormatter(user.Score)}
{/**/}
):(<>) } ) } const PageHeader = () => { const LINKS=useSelector(allTopNavs); const {initHeaderHeight,installOpen} = 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(false); const isLogin=useSelector(isLogined); let lastscroll=0; const {open} = useSidebar(); const navstyle=open?styles.nav_open:""; const checkNavActive=(lv)=>{ if (currRoute&&currRoute.lv)return currRoute.lv.startsWith(lv); else return false; } const getHeaderHeight = () => { // console.log(document.querySelector('div.progressier-install-banner')) const header = document.querySelector('#appbar'); let offset = 0; if (barRef){ const headerRoom=document.querySelector('#headerRoom'); if (headerRoom){ if (!barRef.showHeader){ offset=headerRoom.clientHeight; const hstyle = window.getComputedStyle(headerRoom); if (hstyle!=null){ let paddingBottom=hstyle.paddingBottom; paddingBottom=Number(paddingBottom.replace("px","")); offset=offset-paddingBottom; } } } } if (header!=null)return `${(header.offsetHeight-offset) || 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); } if (scrollTop<20){ setShowMHeader(true); } } 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(); } }); const getProgressierInstallBanner=(params,callback)=>{ let banner=new window.NewProgressierInstallBanner( params, callback ) banner.remove = async ()=>{ if (banner.deny && !banner.data.preview) { banner.deny() } banner.element.classList.remove("in"); // await progressier.utils.wait(1e3); banner.element.remove() } banner.make=()=>{ document.querySelectorAll("." + banner.className).forEach(function(e) { e.remove() }); let installBanner=document.querySelector("#installBanner"); if (installBanner){ banner.element = window.progressier.utils.node("div", banner.className, { parent: installBanner }); banner.element.classList.add(styles.install_banner); } } window.install_banner=banner; return banner; } // const reProgressierInstallBanner=()=>{ // if (window.NewProgressierInstallBanner!=null)return; // let ProgressierInstallBanner=window.ProgressierInstallBanner; // window.NewProgressierInstallBanner=ProgressierInstallBanner; // window.ProgressierInstallBanner=function (e, t) { // this.remove = async function() { // // }; // this.render = async function() { // // }; // this.make = function() { // // }; // this.init = async function() { // // } // } // } const checkInstall=(l)=>{ if (!installOpen){ return false; } if (l.parent.detection.isStandalone()) { return false; } return true; } const startListening=async ()=>{ if (window.progressier==null)return ; let l=window.progressier.banners; await l.parent.data.waitForData(); l.data = l.parent.data.params; if (!l.reinstallTimer) { l.reinstallTimer = setInterval(function() { // window.alert(window.progressier["native"].justInstalled) // if (!l.showInstall()) { // return // } if (!checkInstall(l)){ clearInterval(l.reinstallTimer) l.reinstallTimer=null; return; } // window.alert("222") // if (l.showed) { // clearInterval(l.reinstallTimer) // l.reinstallTimer=null; // return // } // window.alert("3333") l.showed = true; // new window.NewProgressierInstallBanner({ // icon: l.icon(), // color: l.data.buttonColor, // btnColor: l.data.buttonTextColor, // text: l.data.installBannerPitch // },function() { // l.deny(l.installCookie) // } // ).init(); let InstallBanner=getProgressierInstallBanner( { icon: l.icon(), color: l.data.buttonColor, btnColor: l.data.buttonTextColor, text: l.data.installBannerPitch },()=>{ l.deny(l.installCookie) } ).init(); clearInterval(l.reinstallTimer) }, l.interval) } else { clearInterval(l.reinstallTimer) l.reinstallTimer=null; } } const checkProgressier=async ()=>{ // return ; if (window.progressier){ // reProgressierInstallBanner(); // let l=window.progressier.banners; // await l.parent.data.waitForData(); // await checkWaitForData(); // let data=l.data; // if (data){ // if (window.NewProgressierInstallBanner){ // let InstallBanner=getProgressierInstallBanner( // { // icon: l.icon(), // color: l.data.buttonColor, // btnColor: l.data.buttonTextColor, // text: l.data.installBannerPitch // } // ).init(); // } // } startListening(); } } const stopListener=()=>{ if (window.progressier==null)return; let l=window.progressier.banners; if(l){ if (l.reinstallTimer!=null){ clearInterval(l.reinstallTimer); l.reinstallTimer=null; } } } const checkInstallOpen=()=>{ if (installOpen){ checkProgressier(); } else { if (window.install_banner){ window.install_banner.remove(); } } } useEffect(() => { // 这里的代码会在组件挂载时执行 // console.log('Component mounted'); window.addEventListener('scroll', handleScroll); if (barRef.current) { resizeObserver.observe(barRef.current); } // testBefore(); // checkProgressier(); return () => { // 可选的清除函数,当组件卸载时执行 // console.log('Component unmounted'); window.removeEventListener('scroll', handleScroll); if (barRef.current) { resizeObserver.unobserve(barRef.current); } // stopListener(); }; }, []); // }, [pathname]); useEffect(()=>{ setShowMHeader(showHeader); barRef.showHeader=showHeader; changeHeaderHeight(); },[showHeader]); useEffect(()=>{ let len=chain.length; let isShowH=len<=1; if (LINKS===null||LINKS.length<=1){ isShowH=false; } setShowHeader(isShowH); },[pathname]); useEffect(()=>{ checkInstallOpen(); return ()=>{ stopListener(); } },[installOpen]) 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 renderMobileInstall=()=>{ return (
) } const renderMobile=()=>{ return ( <> {renderMobileInstall()} {renderHeaderRoom()} ) } const renderDesktopInstall=()=>{ return (
) } const renderDesktop=()=>{ return ( <> {renderDesktopInstall()} ); } return (
{ isMobile()?renderMobile():renderDesktop() }
) } export default PageHeader