reducer.js 8.76 KB
Newer Older
dengxiaofeng's avatar
dengxiaofeng committed
1
import { fromJS } from 'immutable';
邓晓峰's avatar
邓晓峰 committed
2
import Cookies from 'js-cookie';
邓晓峰's avatar
邓晓峰 committed
3
import { AppConfig, store, event, Storage, helpers } from '@wisdom-utils/utils';
杨思琦's avatar
杨思琦 committed
4
import { params, Storeage as Store } from '@wisdom-utils/utils/lib/helpers';
5
import defaultSetting from '@wisdom-utils/components/lib/AppLayout/layouts/defaultSettings';
邓晓峰's avatar
邓晓峰 committed
6 7
import _ from 'lodash';
import memoized from 'nano-memoize';
8
import pkg from '../../../../package.json';
邓晓峰's avatar
邓晓峰 committed
9 10
// import { transformWidgets } from '../../../utils/routes';
// eslint-disable-next-line import/no-duplicates
dengxiaofeng's avatar
dengxiaofeng committed
11
import {
邓晓峰's avatar
邓晓峰 committed
12
  CLEAR_RCENT_KEYWORD,
邓晓峰's avatar
邓晓峰 committed
13 14
  COMPLEX_CONFIG,
  COMPLEX_PATHNAME,
邓晓峰's avatar
邓晓峰 committed
15
  CREATE_CONEXT,
邓晓峰's avatar
邓晓峰 committed
16
  EXTEND_OPEN_KEY,
邓晓峰's avatar
邓晓峰 committed
17
  GENERATE_MENU,
dengxiaofeng's avatar
dengxiaofeng committed
18
  GET_CONFIG,
邓晓峰's avatar
邓晓峰 committed
19
  GET_CURRENT_INDEX,
邓晓峰's avatar
邓晓峰 committed
20
  GET_CURRENT_ROUTES,
dengxiaofeng's avatar
dengxiaofeng committed
21
  GET_ERROR_CONFIG,
22
  GET_MICRO_MOUNTED_STATUS,
邓晓峰's avatar
邓晓峰 committed
23
  GET_PATHNAME,
邓晓峰's avatar
邓晓峰 committed
24 25 26
  GET_RCENT_KEYWORD,
  GET_RECENT_PRODUCT,
  GET_RECENT_VISITED,
邓晓峰's avatar
邓晓峰 committed
27
  GET_THEME_CONFIG,
邓晓峰's avatar
邓晓峰 committed
28
  LOGIN_MODE,
29
  LOGINOUT,
邓晓峰's avatar
邓晓峰 committed
30
  SELECT_MENU_KEY,
邓晓峰's avatar
邓晓峰 committed
31
  SLIDER_MENU_MODE,
邓晓峰's avatar
邓晓峰 committed
32
  VALIDATE_AUTH,
33
  MAP_VIEW,
lihonglin's avatar
lihonglin committed
34
  AMAP_VIEW,
邓晓峰's avatar
邓晓峰 committed
35
  PD_VIEW,
dengxiaofeng's avatar
dengxiaofeng committed
36
} from './constants';
37

邓晓峰's avatar
邓晓峰 committed
38 39
const { generMainRoutes, generFlatRoutes, transformWidgets } = helpers;

40
const proxy = require('../../../../config/proxy');
dengxiaofeng's avatar
dengxiaofeng committed
41

邓晓峰's avatar
邓晓峰 committed
42 43 44
const keywordStorage = new Storage(`__global_search_keywords__micro_${window.location.hostname}`);
const recentVisitedStorage = new Storage(`__global_recent_visited__micro_${window.location.hostname}`);
const recentProductStorage = new Storage(`__global__recent_product__micro_${window.location.hostname}`);
45 46 47 48 49
const currentProduct = `__global__recent_productIndex__micro_${window.location.hostname}_${sessionStorage.getItem(
  'client',
) ||
  params.getParams('client') ||
  'city'}`;
