CategoryBContainer.js 8.64 KB
'use strict'

import React, {Component} from 'react';
import ReactNative, {
    StyleSheet,
    Dimensions,
    Platform,
    View,
    Text,
    NativeModules,
    InteractionManager,
    NativeAppEventEmitter,
    Alert,
} from 'react-native'

import {bindActionCreators} from 'redux';
import {connect} from 'react-redux';
import {Map} from 'immutable';
import * as categoryBActions from '../reducers/categoryB/categoryBActions';

import CategoryB from '../components/categoryB/CategoryB';


const actions = [
     categoryBActions,
];

function mapStateToProps(state) {
    return {
        ...state
    };
}

function mapDispatchToProps(dispatch) {

    const creators = Map()
        .merge(...actions)
        .filter(value => typeof value === 'function')
        .toObject();

    return {
        actions: bindActionCreators(creators, dispatch),
        dispatch
    };
}


class CategoryBContainer extends Component {
    constructor(props) {
        super(props);

        this._onSelectChannel = this._onSelectChannel.bind(this);
        this._onSelectCategory = this._onSelectCategory.bind(this);
        this._onPressBannerResourceItem = this._onPressBannerResourceItem.bind(this);
        this._onPressCategoryBMore = this._onPressCategoryBMore.bind(this);
        this._onPressHotCategoryItem = this._onPressHotCategoryItem.bind(this);
        this._onPressHotBrandItem = this._onPressHotBrandItem.bind(this);
        this.onRefresh = this.onRefresh.bind(this);
        this.onPressReload = this.onPressReload.bind(this);

        this.subscription = NativeAppEventEmitter.addListener(
            'ChannelDidChangeEvent',
            (reminder) => {
                this.props.actions.setDelayExposeData(true);    
                let id = reminder.channel;
                let value;
                if(id == 2){
                    value='girl';
                }else if(id == 3){
                    value='kids';
                }else if(id == 4){
                    value='lifestyle';
                }else{
                    id = 1;
                    value='boy';
                }
                this._onSelectChannel({id, value});
            }
        );

        this.subscription2 = NativeAppEventEmitter.addListener(
            'CategoryViewDidAppearEvent',
            () => {
                this.props.categoryB.delayExposeData && this.props.actions.startExposeData();
                this.props.actions.setDelayExposeData(false);                
            }
        );
    }

    componentDidMount() {
        this.props.actions.getCategoryBList();
    }

    componentWillUnmount() {
        this.subscription && this.subscription.remove();
        this.subscription2 && this.subscription2.remove();
    }

    _onSelectChannel(channel) {
        this.props.actions.setCurrentChannelB(channel.id, channel.value);
        this.props.actions.getCategoryBFirstSubCategoryDetail();
    }

    _onSelectCategory(category) {
        let categoryId = category.category_id;
        let categoryValue = category.category_name;

        if(category.sub && category.sub.length > 0){
            if (this.props.categoryB.currentCateId == categoryId) {
                return;
            }

            this.category && this.category.stopPullToRefresh();
            
            this.props.actions.setCurrentCateB(categoryId, categoryValue);

            this.props.actions.fetchSubCategory(categoryId, categoryValue, () => {
                this.category && this.category.trigggePullToRefresh(categoryId, categoryValue);
            });
        }else{

            let all = {
                category_name: "全部" + categoryValue,
                parent_id: categoryId,
                relation_parameter: category.relation_parameter,
                node_count: category.node_count,
            };
            //设置当前的类别信息
            this.props.actions.jumpToCategory(all, 0, this.props.categoryB.currentChannelId);      
        }
    }

    onRefresh(categoryId, categoryValue) {
        this.props.actions.getCategoryBSubCategoryDetail(categoryId, categoryValue);
    }

    onPressReload() {
        this.props.actions.getCategoryBList();
    }

    _onPressBannerResourceItem(url){
        if(url){
            ReactNative.NativeModules.YH_CommonHelper.jumpWithUrl(url);

            //埋点
            let {currentChannelId, currentCateId} = this.props.categoryB;
            let params = {
                TAB_ID: currentChannelId + '',
                F_ID: "1001",
                F_NAME: "BANNER",
                F_INDEX: "1",
                L1_CATE: currentCateId + '',
                L2_CATE: "",
                I_INDEX: '0',
            };
            NativeModules.YH_CommonHelper.logEvent('YB_CATEGORY_CAT_FLR_C', params);
        }
    }

