CommunityList.js 4.47 KB
'use strict';

import React from 'react';
import ReactNative from 'react-native';
import ListCell from '../home/ListCell';
import ImmutablePropTypes from 'react-immutable-proptypes';
import EmptyListTip from './EmptyListTip';
import PropTypes from 'prop-types';

const {
    View,
    Text,
    Image,
    ListView,
    TouchableOpacity,
    Platform,
    StyleSheet,
    Dimensions,
} = ReactNative;

export default class CommunityList extends React.Component {

    static propTypes = {
        data: ImmutablePropTypes.listOf(
            ImmutablePropTypes.contains({
                author: ImmutablePropTypes.contains({
                    avatar: PropTypes.string,
                    uid: PropTypes.number,
                    name: PropTypes.string,
    			}),
                timeago: PropTypes.string.isRequired,
                isOwner: PropTypes.bool,
                isTop: PropTypes.bool,
                isLike: PropTypes.bool,
                title: PropTypes.string,
                desc: PropTypes.string,
                thumbs: ImmutablePropTypes.listOf(
                    ImmutablePropTypes.contains({
                        src: PropTypes.string,
                    })
                ),
                section: ImmutablePropTypes.contains({
    				id: PropTypes.number,
    				name: PropTypes.string,
    			}),
                commentCount: PropTypes.number,
                likeCount: PropTypes.number,
            }),
        ),
        onPressPost: PropTypes.func,
    };

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

        this.state = {
            contentHeight: 0,
        };
    }

    shouldComponentUpdate(nextProps) {
        return this.props.data !== nextProps.data
            || this.props.endReached !== nextProps.endReached
            || this.props.page !== nextProps.page
            || this.props.endReachedViewHeight !== nextProps.endReachedViewHeight;
    }

    _renderRow(rowData, sectionID, rowID, highlightRow) {
        return (
            <ListCell
                key={sectionID + rowID}
                data={rowData}
                onPressPost={this.props.onPressPost}
                onPressAvatar={this.props.onPressAvatar}
                onPressSectionTag={this.props.onPressSectionTag}
                onPressComment={this.props.onPressComment}
                onPressLike={this.props.onPressLike}
            />
        );
    }

    _renderSeparator(sectionID, rowID, adjacentRowHighlighted) {
        return (
            <View key={'separator' + sectionID + rowID} style={styles.separator}/>
        );
    }

    getContentHeight() {
        let {data, endReached, index, endReachedViewHeight} = this.props;
        return this.state.contentHeight;
    }

    render() {
        let {data, endReached, page, endReachedViewHeight} = this.props;

        if (endReached && data.size == 0) {
            let endReachedText = page == 0 ? '你还没有发布的帖子' : '你还没有赞过的帖子';
            return (
                <EmptyListTip
                    style={{height: endReachedViewHeight}}
                    text={endReachedText}
                    onLayout={(event) => {
                        this.setState({
                            contentHeight: this.props.endReachedViewHeight
                        });
                    }}
                />
            );
        }

        return (
            <ListView
                dataSource={this.dataSource.cloneWithRows(data.toArray())}
                renderRow={this._renderRow}
                renderSectionHeader={this._renderSectionHeader}
                renderSeparator={this._renderSeparator}
                enableEmptySections={true}
                scrollEnabled={false}
                onEndReached={() => {}}
                onContentSizeChange={(width, height) => {
                    this.setState({
                        contentHeight: height
                    }, () => {
                        this.props.onContentSizeChange && this.props.onContentSizeChange(width, height);
                    });
                }}

            />
        );
    }
}


let styles = StyleSheet.create({
    separator: {
        height: 0.5,
        backgroundColor: '#e0e0e0',
    },
});