50
sessionStorage.setItem(currentProduct, 0);
邓晓峰's avatar
邓晓峰 committed
51
Cookies.set('loginMode', Cookies.get('loginMode') || 'pdw');
dengxiaofeng's avatar
dengxiaofeng committed
52 53
export const initialState = fromJS({
  globalConfig: {},
邓晓峰's avatar
邓晓峰 committed
54 55 56 57
  globalConfigError: '',
  currentRoutes: {},
  instance: null,
  menu: [],
邓晓峰's avatar
邓晓峰 committed
58
  flatMenu: [],
邓晓峰's avatar
邓晓峰 committed
59
  defaultSetting,
邓晓峰's avatar
邓晓峰 committed
60
  recentKeywords: keywordStorage.list || [],
邓晓峰's avatar
邓晓峰 committed
61
  recentVisited: recentVisitedStorage.list || [],
邓晓峰's avatar
邓晓峰 committed
62
  recentProducts: recentProductStorage.list || [],
63
  currentMenuIndex: Number(sessionStorage.getItem(currentProduct)) || 0,
邓晓峰's avatar
邓晓峰 committed
64 65
  currentMenu: null,
  collapsed: true,
邓晓峰's avatar
邓晓峰 committed
66
  loginMode: Cookies.get('loginMode') || 'pdw',
邓晓峰's avatar
邓晓峰 committed
67 68 69 70 71
  authValidate: false,
  pathname: '',
  selectedKeys: null,
  openKeys: [],
  complexConfig: {},
邓晓峰's avatar
邓晓峰 committed
72
  complexPathName: null,
73
  microMounted: true,
邓晓峰's avatar
邓晓峰 committed
74
  mapView: null,
lihonglin's avatar
lihonglin committed
75
  amapView: {},
dengxiaofeng's avatar
dengxiaofeng committed
76 77 78 79 80 81
});

