// 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 {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 {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_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 {reqLogout} from "@features/api"; 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', // 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} = 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)=>{ let ispop=link.type===ROUTE_TYPE_POP||link.type===ROUTE_TYPE_POP_OR_FULL||link.type===ROUTE_TYPE_OUTLINK; let linkIcon=(); 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)=>{ 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); }) } ) } const renderBonus=()=>{ let styles=getOLStyles(0); let herf="/bonus"; let link={type:0,title:'links.bonus',icon:'icon_Gift',path:herf} return ( { open?( {i18n.t("links.bonus")} ):renderIconLink(link,styles) }
); } const renderLogout=()=>{ return ( <> { isLogin?( { dispatch(reqLogout()); setOpen(false); }}> {open?i18n.t("links.log_out"):""} ):(<>) } ) } const renderSuport=()=>{ return ( {renderLogout()} {open?i18n.t("links.live_support"):""} ) } const handleTheme = (event, value) => { if (value){ toggleTheme(); } else { } } 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=()=>{ return ( <> {renderBonus()} {renderBanner()} {renderLine()} {renderLinkBlocks()} {renderSuport()} {renderThemeTabs()} ) } const renderDesktop=()=>{ return ( { open?(
):<> }
{ renderContent() }
) } const renderMobile=()=>{ return ( { setOpen(false); }}> { open?(
):<> }
{ renderContent() }
) } const {isMobile} = useThemeProvider(); return ( <> { isMobile()?(renderMobile()):renderDesktop() } ) } export default Sidebar