mutations.js 1.89 KB
import * as Types from './types';
import { find } from 'lodash';

import { defaultProduct, defaultSelectedSize } from './index';

function ensureProduct(state, productId) {
  if (state.products[productId] === undefined) {
    state.products = {...state.products, [productId]: defaultProduct()};
  }
}
function ensureSelectedProduct(state, productId) {
  if (!state.selectedProductInfo || state.selectedProductInfo.productId !== productId) {
    ensureProduct(state, productId);

    state.selectedProductInfo = {
      productId,
      product: state.products[productId],
      sizeId: null,
      storageId: null,
      size: {},
    };
  }
}

export default {
  [Types.ENSURE_PRODUCT_DETAIL](state, { productId }) {
    ensureProduct(state, productId);
  },
  [Types.UPDATE_PRODUCT_DETAIL](state, payload) {
    state.products = {...state.products, [payload.product_id]: payload};
    ensureSelectedProduct(state, payload.product_id);
  },
  [Types.UPDATE_BRAND_PRODUCT_TOP_LIST](state, { productId, topList }) {
    state.topLists = {...state.topLists, [productId]: topList};
  },
  [Types.UPDATE_PRODUCT_FAV](state, { productId, isFav }) {
    state.fav = {...state.fav, [productId]: isFav};
  },
  [Types.UPDATE_SELECTED_PRODUCT_SIZE](state, { productId, sizeId, storageId }) {
    ensureSelectedProduct(state, productId);

    const sizeList = state.selectedProductInfo.product.goods_list[0].size_list;

    let sizeInfo;

    if (storageId) {
      sizeInfo = find(sizeList, (size) => size.storage_id === storageId);
    } else {
      sizeInfo = find(sizeList, (size) => size.size_id === sizeId);
    }

    if (sizeInfo) {
      state.selectedProductInfo.sizeId = sizeInfo.size_id;
      state.selectedProductInfo.storageId = sizeInfo.storage_id;
    }
    state.selectedProductInfo.size = sizeInfo;
  },
  [Types.RESET_SELECTED_PRODUCT_SIZE](state) {
    Object.assign(state.selectedProductInfo, defaultSelectedSize());
  },
};