mainSlice.js 31 KB

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