categoryBActions.js 9.29 KB
'use strict';

import ReactNative from 'react-native';
import CategoryBService from '../../services/CategoryBService';
import Immutable, {Map} from 'immutable';
const {
	SET_TYPE,

    GET_CATEGORY_B_LIST_REQUEST,
    GET_CATEGORY_B_LIST_SUCCESS,
    GET_CATEGORY_B_LIST_FAILURE,

    GET_CATEGORY_B_SUBDETAIL_REQUEST,
    GET_CATEGORY_B_SUBDETAIL_SUCCESS,
    GET_CATEGORY_B_SUBDETAIL_FAILURE,

	SET_CURRENT_CATEGORY_B,
	SET_CURRENT_CHANNEL_B,

	SET_CURRENT_CATEGORY_B_SUBDETAIL_FROM_CACHE,

	JUMP_TO_CATEGORY,

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

export function getCategoryBList(channel_id) {
	return (dispatch, getState) => {
		let {app, classify} = getState();

		dispatch(getCategoryBListRequest());

		return new CategoryBService(app.host).getCategoryBList()
        .then(json => {
			dispatch(getCategoryBListSuccess(json));

			dispatch(getCategoryBFirstSubCategoryDetail(channel_id));
		})
		.catch(error => {
			dispatch(getCategoryBListFailure());
		});
	};
}


export function selectCategoryB(category){
	return (dispatch, getState) => {
		let {categoryB} = getState();

		let categoryId = category.category_id;
        let categoryValue = category.category_name;

        if(category.sub && category.sub.length > 0){
        	dispatch(getCategoryBSubCategoryDetail(categoryId, categoryValue));
        }
        else{
        	let all = {
	            category_name: "全部" + categoryValue,
	            parent_id: categoryId,
	            relation_parameter: category.relation_parameter,
	            node_count: category.node_count,
	        };
	        //设置当前的类别信息
        	//dispatch(setCurrentCateB(categoryId, categoryValue));
	        dispatch(jumpToCategory(all, 0, categoryB.currentChannelId));      
        }
	};
}

/**
 *  点击More事件
 **/
export function pressCategoryBMore(category_id){
	return (dispatch, getState) => {
		let {categoryB} = getState();

		//获取当前频道下一级分类列表信息
		let categoryData = categoryB.categoryList ? categoryB.categoryList.get(categoryB.currentChannelValue) : [];

		//获取指定category_id分类信息
		let category = null; 
		categoryData.map((item, i) => {
			if(item && (category_id == item.get('category_id'))){
				category = item;
			}
		});

    	let all = {
            category_name: "全部" + (category ? category.get('category_name') : ""),
            parent_id: category_id + '',
            relation_parameter: category ? category.get('relation_parameter').toJS() : {},
            node_count: category ? category.get('node_count') : 0,
        };

        //设置当前的类别信息
    	dispatch(setCurrentCateB(category_id, category ? category.get('category_name') : ""));
        dispatch(jumpToCategory(all, 0, categoryB.currentChannelId));
        
	};
}


/**
 * 获取子分类的数据,逻辑上先判断缓存数据是否存在,不存在则从网络获取
 **/
export function getCategoryBSubCategoryDetail(category_id, category_value){

	return (dispatch, getState) => {

		let {categoryB} = getState();

		let currentChannelId = categoryB.currentChannelId;

		//检查缓存是否存在数据,如果不存在则获取
        let cache = categoryB.cacheSubCateData;
        let key = getSubDetailCacheKey(currentChannelId, category_id);
        let categoryData = cache ? cache.get(key) : "";

        //设置当前的类别信息
        dispatch(setCurrentCateB(category_id, category_value));

		//未命中,访问网络数据
        if (!categoryData) {
            dispatch(getCategoryBSubDetail(currentChannelId, category_id, category_value));
        }
        //已命中,展示缓存数据
        else{
            dispatch(getCategoryBSubDetailFromCache(categoryData));
            //曝光从缓存获取的数据
            dispatch(dataExposure(currentChannelId, category_id, category_value, categoryData));
        }

	};
}

/**
 *	获取子分类的KEY值
 **/
function getSubDetailCacheKey(channel_id, category_id){
	let key = "CHA_" + channel_id + "_CAT_" + category_id;
	return key;
}


/**
 * 网络获取子分类的数据
 **/
export function getCategoryBSubDetail(channel_id, category_id, category_value) {
	return (dispatch, getState) => {
		let {app, categoryB} = getState();

		//各频道固定资源位
		let content_code = '';
		if(channel_id == '1'){
			content_code = 'daaa8b1a5103a30419ebd79c06e6feac';
		}
		else if(channel_id == '2'){
			content_code = '1a18449fa785631b302dc6d27388bf93';
		}
		else if(channel_id == '3'){
			content_code = '591152bee9fddcb0b4f793aa38304cb5';
		}
		else if(channel_id == '4'){
			content_code = 'e823582db5ead63c82e0d348c4e6a6bb';
		}

		dispatch(getCategoryBSubDetailRequest());

		return new CategoryBService(app.host).getCategoryBSubDetail(channel_id, category_id, content_code)
        .then(json => {
        	let payload = parseCategoryBSubDetail(channel_id, category_id, json, categoryB);
			dispatch(getCategoryBSubDetailSuccess(payload));
			//曝光从网络获取的数据
			dispatch(dataExposure(channel_id, category_id, category_value, json));
		})
		.catch(error => {
			dispatch(getCategoryBSubDetailFailure());
		});
	};
}

/**
 *获取指定channel的第一个分类数据
 **/
export function getCategoryBFirstSubCategoryDetail(channel_id) {

	return (dispatch, getState) => {
		let {categoryB} = getState();

		let categoryList = categoryB.categoryList;

		let category = null;
		if(channel_id == '1'){
			category = categoryList.get('boy').get(0);
		}
		else if(channel_id == '2'){
			category = categoryList.get('girl').get(0);
		}
		else if(channel_id == '3'){
			category = categoryList.get('kids').get(0);
		}
		else if(channel_id == '4'){
			category = categoryList.get('lifestyle').get(0);
		}

		let category_id = category ? category.get('category_id') : "";
		let category_name = category ? category.get('category_name') : "";
		dispatch(getCategoryBSubCategoryDetail(category_id, category_name));
	};
}


/**
 *在子分类的数据尾部添加一个MORE,因为需要获取relation_parameter 和 node_count数据,所以不得不从分类列表中筛选找出
 **/
function parseCategoryBSubDetail(channel_id, category_id, subcategory_data, props_data) {
	if(!subcategory_data || !props_data){
		return;
	}

	let key = getSubDetailCacheKey(channel_id, category_id);

	return {key: key, data: subcategory_data};

}


export function getCategoryBListRequest() {
    return {
        type: GET_CATEGORY_B_LIST_REQUEST,
    };
}

export function getCategoryBListSuccess(json) {
    return {
        type: GET_CATEGORY_B_LIST_SUCCESS,
        payload: json
    }
}

export function getCategoryBListFailure(error) {
    return {
        type: GET_CATEGORY_B_LIST_FAILURE,
        payload: error
    }
}

export function getCategoryBSubDetailRequest() {
    return {
        type: GET_CATEGORY_B_SUBDETAIL_REQUEST,
    };
}

export function getCategoryBSubDetailSuccess(json) {
    return {
        type: GET_CATEGORY_B_SUBDETAIL_SUCCESS,
        payload: json
    }
}

export function getCategoryBSubDetailFailure(error) {
    return {
        type: GET_CATEGORY_B_SUBDETAIL_FAILURE,
        payload: error
    }
}


export function setCurrentCateB(categoryId, categoryValue){
	return {
        type: SET_CURRENT_CATEGORY_B,
        payload: {id: categoryId, value : categoryValue}
    }
}

export function setCurrentChannelB(channelId, channelValue){
	return {
        type: SET_CURRENT_CHANNEL_B,
        payload: {id: channelId, value : channelValue}
    }
}

export function getCategoryBSubDetailFromCache(categoryData) {
	return {
        type: SET_CURRENT_CATEGORY_B_SUBDETAIL_FROM_CACHE,
        payload: categoryData
    }
}


export function jumpToCategory(value, index, channelId){
	ReactNative.NativeModules.YH_CommonHelper.jumpToCategory(value, parseInt(index), parseInt(channelId));
	return {
        type: JUMP_TO_CATEGORY,
        payload: value
    }
}


function dataExposure(channel_id, category_id, category_value, json) {
	return (dispatch, getState) => {
		if (!json) {
			return;
		}

		let dataList = [];

		//bannerInfo数据曝光
		let bannerInfo = json.bannerInfo;
		if(bannerInfo && bannerInfo.length > 0){
			let bannerList = [];
			bannerInfo.map((item, i) => {
				bannerList.push({
 					I_INDEX: i + 1 + '',
 					F_URL: item.data[0].url,
				});
			})

			let bannerData = {
				L1_CATE: category_id + '',
				F_ID: '1001',
				F_NAME: 'BANNER',
				LIST: bannerList,
			}

			dataList.push(bannerData);
		}

		//sortInfo数据
		let sortInfo = json.sortInfo;
		if(sortInfo && sortInfo.length > 0){

			let sortList = [];
			sortInfo.map((item, i) => {
				sortList.push({
 					I_INDEX: i + 1 + '',
 					PRD_SKN: item.product_skn + '',
 					L2_CATE: item.category_id + '',
				});
			})

			let sortData = {
				L1_CATE: category_id + '',
				F_ID: '1002',
				F_NAME: '全部'+category_value,
				LIST: sortList,
			}

			dataList.push(sortData);
		}

		//brandInfo数据
		let brandInfo = json.brandInfo;
		if(brandInfo && brandInfo.length > 0){

			let brandList = [];
			brandInfo.map((item, i) => {
				brandList.push({
 					I_INDEX: i + 1 + '',
 					BRAND_ID: item.id + '',
				});
			})

			let brandData = {
				L1_CATE: category_id + '',
				F_ID: '1003',
				F_NAME: '热门品牌',
				LIST: brandList,
			}

			dataList.push(brandData);
		}

		let params = {
			TAB_ID: channel_id + '',
			DATA: dataList,
		};

		ReactNative.NativeModules.YH_CommonHelper.logEvent('YB_SHOW_CATEGORY', params);
	};
}