MessageList.js 8.39 KB
'use strict';

import React, {Component} from 'react';
import ReactNative, {
    View,
    Text,
    Image,
    ListView,
    StyleSheet,
    Dimensions,
    InteractionManager,
    Platform,
    Clipboard,
} from 'react-native';

import LoadMoreIndicator from '../../../common/components/LoadMoreIndicator';
import LoadingIndicator from '../../../common/components/LoadingIndicator';
import EmptyContent from './EmptyContent';
import MessageListCellHeader from './MessageListCellHeader';
import MessageListSmallIconCell from './MessageListSmallIconCell';
import MessageListBigIconCell from './MessageListBigIconCell';
import MessageListTextCell from './MessageListTextCell';
import MessageListOrderCell from './MessageListOrderCell';
import YH_ToolTips from '../../../common/components/YH_ToolTips'

export default class MessageList extends Component {
    constructor(props) {
        super(props);
        this.renderRow = this.renderRow.bind(this);
        this.dataSource = new ListView.DataSource({
            rowHasChanged: (r1, r2) => !Immutable.is(r1, r2),
        });
        this.loadMessageListCell = this.loadMessageListCell.bind(this);
        this.onLongPressListItem = this.onLongPressListItem.bind(this);
        this._copy = this._copy.bind(this);
        this._delete = this._delete.bind(this);
        this.showToolTip = this.showToolTip.bind(this);
        this.state = {showToolTips: false,index:0}
    }

    componentDidMount() {

    }

    onLongPressListItem(itemData, index) {
        this.setState({showToolTips: true, index: index});
    }

    loadMessageListCell(rowData, rowID) {
        let cellType = rowData.get('businessType');
        switch (cellType) {
            case 100:
            case 101:
            case 102:
            case 103:
            case 202:
            case 203:
            case 204:
            case 205:
            case 206:
            case 207:
            case 208:
            case 209:
            {
                return(
                        <MessageListSmallIconCell
                            itemData={rowData}
                            onPressListItem={(itemData) =>{
                                    this.setState({showToolTips: false});
                                    this.props.onPressListItem && this.props.onPressListItem(itemData, rowID)
                                }
                            }
                            onLongPressListItem={(itemData) =>{
                                this.onLongPressListItem(itemData,rowID);
                            }}
                        />
                );
            }
                break;
            case 200:
            case 201:
            case 403:
            {
                return(
                    <MessageListBigIconCell
                        itemData={rowData}
                        onPressListItem={(itemData) =>{
                                this.setState({showToolTips: false});
                                this.props.onPressListItem && this.props.onPressListItem(itemData, rowID)
                            }
                        }
                        onLongPressListItem={(itemData) =>{
                            this.onLongPressListItem(itemData,rowID);
                        }}
                    />
                );
            }
                break;
            case 300:
            case 301:
            case 302:
            case 303:
            case 304:
            case 305:
            case 402:
            case 404:
            {
                return(
                    <MessageListOrderCell
                        itemData={rowData}
                        onPressListItem={(itemData) =>{
                                this.setState({showToolTips: false});
                                this.props.onPressListItem && this.props.onPressListItem(itemData, rowID)
                            }
                        }
                        onLongPressListItem={(itemData) =>{
                            this.onLongPressListItem(itemData,rowID);
                        }}
                    />
                );
            }
                break;
            case 400:
            case 401:
            case 306:
            {
                return(
                    <MessageListTextCell
                        itemData={rowData}
                        onLongPressListItem={(itemData) =>{
                            this.onLongPressListItem(itemData, rowID);
                        }}
                        onPressListItem={(itemData) =>{
                                this.setState({showToolTips: false});
                            }
                        }
                    />
                );
            }
                break;
            default:
                return(
                    <View />
                );
        }
    }

    _copy(rowData) {
        this.setState({showToolTips: false});
        let copyString = rowData.get('body',{}).get('content','');
        Clipboard.setString(copyString);
    }

    _delete(rowData) {
        this.setState({showToolTips: false});
        this.props.deleteListItem && this.props.deleteListItem(rowData);
    }

    showToolTip(rowID, rowData) {
        let {showToolTips, index} = this.state;
        let show = (index == rowID) && showToolTips;
        if (show) {
            return(
                <YH_ToolTips
                    style={styles.tips}
                    actions={[{text: '复制', onPress:() =>{
                                this._copy(rowData);
                              }},
                              {text: '删除', onPress:() =>{
                                  this._delete(rowData);
                              }}]}
                    isShow={showToolTips}
                    itemData={rowData}
                />
            );
        }else {
            <View />
        }
    }

    renderRow(rowData, sectionID, rowID) {
        return (
            <View style= {styles.cellContainer}>
                <MessageListCellHeader
                    timestamp= {rowData.get('create_date')}
                />
                {this.loadMessageListCell(rowData,rowID)}
                {this.showToolTip(rowID, rowData)}
            </View>
        );
    }

    render() {
        let {isFetching, endReached, list, listId, shouldShowEmpty} = this.props.data;
        let isLoadingMore = list.size != 0 && isFetching;

        if (shouldShowEmpty) {
            return (
                <View style={styles.container}>
                    <EmptyContent
                        listId={listId}
                        onPressEmptyItem={this.props.onPressEmptyItem}
                    />
                </View>
            );
        }
        return (
            <View style={styles.container}>
                <ListView
                    contentContainerStyle={styles.contentContainer}
                    dataSource={this.dataSource.cloneWithRows(list.toArray())}
                    renderRow={this.renderRow}
                    enableEmptySections={true}
                    onScroll={() => {
                        this.setState({showToolTips: false});
                    }}
                    onEndReached={() => {
                        if (list.size != 0) {
                            this.props.onEndReached && this.props.onEndReached();
                        }
                    }}
                    renderFooter={() => {
                        if (endReached) {
                            return <LoadMoreIndicator
                                    isVisible={true}
                                    text={'暂无更多'}
                                />;
                        } else {
                            return <LoadMoreIndicator
                                    isVisible={isLoadingMore}
                                    animating={isFetching}
                                />;
                        }
                    }}
                />
                <LoadingIndicator
                    isVisible={isFetching}
                />
            </View>
        );
    }
}

let {width, height} = Dimensions.get('window');

let styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#f0f0f0',
    },
    cellContainer: {
        backgroundColor: 'transparent',
        flexDirection: 'column',
        justifyContent: 'flex-start',
    },
    tips: {
        position: 'absolute',
        top: 10,
        left: 0
    }
});