HomeContainer.js 6.75 KB
'use strict';

import React, {Component} from 'react';
import ReactNative, {AsyncStorage, Platform, StyleSheet, View} from 'react-native'

import {bindActionCreators} from 'redux';
import {connect} from 'react-redux';
import {Map} from 'immutable';
import * as allianceActions from '../reducers/alliance/allianceActions';
import * as appActions from  '../reducers/app/appActions';
import Home from '../components/Home'
import LoadingIndicator from '../../common/components/LoadingIndicator';

const actions = [
    allianceActions,
    appActions,
];

const AsyncStorageKey = "RN_FIRST_FLAG";

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 HomeContainer extends Component {
    constructor(props) {
        super(props);

        this.state = {
            tips: '',
            firstFlag: '0'
        };

        this._hiddenGuideDialog = this._hiddenGuideDialog.bind(this);
        this._onPressProduct = this._onPressProduct.bind(this);
        this._jumpWithUrl = this._jumpWithUrl.bind(this);
        this._resourceJumpWithUrl = this._resourceJumpWithUrl.bind(this);
        this._onEndReached = this._onEndReached.bind(this);
        this.onPressCategory = this.onPressCategory.bind(this);

        AsyncStorage.getItem(AsyncStorageKey, (error, value) => {
            if (error) {
                return
            }
            if (value === null) {
                AsyncStorage.setItem(AsyncStorageKey, '1', (error) => {
                    if (error) {
                        return
                    }
                    this.setState({
                        firstFlag: '1',
                    });
                });
            } else {
                this.setState({
                    firstFlag: value,
                });
            }
        });
    }

    componentDidMount() {
        let self = this;
        this.props.actions.getResourceInfo(function (json) {
               json && json.forEach(item => {
                    if (item.template_name === 'recommendGoodsGroup' && item.data) {
                        let productPool = item.data.recommendLogic;
                        let skns = item.data.skns;
                        self.props.actions.getProductList(productPool, skns);
                        let params = {
                            TAB_ID: '0',
                            TAB_NAME: '热门推荐'
                        };
                        ReactNative.NativeModules.YH_CommonHelper.logEvent('YB_CPS_MAIN_PRO_TAB_C', params);
                    }
                })
        });
        this.props.actions.getInviteCode();
    }

    componentWillUnmount() {

    }

    _hiddenGuideDialog() {
        AsyncStorage.setItem(AsyncStorageKey, '0', () => {
            this.setState({
                firstFlag: '0',
            });
        });
    }

    _jumpWithUrl(title = '', type = '', orderCode = '') {
        let url = `http://m.yohobuy.com?openby:yohobuy={"action":"go.minealliance","params":{"title":"${title}","type":"${type}","order_code":"${orderCode}"}}`;
        ReactNative.NativeModules.YH_CommonHelper.jumpWithUrl(url);
    }

    _resourceJumpWithUrl(url, type, params) {
        if (!url) {
            return;
        }
        ReactNative.NativeModules.YH_CommonHelper.logEvent('YB_CPS_MAIN_EVENT', params);
        ReactNative.NativeModules.YH_CommonHelper.jumpWithUrl(url);
    }

    _onPressProduct(product) {

        let productSkn = product && product.get('product_skn', 0);
        let product_id = product && product.get('product_id', 0);

        //拼团需要传递的字段
        let collage_activity_id = product && product.get('collage_activity_id', -1);
        let collage_price = product && product.get('collage_price', 0);
        let collage_rebates_amount = product && product.get('collage_rebates_amount', 0);

        if (!productSkn) {
            return;
        }

        let pageName = 'iFP_Alliance';
        if (Platform.OS === 'android') {
            pageName = 'aFP_Alliance';
        }

        let url = `http://m.yohobuy.com?openby:yohobuy={"action":"go.minealliance","params":{"type":"shareDetail","title":"有货推手商品详情", "product_skn":"${productSkn}", "product_id": "${product_id}" ,"from_page_name":"${pageName}", "collage_activity_id":"${collage_activity_id}", "collage_price":"${collage_price}", "collage_rebates_amount":"${collage_rebates_amount}"}}`;

        ReactNative.NativeModules.YH_CommonHelper.jumpWithUrl(url);

        let {productList} = this.props.app;
        let params = {
            TAB_ID: productList.current_sort_id,
            TAB_NAME: productList.current_sort_name,
            SKN: product.get('product_skn')
        };
        ReactNative.NativeModules.YH_CommonHelper.logEvent('YB_CPS_MAIN_PRO_C', params);
    }

    onPressCategory(data, index) {
        let {
            productPool,
            skns,
        } = this.props.app;
        this.props.actions.setAppSelectedCategory(productPool, skns, data.get('sort_id'), data.get('sort_name'), index);

        let params = {
            TAB_ID: data.get('sort_id'),
            TAB_NAME: data.get('sort_name')
        };
        ReactNative.NativeModules.YH_CommonHelper.logEvent('YB_CPS_MAIN_PRO_TAB_C', params);
    }

    _onEndReached() {

        let {
            productPool,
            skns,
        } = this.props.app;

        // _onEndReached 事件会出现在 productPool返回前触发,可能会导致数据不一致,因此控制为0时不调用_onEndReached 
        if(productPool != 0){
            this.props.actions.getProductList(productPool, skns);
        }
    }

    render() {
        let {
            resourceInfo,
            src,
        } = this.props.alliance;
        let {productList} = this.props.app;
        let isShowGuide = this.state.firstFlag === '1';
        let isFetching = resourceInfo.isFetching;
        return (
            <View style={styles.container}>
                <Home
                    resourceInfo={resourceInfo}
                    data={this.props.app}
                    jumpWithUrl={this._jumpWithUrl}
                    resourceJumpWithUrl={this._resourceJumpWithUrl}
                    onPressProduct={this._onPressProduct}
                    onEndReached={this._onEndReached}
                    onPressCategory={this.onPressCategory}
                />
                <LoadingIndicator isVisible={isFetching}/>
            </View>

        );
    }
}

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

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