77 lines
1.7 KiB
JavaScript
77 lines
1.7 KiB
JavaScript
|
// @flow
|
||
|
|
||
|
import React, { Component } from 'react';
|
||
|
import { FlatList } from 'react-native';
|
||
|
|
||
|
import ChatMessage from './ChatMessage';
|
||
|
import styles from './styles';
|
||
|
|
||
|
type Props = {
|
||
|
|
||
|
/**
|
||
|
* The messages array to render.
|
||
|
*/
|
||
|
messages: Array<Object>
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Implements a container to render all the chat messages in a conference.
|
||
|
*/
|
||
|
export default class MessageContainer extends Component<Props> {
|
||
|
/**
|
||
|
* Instantiates a new instance of the component.
|
||
|
*
|
||
|
* @inheritdoc
|
||
|
*/
|
||
|
constructor(props: Props) {
|
||
|
super(props);
|
||
|
|
||
|
this._keyExtractor = this._keyExtractor.bind(this);
|
||
|
this._renderMessage = this._renderMessage.bind(this);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Implements {@code Component#render}.
|
||
|
*
|
||
|
* @inheritdoc
|
||
|
*/
|
||
|
render() {
|
||
|
return (
|
||
|
<FlatList
|
||
|
data = { this.props.messages }
|
||
|
inverted = { true }
|
||
|
keyExtractor = { this._keyExtractor }
|
||
|
renderItem = { this._renderMessage }
|
||
|
style = { styles.messageContainer } />
|
||
|
);
|
||
|
}
|
||
|
|
||
|
_keyExtractor: Object => string
|
||
|
|
||
|
/**
|
||
|
* Key extractor for the flatlist.
|
||
|
*
|
||
|
* @param {Object} item - The flatlist item that we need the key to be
|
||
|
* generated for.
|
||
|
* @param {number} index - The index of the element.
|
||
|
* @returns {string}
|
||
|
*/
|
||
|
_keyExtractor(item, index) {
|
||
|
return `key_${index}`;
|
||
|
}
|
||
|
|
||
|
_renderMessage: Object => React$Element<*>;
|
||
|
|
||
|
/**
|
||
|
* Renders a single chat message.
|
||
|
*
|
||
|
* @param {Object} message - The chat message to render.
|
||
|
* @returns {React$Element<*>}
|
||
|
*/
|
||
|
_renderMessage({ item: message }) {
|
||
|
return (
|
||
|
<ChatMessage message = { message } />
|
||
|
);
|
||
|
}
|
||
|
}
|