/* eslint-disable default-case, no-param-reassign */
const appReducer = (state = initialState, action) => {
  switch (action.type) {
    case GET_CONFIG:
邓晓峰's avatar
邓晓峰 committed
82
      /* eslint-disable */
邓晓峰's avatar
邓晓峰 committed
83 84 85 86
      window.__INITIAL_STATE__ = Object.assign(
        {},
        action.data,
        {
87
          assetsRoot: proxy.assetsRoot,
邓晓峰's avatar
邓晓峰 committed
88 89 90 91
          allWidgets: action.data.widgets || [],
          env: process.env.NODE_ENV === 'development' ? 'daily' : 'prod',
        },
      );
邓晓峰's avatar
邓晓峰 committed
92
      window.arcgisAssetsPath = `${window.location.origin}/${pkg.name.toLocaleLowerCase()}/assets`;
93 94
      window.__INITIAL_STATE__.mdi = 'SDI';
      window.__INITIAL_STATE__.menu = 'banner-left';
95 96 97
      const  temp = AppConfig(window.__INITIAL_STATE__)
      temp.displayMode = window.__INITIAL_STATE__?.displayMode||''
      window.globalConfig = temp;
98 99


邓晓峰's avatar
邓晓峰 committed
100
      // eslint-disable-next-line no-undef
邓晓峰's avatar
邓晓峰 committed
101
      createStoreage.set('globalConfig', window.globalConfig);
邓晓峰's avatar
邓晓峰 committed
102
      // eslint-disable-next-line no-undef,no-case-declarations
邓晓峰's avatar
邓晓峰 committed
103
      const config = window.globalConfig;
104
      // config.access_token = "";
邓晓峰's avatar
邓晓峰 committed
105
      // eslint-disable-next-line no-case-declarations
杨思琦's avatar
杨思琦 committed
106
      const { homepage, isOpenTransitionPage } = window.globalConfig;
邓晓峰's avatar
邓晓峰 committed
107
      const modulePkg = {};
邓晓峰's avatar
邓晓峰 committed
108
      window.globalConfig && window.globalConfig.products && Array.isArray(window.globalConfig.products) && window.globalConfig.products.map(item => {
徐乐's avatar
徐乐 committed
109
        modulePkg[item.PackageName] = item;
邓晓峰's avatar
邓晓峰 committed
110
      });
徐乐's avatar
徐乐 committed
111
      config.widgets = transformWidgets(config.widgets);
邓晓峰's avatar
邓晓峰 committed
112
      // const pickMenus = memoized(() => )
邓晓峰's avatar
邓晓峰 committed
113
      const generMenu = generMainRoutes(config.widgets || [], null, 0, modulePkg);
邓晓峰's avatar
邓晓峰 committed
114
      let flatMenu = [];
邓晓峰's avatar
邓晓峰 committed
115
      if (generMenu) {
邓晓峰's avatar
邓晓峰 committed
116
        const flat = state.toJS();
徐乐's avatar
徐乐 committed
117 118 119
        const data = _.uniqBy(generFlatRoutes(generMenu || [], null, null, modulePkg), 'path');
        if (_.isEqualWith(flat.flatMenu, data, (value, other) => {
          if (value.path === other.path) {
邓晓峰's avatar
邓晓峰 committed
120 121 122
            return true
          }
        })) {
徐乐's avatar
徐乐 committed
123
          flatMenu = data
邓晓峰's avatar
邓晓峰 committed
124 125 126 127
        } else {
          flatMenu = flat.flatMenu
        }
        const index = flatMenu.findIndex(item => item.name === '首页');
杨思琦's avatar
杨思琦 committed
128
        if (!isOpenTransitionPage && index === -1) {
邓晓峰's avatar
邓晓峰 committed
129 130 131
          flatMenu.push({
            path: `/${homepage}`,
            href: `/${homepage}`,
132
            key: 'PANDA_HOME',
邓晓峰's avatar
邓晓峰 committed
133 134 135
            name: '首页'
          })
        }
邓晓峰's avatar
邓晓峰 committed
136
      }
邓晓峰's avatar
邓晓峰 committed
137 138

      const home = flatMenu.find(item => {
邓晓峰's avatar
邓晓峰 committed
139
        const path = decodeURI(item.path).split('|');
邓晓峰's avatar
邓晓峰 committed
140
        let currentPath = path[0];
邓晓峰's avatar
邓晓峰 committed
141
        if (/^\//.test(currentPath)) {
邓晓峰's avatar
邓晓峰 committed
142 143
          currentPath = currentPath.replace(/^\//, '');
        }
邓晓峰's avatar
邓晓峰 committed
144
        return currentPath === decodeURI(homepage);
邓晓峰's avatar
邓晓峰 committed
145 146
      });

徐乐's avatar
徐乐 committed
147

邓晓峰's avatar
邓晓峰 committed
148

邓晓峰's avatar
邓晓峰 committed
149
      let currentMenuIndex = 0;
邓晓峰's avatar
邓晓峰 committed
150
      if (home) {
邓晓峰's avatar
邓晓峰 committed
151
        const parent = home.level >= 2 ? home.parent.parent : home.level >= 3 ? home.parent.parent.parent : home.parent;
邓晓峰's avatar
邓晓峰 committed
152
        if (parent) {
杨思琦's avatar
杨思琦 committed
153
          currentMenuIndex = generMenu.findIndex(item => item.name === parent.label) || 0;
154
          sessionStorage.setItem(currentProduct, currentMenuIndex)
邓晓峰's avatar
邓晓峰 committed
155
          store.set('updateMenuIndex', currentMenuIndex);
邓晓峰's avatar
邓晓峰 committed
156
        }
157
      }
邓晓峰's avatar
邓晓峰 committed
158
      window.globalConfig.home = home;
159
      Cookies.set('client', Cookies.get('client') || window.globalConfig.client);
160
      window.globalConfig = config;
dengxiaofeng's avatar
dengxiaofeng committed
161
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
162
        globalConfig: config || {},
邓晓峰's avatar
邓晓峰 committed
163
        menu: generMenu || [],
邓晓峰's avatar
邓晓峰 committed
164
        flatMenu,
165
        currentMenu: generMenu && generMenu[state.currentMenuIndex],
邓晓峰's avatar
邓晓峰 committed
166
      });
dengxiaofeng's avatar
dengxiaofeng committed
167 168
    case GET_ERROR_CONFIG:
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
169 170 171 172 173 174 175 176 177 178 179 180 181
        globalConfigError: action.data,
      });
    case GET_CURRENT_ROUTES:
      return state.merge({
        currentRoutes: action.data,
      });
    case CREATE_CONEXT:
      return state.merge({
        instance: action.data,
      });
    case GENERATE_MENU:
      return state.merge({
        menu: action.data,
邓晓峰's avatar
邓晓峰 committed
182
        currentMenu: action.data[state.currentMenuIndex],
邓晓峰's avatar
邓晓峰 committed
183
      });
邓晓峰's avatar
邓晓峰 committed
184 185 186 187
    case GET_THEME_CONFIG:
      return state.merge({
        defaultSetting: action.data,
      });
