index.js 6.11 KB
import * as Types from './types';
import cookie from 'yoho-cookie';
import { merge } from 'lodash';

export default function(mergeState = {}) {
  return {
    state: merge(
      {
        context: {
          title: '',
          env: {
            isApp: true,
            isiOS: false,
            isAndroid: false,
            isYohoBuy: false,
            isWechat: false,
            isQQ: false,
            isWeibo: false,
            isChat: false,
          },
          route: '',
          path: '',
          needLogin: false,
          isLogin: false,
          userHeadIco: '',
          userName: '',
        },
        window: {
          statusBarStatus: false,
          statusBarHeight: 0,
          actionBarHeight: 0,
          statusBarColor: 'black',
          clientHeight: 0,
          clientWidth: 0,
          supportsPassive: false,
          supportWebp: false,
        },
        historys: [],
        direction: 'forword',
        homePage: true,
        user: {},
      },
      mergeState,
    ),
    mutations: {
      [Types.SET_SERVER_INFO](state, { context }) {
        state.context.title = context.title;
        state.context.route = context.route;
        state.context.path = context.path;
        state.context.env = Object.assign({}, context.env);
      },
      [Types.SET_ENV](state, { env }) {
        state.context.env = Object.assign({}, env);
      },
      [Types.SET_LOGIN_INFO](state, { uid }) {
        state.context.isLogin = uid > 1;
      },
      [Types.SET_USER](
        state,
        { appUid, appSessionKey, appVersion, appClientType },
      ) {
        state.user.appUid = appUid;
        state.user.appSessionKey = appSessionKey;
        state.user.appVersion = appVersion;
        state.user.appClientType = appClientType;
      },
      [Types.SET_TITLE](state, { title }) {
        state.context.title = title;
      },
      [Types.ROUTE_CHANGE](state, { to }) {
        let topath;

        try {
          topath = decodeURIComponent(to.path);
        } catch (error) {
          topath = to.path;
        }

        if (
          state.historys.length >= 2 &&
          state.historys[state.historys.length - 2].path === topath
        ) {
          state.historys.pop();
          state.direction = 'back';
        } else {
          state.historys.push({
            name: to.name,
            path: topath,
          });
          state.direction = 'forword';
        }
        state.homePage = state.historys.length <= 1;
      },
      [Types.SET_NEED_LOGIN](state, { needLogin }) {
        state.context.needLogin = needLogin;
        state.user = {};
      },
      [Types.SET_WINDOW_SIZE](state, { clientWidth, clientHeight }) {
        state.window.clientWidth = clientWidth;
        state.window.clientHeight = clientHeight;
      },
      [Types.SET_SUPPORT_PASSIVE](state, { supportsPassive }) {
        state.window.supportsPassive = supportsPassive;
      },
      [Types.SET_SUPPORT_WEBP](state, { supportWebp }) {
        state.window.supportWebp = supportWebp;
      },
      [Types.SET_STATUS_BAR_STATUS](state, { status }) {
        state.window.statusBarStatus = !!status;
      },
      [Types.SET_STATUS_BAR_HEIGHT](state, { height }) {
        state.window.statusBarHeight = height;
      },
      [Types.SET_ACTION_BAR_HEIGHT](state, { height }) {
        state.window.actionBarHeight = height;
      },
      [Types.SET_STATUS_BAR_COLOR](state, { color }) {
        if (
          state.context.env.isYohoBuy &&
          state.context.env.isiOS &&
          state.window.statusBarStatus
        ) {
          state.window.statusBarColor = color || 'black';
        }
      },
      [Types.FETCH_USER_INFO_SUCCESS](state, { head_ico, nickname }) {
        state.context.userHeadIco = head_ico;
        state.context.userName = nickname;
      },
      [Types.FETCH_USER_INFO_FAILD](state) {
        state.context.userHeadIco = '';
      },
      [Types.SET_USER_SELLER_INFO](state, sellerInfo) {
        state.user.sellerInfo = sellerInfo || {};
      },
    },
    getters: {
      getLogin(state) {
        return state.context.isLogin;
      },
    },
    actions: {
      async fetchUserProfile({ commit }) {
        const result = await this.$api.get('/api/grass/userProfile');

        if (result && result.code === 200) {
          if (!result.data) {
            result.data = {};
          }
          commit(Types.FETCH_USER_INFO_SUCCESS, result.data);
          return result.data;
        } else {
          commit(Types.FETCH_USER_INFO_FAILD);
          return {};
        }
      },
      userRealCertification(
        { commit },
        { certName, certNo, frontImageUrl, backImageUrl },
      ) {
        return this.$api.post('/api/ufo/user/certification', {
          certName,
          certNo,
          frontImageUrl,
          backImageUrl,
        });
      },
      sendBindSms({ commit }, { mobile, bindCode }) {
        return this.$api.post('/passport/bind/sms/send', {
          mobile,
          bindCode,
        });
      },
      submitThirdBind({ commit }, { mobile, code, bindCode }) {
        return this.$api.post('/passport/bind/third', {
          mobile,
          code,
          bindCode,
        });
      },
      reportError(params, { error }) {
        this.$reportError(error);
      },
      reportYas(
        params,
        {
          params: { appop, param },
          asyncindx = false,
        },
      ) {
        try {
          document.addEventListener('deviceready', () => {
            setTimeout(() => {
              if (window._yas && window._yas.sendAppLogs) {
                param = param || {};

                if (!param.C_ID) {
                  const channel = {
                    men: 1,
                    women: 2,
                  }[cookie.get('_Channel') || 'men'];

                  param.C_ID = channel;
                }
                window._yas.sendAppLogs(
                  {
                    appop,
                    param: param ? JSON.stringify(param) : '{}',
                  },
                  asyncindx,
                );
              }
            }, 300);
          });
        } catch (e) {
          // pass
        }
      },
    },
  };
}