productListPoolActions.js 8.66 KB
'use strict';

import ReactNative from 'react-native';
import ProductListPoolService from '../../services/ProductListPoolService';
import * as _ from 'lodash';
import Utils from '../../utils/Utils'

const {

	PRODUCT_LIST_REQUEST,
	PRODUCT_LIST_SUCCESS,
	PRODUCT_LIST_FAILURE,
	RESET_LIST_PAGE_INFO,
	PRODUCT_FILTER_ACTION,

	SET_SIMILAR_PRODUCT_INDEX,
	SET_PRODUCT_LIST_FILTER,

	GET_BANNERLIST_REQUEST,
	GET_BANNERLIST_SUCCESS,
	GET_BANNERLIST_FAILURE,

	GET_ACTIVITY_REQUEST,
	GET_ACTIVITY_SUCCESS,
	GET_ACTIVITY_FAILURE,

} = require('../../constants/actionTypes').default;


export function setSimilarIndex(rowID) {
	return {
        type: SET_SIMILAR_PRODUCT_INDEX,
        payload: rowID
    }
}

export function resetListPageInfo() {
	return {
		type: RESET_LIST_PAGE_INFO,
	}
}

export function setProductListFilter(value) {
	return {
		type: SET_PRODUCT_LIST_FILTER,
		payload: value
	}
}

export function productListRequest() {
    return {
        type: PRODUCT_LIST_REQUEST,
    };
}

export function productListSuccess(json) {
    return {
        type: PRODUCT_LIST_SUCCESS,
        payload: json
    }
}

export function productListFailure(error) {
    return {
        type: PRODUCT_LIST_FAILURE,
        payload: error
    }
}

export function getProductList(reload=false) {
	return (dispatch, getState) => {

		let {app, productListPool} = getState();
		let {productList, filterFactors,activityInfo} = productListPool;
		let {originParams,saleType,type} = app;

        if (reload) {

		} else {
			if (productList.isFetching || productList.endReached || productList.error) {
				return;
			}
		}
		let page = productList.currentPage + 1;
		let pageSize = productList.pageSize;
		let order = productList.order;
		let params = {};

		if (type == 'YH_ProductListPoolView') {
			params = {
				method: 'app.search.pool',
				fromPage: ''
			};
		}else if (type == 'YH_VipProListVC') {
			params = {
				method: 'app.search.sales',
				fromPage: 'iFP_VipProList',
				saleType: saleType,
			};
		}else if (type == 'YH_PromotionProductListVC') {
			params = {
				method: 'app.search.promotion',
			};
		}else if (type == 'YH_OutLetProListVC') {
			let productPool = activityInfo.productPool
			params = {
				method: 'app.search.sales',
				fromPage: 'iFP_OutLetProList',
				saleType: saleType,
				productPool: productPool,
			};
		}else if (type == 'YH_InstalmentView') {
			params = {
				method: 'app.search.instalment',
			}
		}else if (type == 'YH_NewUserView') {
			dispatch(getNewUserProductList(reload));
			return;
		}

		let bSelectedFilterFactor,allFilterFactors;
		allFilterFactors = filterFactors.toJS();

		for (let prop in allFilterFactors) {
			if (allFilterFactors.hasOwnProperty(prop)) {
				if (allFilterFactors[prop] === '' || !allFilterFactors[prop]) {
					delete allFilterFactors[prop];
				}
				if (prop == 'sizeKey' && allFilterFactors[prop]) {
					allFilterFactors['size'] = allFilterFactors[prop];
					delete allFilterFactors[prop];
				}
			}
		}

		let getList = (uid) => {
			dispatch(productListRequest());
	        return new ProductListPoolService(app.host).productList(uid,order,page, pageSize,originParams,allFilterFactors,params)
	        .then(json => {
				let payload = Utils.parseProductList(json);
				payload.endReached = payload.currentPage == payload.pageCount;

				if (payload.currentPage > 1) {
					let oldList = productList.list.toJS();
					let list = [...oldList, ...payload.list];
					payload.list = list;
				}
				let categoryFilterList = payload.categoryFilterList;
				let filterCategoryDetailFilterList = payload.filterCategoryDetailFilterList;
				let filters = Utils.parsecategoryFilter({categoryFilterList,filterCategoryDetailFilterList});
				ReactNative.NativeModules.YH_ProductListRNViewHelper.setFilterData(filters);
				ReactNative.NativeModules.YH_FilterHelper.enableBrandFilter(true);
				dispatch(productListSuccess(payload));
			})
			.catch(error => {
				dispatch(productListFailure(error));
			});
		}

		ReactNative.NativeModules.YH_CommonHelper.uid()
		.then(uid => {
			getList(uid);
		})
		.catch(error => {
			getList('');
		});
	};
}

