import {createAsyncThunk, createSlice} from "@reduxjs/toolkit"; import {routes} from "@db/routes"; import { ROUTE_TYPE_FULL, ROUTE_TYPE_IN, ROUTE_TYPE_OUTLINK, ROUTE_TYPE_POP, ROUTE_TYPE_POP_OR_FULL, SIDE_TYPE_NOMAL } from "@constants/routes"; import {REQ_STATUS} from "@api/config"; import { buildReqReducer, reqChangeEmail, reqChangeInfo, reqChangePass, reqChangePhone, reqCustomLeaveMsg, reqCustomService, reqGameInfo, reqGetRoutes, reqLogin, reqLogout, reqRegister } from "@features/api"; import {toast} from 'react-toastify'; import {getHttpMsg, localStorageGet, localStorageSet} from "@utils/helpers"; import {LOCAL_CUSTOM_LOCK, LOCAL_IS_LOGIN, LOCAL_SIGN, LOCAL_USER_INFO, LOCAL_VISTOR_ID} from "@constants/localkey"; import {reqPayConfig} from "@features/paySlice"; import FingerprintJS from '@fingerprintjs/fingerprintjs-pro' const i18n=global.i18n; const generateNavs=(routes)=>{ const navs=[]; const allNavs=[]; const allTopNavs=[]; for (let i = 0; i { const allMap={}; const inRoutes=[]; const popRoutes=[]; //路由等级 //ppath parent path const _generate=(list,plevel,ppath)=>{ Object.keys(list).map((key)=>{ let route=list[key]; if (route){ if (allMap[route.path]==null){ //level route.plv=plevel; route.ppath=ppath; route.lv=plevel+key+"_"; // if (route.path==="#/signin"||route.path==="#/signup"){ // route.component="Login"; // } if (route.path==="#/pay"){ route.component="deposit"; } if (route.path==="#/saque"){ route.component="withdraw"; } allMap[route.path]=route; let type=route.type; if (type===ROUTE_TYPE_IN||type===ROUTE_TYPE_FULL)inRoutes.push(route); else if (type===ROUTE_TYPE_POP_OR_FULL)popRoutes.push(route); else if (type===ROUTE_TYPE_POP)popRoutes.push(route); } let subs=route.subs; if (subs!=null)_generate(subs,route.lv,route.path); } }); } const allroutes=[...routes, ...asyncRoutes]; _generate(allroutes,"",""); const gnavs=generateNavs(allroutes); return {allMap,inRoutes,popRoutes,blockNavs:gnavs.navs,allNavs:gnavs.allNavs,allTopNavs:gnavs.allTopNavs}; } const parseThemeStypes=(data)=>{ if (data!=null){ for (const key in data) { let item=data[key]; if (item!=null){ if (typeof item=="string"){ if (item.indexOf(";")!=-1){ data[key]=item.split(";"); } } } } } return data; } const parseStyles=(data)=>{ let styles={}; if (data!=null){ for (let i = 0; i { let blocks={}; if (data!=null){ for (let i = 0; i < data.length; i++) { let item=data[i]; if (item){ blocks[item.block]=item; } } } return blocks; } const reducerRoutes=(state,action)=>{ let json=action.payload; if (json&&json.code==0){ let data=json.data==null?[]:json.data; let generData=generateRoutes(state.routes,data); let styles=parseStyles(json.styles); let blocks=parseBlocks(json.blocks); let user=json.user; let isLogin=0; let userInfo={}; if (user){ if (typeof user=="object"){ isLogin=1; userInfo=user; //请求pay // global.dispatch(reqPayConfig(user)); } } Object.assign(state, {routes:state.routes,asyncRoutes:data,styles:styles,blocks:blocks,...generData,isLogin:isLogin,userInfo:userInfo}); } } const routesStatus=(state,status,arg)=>{ state.status=status; } //login const getLocalUserInfo=()=>{ let user={}; let value=localStorageGet(LOCAL_USER_INFO,null); if (value&&value!=""){ user=JSON.parse(value); } return user; } const getLocalIsLogin=()=>{ let islogin=localStorageGet(LOCAL_IS_LOGIN,0); islogin=Number(islogin); return islogin; } const getMsg=(payload)=>{ return getHttpMsg(payload); } const parseLogin=(state,action,arg,isShowMsg=true)=>{ let payload=action.payload; let code=payload.code; let msg=getMsg(payload); //success if (code==200){ let data=payload.data; state.userInfo=data; state.isLogin=1; // localStorageSet(LOCAL_USER_INFO,JSON.stringify(data)); // localStorageSet(LOCAL_IS_LOGIN,1); let sign=data.sign; if (sign!=null)localStorageSet(LOCAL_SIGN,sign); if(isShowMsg)toast.success(msg); //请求pay // global.dispatch(reqPayConfig(data)); } else { if(isShowMsg)toast.error(msg); } if (arg){ let callback=arg.callback; if (callback!=null)callback(code); } } const reducerLogin=(state,action,arg)=>{ // toast.success("success"); parseLogin(state,action,arg); } const loginStatus=(state,status,arg)=>{ state.loginStatus.login=status; } const reducerReg=(state,action,arg)=>{ parseLogin(state,action,arg); } const regStatus=(state,status,arg)=>{ state.loginStatus.register=status; } const reducerLogout=(state,action,arg)=>{ let payload=action.payload; let code=payload.code; let msg=getMsg(payload); if (code==200){ state.userInfo={}; state.isLogin=0; localStorageSet(LOCAL_SIGN,""); // localStorageSet(LOCAL_USER_INFO,""); // localStorageSet(LOCAL_IS_LOGIN,0); toast.success(msg); } else { toast.error(msg); } } const logoutStatus=(state,status,arg)=>{ state.loginStatus.logout=status; } //login //modify const reducerChangePass=(state,action,arg)=>{ // let payload=action.payload; // let code=payload.code; // let msg=getMsg(payload); // if (code==200){ // toast.success(msg); // } // else // { // toast.error(msg); // } parseLogin(state,action,arg); } const changePassStatus=(state,status,arg)=>{ state.modifyStatus.password=status; } const reducerChangeInfo=(state,action,arg)=>{ // let payload=action.payload; // let code=payload.code; // let msg=getMsg(payload); // if (code==200){ // toast.success(msg); // } // else // { // toast.error(msg); // } parseLogin(state,action,arg); } const changeInfoStatus=(state,status,arg)=>{ state.modifyStatus.info=status; } const reducerChangePhone=(state,action,arg)=>{ parseLogin(state,action,arg); } const changePhoneStatus=(state,status,arg)=>{ state.modifyStatus.phone=status; } const reducerChangeEmail=(state,action,arg)=>{ parseLogin(state,action,arg); } const changeEmailStatus=(state,status,arg)=>{ state.modifyStatus.phone=status; } //modify //gameinfo const reducerGameInfo=(state,action,arg)=>{ // parseLogin(state,action,arg); parseLogin(state,action,arg,false); } const gameInfoStatus=(state,status,arg)=>{ state.gameInfoStatus=status; } //gameinfo //custom const reducerCustom=(state,action,arg)=>{ let payload=action.payload; if (payload&&payload.code===200){ state.customerInfo=payload.data; } } const reducerCustomLeaveMsg=(state,action,arg)=>{ let payload=action.payload; if (payload!=null){ if (payload&&payload.code===200){ localStorageSet(LOCAL_CUSTOM_LOCK,Date.now()); toast.success(i18n.t("customer.TopTip_succeed")); } else { toast.error(i18n.t("customer.TopTip_fail")); } } } const customLeaveMsgStatus=(state,status,arg)=>{ state.customLeaveMsgStatus=status; } //custom export const Main=createSlice({ name: 'main', initialState: { status:REQ_STATUS.NONE, routes:routes, asyncRoutes:[], styles:{}, blocks:{}, ...generateRoutes(routes), loginStatus:{ login:REQ_STATUS.NONE, register:REQ_STATUS.NONE, logout:REQ_STATUS.NONE, }, userInfo: {}, isLogin:0, modifyStatus:{ info:REQ_STATUS.NONE, password:REQ_STATUS.NONE, phone:REQ_STATUS.NONE, email:REQ_STATUS.NONE }, gameInfoStatus:REQ_STATUS.NONE, customLeaveMsgStatus:REQ_STATUS.NONE, customerInfo:[] }, reducers: { logout:(state, action)=>{ state.userInfo={}; state.isLogin=0; // localStorageSet(LOCAL_USER_INFO,""); // localStorageSet(LOCAL_IS_LOGIN,0); }, updateUserInfo:(state, action)=>{ parseLogin(state,action,{},false); }, updateUserScore:(state, action)=>{ let score=action.payload; if (score!=null){ if(state.userInfo)state.userInfo.Score=Number(score); } }, }, extraReducers: (builder) => { // Add reducers for additional action types here, and handle loading state as needed // reducerRoutes(builder); buildReqReducer(builder,reqGetRoutes,reducerRoutes,routesStatus); buildReqReducer(builder,reqLogin,reducerLogin,loginStatus); buildReqReducer(builder,reqRegister,reducerReg,regStatus); buildReqReducer(builder,reqLogout,reducerLogout,logoutStatus); buildReqReducer(builder,reqChangePass,reducerChangePass,changePassStatus); buildReqReducer(builder,reqChangeInfo,reducerChangeInfo,changeInfoStatus); buildReqReducer(builder,reqChangePhone,reducerChangePhone,changePhoneStatus); buildReqReducer(builder,reqChangeEmail,reducerChangeEmail,changeEmailStatus); buildReqReducer(builder,reqGameInfo,reducerGameInfo,gameInfoStatus); buildReqReducer(builder,reqCustomService,reducerCustom,null); buildReqReducer(builder,reqCustomLeaveMsg,reducerCustomLeaveMsg,customLeaveMsgStatus); }, }) export const {logout,updateUserInfo,updateUserScore} = Main.actions; //数据获取 export const getFetchStatus=(state)=>{ return state.main.status; } export const routesMap=(state)=>{ return state.main.allMap; } export const routesIn=(state)=>{ return state.main.inRoutes; } export const routesPop=(state)=>{ return state.main.popRoutes; } export const nBlocks=(state)=>{ return state.main.blockNavs; } export const allNavs=(state)=>{ return state.main.allNavs; } export const allTopNavs=(state)=>{ return state.main.allTopNavs; } const getRouteFromPath=(state,path)=>{ let allMap=routesMap(state); let route=allMap[path]; if (route==null){ //查看是否有可变路由 let paths=path.split("/"); paths[paths.length-1]="*"; let newpath=paths.join("/"); route=allMap[newpath]; } return route; } export const getRoute=(path)=>(state)=>{ // let route=routesMap(state)[path]; let route=getRouteFromPath(state,path); if (route==null)return {}; return route; } export const getRouteChain=(path)=>(state)=>{ let map=routesMap(state); let list=[]; let getChain=(cpath)=>{ let route=map[cpath]; if (route!=null){ list.unshift(route); if (route.ppath!=null&&route.ppath!==""){ getChain(route.ppath); } } } getChain(path); return list; } export const getRouteStyles=(state)=>{ let styles=state.main.styles; return styles; } export const getBlockColumn=(state)=>{ let blocks=state.main.blocks; return blocks; } export const isFullRoute=(path)=>(state)=>{ // let route=routesMap(state)[path]; let route=getRouteFromPath(state,path); if (route)return route.type===ROUTE_TYPE_FULL; return false; } export const isPopRoute=(path)=>(state)=>{ // let route=routesMap(state)[path]; let route=getRouteFromPath(state,path); if (route)return route.type===ROUTE_TYPE_POP; return false; } export const isInRoute=(path)=>(state)=>{ // let route=routesMap(state)[path]; let route=getRouteFromPath(state,path); if (route)return route.type===ROUTE_TYPE_IN; return false; } export const isOutRoute=(path)=>(state)=>{ // let route=routesMap(state)[path]; let route=getRouteFromPath(state,path); if (route)return route.type===ROUTE_TYPE_OUTLINK; return false; } //login export const getLoginStatus=(state)=>{ return state.main.loginStatus.login; } export const getRegStatus=(state)=>{ return state.main.loginStatus.register; } export const getLogoutStatus=(state)=>{ return state.main.loginStatus.logout; } //modify export const getChangeInfoStatus=(state)=>{ return state.main.modifyStatus.info; } export const getChangePassStatus=(state)=>{ return state.main.modifyStatus.password; } export const getChangePhoneStatus=(state)=>{ return state.main.modifyStatus.phone; } export const getChangeEmailStatus=(state)=>{ return state.main.modifyStatus.email; } export const isLogined=(state)=>{ // console.log(state.main.isLogin) return state.main.isLogin; // return 1; } export const getUserInfo=(state)=>{ return state.main.userInfo; } export const getUserID=(state)=>{ let uid=0; let userInfo=state.main.userInfo; if (userInfo){ if (userInfo.UserID!=null)uid=userInfo.UserID; } return uid; } export const getCustomInfo=(state)=>{ return state.main.customerInfo; } export const getCustomTypeInfo=(type)=>(state)=>{ let item=null; let customerInfo=state.main.customerInfo; if (customerInfo){ for (let i = 0; i < customerInfo.length; i++) { let info=customerInfo[i]; if (info.StatusName===type){ item=info; break; } } } return item } export const getCustomStatus=(state)=>{ return state.main.customLeaveMsgStatus; } //数据获取 export default Main.reducer; export const getBFP=()=>{ return async (dispatch, getState) => { let bfp=""; bfp=localStorageGet(LOCAL_VISTOR_ID,""); if (bfp!=null&&bfp!==""){ global.BFP=bfp; return bfp; } const fpPromise = FingerprintJS.load({ apiKey: "W7zWifGvJhjacPekHi64" }) let fp=await fpPromise; let result=await fp.get(); if (result!=null){ bfp=result.visitorId; localStorageSet(LOCAL_VISTOR_ID,bfp); global.BFP=bfp; } return bfp; } }