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,
getShowInstall,
getUserInfo,
isLogin,
isLogined
} from "@features/mainSlice";
import {getMailNew} from "@features/mailSlice";
import LazyImage from "@components/LazyImage";
import {numFormatter, sleep} from "@utils/helpers";
import {getAvatarUrl} from "@utils/avatar";
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;
// provider 数量较多时不要换行 / 不要把右侧 SignIn 区挤掉,
// 给一个横向滚动兜底(一般场景宽度够用就不会出现滚动条)。
flex-wrap: nowrap;
overflow-x: auto;
max-width: 100%;
scrollbar-width: thin;
&::-webkit-scrollbar { height: 4px; }
`;
const StyledToggle=styled(ToggleButton)`
gap: 12px;
text-transform:none !important;
border: none !important;
border-radius: var(--border-radius) !important;
padding: 0px !important;
flex: 0 0 auto;
white-space: nowrap;
&: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);
// 之前固定 slice(0,4) 让顶部导航最多只显示 4 项(Home/Hot Games/PGSoft/PragmaticPlay),
// 后面的 provider 全部被截掉。导航栏右侧本身还有大量空白,直接展示全部即可。
const links=LINKS;
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 mailNew=useSelector(getMailNew);
const navigate=useNavigate();
const stop=(e)=>{e.stopPropagation();};
return (
<>
{
isLogin?(
{
navigate(ROUTE_PATH.SETTINGS);
}}>
{global.DOLLAR+" "+numFormatter(user.Score)}
{mailNew>0&&({mailNew>99?'99+':mailNew})}
):(<>>)
}
>
)
}
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,showMHeader, setShowMHeader} = useThemeProvider();
// const [showMHeader, setShowMHeader] = useState(false);
const isLogin=useSelector(isLogined);
let lastscroll=0;
const {open} = useSidebar();
const navstyle=open?styles.nav_open:"";
const isShowInstall=useSelector(getShowInstall);
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);
}
}
banner.init = async function() {
window.progressier.utils.styling(banner.styling, banner.className);
let installBanner=document.querySelector("#installBanner");
if (installBanner==null){return}
banner.make();
banner.render()
}
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)=>{
//route控制
if (!isShowInstall){
return false;
}
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&&isShowInstall){
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;
}
if (pathname.startsWith(ROUTE_PATH.SPORTS)){
isShowH=true;
}
setShowHeader(isShowH);
},[pathname]);
useEffect(()=>{
checkInstallOpen();
return ()=>{
stopListener();
}
},[installOpen,isShowInstall])
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 (
);
}
const renderMobileInstall=()=>{
return (
)
}
const renderMobile=()=>{
return (
<>
{/* {renderMobileInstall()} */}
{/* {renderHeaderRoom()} */}
>
)
}
const renderDesktopInstall=()=>{
return (
)
}
const renderDesktop=()=>{
return (
<>
{/*{renderDesktopInstall()}*/}
>
);
}
const isHome = pathname === "/" || pathname === "";
if (isMobile() && !isHome) {
return ();
}
return (
{
isMobile()?renderMobile():renderDesktop()
}
)
}
export default PageHeader