haggleActions.js 8.57 KB
'use strict';

import ReactNative from 'react-native';
import haggleService from '../../services/haggleService';

const Platform = require('Platform');

const {
    PRODUCT_LIST_REQUEST,
    PRODUCT_LIST_SUCCESS,
    PRODUCT_LIST_FAILURE,
    SET_SELECTED_CATEGORY,
    SHOW_HASCUT_ALERT,
    HAGGLE_STATUS_SUCCESS,
    REFRESH_PRODUCT_LIST,
    MYHAGGLE_PRODUCT_LIST_REQUEST,
    MYHAGGLE_PRODUCT_LIST_SUCCESS,
    MYHAGGLE_PRODUCT_LIST_FAILURE,
    RESOURCE_INFO_REQUEST,
    RESOURCE_INFO_SUCCESS,
    RESOURCE_INFO_FAILURE,
} = require('../../constants/actionTypes').default;

export function setSelectedCategoryType(index) {
    return {
        type: SET_SELECTED_CATEGORY,
        payload: index
    };
}

export function setSelectedCategory(index) {
    return (dispatch, getState) => {
        dispatch(setSelectedCategoryType(index));
        let {haggle} = getState();
        let productList = haggle.productList;
        let myproductList = haggle.myHaggleProductList;
        let list = productList.list ? productList.list.toArray() : [];
        let myList = myproductList.list ? myproductList.list.toArray() : [];

        if (index == 0 && list.length == 0) {
            dispatch(getHaggleProductList());
        } else if (index == 1 && myList.length == 0) {
            dispatch(getMyHaggleProductList());
        }
    };
}

export function refreshProductList(index) {
    return (dispatch, getState) => {

        dispatch({
            type: REFRESH_PRODUCT_LIST,
            payload: {index}
        });

        if (index == 0) {
            dispatch(getHaggleProductList());
        } else if (index == 1) {
            dispatch(getMyHaggleProductList());
        }

    };
}

export function showHasCutAlert() {
    return {
        type: SHOW_HASCUT_ALERT,
    };
}

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

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

export function haggleStatusSuccess(json) {
    return {
        type: HAGGLE_STATUS_SUCCESS,
        payload: json
    };
}

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

export function myHaggleProductListRequest() {
    return {
        type: MYHAGGLE_PRODUCT_LIST_REQUEST,
    };
}

export function myHaggleProductListSuccess(json) {
    return {
        type: MYHAGGLE_PRODUCT_LIST_SUCCESS,
        payload: json
    };
}

export function myHaggleProductListFailure(error) {
    return {
        type: MYHAGGLE_PRODUCT_LIST_FAILURE,
        payload: error
    };
}

export function getResourceRequest() {
    return {
        type: RESOURCE_INFO_REQUEST,
    };
}

export function getResourceSuccess(json) {
    return {
        type: RESOURCE_INFO_SUCCESS,
        payload: json
    };
}

export function getResourceFailure(error) {
    return {
        type: RESOURCE_INFO_FAILURE,
        payload: error
    };
}

export function getHaggleProductList() {
    return (dispatch, getState) => {
        let {app, haggle} = getState();
        let list = haggle.productList;
        /**
         * page: 0, //当前页面
         * page_size: 20, //每页显示的数量
         * total: 0, //总共多少条
         * page_total: 0, //总共多少页
         * endReached: false, //到达底部
         */

        if (list.isFetching || list.endReached || list.error || (!list.endReached && list.page_total === 1)) {
            return;
        }

        let page = list.page + 1;
        let pageSize = list.page_size;
        dispatch(productListRequest());
        return new haggleService(app.host).fetchHaggleProductList(page, pageSize)
            .then(json => {
                let payload = exposeProductListData(json)

                payload.endReached = (payload.page === payload.page_total) && (payload.page_total !== 1);
                if (payload.page > 1) {
                    let oldList = list.list.toJS();
                    let newList = [...oldList, ...payload.list];
                    payload.list = newList;
                }
                dispatch(productListSuccess(payload));
            })
            .catch(error => {
                dispatch(productListFailure(error));
            });
    };
}

