mainSlice.js 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
  1. import { initTrackAll ,trackEvent} from "../tracking/TrackAll"
  2. import {createAsyncThunk, createSlice} from "@reduxjs/toolkit";
  3. import {routes} from "@db/routes";
  4. import {
  5. ROUTE_PATH,
  6. ROUTE_TYPE_CUSTOM,
  7. ROUTE_TYPE_FULL,
  8. ROUTE_TYPE_IN,
  9. ROUTE_TYPE_OUTLINK,
  10. ROUTE_TYPE_POP,
  11. ROUTE_TYPE_POP_OR_FULL, SIDE_TYPE_NOMAL
  12. } from "@constants/routes";
  13. import {REQ_STATUS} from "@api/config";
  14. import {
  15. buildReqReducer, reqBindSMS, reqChangeEmail,
  16. reqChangeInfo,
  17. reqChangePass, reqChangePhone, reqCustomLeaveMsg, reqCustomService, reqFavoGet, reqGameCardInfo, reqGameInfo,
  18. reqGetRoutes,
  19. reqLogin,
  20. reqLogout,
  21. reqRegister, reqSendCode, reqSMSLogin, reqUpdateFavoInfo
  22. } from "@features/api";
  23. import {toast} from 'react-toastify';
  24. import {getHttpMsg, localStorageGet, localStorageSet} from "@utils/helpers";
  25. import {
  26. LOCAL_ACTIVITY_C,
  27. LOCAL_CUSTOM_LOCK,
  28. LOCAL_FAVO_IDS, LOCAL_GAME_URL,
  29. LOCAL_IS_LOGIN,
  30. LOCAL_SIGN,
  31. LOCAL_USER_INFO,
  32. LOCAL_VISTOR_ID
  33. } from "@constants/localkey";
  34. import {reqPayConfig} from "@features/paySlice";
  35. import FingerprintJS from '@fingerprintjs/fingerprintjs'
  36. const i18n=global.i18n;
  37. const generateNavs=(routes)=>{
  38. const navs=[];
  39. const allNavs=[];
  40. const allTopNavs=[];
  41. for (let i = 0; i <routes.length ; i++) {
  42. let route=routes[i];
  43. if (!route.side)continue;
  44. allNavs.push(route);
  45. if(route.side===SIDE_TYPE_NOMAL)allTopNavs.push(route);
  46. let block=route.block!=null?route.block:0;
  47. let temp=navs[block];
  48. if (temp==null)temp=[];
  49. temp.push(route);
  50. navs[block]=temp;
  51. }
  52. return {navs,allNavs,allTopNavs};
  53. }
  54. const generateRoutes=(routes,asyncRoutes=[])=>{
  55. const allMap={};
  56. const inRoutes=[];
  57. const popRoutes=[];
  58. //路由等级
  59. //ppath parent path
  60. const _generate=(list,plevel,ppath)=>{
  61. Object.keys(list).map((key)=>{
  62. let route=list[key];
  63. if (route){
  64. if (allMap[route.path]==null){
  65. //level
  66. route.plv=plevel;
  67. route.ppath=ppath;
  68. route.lv=plevel+key+"_";
  69. // if (route.path==="#/signin"||route.path==="#/signup"){
  70. // route.component="Login";
  71. // }
  72. if (route.path==="#/pay"){
  73. route.component="deposit";
  74. }
  75. if (route.path==="#/saque"){
  76. route.component="withdraw";
  77. }
  78. // if (route.path==="/sports"){
  79. // route.subs=[
  80. // {
  81. // "id": 100,
  82. // "parent_id": 4,
  83. // "index": 100,
  84. // "path": "/sports/soccer-1",
  85. // "type": 0,
  86. // "side": 1,
  87. // "block": 1,
  88. // "title": "Soccer",
  89. // "icon": "icon_Soccer",
  90. // "fill": ";;",
  91. // "style": 1,
  92. // "component": "Sport",
  93. // "query": "",
  94. // "login": 0,
  95. // "lpath": "#\/signup",
  96. // "state": 15,
  97. // "subs": []
  98. // },
  99. // {
  100. // "id": 101,
  101. // "parent_id": 4,
  102. // "index": 101,
  103. // "path": "/sports/basketball-2",
  104. // "type": 0,
  105. // "side": 1,
  106. // "block": 1,
  107. // "title": "Basketball",
  108. // "icon": "icon_Basketball",
  109. // "fill": ";;",
  110. // "style": 1,
  111. // "component": "Sport",
  112. // "query": "",
  113. // "login": 0,
  114. // "lpath": "#\/signup",
  115. // "state": 15,
  116. // "subs": []
  117. // }
  118. // ]
  119. // }
  120. // if (route.path==="/sports"){
  121. // route.type=ROUTE_TYPE_FULL;
  122. // }
  123. allMap[route.path]=route;
  124. let type=route.type;
  125. if (type===ROUTE_TYPE_IN||type===ROUTE_TYPE_FULL)inRoutes.push(route);
  126. else if (type===ROUTE_TYPE_POP_OR_FULL)popRoutes.push(route);
  127. else if (type===ROUTE_TYPE_POP)popRoutes.push(route);
  128. else if (type===ROUTE_TYPE_CUSTOM)popRoutes.push(route);
  129. }
  130. let subs=route.subs;
  131. if (subs!=null)_generate(subs,route.lv,route.path);
  132. }
  133. });
  134. }
  135. const allroutes=[...routes, ...asyncRoutes];
  136. _generate(allroutes,"","");
  137. const gnavs=generateNavs(allroutes);
  138. return {allMap,inRoutes,popRoutes,blockNavs:gnavs.navs,allNavs:gnavs.allNavs,allTopNavs:gnavs.allTopNavs};
  139. }
  140. const parseThemeStypes=(data)=>{
  141. if (data!=null){
  142. for (const key in data) {
  143. let item=data[key];
  144. if (item!=null){
  145. if (typeof item=="string"){
  146. if (item.indexOf(";")!=-1){
  147. data[key]=item.split(";");
  148. }
  149. }
  150. }
  151. }
  152. }
  153. return data;
  154. }
  155. const parseStyles=(data)=>{
  156. let styles={};
  157. if (data!=null){
  158. for (let i = 0; i <data.length ; i++) {
  159. let item=data[i];
  160. if (item){
  161. let styleid=item.styleid;
  162. let style=item.style;
  163. let json={};
  164. if (style!=null&&style!=""){
  165. json=JSON.parse(style);
  166. json['dark']=parseThemeStypes(json['dark']);
  167. json['light']=parseThemeStypes(json['light']);
  168. }
  169. styles[styleid]={styleid,style:json};
  170. }
  171. }
  172. }
  173. return styles;
  174. }
  175. const parseBlocks=(data)=>{
  176. let blocks={};
  177. if (data!=null){
  178. for (let i = 0; i < data.length; i++) {
  179. let item=data[i];
  180. if (item){
  181. blocks[item.block]=item;
  182. }
  183. }
  184. }
  185. return blocks;
  186. }
  187. const getFavorites=(data)=>{
  188. let favorites=[];
  189. if (data!=null&&!!data.length){
  190. let arr=data.split(",");
  191. if (arr){
  192. for (let i = 0; i < arr.length; i++) {
  193. favorites.push(parseInt(arr[i]));
  194. }
  195. }
  196. localStorageSet(LOCAL_FAVO_IDS,JSON.stringify(favorites));
  197. }
  198. else
  199. {
  200. let localFavorites=localStorageGet(LOCAL_FAVO_IDS,"");
  201. if (localFavorites!=="")favorites=JSON.parse(localFavorites)
  202. }
  203. return favorites;
  204. }
  205. const reducerRoutes=(state,action)=>{
  206. let json=action.payload;
  207. if (json&&json.code==0){
  208. let data=json.data==null?[]:json.data;
  209. let generData=generateRoutes(state.routes,data);
  210. let styles=parseStyles(json.styles);
  211. let blocks=parseBlocks(json.blocks);
  212. let user=json.user;
  213. let isLogin=0;
  214. let userInfo={};
  215. let hasPhone=0;
  216. if (user){
  217. if (typeof user=="object"){
  218. isLogin=1;
  219. // user.InsurePass=0;
  220. userInfo=user;
  221. //请求pay
  222. // global.dispatch(reqPayConfig(user));
  223. let sign=user.sign;
  224. if (sign!=null)localStorageSet(LOCAL_SIGN,sign);
  225. if(user.Phone!==""&&user.Phone.startsWith(user.RegisterLocation)){
  226. hasPhone=1;
  227. }
  228. checkChannel(user);
  229. }
  230. }
  231. let conf=json.conf;
  232. let hallServerUrl='';
  233. let promoteInstall=0;
  234. let guest=0;
  235. let upgradeBonus=0;
  236. let popWheel=0;
  237. let popBindPhone=0;
  238. let firstBonus=0;
  239. let openRelief=0;
  240. //sport 配置
  241. let bbConf=null;
  242. if (conf){
  243. if (!!conf.hall)hallServerUrl=conf.hall;
  244. if (!!conf.DOLLAR)global.DOLLAR=conf.DOLLAR;
  245. global.pf=conf.pf;
  246. //平台配置
  247. if(!!conf.pf&&!!conf.pf.id){
  248. let {type,id}=conf.pf;
  249. initTrackAll(type,id,isLogin?userInfo.UserID:null)
  250. }
  251. //promoteInstall
  252. if (!!conf.promoteInstall)promoteInstall=conf.promoteInstall;
  253. //guest
  254. if (!!conf.guest)guest=conf.guest;
  255. if (!!conf.upgradeBonus)upgradeBonus=conf.upgradeBonus;
  256. //弹出转盘
  257. if (!!conf.popWheel)popWheel=conf.popWheel;
  258. //弹出绑定电话奖励,并显示浮标
  259. if (!!conf.popBindPhone)popBindPhone=hasPhone?0:conf.popBindPhone;
  260. //显示首冲浮标
  261. if (!!conf.firstBonus)firstBonus=conf.firstBonus;
  262. //显示救济浮标
  263. if (!!conf.openRelief)openRelief=conf.openRelief;
  264. //sport 配置
  265. if (!!conf.bb){
  266. bbConf=conf.bb;
  267. if(userInfo!=null)userInfo.bb=bbConf;
  268. }
  269. }
  270. //favorites
  271. // let favorites=getFavorites(json.favorites);
  272. Object.assign(state, {routes:state.routes,asyncRoutes:data,styles,blocks,...generData,isLogin:isLogin,userInfo,hallServerUrl,promoteInstall,guest,upgradeBonus,popWheel,popBindPhone,firstBonus,openRelief,bbConf});
  273. // Object.assign(state, {routes:state.routes,asyncRoutes:data,styles:styles,blocks:blocks,...generData,isLogin:isLogin,userInfo:userInfo,hallServerUrl:hallServerUrl,promoteInstall:promoteInstall,guest:guest,upgradeBonus:upgradeBonus});
  274. }
  275. }
  276. const routesStatus=(state,status,arg)=>{
  277. state.status=status;
  278. }
  279. //login
  280. const getLocalUserInfo=()=>{
  281. let user={};
  282. let value=localStorageGet(LOCAL_USER_INFO,null);
  283. if (value&&value!=""){
  284. user=JSON.parse(value);
  285. }
  286. return user;
  287. }
  288. const getLocalIsLogin=()=>{
  289. let islogin=localStorageGet(LOCAL_IS_LOGIN,0);
  290. islogin=Number(islogin);
  291. return islogin;
  292. }
  293. const getMsg=(payload)=>{
  294. return getHttpMsg(payload);
  295. }
  296. //检查渠道
  297. const checkChannel=(userInfo)=>{
  298. if (userInfo!=null&&userInfo.Channel!=null){
  299. let Channel=parseInt(userInfo.Channel);
  300. let localC=localStorageGet(LOCAL_ACTIVITY_C,"");
  301. if (localC!=null&&localC!==""){
  302. localC=parseInt(localC);
  303. if (Channel!==localC){
  304. localStorageSet(LOCAL_ACTIVITY_C,Channel+"");
  305. window.location.replace(window.location.origin);
  306. }
  307. }
  308. }
  309. }
  310. const parseLogin=(state,action,arg,isShowMsg=true)=>{
  311. let payload=action.payload;
  312. let code=payload.code;
  313. let msg=getMsg(payload);
  314. //success
  315. if (code==200){
  316. let data=payload.data;
  317. if (data.bb==null){
  318. if (state.userInfo!=null)data.bb=state.userInfo.bb;
  319. }
  320. if (arg){
  321. if (arg.DefaultLanguage!=null)data.lang=arg.DefaultLanguage;
  322. if (arg.ThemeColor!=null)data.theme=arg.ThemeColor;
  323. }
  324. state.userInfo=data;
  325. state.isLogin=1;
  326. // localStorageSet(LOCAL_USER_INFO,JSON.stringify(data));
  327. // localStorageSet(LOCAL_IS_LOGIN,1);
  328. let sign=data.sign;
  329. if (sign!=null)localStorageSet(LOCAL_SIGN,sign);
  330. if(isShowMsg)toast.success(msg);
  331. //请求pay
  332. // global.dispatch(reqPayConfig(data));
  333. if(!!data.reg){
  334. //新注册的
  335. trackEvent("CompleteRegistration",{external_id:data.UserID})
  336. }
  337. checkChannel(data);
  338. }
  339. else
  340. {
  341. if(isShowMsg)toast.error(msg);
  342. }
  343. if (arg){
  344. let callback=arg.callback;
  345. if (callback!=null)callback(code);
  346. }
  347. }
  348. const reducerLogin=(state,action,arg)=>{
  349. // toast.success("success");
  350. parseLogin(state,action,arg);
  351. }
  352. const loginStatus=(state,status,arg)=>{
  353. state.loginStatus.login=status;
  354. }
  355. const reducerReg=(state,action,arg)=>{
  356. parseLogin(state,action,arg);
  357. }
  358. const regStatus=(state,status,arg)=>{
  359. state.loginStatus.register=status;
  360. }
  361. const reducerLogout=(state,action,arg)=>{
  362. let payload=action.payload;
  363. let code=payload.code;
  364. let msg=getMsg(payload);
  365. if (code==200){
  366. state.userInfo={};
  367. state.isLogin=0;
  368. localStorageSet(LOCAL_SIGN,"");
  369. // localStorageSet(LOCAL_USER_INFO,"");
  370. // localStorageSet(LOCAL_IS_LOGIN,0);
  371. toast.success(msg);
  372. }
  373. else
  374. {
  375. toast.error(msg);
  376. }
  377. }
  378. const logoutStatus=(state,status,arg)=>{
  379. state.loginStatus.logout=status;
  380. }
  381. //login
  382. //modify
  383. const reducerChangePass=(state,action,arg)=>{
  384. // let payload=action.payload;
  385. // let code=payload.code;
  386. // let msg=getMsg(payload);
  387. // if (code==200){
  388. // toast.success(msg);
  389. // }
  390. // else
  391. // {
  392. // toast.error(msg);
  393. // }
  394. parseLogin(state,action,arg);
  395. }
  396. const changePassStatus=(state,status,arg)=>{
  397. state.modifyStatus.password=status;
  398. }
  399. const reducerChangeInfo=(state,action,arg)=>{
  400. // let payload=action.payload;
  401. // let code=payload.code;
  402. // let msg=getMsg(payload);
  403. // if (code==200){
  404. // toast.success(msg);
  405. // }
  406. // else
  407. // {
  408. // toast.error(msg);
  409. // }
  410. parseLogin(state,action,arg);
  411. }
  412. const changeInfoStatus=(state,status,arg)=>{
  413. state.modifyStatus.info=status;
  414. }
  415. const reducerChangePhone=(state,action,arg)=>{
  416. parseLogin(state,action,arg);
  417. }
  418. const changePhoneStatus=(state,status,arg)=>{
  419. state.modifyStatus.phone=status;
  420. }
  421. const reducerChangeEmail=(state,action,arg)=>{
  422. parseLogin(state,action,arg);
  423. }
  424. const changeEmailStatus=(state,status,arg)=>{
  425. state.modifyStatus.phone=status;
  426. }
  427. //modify
  428. //gameinfo
  429. const reducerGameInfo=(state,action,arg)=>{
  430. // parseLogin(state,action,arg);
  431. parseLogin(state,action,arg,false);
  432. }
  433. const gameInfoStatus=(state,status,arg)=>{
  434. state.gameInfoStatus=status;
  435. }
  436. //gameinfo
  437. //custom
  438. const reducerCustom=(state,action,arg)=>{
  439. let payload=action.payload;
  440. if (payload&&payload.code===200){
  441. state.customerInfo=payload.data;
  442. }
  443. }
  444. const customStatus=(state,status,arg)=>{
  445. state.customServiceStatus=status;
  446. }
  447. const reducerCustomLeaveMsg=(state,action,arg)=>{
  448. let payload=action.payload;
  449. if (payload!=null){
  450. if (payload&&payload.code===200){
  451. localStorageSet(LOCAL_CUSTOM_LOCK,Date.now());
  452. toast.success(i18n.t("customer.TopTip_succeed"));
  453. }
  454. else {
  455. toast.error(i18n.t("customer.TopTip_fail"));
  456. }
  457. }
  458. }
  459. const customLeaveMsgStatus=(state,status,arg)=>{
  460. state.customLeaveMsgStatus=status;
  461. }
  462. const reducerUpdateFavoInfo=(state,action,arg)=>{
  463. let payload=action.payload;
  464. let msg=getHttpMsg(payload);
  465. if (payload&&payload.code===200){
  466. if (msg!=null&&msg!==""){
  467. toast.success(msg)
  468. }
  469. }
  470. else
  471. {
  472. if (msg!=null&&msg!==""){
  473. toast.error(msg)
  474. }
  475. }
  476. }
  477. const reducerFavoGet=(state,action,arg)=>{
  478. let payload=action.payload;
  479. if (payload&&payload.code===200){
  480. let data=payload.data;
  481. let favorites=[];
  482. if (data!=null){
  483. for (let i = 0; i < data.length; i++) {
  484. let item=data[i];
  485. if(item)favorites.push(item.id);
  486. }
  487. }
  488. state.favorites=favorites;
  489. }
  490. }
  491. const reducerGameCardInfo=(state,action,arg)=>{
  492. let payload=action.payload;
  493. if (payload&&payload.code===200){
  494. let data=payload.data;
  495. if (data!=null){
  496. let id=Number(data.id);
  497. let level_info=data.level_info;
  498. let level=level_info!=null?1:0;
  499. let local=parseInt(localStorageGet(LOCAL_GAME_URL+id,0));
  500. if (local>0)level=local;
  501. state.gameCardInfo[id]={...data,level:level}
  502. }
  503. }
  504. }
  505. const gameCardInfoStatus=(state,status,arg)=>{
  506. state.gameCardInfoStatus=status;
  507. }
  508. //send code
  509. const reducerSendCode=(state,action,arg)=>{
  510. let payload=action.payload;
  511. let msg=getHttpMsg(payload);
  512. if (payload&&payload.code===200){
  513. toast.success(msg);
  514. state.otpTimeStamp=Date.now();
  515. }
  516. else
  517. {
  518. toast.error(msg);
  519. }
  520. }
  521. const sendCodeStatus=(state,status,arg)=>{
  522. state.loginStatus.send_code=status;
  523. }
  524. //bind phone
  525. const reducerBindSMS=(state,action,arg)=>{
  526. parseLogin(state,action,arg);
  527. }
  528. const bindSMSStatus=(state,status,arg)=>{
  529. state.loginStatus.bind=status;
  530. }
  531. //sms login
  532. const reducerSMSLogin=(state,action,arg)=>{
  533. parseLogin(state,action,arg);
  534. }
  535. const smsLoginStatus=(state,status,arg)=>{
  536. state.loginStatus.smslogin=status;
  537. }
  538. //custom
  539. export const Main=createSlice({
  540. name: 'main',
  541. initialState: {
  542. status:REQ_STATUS.NONE,
  543. routes:routes,
  544. asyncRoutes:[],
  545. styles:{},
  546. blocks:{},
  547. ...generateRoutes(routes),
  548. loginStatus:{
  549. login:REQ_STATUS.NONE,
  550. register:REQ_STATUS.NONE,
  551. logout:REQ_STATUS.NONE,
  552. bind:REQ_STATUS.NONE,
  553. send_code:REQ_STATUS.NONE,
  554. smslogin:REQ_STATUS.NONE,
  555. },
  556. userInfo: null,
  557. isLogin:0,
  558. modifyStatus:{
  559. info:REQ_STATUS.NONE,
  560. password:REQ_STATUS.NONE,
  561. phone:REQ_STATUS.NONE,
  562. email:REQ_STATUS.NONE
  563. },
  564. gameInfoStatus:REQ_STATUS.NONE,
  565. customLeaveMsgStatus:REQ_STATUS.NONE,
  566. customServiceStatus:REQ_STATUS.NONE,
  567. //客服
  568. customerInfo:[],
  569. //大厅服务器
  570. hallServerUrl:'',
  571. //收藏列表
  572. favorites:[],
  573. //当前游戏id
  574. gameID:0,
  575. //服务器踢
  576. serverKick:0,
  577. //安装提示
  578. promoteInstall:0,
  579. //服务器返回777打开充值
  580. openPay:0,
  581. gameCardInfoStatus:REQ_STATUS.NONE,
  582. //游戏卡信息
  583. gameCardInfo:{},
  584. //otp 时间戳
  585. otpTimeStamp:0,
  586. //是否是guest登录
  587. guest:0,
  588. //绑定奖励
  589. upgradeBonus:0,
  590. //sport conf
  591. bbConf:null
  592. },
  593. reducers: {
  594. logout:(state, action)=>{
  595. state.userInfo={};
  596. state.isLogin=0;
  597. // localStorageSet(LOCAL_USER_INFO,"");
  598. // localStorageSet(LOCAL_IS_LOGIN,0);
  599. },
  600. updateUserInfo:(state, action)=>{
  601. parseLogin(state,action,{},false);
  602. },
  603. updateUserScore:(state, action)=>{
  604. let score=action.payload;
  605. if (score!=null){
  606. if(state.userInfo)state.userInfo.Score=Number(score);
  607. }
  608. },
  609. updateAddScore:(state, action)=>{
  610. let score=action.payload;
  611. if (score!=null){
  612. if(state.userInfo)state.userInfo.Score=state.userInfo.Score+Number(score);
  613. }
  614. },
  615. updateGameLike:(state, action)=>{
  616. let payload=action.payload;
  617. let id=payload.id;
  618. let like=payload.like;
  619. let favorites=state.favorites;
  620. let index=favorites.indexOf(id);
  621. if (like){
  622. if (index===-1){
  623. favorites.push(id);
  624. state.favorites=favorites;
  625. }
  626. }
  627. else {
  628. let index=favorites.indexOf(id);
  629. if (index!==-1){
  630. favorites.splice(index,1);
  631. state.favorites=favorites;
  632. }
  633. }
  634. // localStorageSet(LOCAL_FAVO_IDS,JSON.stringify(favorites));
  635. },
  636. onSliceChangeUser:(state,action)=>{
  637. state.favorites=[];
  638. },
  639. updateCurrGame:(state,action)=>{
  640. state.gameID=action.payload;
  641. },
  642. updateServerKick:(state,action)=>{
  643. state.serverKick=action.payload;
  644. },
  645. updateOpenPay:(state,action)=>{
  646. state.openPay=action.payload;
  647. },
  648. updateGameRoute:(state,action)=> {
  649. let route = state.allMap[ROUTE_PATH.GAME + "/*"];
  650. if (route != null) {
  651. let type = action.payload;
  652. route.type = type;
  653. }
  654. },
  655. updateGameCardInfo:(state,action)=>{
  656. let {data,level}=action.payload;
  657. if (data!=null){
  658. if (level==null)level=0;
  659. let id=data.id;
  660. state.gameCardInfo[id]={...data,level};
  661. }
  662. }
  663. },
  664. extraReducers: (builder) => {
  665. // Add reducers for additional action types here, and handle loading state as needed
  666. // reducerRoutes(builder);
  667. buildReqReducer(builder,reqGetRoutes,reducerRoutes,routesStatus);
  668. buildReqReducer(builder,reqLogin,reducerLogin,loginStatus);
  669. buildReqReducer(builder,reqRegister,reducerReg,regStatus);
  670. buildReqReducer(builder,reqLogout,reducerLogout,logoutStatus);
  671. buildReqReducer(builder,reqChangePass,reducerChangePass,changePassStatus);
  672. buildReqReducer(builder,reqChangeInfo,reducerChangeInfo,changeInfoStatus);
  673. buildReqReducer(builder,reqChangePhone,reducerChangePhone,changePhoneStatus);
  674. buildReqReducer(builder,reqChangeEmail,reducerChangeEmail,changeEmailStatus);
  675. buildReqReducer(builder,reqGameInfo,reducerGameInfo,gameInfoStatus);
  676. buildReqReducer(builder,reqCustomService,reducerCustom,customStatus);
  677. buildReqReducer(builder,reqCustomLeaveMsg,reducerCustomLeaveMsg,customLeaveMsgStatus);
  678. buildReqReducer(builder,reqUpdateFavoInfo,reducerUpdateFavoInfo,null);
  679. buildReqReducer(builder,reqFavoGet,reducerFavoGet,null);
  680. buildReqReducer(builder,reqGameCardInfo,reducerGameCardInfo,gameCardInfoStatus);
  681. buildReqReducer(builder,reqSendCode,reducerSendCode,sendCodeStatus);
  682. buildReqReducer(builder,reqBindSMS,reducerBindSMS,bindSMSStatus);
  683. buildReqReducer(builder,reqSMSLogin,reducerSMSLogin,smsLoginStatus);
  684. },
  685. })
  686. export const {logout,updateUserInfo,updateUserScore,updateAddScore,updateGameLike,updateCurrGame,updateServerKick,updateOpenPay,updateGameRoute,updateGameCardInfo} = Main.actions;
  687. //数据获取
  688. export const getFetchStatus=(state)=>{
  689. return state.main.status;
  690. }
  691. export const routesMap=(state)=>{
  692. return state.main.allMap;
  693. }
  694. export const routesIn=(state)=>{
  695. return state.main.inRoutes;
  696. }
  697. export const routesPop=(state)=>{
  698. return state.main.popRoutes;
  699. }
  700. export const nBlocks=(state)=>{
  701. return state.main.blockNavs;
  702. }
  703. export const allNavs=(state)=>{
  704. return state.main.allNavs;
  705. }
  706. export const allTopNavs=(state)=>{
  707. return state.main.allTopNavs;
  708. }
  709. const getRouteFromPath=(state,path)=>{
  710. let allMap=routesMap(state);
  711. let route=allMap[path];
  712. if (route==null){
  713. //查看是否有可变路由
  714. let paths=path.split("/");
  715. paths[paths.length-1]="*";
  716. let newpath=paths.join("/");
  717. route=allMap[newpath];
  718. }
  719. return route;
  720. }
  721. export const getRoute=(path)=>(state)=>{
  722. // let route=routesMap(state)[path];
  723. let route=getRouteFromPath(state,path);
  724. if (route==null)return {};
  725. return route;
  726. }
  727. export const getRouteChain=(path)=>(state)=>{
  728. let map=routesMap(state);
  729. let list=[];
  730. let getChain=(cpath)=>{
  731. let route=map[cpath];
  732. if (route!=null){
  733. list.unshift(route);
  734. if (route.ppath!=null&&route.ppath!==""){
  735. getChain(route.ppath);
  736. }
  737. }
  738. }
  739. getChain(path);
  740. return list;
  741. }
  742. export const getRouteStyles=(state)=>{
  743. let styles=state.main.styles;
  744. return styles;
  745. }
  746. export const getBlockColumn=(state)=>{
  747. let blocks=state.main.blocks;
  748. return blocks;
  749. }
  750. export const isFullRoute=(path)=>(state)=>{
  751. // let route=routesMap(state)[path];
  752. let route=getRouteFromPath(state,path);
  753. if (route)return route.type===ROUTE_TYPE_FULL;
  754. return false;
  755. }
  756. export const isPopRoute=(path)=>(state)=>{
  757. // let route=routesMap(state)[path];
  758. let route=getRouteFromPath(state,path);
  759. if (route)return route.type===ROUTE_TYPE_POP;
  760. return false;
  761. }
  762. export const isInRoute=(path)=>(state)=>{
  763. // let route=routesMap(state)[path];
  764. let route=getRouteFromPath(state,path);
  765. if (route)return route.type===ROUTE_TYPE_IN;
  766. return false;
  767. }
  768. export const isOutRoute=(path)=>(state)=>{
  769. // let route=routesMap(state)[path];
  770. let route=getRouteFromPath(state,path);
  771. if (route)return route.type===ROUTE_TYPE_OUTLINK;
  772. return false;
  773. }
  774. //login
  775. export const getLoginStatus=(state)=>{
  776. return state.main.loginStatus.login;
  777. }
  778. export const getRegStatus=(state)=>{
  779. return state.main.loginStatus.register;
  780. }
  781. export const getLogoutStatus=(state)=>{
  782. return state.main.loginStatus.logout;
  783. }
  784. export const getSendCodeStatus=(state)=>{
  785. return state.main.loginStatus.send_code;
  786. }
  787. export const getBindSMSStatus=(state)=>{
  788. return state.main.loginStatus.bind;
  789. }
  790. export const getSMSLoginStatus=(state)=>{
  791. return state.main.loginStatus.smslogin;
  792. }
  793. export const getSendCodeTS=(state)=>{
  794. return state.main.otpTimeStamp;
  795. }
  796. //modify
  797. export const getChangeInfoStatus=(state)=>{
  798. return state.main.modifyStatus.info;
  799. }
  800. export const getChangePassStatus=(state)=>{
  801. return state.main.modifyStatus.password;
  802. }
  803. export const getChangePhoneStatus=(state)=>{
  804. return state.main.modifyStatus.phone;
  805. }
  806. export const getChangeEmailStatus=(state)=>{
  807. return state.main.modifyStatus.email;
  808. }
  809. export const isLogined=(state)=>{
  810. // console.log(state.main.isLogin)
  811. return state.main.isLogin;
  812. // return 1;
  813. }
  814. export const getUserInfo=(state)=>{
  815. return state.main.userInfo;
  816. }
  817. export const getUserID=(state)=>{
  818. let uid=-1;
  819. let userInfo=state.main.userInfo;
  820. if (userInfo){
  821. if (userInfo.UserID!=null)uid=userInfo.UserID;
  822. else uid=0;
  823. }
  824. return uid;
  825. }
  826. export const getCustomInfo=(state)=>{
  827. return state.main.customerInfo;
  828. }
  829. export const getCustomTypeInfo=(type)=>(state)=>{
  830. let item=null;
  831. let customerInfo=state.main.customerInfo;
  832. if (customerInfo){
  833. for (let i = 0; i < customerInfo.length; i++) {
  834. let info=customerInfo[i];
  835. if (info.StatusName===type){
  836. item=info;
  837. break;
  838. }
  839. }
  840. }
  841. return item
  842. }
  843. export const getCustomStatus=(state)=>{
  844. return state.main.customLeaveMsgStatus;
  845. }
  846. export const getCustomServiceStatus=(state)=>{
  847. return state.main.customServiceStatus;
  848. }
  849. export const getHallServerUrl=(state)=>{
  850. return state.main.hallServerUrl;
  851. }
  852. export const getGameLikes=(state)=>{
  853. return state.main.favorites;
  854. }
  855. export const getGameLike=(id)=>(state)=>{
  856. let favorites=state.main.favorites;
  857. if (favorites.includes(id))return 1;
  858. return 0;
  859. }
  860. export const getKickState=(state)=>{
  861. return state.main.serverKick;
  862. }
  863. export const getPromoteInstall=(state)=>{
  864. return state.main.promoteInstall;
  865. }
  866. export const getPopWheel=(state)=>{
  867. return state.main.popWheel;
  868. }
  869. export const getOpenPay=(state)=>{
  870. return state.main.openPay;
  871. }
  872. export const getGameCardInfo=(id)=>(state)=>{
  873. id=Number(id);
  874. return state.main.gameCardInfo[id];
  875. }
  876. export const getIsGuest=(state)=>{
  877. return state.main.guest;
  878. }
  879. export const getUpgradeBonus=(state)=>{
  880. return state.main.upgradeBonus;
  881. }
  882. export const getPopBindPhone=(state)=>{
  883. return state.main.popBindPhone;
  884. }
  885. export const getFirstBonus=(state)=>{
  886. return state.main.firstBonus;
  887. }
  888. export const getOpenRelief=(state)=>{
  889. return state.main.openRelief;
  890. }
  891. export const getBBConf=(state)=>{
  892. return state.main.bbConf;
  893. }
  894. export const getUserBBToken=(state)=>{
  895. let token=null;
  896. let userInfo=state.main.userInfo;
  897. if (userInfo){
  898. if (userInfo.bb != null&&userInfo.bb.token!=null)token=userInfo.bb.token;
  899. }
  900. return token;
  901. }
  902. export const getUserThemeAndLang=(state)=>{
  903. let data={};
  904. let userInfo=state.main.userInfo;
  905. if (userInfo){
  906. data.lang=userInfo.lang;
  907. data.theme=userInfo.theme;
  908. }
  909. return data;
  910. }
  911. //数据获取
  912. export default Main.reducer;
  913. export const getBFP=()=>{
  914. return async (dispatch, getState) => {
  915. let bfp="";
  916. bfp=localStorageGet(LOCAL_VISTOR_ID,"");
  917. if (bfp!=null&&bfp!==""){
  918. global.BFP=bfp;
  919. return bfp;
  920. }
  921. // const fpPromise = FingerprintJS.load({
  922. // apiKey: "W7zWifGvJhjacPekHi64"
  923. // })
  924. const fpPromise =FingerprintJS.load();
  925. try {
  926. let fp=await fpPromise;
  927. let result=await fp.get();
  928. if (result!=null){
  929. bfp=result.visitorId;
  930. localStorageSet(LOCAL_VISTOR_ID,bfp);
  931. global.BFP=bfp;
  932. }
  933. }
  934. catch (err){
  935. console.log(err);
  936. }
  937. return bfp;
  938. }
  939. }