Layout.jsx 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. import ScrollToTop from "@components/ScrollToTop";
  2. import Sidebar from "@layout/Sidebar";
  3. import Navbar from "@layout/Navbar";
  4. import BottomNav from "@layout/BottomNav";
  5. import AppContainer from "@layout/AppContainer";
  6. import React, {cloneElement, createRef, lazy, Suspense, useEffect, useRef, useState} from "react";
  7. import LoadingScreen from "@components/LoadingScreen";
  8. import {Route, Routes, useLocation, useNavigate} from "react-router-dom";
  9. import {useDispatch, useSelector} from "react-redux";
  10. import {isFullRoute, isLogined, routesIn, routesPop, updateGameRoute} from "@features/mainSlice";
  11. import {preventDefault} from "@utils/helpers";
  12. import {useThemeProvider} from "@contexts/themeContext";
  13. import CRoute from "@layout/Routes";
  14. import {CBrowserRouter,CHashRouter} from "@layout/Routes";
  15. import Footer from "@layout/Footer";
  16. import GameSearchPanel from "@layout/GameSearchPanel";
  17. import TransitionGroup from "react-transition-group/TransitionGroup";
  18. import SubScreen from "@components/SubScreen";
  19. import CSSTransition from "react-transition-group/CSSTransition";
  20. import Transition from "react-transition-group/Transition";
  21. import WLangSelect from "@widgets/WLangSelect";
  22. import MsgBox from "@components/MsgBox";
  23. import WDPassPrompt from "@widgets/WWithdraw/PassPrompt/WDPassPrompt";
  24. import useAuthLockRoute from "@hooks/useAuthLockRoute";
  25. import WHallWheel from "@widgets/WCashWheel/WHallWheel/WHallWheel";
  26. import LoadingIn from "@components/Loading/LoadingIn";
  27. import WDPassBox from "@widgets/WWithdraw/PassBox/WDPassBox";
  28. import {ROUTE_PATH, ROUTE_TYPE_FULL, ROUTE_TYPE_IN} from "@constants/routes";
  29. import DropCoins from "@components/DropCoins";
  30. import {toast} from "react-toastify";
  31. import useEdgeGesture from "@hooks/useEdgeGesture";
  32. import MailNew from "@components/MailNew";
  33. import WInstallBox from "@widgets/WInstallBox";
  34. import WBindPhone from "@widgets/WBindPhone";
  35. import WBindPrompt from "@widgets/WBindPrompt";
  36. import WWelfarebar from "@widgets/WWelfarebar";
  37. import WProtect from "@widgets/WProtect";
  38. import LoadingCircular from "@components/Loading/LoadingCircular";
  39. import WFirstPay from "@widgets/WFirstPay";
  40. import WAreaSelect from "@widgets/WAreaSelect";
  41. import WSaveAccount from "@widgets/WSaveAccount";
  42. import WBonusPack from "@widgets/WBonusPack";
  43. import WDepositInfo from "@widgets/WDeposit/WPayInfo/WDepositInfo";
  44. // 全局挂载 BR/RU 的下单前置弹窗,保证任何地方调用 startPayingOrder 都能弹出
  45. import BRCPFSave from "@widgets/WDeposit/BR/BRCPFSave/BRCPFSave";
  46. import RUPaytypeSelect from "@widgets/WDeposit/RU/RUPaytypeSelect";
  47. const PageNotFound = lazy(() => import('@pages/PageNotFound'));
  48. const Layout=({...props})=>{
  49. const appRef = useRef(null);
  50. const msgBoxRef=useRef(null);
  51. const {isMobile,isShowWheel, setIsShowWheel,isShowWDPassBox,setIsShowWDPassBox,isOpenSub} = useThemeProvider();
  52. const {pathname, search, hash} = useLocation();
  53. const isFull = useSelector(isFullRoute(pathname));
  54. const inRoutes=useSelector(routesIn);
  55. const popRoutes=useSelector(routesPop);
  56. const isLogin=useSelector(isLogined);
  57. const navigate=useNavigate();
  58. const {getSidedGesture}=useEdgeGesture();
  59. const isGesture=getSidedGesture();
  60. const mobile=isMobile();
  61. const dispatch = useDispatch();
  62. // const {setLockPath}=useAuthLockRoute();
  63. useEffect(() => {
  64. // scroll to top on route change
  65. appRef.current && appRef.current.scrollTo(0, 0);
  66. preventDefault();
  67. }, []);
  68. useEffect(()=>{
  69. global.msgBox=msgBoxRef.current;
  70. },[msgBoxRef])
  71. useEffect(()=>{
  72. let routeType=ROUTE_TYPE_FULL;
  73. if (!mobile)routeType=ROUTE_TYPE_IN;
  74. dispatch(updateGameRoute(routeType));
  75. },[mobile])
  76. const renderIn=()=>{
  77. let isShowSub=false;
  78. if (isMobile()&&isOpenSub)isShowSub=true;
  79. if (hash==null||hash==="")isShowSub=false;
  80. return (
  81. <>
  82. <div className={`app ${isShowSub ? 'app_openSub' : ''} ${isGesture?'app_gestureSub':''}`} ref={appRef}>
  83. <ScrollToTop/>
  84. <AppContainer>
  85. <div className="app_container-content d-flex flex-column flex-1">
  86. <Suspense fallback={<LoadingIn/>}>
  87. <CBrowserRouter isLogin={isLogin} routes={inRoutes}/>
  88. </Suspense>
  89. </div>
  90. <Footer/>
  91. </AppContainer>
  92. <GameSearchPanel/>
  93. </div>
  94. <div className={`app-top ${isShowSub ? 'app_openSub' : ''} ${isGesture?'app_gestureSub':''}`}>
  95. <Sidebar/>
  96. <Navbar/>
  97. {isMobile() && <BottomNav/>}
  98. {/* <WWelfarebar/> moved into Home banner row */}
  99. </div>
  100. </>
  101. )
  102. }
  103. const renderInFull = () => {
  104. return (
  105. <>
  106. <div className={`app fluid`} ref={appRef}>
  107. <ScrollToTop/>
  108. <div className="app_container_full">
  109. <Suspense fallback={<LoadingScreen/>}>
  110. <CBrowserRouter isLogin={isLogin} routes={inRoutes}/>
  111. </Suspense>
  112. </div>
  113. </div>
  114. </>
  115. )
  116. }
  117. const renderHash = () => {
  118. return (
  119. <CHashRouter isLogin={isLogin} routes={popRoutes} hlocation={{
  120. pathname: pathname,
  121. search: search,
  122. hash: hash
  123. }} basePath={pathname}/>
  124. )
  125. }
  126. const renderPop=()=>{
  127. return (
  128. <>
  129. <WLangSelect/>
  130. <MsgBox ref={msgBoxRef}/>
  131. <WDPassPrompt/>
  132. <WDPassBox open={isShowWDPassBox} onClose={()=>{
  133. setIsShowWDPassBox(false);
  134. }}/>
  135. <WHallWheel open={isShowWheel} onClose={()=>{
  136. setIsShowWheel(false);
  137. if (props&&props.onCloseHallWheel)props.onCloseHallWheel()
  138. }}></WHallWheel>
  139. {/*<WInstallBox/>*/}
  140. <WBindPhone/>
  141. <WBindPrompt/>
  142. <WProtect/>
  143. <WFirstPay/>
  144. <WSaveAccount/>
  145. <WBonusPack/>
  146. <WDepositInfo/>
  147. <BRCPFSave/>
  148. <RUPaytypeSelect/>
  149. </>
  150. )
  151. }
  152. const renderEffect=()=>{
  153. return (
  154. <>
  155. <DropCoins/>
  156. <MailNew/>
  157. <LoadingCircular/>
  158. </>
  159. )
  160. }
  161. return (
  162. <>
  163. {
  164. !isFull?renderIn():renderInFull()
  165. }
  166. {
  167. // hash!=''?renderHash():(<></>)
  168. renderHash()
  169. }
  170. {
  171. renderPop()
  172. }
  173. {
  174. renderEffect()
  175. }
  176. </>
  177. );
  178. }
  179. export default Layout;