// styled components import { Link, SingleLink, StyledAccordion, StyledAccordionDetails, StyledAccordionSummary, StyledBonus, StyledButton, StyledThemeTabs, StyledThemeTab, StyledAct, StyledRefer, StyledBlock, StyledIconLink } from './styles'; // components import Logo from '@components/Logo'; import {NavLink, useLocation,useNavigate} from 'react-router-dom'; // hooks import {useSidebar} from '@contexts/sidebarContext'; import {useWindowSize} from 'react-use'; import {Fragment, useEffect, useState} from 'react'; // constants import LINKS from '@constants/links'; import MuiDrawer from '@mui/material/Drawer'; // import styled from 'styled-components/macro'; import { styled, useTheme } from '@mui/material/styles'; import SidebarTrigger from "@ui/SidebarTrigger"; import {ReactComponent as CheckInIcon} from "@assets/singlesvg/chekin.svg"; // import {useThemeProvider} from '@contexts/themeContext'; import symbol from '@assets/symbol-defs.svg'; import MTooltip from "@components/MTooltip"; import Tabs from "@mui/material/Tabs"; import Tab from "@mui/material/Tab"; import Button from "@mui/material/Button"; import TabScrollButton from "@mui/material/TabScrollButton"; import ToggleButtonGroup from "@mui/material/ToggleButtonGroup"; import {useThemeProvider} from "@contexts/themeContext"; import questsimg from "@assets/activity/quests.png"; import spin_1 from "@assets/activity/spin_1.png"; import spin_2 from "@assets/activity/spin_2.png"; import spin_3 from "@assets/activity/spin_3.png"; import imgrefer from "@assets/activity/rio_refer.png"; import imgrefer_f from "@assets/activity/rio_refer_f.png"; import {useDispatch, useSelector} from "react-redux"; import { allNavs, getBlockColumn, getRoute, getRouteStyles, isFullRoute, isLogined, logout, nBlocks } from "@features/mainSlice"; import { ROUTE_PATH, ROUTE_TYPE_OUTLINK, ROUTE_TYPE_POP, ROUTE_TYPE_POP_OR_FULL, SIDE_TYPE_GRID, SIDE_TYPE_NOMAL, SIDE_TYPE_SPECIAL } from "@constants/routes"; import SvgIcon from "@components/SvgIcon"; import {reqChangeInfo, reqLogout} from "@features/api"; import {APP_THEME} from "@constants/app"; const drawWidth = 250; const drawMobieWidth=250; const i18n=global.i18n; const openedMixin = (theme,width) => ({ width: width, transition: theme.transitions.create('width', { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.enteringScreen, }), // overflowX: 'hidden', overflow:'visible !important', backgroundColor:'var(--standard);', boxShadow:'var(--widget-shadow);', // position:'relative', }); const closedMixin = (theme) => ({ transition: theme.transitions.create('width', { easing: theme.transitions.easing.sharp, duration: theme.transitions.duration.leavingScreen, }), // overflowX: 'hidden', //spin显示 overflow:'visible !important', width: `calc(${theme.spacing(7)} + 1px)`, [theme.breakpoints.up('sm')]: { width: `calc(${theme.spacing(8)} + 1px)`, }, backgroundColor:'var(--standard);', boxShadow:'var(--widget-shadow);', // position:'absolute', }); const Drawer = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open' })( ({ theme, open}) => ({ width: drawWidth, flexShrink: 0, whiteSpace: 'nowrap', boxSizing: 'border-box', pointerEvents: 'auto', // overflowX:'hidden', ...(open && { ...openedMixin(theme), '& .MuiDrawer-paper': openedMixin(theme,drawWidth), }), ...(!open && { ...closedMixin(theme), '& .MuiDrawer-paper': closedMixin(theme), }), }), ); const DrawerHeader = styled('div')(({ theme }) => ({ display: 'flex', alignItems: 'center', padding: '0 10px', gap:'12px', // backgroundColor:'#000', boxShadow:'var(--widget-shadow)', position:'relative', '& .logo_con':{ width:'80%' }, '& .logo_con_m':{ width:'80%' }, // necessary for content to be below app bar ...theme.mixins.toolbar, })); const Sidebar = () => { // const theme = useTheme(); const {open, setOpen} = useSidebar(); const [expanded, setExpanded] = useState(""); const {pathname,hash} = useLocation(); const navigate=useNavigate(); const {width} = useWindowSize(); const {theme, toggleTheme, setIsShowLang, isMobile} = useThemeProvider(); const [isActHovered, setIsActHovered] = useState(false); const visiblecls=isActHovered?"overflow-visible":""; const navBlocks=useSelector(nBlocks); const currRoute = useSelector(getRoute(pathname)); const blocksColumn=useSelector(getBlockColumn); const routeStyles=useSelector(getRouteStyles); const isLogin=useSelector(isLogined); const dispatch = useDispatch(); const handleActEnter = () => { if (open)return; setIsActHovered(true); }; const handleActLeave = () => { if (open)return; setIsActHovered(false); }; // manually handle accordion expansion const handleChange = (panel,path) => (event, isExpanded) => { if (isExpanded)navigate(path); // setExpanded(isExpanded ? panel : false); if (!isExpanded){ let arr=panel.split("_"); let s=arr.length-2; if (s<0)panel=""; else { arr.splice(s,1); panel=arr.join("_"); } } setExpanded(panel); } const checkNavOpen=()=>{ if (currRoute==null)return; let lv=currRoute.lv; setExpanded(lv); } const getolstyles=(styleID)=>{ let styles=routeStyles[styleID]; if (styles==null){ styles=routeStyles[1]; } let style={}; if (styles!=null){ style=styles.style; } let thstyles=style[theme]; if (thstyles==null)thstyles={}; return thstyles; } // collapse opened accordion on route change when the drawer is temporary useEffect(() => { checkNavOpen(); }, [pathname]); const checkCkey=(lv)=>{ if (expanded==null)return false; else return expanded.startsWith(lv); } const checkPath=(link)=>{ let lv=currRoute.lv; return lv===link.lv; } const renderIconLink=(link,olstyle,lIcon=null)=>{ let ispop=link.type===ROUTE_TYPE_POP||link.type===ROUTE_TYPE_POP_OR_FULL||link.type===ROUTE_TYPE_OUTLINK; let linkIcon=(); if (lIcon!=null)linkIcon=lIcon; let target=link.type===ROUTE_TYPE_OUTLINK?"_blank":""; let linkA=ispop?( {linkIcon} ):( {linkIcon} ); return ( {linkA} ); } const renderLink=(link)=>{ let pages=link.subs||link.pages; let styles=getolstyles(link.style); let linkItem=open?( {i18n.t(link.title)} { pages.map((page,pindex)=>{ let subs=page.subs; if (subs==null||subs.length==0)return renderRLink(page); else { return renderLink(page); } }) } ):renderIconLink(link,styles); return linkItem } const renderRLink=(link)=>{ let isActive=checkPath(link); let ispop=link.type===ROUTE_TYPE_POP||link.type===ROUTE_TYPE_POP_OR_FULL||link.type===ROUTE_TYPE_OUTLINK; let clname=`${isActive?'active':''} h4`; let linktxt=( <> {i18n.t(`${link.title}`)} ) let target=link.type===ROUTE_TYPE_OUTLINK?"_blank":""; return ispop?({linktxt}):({linktxt}) } const renderSingleLink=(link)=>{ let styles=getolstyles(link.style); return open?( { renderRLink(link) } ):renderIconLink(link,styles) } const renderLinkNav=(link)=>{ let linkItem=(<>); let subs=link.subs; let len=subs.length; if (len===0&&link.plv===""){ linkItem=renderSingleLink(link); } else { linkItem=renderLink(link); } return linkItem; } const renderBlock=(block,bkey)=>{ if (block==null)return (); let first=block[0]; if (first==null)return (); let blockID=first.block; let column=1; if (blocksColumn!=null){ let blockC=blocksColumn[blockID]; if (blockC!=null)column=blockC.column; } return ( { block.map((link, index) => { return ({renderLinkNav(link)}) }) } {renderLine()} ) } const renderLinkBlocks=()=>{ return ( <> { navBlocks.map((block,index)=>{ return renderBlock(block,index); }) } ) } const renderBonus=()=>{ let styles=getolstyles(0); const ICON_SIZE={width:'1.5rem',height:'1.5rem',flex:'none'}; // 桌面端用 hash 路由(#/promotion / #/bonus),由 RouteContainer 渲染成 // popup-big 弹窗,当前页面 URL/内容不变;移动端继续走 /promotion / /bonus 全屏页。 const desktop = !isMobile(); const promotionPath = desktop ? "#/promotion" : ROUTE_PATH.PROMOTION; const bonusPath = desktop ? "#/bonus" : ROUTE_PATH.BONUS; const items=[ {title:'links.promotion', icon:'icon_Giftbox', path:promotionPath, color:'#3bc117'}, {title:'links.bonus', icon:'icon_Gift', path:bonusPath, color:'#b891ff'}, {title:'links.share_rewards', icon:null, path:ROUTE_PATH.CASH_WHEEL, spin:true}, ]; const isActive=(p)=>pathname===p||(p && pathname.startsWith(p) && p!=='/'); const spinIcon=( ); const renderRow=(it)=>{ const iconNode=it.spin?spinIcon:( ); const link={type:0,title:it.title,icon:it.icon||'icon_Share',path:it.path}; if (!open){ return ({renderIconLink(link,styles,iconNode)}); } return ( {iconNode} {i18n.t(it.title)} ); }; return ( {items.map(renderRow)} ); } const renderLogout=()=>{ return ( <> { isLogin?( { dispatch(reqLogout()); setOpen(false); }}> {open?i18n.t("links.log_out"):""} ):(<>) } ) } const renderLanguage=()=>{ return ( { if (typeof setIsShowLang === "function") setIsShowLang(true); setOpen(false); }}> {open?i18n.t("quickbar.language"):""} ) } const renderSuport=()=>{ return ( {/*{renderLogout()}*/} { if (global.showCustomerService) global.showCustomerService(); }}> {open?i18n.t("links.live_support"):""} ) } const handleTheme = (event, value) => { if (value){ toggleTheme(); } if (!isLogin)return; dispatch(reqChangeInfo({ ThemeColor:value })); // console.log(value) } const renderThemeTabs=()=>{ if (open){ return (
{i18n.t("theme.dark")} {i18n.t("theme.light")} ) } else return(<>); } const renderLine=(key="1")=>{ // if (open)return(<>); // else // { // return ( //
// ) // } return (
) } const renderBanner=()=>{ let refimg=open?imgrefer:imgrefer_f; return ( {"refer"} { open?(
{i18n.t("refer.title")}
{i18n.t("refer.des")}
):(<>) }
) } const renderContent=(showLanguage=false)=>{ return ( <> {renderBonus()} {/*{renderBanner()}*/} {renderLine()} {renderLinkBlocks()} {renderSuport()} {showLanguage?renderLanguage():null} {renderThemeTabs()} ) } const renderDesktop=()=>{ return ( { open?(
):<> }
{ renderContent() }
) } const renderMobile=()=>{ return ( { setOpen(false); }}> { open?(
):<> }
{ renderContent(true) }
) } return ( <> { isMobile()?(renderMobile()):renderDesktop() } ) } export default Sidebar