mainSlice.js 16 KB

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