DetailContainer.js 6.06 KB
'use strict'

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

import {bindActionCreators} from 'redux';
import {connect} from 'react-redux';
import {Map} from 'immutable';
import * as detailActions from '../reducers/detail/detailActions';
import BrandIntro from '../components/detail/BrandIntro'
import BrandArticleList from '../components/detail/BrandArticleList'
import BrandArticleCell from '../components/detail/BrandArticleCell'
import NewArrival from '../components/detail/NewArrival'
import Prompt from '../../coupon/components/coupon/Prompt';

const actions = [
    detailActions,
];

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 DetailContainer extends Component {
    componentDidMount() {
        this.props.actions.getBrandInfo();
    }
    constructor(props) {
        super(props);
        this._onPressArticle = this._onPressArticle.bind(this);
        this._onPressArticleLike = this._onPressArticleLike.bind(this);
        this._onPressFav = this._onPressFav.bind(this);
        this._onPressBrandIntroMore = this._onPressBrandIntroMore.bind(this);
        this._onPressMoreProducts = this._onPressMoreProducts.bind(this);
        this._addCanelFavTipRemove = this._addCanelFavTipRemove.bind(this);

        this.renderRow = this.renderRow.bind(this);
        this.dataSource = new ListView.DataSource({
            rowHasChanged: (r1, r2) => !Immutable.is(r1, r2),
            sectionHeaderHasChanged: (s1, s2) => !Immutable.is(s1, s2),
        });
    }

    componentDidMount() {
        this.props.actions.uidBrandFav();
        this.props.actions.brandInfo();
    }

    componentWillReceiveProps(nextProps) {
        if (this.props.detail.get('brandInfo').get('titleUnfold') && !nextProps.detail.get('brandInfo').get('titleUnfold')) {
            this.listView.scrollTo({x: 0, y: 0, animated: false, });
        }
    }

    _onPressArticle(url) {
        console.log("chenlin", "_onPressArticle:URL:" + url);
    }

    _onPressArticleLike(id, isLiked) {
        console.log("chenlin", "_onPressArticleLike:id" + id + ",isLiked:" + isLiked);
        let opt = isLiked ? "ok" : "cancel";

        this.props.actions.praiseArticle(id,opt);
    }

    _onPressFav(bFav='true') {
        if (bFav) {
            this.props.actions.addFavorite();
        } else {
            this.props.actions.cancelFavorite();
        }
    }

    _onPressBrandIntroMore(unfold='false'){
        this.props.actions.brandIntroUnfold(unfold);
    }

    _onPressMoreProducts(url){
        ReactNative.NativeModules.YH_CommonHelper.jumpWithUrl(url);
    }

    _onPressProduct(product, rowId=0){
        let productSkn = product && product.get('product_skn', 0);
        if (!productSkn) {
            return;
        }

        let url = `http://m.yohobuy.com?openby:yohobuy={"action":"go.productDetail","params":{"product_skn":"${productSkn}"}}`;
        ReactNative.NativeModules.YH_CommonHelper.jumpWithUrl(url);

    }

    _addCanelFavTipRemove(){
        this.props.actions.addCanelFavTipRemove();
    }

    renderRow(rowData, sectionID, rowID, highlightRow) {
        if (!rowData && rowData.length == 0) {
            return null;
        }
        switch (rowID) {
            case 'brandInfo':
                return(
                    <BrandIntro
                        brandIntro={rowData}
                        brandFav={this.props.detail.get('brandFav')}
                        onPressFav={this._onPressFav}
                        onPressBrandIntroMore={this._onPressBrandIntroMore}
                        addCanelFavTipRemove={this._addCanelFavTipRemove}
                    />
                );
            case 'productList':
            console.log(rowData);
            console.log('rowData');
                return (
                    <NewArrival
                        prodcutList={rowData}
                        onPressMoreProducts={this._onPressMoreProducts}
                        onPressProduct={this._onPressProduct}
                        moreProductUrl={this.props.detail.get('moreProductUrl')}
                    />
                );
            case 'articleList':
                return(
                    <BrandArticleList
                        articleList={rowData}
                        onPressArticle={this._onPressArticle}
                        onPressArticleLike={this._onPressArticleLike} />
                );
            default:
                return null;

        }
    }


    render() {
        let {detail} = this.props;

        let dataSource = {
            brandInfo: detail.get('brandInfo'),
            productList: detail.get('productList').toArray(),
            articleList: detail.get('articleList').toArray(),
        };

        return (
            <View style={styles.container}>
                <ListView
                ref={(c) => {
                    this.listView = c;
                }}
                contentContainerStyle={styles.contentContainer}
                enableEmptySections={true}
                dataSource={this.dataSource.cloneWithRows(dataSource)}
                renderRow={this.renderRow}
                />


                {detail.get('brandInfo').get('addCancelTip') !== '' ? <Prompt
                    text={detail.get('brandInfo').get('addCancelTip')}
                    duration={800}
                    onPromptHidden={this._addCanelFavTipRemove}
                /> : null}
            </View>
        );
    }
}

let styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#f0f0f0',
    },
    contentContainer:{
        flexDirection: 'column',
        flexWrap: 'wrap',
    },
});

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