    _onPressCategoryBMore() {
        let {currentChannelId, currentCateId} = this.props.categoryB;
        this.props.actions.pressCategoryBMore(currentCateId);

        //埋点
        let params = {
            TAB_ID: currentChannelId + '',
            F_ID: "1002",
            F_NAME: "MORE",
            F_INDEX: "2",
            L1_CATE: currentCateId + '',
            L2_CATE: "",
            I_INDEX: '0',
        };
        NativeModules.YH_CommonHelper.logEvent('YB_CATEGORY_CAT_FLR_C', params);
    }

    _onPressHotCategoryItem(value, index) {
        let {currentChannelId, currentCateId, currentCateValue} = this.props.categoryB;

        //首先判断是否为物理类目,判断依据为relation_parameter对象存在且内部sort不为空,
        // 物理类目走类目跳转逻辑,否则走跳转规则逻辑
        if(value.relation_parameter && value.relation_parameter.sort){
            ReactNative.NativeModules.YH_CommonHelper.jumpToCategory(value, parseInt(index), parseInt(currentChannelId));
        }
        else if(value.url){
            ReactNative.NativeModules.YH_CommonHelper.jumpWithUrl(value.url);
        }

        //埋点
        let subcategoryId = value.category_id;
        let params = {
            TAB_ID: currentChannelId + '',
            F_ID: "1002",
            F_NAME: "全部"+currentCateValue,
            F_INDEX: "2",
            L1_CATE: currentCateId + '',
            L2_CATE: subcategoryId + '',
            I_INDEX: parseInt(index) + 1 + '',
            PRD_SKN: value.product_skn + '',
        };
        NativeModules.YH_CommonHelper.logEvent('YB_CATEGORY_CAT_FLR_C', params);
    }

    _onPressHotBrandItem(data, index){
        ReactNative.NativeModules.YH_CommonHelper.pushBrandVC(data);

        //埋点
        let {currentChannelId, currentCateId} = this.props.categoryB;
        let params = {
            TAB_ID: currentChannelId + '',
            F_ID: "1003",
            F_NAME: "热门品牌",
            F_INDEX: "3",
            L1_CATE: currentCateId + '',
            I_INDEX: parseInt(index) + 1 + '',
            BRAND_ID: data.id + '',
        };
        NativeModules.YH_CommonHelper.logEvent('YB_CATEGORY_CAT_FLR_C', params);
    }


    render() {
        let {
            isFetching,
            currentChannelId,
            currentChannelValue,
            currentCateId,
            categoryList,
            currentCateValue,
            currentSubCateData,
            cacheSubCateData,
            contentFetching,
            categoryError,
        } = this.props.categoryB;

        return (
                <CategoryB
                    ref={(c) => {
                        this.category = c;
                    }}
                    style={styles.container}
                    isFetching={isFetching}
                    categoryError={categoryError}
                    contentFetching={contentFetching}
                    categoryList={categoryList}
                    currentChannelId={currentChannelId}
                    currentChannelValue={currentChannelValue}
                    currentCateId={currentCateId}
                    currentCateValue={currentCateValue}
                    currentSubCateData={currentSubCateData}
                    cacheSubCateData={cacheSubCateData}
                    onSelectChannel={this._onSelectChannel}
                    onSelectCategory={this._onSelectCategory}
                    onPressBannerResourceItem={this._onPressBannerResourceItem}
                    onPressCategoryBMore={this._onPressCategoryBMore}
                    onPressHotCategoryItem={this._onPressHotCategoryItem}
                    onPressHotBrandItem={this._onPressHotBrandItem}
                    onRefresh={this.onRefresh}
                    onPressReload={this.onPressReload}
                />
        );
    }
}

let styles = StyleSheet.create({
    container: {
        flex: 1,
    },

});

export default connect(mapStateToProps, mapDispatchToProps)(CategoryBContainer);