邓晓峰's avatar
邓晓峰 committed
188 189 190
    case GET_RCENT_KEYWORD:
      keywordStorage.set('keywords', action.data);
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
191 192
        recentKeywords: keywordStorage.list,
      });
邓晓峰's avatar
邓晓峰 committed
193 194 195
    case GET_RECENT_VISITED:
      recentVisitedStorage.set('history', action.data);
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
196 197
        recentVisited: recentVisitedStorage.list,
      });
邓晓峰's avatar
邓晓峰 committed
198 199 200
    case GET_RECENT_PRODUCT:
      recentProductStorage.set('history', action.data);
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
201 202
        recentProducts: recentProductStorage.list,
      });
邓晓峰's avatar
邓晓峰 committed
203 204 205
    case CLEAR_RCENT_KEYWORD:
      keywordStorage.clear();
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
206
        recentKeywords: [],
邓晓峰's avatar
邓晓峰 committed
207 208
        recentVisited: [],
      });
邓晓峰's avatar
邓晓峰 committed
209
    case GET_CURRENT_INDEX:
徐乐's avatar
徐乐 committed
210 211
      const currentProductNew = `__global__recent_productIndex__micro_${window.location.hostname}_${sessionStorage.getItem('client') || window.globalConfig?.client || 'city'}`;
      sessionStorage.setItem(currentProductNew, action.data)
邓晓峰's avatar
邓晓峰 committed
212
      return state.merge({
杨思琦's avatar
杨思琦 committed
213
        currentMenuIndex: Number(sessionStorage.getItem(currentProductNew)) || 0,
邓晓峰's avatar
邓晓峰 committed
214
      });
邓晓峰's avatar
邓晓峰 committed
215 216
    case SLIDER_MENU_MODE:
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
217 218
        collapsed: action.data,
      });
邓晓峰's avatar
邓晓峰 committed
219 220
    case LOGIN_MODE:
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
221 222
        loginMode: action.data,
      });
邓晓峰's avatar
邓晓峰 committed
223 224
    case VALIDATE_AUTH:
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
225
        authValidate: action.data,
邓晓峰's avatar
邓晓峰 committed
226 227 228
      });
    case GET_PATHNAME:
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
229
        pathname: action.data,
邓晓峰's avatar
邓晓峰 committed
230 231 232
      });
    case SELECT_MENU_KEY:
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
233
        selectedKeys: action.data,
邓晓峰's avatar
邓晓峰 committed
234 235 236
      });
    case EXTEND_OPEN_KEY:
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
237 238
        openKeys: action.data,
      });
邓晓峰's avatar
邓晓峰 committed
239 240
    case COMPLEX_CONFIG:
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
241 242
        complexConfig: action.data,
      });
邓晓峰's avatar
邓晓峰 committed
243 244
    case COMPLEX_PATHNAME:
      return state.merge({
邓晓峰's avatar
邓晓峰 committed
245 246
        complexPathName: action.data,
      });
247 248 249 250
    case GET_MICRO_MOUNTED_STATUS:
      return state.merge({
        microMounted: action.data,
      });
251
    case LOGINOUT:
252
      event.emit('event: application-logout', action.data);
253 254
      return state.merge({
        complexConfig: action.data.complexConfig,
杨思琦's avatar
杨思琦 committed
255
        currentMenuIndex: action.data.currentMenuIndex || 0,
邓晓峰's avatar
邓晓峰 committed
256
        globalConfig: action.data.globalConfig,
邓晓峰's avatar
邓晓峰 committed
257
      });
258 259 260 261 262
    case MAP_VIEW:
      store.set('view', action.data);
      return state.merge({
        mapView: action.data,
      });
lihonglin's avatar
lihonglin committed
263
    case AMAP_VIEW:
邓晓峰's avatar
邓晓峰 committed
264
      store.set('amapView', action.data);
lihonglin's avatar
lihonglin committed
265 266 267
      return state.merge({
        amapView: action.data,
      });
邓晓峰's avatar
邓晓峰 committed
268 269 270 271 272 273
    case PD_VIEW:
      store.set('pdView', action.data);
      return state.merge({
        pdView: action.data,
      });

dengxiaofeng's avatar
dengxiaofeng committed
274 275 276
    default:
      return state;
  }
邓晓峰's avatar
邓晓峰 committed
277
};
dengxiaofeng's avatar
dengxiaofeng committed
278
export default appReducer;