export function getMyHaggleProductList() {
    return (dispatch, getState) => {
        let {app, haggle} = getState();
        let list = haggle.myHaggleProductList;

        /**
         * page: 0, //当前页面
         * page_size: 20, //每页显示的数量
         * total: 0, //总共多少条
         * page_total: 0, //总共多少页
         * endReached: false, //到达底部
         */

        if (list.isFetching || list.endReached || list.error || (!list.endReached && list.page_total === 1)) {
            return;
        }

        let page = list.page + 1;
        let pageSize = list.page_size;
        let fetchMyHaggleProductList = (uid) => {
            dispatch(myHaggleProductListRequest());
            return new haggleService(app.host).fetchMyHaggleProductList(uid, page, pageSize)
                .then(json => {
                    let payload = exposeProductListData(json)

                    payload.endReached = (payload.page === payload.page_total) && (payload.page_total !== 1);
                    if (payload.page > 1) {
                        let oldList = list.list.toJS();
                        let newList = [...oldList, ...payload.list];
                        payload.list = newList;
                    }
                    dispatch(myHaggleProductListSuccess(payload));
                })
                .catch(error => {
                    dispatch(myHaggleProductListFailure(error));
                });
        };

        ReactNative.NativeModules.YH_CommonHelper.uid()
            .then(uid => {
                fetchMyHaggleProductList(uid);
            })
            .catch(error => {
                ReactNative.NativeModules.YH_CommonHelper.login()
                    .then(uid => {
                        fetchMyHaggleProductList(uid);
                    })
                    .catch(error => {

                    });
            });

    };
}

function exposeProductListData(json) {
    let res = json;
    try {
        let list = json ? json.list : [];
        if (!list) {
            return json;
        }
        let pageName = 'iFP_BargainProList';
        if (Platform.OS === 'android') {
            pageName = 'aFP_BargainProList';
        }
        for (let i = 0; i < list.length; i++) {
            let item = list[i];
            let inFloorIndex = parseInt(i) + 1 + json.page_size * (json.page - 1) + '';
            item.yh_exposureData = {
                P_NAME: pageName,
                P_PARAM: item.activityId,
                I_INDEX: inFloorIndex,
                PRD_SKN: item.productSkn,
                PRD_CHANNEL: item.productType ? "UFO" : "",
                exposureEnd: 1
            };
        }
        res.list = list;
    } catch (error) {
    }
    return res;
}

export function getHaggleStatus(productSkn, activityId, callBack) {
    return (dispatch, getState) => {
        let {app} = getState();

        let fetchHaggleStatus = (uid) => {
            return new haggleService(app.host).fetcheProductHaggleStatus(uid, activityId, productSkn)
                .then(json => {
                    let payload = json;
                    dispatch(haggleStatusSuccess(payload));
                    callBack && typeof callBack === 'function' && callBack(payload)
                })
                .catch(error => {
                    ReactNative.NativeModules.YH_CommonHelper.showToast(error.message || '网络请求失败')
                });
        };

        ReactNative.NativeModules.YH_CommonHelper.uid()
            .then(uid => {
                fetchHaggleStatus(uid)
            })
            .catch(error => {
                ReactNative.NativeModules.YH_CommonHelper.login()
                    .then(uid => {
                        fetchHaggleStatus(uid)
                    })
                    .catch(error => {
                    });
            });

    };
}

export function getResourceInfo(callback) {
    return (dispatch, getState) => {
        let {app} = getState();
        dispatch(getResourceRequest());
        return new haggleService(app.host).fetchResourceInfo('84c207985a995658669e019ce98171ed')
            .then(json => {
                dispatch(getResourceSuccess(json));
                callback && typeof callback === 'function' && callback(json)
            })
            .catch(error => {
                dispatch(getResourceFailure(error));
            });
    };
}