export function getNewUserProductList(reload=false) {
	return (dispatch, getState) => {
		let {app, productListPool} = getState();
		let {productList, filterFactors} = productListPool;
		let {originParams} = app;

        if (reload) {

		} else {
			if (productList.isFetching || productList.endReached || productList.error) {
				return;
			}
		}
		let page = productList.currentPage + 1;
		let pageSize = productList.pageSize;
		let order = productList.order;
		let params = {};

		let bSelectedFilterFactor,allFilterFactors;
		allFilterFactors = filterFactors.toJS();

		for (let prop in allFilterFactors) {
			if (allFilterFactors.hasOwnProperty(prop)) {
				if (allFilterFactors[prop] === '' || !allFilterFactors[prop]) {
					delete allFilterFactors[prop];
				}
				if (prop == 'sizeKey' && allFilterFactors[prop]) {
					allFilterFactors['size'] = allFilterFactors[prop];
					delete allFilterFactors[prop];
				}
			}
		}

		let getList = (uid) => {
			dispatch(productListRequest());
	        return new ProductListPoolService(app.serviceHost).newUserProductList(uid, order, page, pageSize, originParams, allFilterFactors, params)
	        .then(json => {
				let payload = Utils.parseProductList(json);
				payload.endReached = payload.currentPage == payload.pageCount;

				if (payload.currentPage > 1) {
					let oldList = productList.list.toJS();
					let list = [...oldList, ...payload.list];
					payload.list = list;
				}
				let categoryFilterList = payload.categoryFilterList;
				let filterCategoryDetailFilterList = payload.filterCategoryDetailFilterList;
				let filters = Utils.parsecategoryFilter({categoryFilterList,filterCategoryDetailFilterList});
				ReactNative.NativeModules.YH_ProductListRNViewHelper.setFilterData(filters);
				ReactNative.NativeModules.YH_FilterHelper.enableBrandFilter(true);
				dispatch(productListSuccess(payload));
			})
			.catch(error => {
				dispatch(productListFailure(error));
			});
		}

		ReactNative.NativeModules.YH_CommonHelper.uid()
		.then(uid => {
			getList(uid);
		})
		.catch(error => {
			getList('');
		});
	};
}

export function getBannerListWithContentCodeRequest() {
    return {
        type: GET_BANNERLIST_REQUEST,
    };
}

export function getBannerListWithContentCodeSuccess(json) {
    return {
        type: GET_BANNERLIST_SUCCESS,
        payload: json
    }
}

export function getBannerListWithContentCodeFailure(error) {
    return {
        type: GET_BANNERLIST_FAILURE,
        payload: error
    }
}

export function getBannerListWithContentCode() {
	return (dispatch, getState) => {

		let {app, productListPool} = getState();
		let {productList, filterFactors} = productListPool;
		let {channel} = app;

		let content_code = '';
		if (channel == 1) {
			content_code = '03c68a478dee4544e97966fa5162aed0';
		}else if (channel == 2) {
			content_code = '22939d2544f29f297634831f795340c9';
		}else if (channel == 3) {
			content_code = 'e4210810f37fd45ecc01bec99e531741';
		}else if (channel == 4) {
			content_code = 'bd54b0e0927ae2b978c94451f0082946';
		}
		dispatch(getBannerListWithContentCodeRequest());
		return new ProductListPoolService(app.serviceHost).getBannerListWithContentCode(content_code)
        .then(json => {
			dispatch(getBannerListWithContentCodeSuccess(json));
		})
		.catch(error => {
			dispatch(getBannerListWithContentCodeFailure(error));
		});
	};
}

export function getActivityRequest() {
    return {
        type: GET_ACTIVITY_REQUEST,
    };
}

export function getActivitySuccess(json) {
    return {
        type: GET_ACTIVITY_SUCCESS,
        payload: json
    }
}

export function getActivityFailure(error) {
    return {
        type: GET_ACTIVITY_FAILURE,
        payload: error
    }
}

export function getActivity() {
	return (dispatch, getState) => {

		let {app, productListPool} = getState();
		let {productList, filterFactors} = productListPool;
		let {activityId} = app;

		dispatch(getActivityRequest());
		return new ProductListPoolService(app.host).getActivity(activityId)
        .then(json => {
			dispatch(getActivitySuccess(json));
			let obj = json?json[0]:'';
			let title = obj?obj.title:'';
			ReactNative.NativeModules.YH_ProductListRNViewHelper.updateTitle(title);
			dispatch(getProductList());
		})
		.catch(error => {
			dispatch(getActivityFailure(error));
		});
	};
}

export function setProductFilterFactors(array) {
	return (dispatch, getState) => {
		let {app, productListForShop} = getState();
		let {filterFactors} = productListForShop;
		filterFactors = filterFactors.toJS();

		for (var i = 0; i < array.length; i++) {
			let item = array[i];
			filterFactors[item._key] = item._value;
		}
		dispatch({
			type: PRODUCT_FILTER_ACTION,
			payload: filterFactors
		});
	};
}