mainSlice.js 13 KB

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