zero-help.js 8.23 KB
export const FETCH_ZERO_HELP_OTHER_GOODS = 'FETCH_ZERO_HELP_OTHER_GOODS';
export const FETCH_POOL_GOODS = 'FETCH_POOL_GOODS';
export const FETCH_ZERO_HELP_COMMAND = 'FETCH_ZERO_HELP_COMMAND';
export const IS_LOADING = 'IS_LOADING';
export const FETCH_ZERO_HELP_GOOD = 'FETCH_ZERO_HELP_GOOD';
export const SET_API_ERROR = 'SET_API_ERROR';
export const FETCH_RESOURCE_IFNO = 'FETCH_RESOURCE_IFNO';

// 730 测试环境 39194 线上
const productPool = 39194;
const resourceCode = 'c41ccdd910fcf0840f18755de4d85ee9';

import { isArray, isEmpty } from 'lodash';
import { getImgUrl } from 'common/utils';
import cookie from 'yoho-cookie';

export default {
  namespaced: true,
  state: {
    isLoading: true,
    poolGoodsInfo: {
      page: 0,
      page_size: 20,
      page_total: 0,
      total: 0,
      product_list: [],
    },
    zeroHelpOtherGoods: {
      page: 0,
      page_size: 10,
      page_total: 0,
      total: 0,
      product_list: [],
    },
    zeroHelpGood: {},
    code: '',
    countdownTimeList: [],
    error: null,
    resourceList: [],
  },
  getters: {
    poolProductList: state => state.poolGoodsInfo.product_list || [],
    zeroHelpOtherProductList: state => state.zeroHelpOtherGoods.product_list,
    productSkn: state => state.zeroHelpGood.productSkn,
    isActivityEnd: state => {
      const { nowTime, endTime } = state.zeroHelpGood;

      return nowTime - endTime < 0;
    },
    reportParam: state => {
      const { userActivityId, productSkn } = state.zeroHelpGood;

      return { userActivityId, productSkn };
    },
  },
  actions: {
    async init({ dispatch }, params = {}) {
      const actions = [
        dispatch('fetchPoolGoods'),
        dispatch('fetchRecourseInfo'),
      ];
      const { actId } = params;

      if (actId) {
        actions.push(dispatch('fetchZeroHelpInfo', params));
      } else {
        actions.push(dispatch('fetchZeroHelpItemInfo', params));
      }

      Promise.all(actions);
    },

    // 获取资源池商品
    async fetchPoolGoods({ commit, state: { poolGoodsInfo } }) {
      let { page_total: pageTotal, page } = poolGoodsInfo;

      // 数据完全获取
      if (page > 0 && (pageTotal === 0 || page === pageTotal)) {
        return true;
      }

      page++;

      let res = await this.$api.get('/api/zero/help/poll/productList', {
        page,
        limit: 30,
        productPool,
        order: 'pools_sort_desc',
      });

      if (res) {
        if (res.code === 200) {
          /**
           * 数据格式兼容
           * res: {
           *  code: 200,
           *  data: [] | {total, page_total, page_size, page, product_list}
           * }
           * 无数据返回 []
           */
          if (isArray(res.data) && isEmpty(res.data)) {
            res = { ...res, data: { product_list: [], page } };
          }
          commit(FETCH_POOL_GOODS, res);
        } else {
          commit(SET_API_ERROR, new Error(res.message));
        }
      }
    },

    /**
     *
     * @param {*} param0
     * @param {*} productSkn 商品编号
     * 获取更多0元助力商品
     */
    async fetchZeroHelpOtherGoods(
      {
        commit,
        state: { zeroHelpOtherGoods },
        getters,
      },
      productSkn,
    ) {
      let {
        page_total: pageTotal,
        page,
        page_size: limit,
      } = zeroHelpOtherGoods;

      // 数据完全获取
      if (page > 0 && (pageTotal === 0 || page === pageTotal)) {
        return true;
      }

      page++;
      const res = await this.$api.get('/api/zero/help/otherProductList', {
        page,
        limit,
        productSkn: getters.productSkn || productSkn,
      });

      if (res) {
        if (res.code === 200) {
          commit('FETCH_ZERO_HELP_OTHER_GOODS', res.data);
        } else {
          commit(SET_API_ERROR, new Error(res.message));
        }
      }
    },

    /**
     *
     * @param {*} param0
     * @param {*} userActivityId 0元助力活动Id
     * 获取App使用口令
     */
    async fetchZeroHelpCommand({ commit }, { userActivityId, userId } = {}) {
      const res = await this.$api.get('/api/zero/help/command', {
        // 业务来源,如1-0元免单
        source: 1,
        key: userActivityId,
        uid: userId,
      });

      if (res) {
        if (res.code === 200) {
          commit(FETCH_ZERO_HELP_COMMAND, res.data);
        } else {
          commit(SET_API_ERROR, new Error(res.message));
        }
      }
    },

    /**
     *
     * @param {*} param0
     * @param {*} params 获取0元助力商品信息
     */
    async fetchZeroHelpItemInfo({ commit, dispatch }, params) {
      commit(IS_LOADING, true);
      const { skn, id: helpProductId } = params;
      const res = await this.$api.get('/api/zero/help/canHelp', {
        skn,
        helpProductId,
      });

      if (res) {
        if (res.code === 200) {
          commit(FETCH_ZERO_HELP_GOOD, res.data);
          await dispatch('fetchZeroHelpOtherGoods', skn);
        } else {
          commit(SET_API_ERROR, new Error(res.message));
        }
      }
      commit(IS_LOADING, false);
    },

    /**
     *
     * @param {*} param0
     * @param {*} params {actId: 活动Id分享参数, activityId: 自定义活动Id}
     */
    async fetchZeroHelpInfo({ commit, dispatch }, params) {
      commit(IS_LOADING, true);
      const { actId: userActivityId = '' } = params;
      const res = await this.$api.get('/api/zero/help/info', {
        // 1-发起人调用,0-助力者调用
        type: 0,
        userActivityId,
      });

      if (res) {
        if (res.code === 200) {
          const { userId } = res.data || {};

          commit(FETCH_ZERO_HELP_GOOD, res.data);
          await dispatch('fetchZeroHelpOtherGoods', res.data.productSkn);
          await dispatch('fetchZeroHelpCommand', { userActivityId, userId });
        } else {
          commit(SET_API_ERROR, new Error(res.message));
        }
      }
      commit(IS_LOADING, false);
    },

    /**
     * 获取资源位信息
     */
    async fetchRecourseInfo({ commit }) {
      const res = await this.$api.get('/api/yoho/resource', {
        content_code: resourceCode,
      });

      if (res && res.code === 200) {
        commit(FETCH_RESOURCE_IFNO, res.data);
      }
    },

    /**
     * 埋点上报事件
     */
    reportYas(_, params) {
      let { appop, param } = params;

      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) : '{}',
        });
      }
    },
  },
  mutations: {
    [FETCH_ZERO_HELP_GOOD](state, data) {
      state.zeroHelpGood = data;
    },
    [IS_LOADING](state, status = false) {
      state.isLoading = status;
    },
    [SET_API_ERROR](state, error) {
      state.error = error;
    },
    // eslint-disable-next-line no-unused-vars
    [FETCH_POOL_GOODS](state, res) {
      const { product_list: oldProductList = [] } = state.poolGoodsInfo;
      const { product_list: newProductList = [] } = res.data;
      const product_list = oldProductList.concat(newProductList);

      state.poolGoodsInfo = {
        ...state.poolGoodsInfo,
        ...res.data,
        product_list,
      };
    },
    [FETCH_ZERO_HELP_OTHER_GOODS](state, data) {
      const { product_list: oldProductList = [] } = state.zeroHelpOtherGoods;
      const { product_list: newProductList = [] } = data;
      const product_list = oldProductList.concat(newProductList);

      state.zeroHelpOtherGoods = {
        ...state.zeroHelpOtherGoods,
        ...data,
        product_list,
      };
    },
    [FETCH_ZERO_HELP_COMMAND](state, { code }) {
      state.code = code;
    },
    [FETCH_RESOURCE_IFNO](state, resources = []) {
      resources = resources.map(resourceInfo => {
        const {
          data: { src = '', urls = [] } = {},
          image_height = 1000,
          image_width = 1000,
          is_extend,
        } = resourceInfo;
        const [to = ''] = urls;
        const url = getImgUrl(src, image_width || 1000, image_height || 1000);

        return { url, to, isExtend: is_extend === '1' };
      });
      state.resourceList = resources;
    },
  },
};