mainSlice.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. import {createAsyncThunk, createSlice} from "@reduxjs/toolkit";
  2. import {routes} from "@db/routes";
  3. import {
  4. ROUTE_TYPE_CUSTOM,
  5. ROUTE_TYPE_FULL,
  6. ROUTE_TYPE_IN,
  7. ROUTE_TYPE_OUTLINK,
  8. ROUTE_TYPE_POP,
  9. ROUTE_TYPE_POP_OR_FULL, SIDE_TYPE_NOMAL
  10. } from "@constants/routes";
  11. import {REQ_STATUS} from "@api/config";
  12. import {
  13. buildReqReducer, reqChangeEmail,
  14. reqChangeInfo,
  15. reqChangePass, reqChangePhone, reqCustomLeaveMsg, reqCustomService, reqGameInfo,
  16. reqGetRoutes,
  17. reqLogin,
  18. reqLogout,
  19. reqRegister
  20. } from "@features/api";
  21. import {toast} from 'react-toastify';
  22. import {getHttpMsg, localStorageGet, localStorageSet} from "@utils/helpers";
  23. import {LOCAL_CUSTOM_LOCK, LOCAL_IS_LOGIN, LOCAL_SIGN, LOCAL_USER_INFO, LOCAL_VISTOR_ID} from "@constants/localkey";
  24. import {reqPayConfig} from "@features/paySlice";
  25. import FingerprintJS from '@fingerprintjs/fingerprintjs'
  26. const i18n=global.i18n;
  27. const generateNavs=(routes)=>{
  28. const navs=[];
  29. const allNavs=[];
  30. const allTopNavs=[];
  31. for (let i = 0; i <routes.length ; i++) {
  32. let route=routes[i];
  33. if (!route.side)continue;
  34. allNavs.push(route);
  35. if(route.side===SIDE_TYPE_NOMAL)allTopNavs.push(route);
  36. let block=route.block!=null?route.block:0;
  37. let temp=navs[block];
  38. if (temp==null)temp=[];
  39. temp.push(route);
  40. navs[block]=temp;
  41. }
  42. return {navs,allNavs,allTopNavs};
  43. }
  44. const generateRoutes=(routes,asyncRoutes=[])=>{
  45. const allMap={};
  46. const inRoutes=[];
  47. const popRoutes=[];
  48. //路由等级
  49. //ppath parent path
  50. const _generate=(list,plevel,ppath)=>{
  51. Object.keys(list).map((key)=>{
  52. let route=list[key];
  53. if (route){
  54. if (allMap[route.path]==null){
  55. //level
  56. route.plv=plevel;
  57. route.ppath=ppath;
  58. route.lv=plevel+key+"_";
  59. // if (route.path==="#/signin"||route.path==="#/signup"){
  60. // route.component="Login";
  61. // }
  62. if (route.path==="#/pay"){
  63. route.component="deposit";
  64. }
  65. if (route.path==="#/saque"){
  66. route.component="withdraw";
  67. }
  68. allMap[route.path]=route;
  69. let type=route.type;
  70. if (type===ROUTE_TYPE_IN||type===ROUTE_TYPE_FULL)inRoutes.push(route);
  71. else if (type===ROUTE_TYPE_POP_OR_FULL)popRoutes.push(route);
  72. else if (type===ROUTE_TYPE_POP)popRoutes.push(route);
  73. else if (type===ROUTE_TYPE_CUSTOM)popRoutes.push(route);
  74. }
  75. let subs=route.subs;
  76. if (subs!=null)_generate(subs,route.lv,route.path);
  77. }
  78. });
  79. }
  80. const allroutes=[...routes, ...asyncRoutes];
  81. _generate(allroutes,"","");
  82. const gnavs=generateNavs(allroutes);
  83. return {allMap,inRoutes,popRoutes,blockNavs:gnavs.navs,allNavs:gnavs.allNavs,allTopNavs:gnavs.allTopNavs};
  84. }
  85. const parseThemeStypes=(data)=>{
  86. if (data!=null){
  87. for (const key in data) {
  88. let item=data[key];
  89. if (item!=null){
  90. if (typeof item=="string"){
  91. if (item.indexOf(";")!=-1){
  92. data[key]=item.split(";");
  93. }
  94. }
  95. }
  96. }
  97. }
  98. return data;
  99. }
  100. const parseStyles=(data)=>{
  101. let styles={};
  102. if (data!=null){
  103. for (let i = 0; i <data.length ; i++) {
  104. let item=data[i];
  105. if (item){
  106. let styleid=item.styleid;
  107. let style=item.style;
  108. let json={};
  109. if (style!=null&&style!=""){
  110. json=JSON.parse(style);
  111. json['dark']=parseThemeStypes(json['dark']);
  112. json['light']=parseThemeStypes(json['light']);
  113. }
  114. styles[styleid]={styleid,style:json};
  115. }
  116. }
  117. }
  118. return styles;
  119. }
  120. const parseBlocks=(data)=>{
  121. let blocks={};
  122. if (data!=null){
  123. for (let i = 0; i < data.length; i++) {
  124. let item=data[i];
  125. if (item){
  126. blocks[item.block]=item;
  127. }
  128. }
  129. }
  130. return blocks;
  131. }
  132. const reducerRoutes=(state,action)=>{
  133. let json=action.payload;
  134. if (json&&json.code==0){
  135. let data=json.data==null?[]:json.data;
  136. let generData=generateRoutes(state.routes,data);
  137. let styles=parseStyles(json.styles);
  138. let blocks=parseBlocks(json.blocks);
  139. let user=json.user;
  140. let isLogin=0;
  141. let userInfo={};
  142. if (user){
  143. if (typeof user=="object"){
  144. isLogin=1;
  145. // user.InsurePass=0;
  146. userInfo=user;
  147. //请求pay
  148. // global.dispatch(reqPayConfig(user));
  149. }
  150. }
  151. Object.assign(state, {routes:state.routes,asyncRoutes:data,styles:styles,blocks:blocks,...generData,isLogin:isLogin,userInfo:userInfo});
  152. }
  153. }
  154. const routesStatus=(state,status,arg)=>{
  155. state.status=status;
  156. }
  157. //login
  158. const getLocalUserInfo=()=>{
  159. let user={};
  160. let value=localStorageGet(LOCAL_USER_INFO,null);
  161. if (value&&value!=""){
  162. user=JSON.parse(value);
  163. }
  164. return user;
  165. }
  166. const getLocalIsLogin=()=>{
  167. let islogin=localStorageGet(LOCAL_IS_LOGIN,0);
  168. islogin=Number(islogin);
  169. return islogin;
  170. }
  171. const getMsg=(payload)=>{
  172. return getHttpMsg(payload);
  173. }
  174. const parseLogin=(state,action,arg,isShowMsg=true)=>{
  175. let payload=action.payload;
  176. let code=payload.code;
  177. let msg=getMsg(payload);
  178. //success
  179. if (code==200){
  180. let data=payload.data;
  181. state.userInfo=data;
  182. state.isLogin=1;
  183. // localStorageSet(LOCAL_USER_INFO,JSON.stringify(data));
  184. // localStorageSet(LOCAL_IS_LOGIN,1);
  185. let sign=data.sign;
  186. if (sign!=null)localStorageSet(LOCAL_SIGN,sign);
  187. if(isShowMsg)toast.success(msg);
  188. //请求pay
  189. // global.dispatch(reqPayConfig(data));
  190. }
  191. else
  192. {
  193. if(isShowMsg)toast.error(msg);
  194. }
  195. if (arg){
  196. let callback=arg.callback;
  197. if (callback!=null)callback(code);
  198. }
  199. }
  200. const reducerLogin=(state,action,arg)=>{
  201. // toast.success("success");
  202. parseLogin(state,action,arg);
  203. }
  204. const loginStatus=(state,status,arg)=>{
  205. state.loginStatus.login=status;
  206. }
  207. const reducerReg=(state,action,arg)=>{
  208. parseLogin(state,action,arg);
  209. }
  210. const regStatus=(state,status,arg)=>{
  211. state.loginStatus.register=status;
  212. }
  213. const reducerLogout=(state,action,arg)=>{
  214. let payload=action.payload;
  215. let code=payload.code;
  216. let msg=getMsg(payload);
  217. if (code==200){
  218. state.userInfo={};
  219. state.isLogin=0;
  220. localStorageSet(LOCAL_SIGN,"");
  221. // localStorageSet(LOCAL_USER_INFO,"");
  222. // localStorageSet(LOCAL_IS_LOGIN,0);
  223. toast.success(msg);
  224. }
  225. else
  226. {
  227. toast.error(msg);
  228. }
  229. }
  230. const logoutStatus=(state,status,arg)=>{
  231. state.loginStatus.logout=status;
  232. }
  233. //login
  234. //modify
  235. const reducerChangePass=(state,action,arg)=>{
  236. // let payload=action.payload;
  237. // let code=payload.code;
  238. // let msg=getMsg(payload);
  239. // if (code==200){
  240. // toast.success(msg);
  241. // }
  242. // else
  243. // {
  244. // toast.error(msg);
  245. // }
  246. parseLogin(state,action,arg);
  247. }
  248. const changePassStatus=(state,status,arg)=>{
  249. state.modifyStatus.password=status;
  250. }
  251. const reducerChangeInfo=(state,action,arg)=>{
  252. // let payload=action.payload;
  253. // let code=payload.code;
  254. // let msg=getMsg(payload);
  255. // if (code==200){
  256. // toast.success(msg);
  257. // }
  258. // else
  259. // {
  260. // toast.error(msg);
  261. // }
  262. parseLogin(state,action,arg);
  263. }
  264. const changeInfoStatus=(state,status,arg)=>{
  265. state.modifyStatus.info=status;
  266. }
  267. const reducerChangePhone=(state,action,arg)=>{
  268. parseLogin(state,action,arg);
  269. }
  270. const changePhoneStatus=(state,status,arg)=>{
  271. state.modifyStatus.phone=status;
  272. }
  273. const reducerChangeEmail=(state,action,arg)=>{
  274. parseLogin(state,action,arg);
  275. }
  276. const changeEmailStatus=(state,status,arg)=>{
  277. state.modifyStatus.phone=status;
  278. }
  279. //modify
  280. //gameinfo
  281. const reducerGameInfo=(state,action,arg)=>{
  282. // parseLogin(state,action,arg);
  283. parseLogin(state,action,arg,false);
  284. }
  285. const gameInfoStatus=(state,status,arg)=>{
  286. state.gameInfoStatus=status;
  287. }
  288. //gameinfo
  289. //custom
  290. const reducerCustom=(state,action,arg)=>{
  291. let payload=action.payload;
  292. if (payload&&payload.code===200){
  293. state.customerInfo=payload.data;
  294. }
  295. }
  296. const reducerCustomLeaveMsg=(state,action,arg)=>{
  297. let payload=action.payload;
  298. if (payload!=null){
  299. if (payload&&payload.code===200){
  300. localStorageSet(LOCAL_CUSTOM_LOCK,Date.now());
  301. toast.success(i18n.t("customer.TopTip_succeed"));
  302. }
  303. else {
  304. toast.error(i18n.t("customer.TopTip_fail"));
  305. }
  306. }
  307. }
  308. const customLeaveMsgStatus=(state,status,arg)=>{
  309. state.customLeaveMsgStatus=status;
  310. }
  311. //custom
  312. export const Main=createSlice({
  313. name: 'main',
  314. initialState: {
  315. status:REQ_STATUS.NONE,
  316. routes:routes,
  317. asyncRoutes:[],
  318. styles:{},
  319. blocks:{},
  320. ...generateRoutes(routes),
  321. loginStatus:{
  322. login:REQ_STATUS.NONE,
  323. register:REQ_STATUS.NONE,
  324. logout:REQ_STATUS.NONE,
  325. },
  326. userInfo: null,
  327. isLogin:0,
  328. modifyStatus:{
  329. info:REQ_STATUS.NONE,
  330. password:REQ_STATUS.NONE,
  331. phone:REQ_STATUS.NONE,
  332. email:REQ_STATUS.NONE
  333. },
  334. gameInfoStatus:REQ_STATUS.NONE,
  335. customLeaveMsgStatus:REQ_STATUS.NONE,
  336. customerInfo:[]
  337. },
  338. reducers: {
  339. logout:(state, action)=>{
  340. state.userInfo={};
  341. state.isLogin=0;
  342. // localStorageSet(LOCAL_USER_INFO,"");
  343. // localStorageSet(LOCAL_IS_LOGIN,0);
  344. },
  345. updateUserInfo:(state, action)=>{
  346. parseLogin(state,action,{},false);
  347. },
  348. updateUserScore:(state, action)=>{
  349. let score=action.payload;
  350. if (score!=null){
  351. if(state.userInfo)state.userInfo.Score=Number(score);
  352. }
  353. },
  354. updateAddScore:(state, action)=>{
  355. let score=action.payload;
  356. if (score!=null){
  357. if(state.userInfo)state.userInfo.Score=state.userInfo.Score+Number(score);
  358. }
  359. }
  360. },
  361. extraReducers: (builder) => {
  362. // Add reducers for additional action types here, and handle loading state as needed
  363. // reducerRoutes(builder);
  364. buildReqReducer(builder,reqGetRoutes,reducerRoutes,routesStatus);
  365. buildReqReducer(builder,reqLogin,reducerLogin,loginStatus);
  366. buildReqReducer(builder,reqRegister,reducerReg,regStatus);
  367. buildReqReducer(builder,reqLogout,reducerLogout,logoutStatus);
  368. buildReqReducer(builder,reqChangePass,reducerChangePass,changePassStatus);
  369. buildReqReducer(builder,reqChangeInfo,reducerChangeInfo,changeInfoStatus);
  370. buildReqReducer(builder,reqChangePhone,reducerChangePhone,changePhoneStatus);
  371. buildReqReducer(builder,reqChangeEmail,reducerChangeEmail,changeEmailStatus);
  372. buildReqReducer(builder,reqGameInfo,reducerGameInfo,gameInfoStatus);
  373. buildReqReducer(builder,reqCustomService,reducerCustom,null);
  374. buildReqReducer(builder,reqCustomLeaveMsg,reducerCustomLeaveMsg,customLeaveMsgStatus);
  375. },
  376. })
  377. export const {logout,updateUserInfo,updateUserScore,updateAddScore} = Main.actions;
  378. //数据获取
  379. export const getFetchStatus=(state)=>{
  380. return state.main.status;
  381. }
  382. export const routesMap=(state)=>{
  383. return state.main.allMap;
  384. }
  385. export const routesIn=(state)=>{
  386. return state.main.inRoutes;
  387. }
  388. export const routesPop=(state)=>{
  389. return state.main.popRoutes;
  390. }
  391. export const nBlocks=(state)=>{
  392. return state.main.blockNavs;
  393. }
  394. export const allNavs=(state)=>{
  395. return state.main.allNavs;
  396. }
  397. export const allTopNavs=(state)=>{
  398. return state.main.allTopNavs;
  399. }
  400. const getRouteFromPath=(state,path)=>{
  401. let allMap=routesMap(state);
  402. let route=allMap[path];
  403. if (route==null){
  404. //查看是否有可变路由
  405. let paths=path.split("/");
  406. paths[paths.length-1]="*";
  407. let newpath=paths.join("/");
  408. route=allMap[newpath];
  409. }
  410. return route;
  411. }
  412. export const getRoute=(path)=>(state)=>{
  413. // let route=routesMap(state)[path];
  414. let route=getRouteFromPath(state,path);
  415. if (route==null)return {};
  416. return route;
  417. }
  418. export const getRouteChain=(path)=>(state)=>{
  419. let map=routesMap(state);
  420. let list=[];
  421. let getChain=(cpath)=>{
  422. let route=map[cpath];
  423. if (route!=null){
  424. list.unshift(route);
  425. if (route.ppath!=null&&route.ppath!==""){
  426. getChain(route.ppath);
  427. }
  428. }
  429. }
  430. getChain(path);
  431. return list;
  432. }
  433. export const getRouteStyles=(state)=>{
  434. let styles=state.main.styles;
  435. return styles;
  436. }
  437. export const getBlockColumn=(state)=>{
  438. let blocks=state.main.blocks;
  439. return blocks;
  440. }
  441. export const isFullRoute=(path)=>(state)=>{
  442. // let route=routesMap(state)[path];
  443. let route=getRouteFromPath(state,path);
  444. if (route)return route.type===ROUTE_TYPE_FULL;
  445. return false;
  446. }
  447. export const isPopRoute=(path)=>(state)=>{
  448. // let route=routesMap(state)[path];
  449. let route=getRouteFromPath(state,path);
  450. if (route)return route.type===ROUTE_TYPE_POP;
  451. return false;
  452. }
  453. export const isInRoute=(path)=>(state)=>{
  454. // let route=routesMap(state)[path];
  455. let route=getRouteFromPath(state,path);
  456. if (route)return route.type===ROUTE_TYPE_IN;
  457. return false;
  458. }
  459. export const isOutRoute=(path)=>(state)=>{
  460. // let route=routesMap(state)[path];
  461. let route=getRouteFromPath(state,path);
  462. if (route)return route.type===ROUTE_TYPE_OUTLINK;
  463. return false;
  464. }
  465. //login
  466. export const getLoginStatus=(state)=>{
  467. return state.main.loginStatus.login;
  468. }
  469. export const getRegStatus=(state)=>{
  470. return state.main.loginStatus.register;
  471. }
  472. export const getLogoutStatus=(state)=>{
  473. return state.main.loginStatus.logout;
  474. }
  475. //modify
  476. export const getChangeInfoStatus=(state)=>{
  477. return state.main.modifyStatus.info;
  478. }
  479. export const getChangePassStatus=(state)=>{
  480. return state.main.modifyStatus.password;
  481. }
  482. export const getChangePhoneStatus=(state)=>{
  483. return state.main.modifyStatus.phone;
  484. }
  485. export const getChangeEmailStatus=(state)=>{
  486. return state.main.modifyStatus.email;
  487. }
  488. export const isLogined=(state)=>{
  489. // console.log(state.main.isLogin)
  490. return state.main.isLogin;
  491. // return 1;
  492. }
  493. export const getUserInfo=(state)=>{
  494. return state.main.userInfo;
  495. }
  496. export const getUserID=(state)=>{
  497. let uid=-1;
  498. let userInfo=state.main.userInfo;
  499. if (userInfo){
  500. if (userInfo.UserID!=null)uid=userInfo.UserID;
  501. else uid=0;
  502. }
  503. return uid;
  504. }
  505. export const getCustomInfo=(state)=>{
  506. return state.main.customerInfo;
  507. }
  508. export const getCustomTypeInfo=(type)=>(state)=>{
  509. let item=null;
  510. let customerInfo=state.main.customerInfo;
  511. if (customerInfo){
  512. for (let i = 0; i < customerInfo.length; i++) {
  513. let info=customerInfo[i];
  514. if (info.StatusName===type){
  515. item=info;
  516. break;
  517. }
  518. }
  519. }
  520. return item
  521. }
  522. export const getCustomStatus=(state)=>{
  523. return state.main.customLeaveMsgStatus;
  524. }
  525. //数据获取
  526. export default Main.reducer;
  527. export const getBFP=()=>{
  528. return async (dispatch, getState) => {
  529. let bfp="";
  530. bfp=localStorageGet(LOCAL_VISTOR_ID,"");
  531. if (bfp!=null&&bfp!==""){
  532. global.BFP=bfp;
  533. return bfp;
  534. }
  535. // const fpPromise = FingerprintJS.load({
  536. // apiKey: "W7zWifGvJhjacPekHi64"
  537. // })
  538. const fpPromise =FingerprintJS.load();
  539. try {
  540. let fp=await fpPromise;
  541. let result=await fp.get();
  542. if (result!=null){
  543. bfp=result.visitorId;
  544. localStorageSet(LOCAL_VISTOR_ID,bfp);
  545. global.BFP=bfp;
  546. }
  547. }
  548. catch (err){
  549. console.log(err);
  550. }
  551. return bfp;
  552. }
  553. }