You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ChatMessageGroup.js 2.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // @flow
  2. import React, { Component } from 'react';
  3. import { FlatList } from 'react-native';
  4. import ChatMessage from './ChatMessage';
  5. import styles from './styles';
  6. type Props = {
  7. /**
  8. * The messages array to render.
  9. */
  10. messages: Array<Object>
  11. }
  12. /**
  13. * Implements a container to render all the chat messages in a conference.
  14. */
  15. export default class ChatMessageGroup extends Component<Props> {
  16. /**
  17. * Instantiates a new instance of the component.
  18. *
  19. * @inheritdoc
  20. */
  21. constructor(props: Props) {
  22. super(props);
  23. this._keyExtractor = this._keyExtractor.bind(this);
  24. this._renderMessage = this._renderMessage.bind(this);
  25. }
  26. /**
  27. * Implements {@code Component#render}.
  28. *
  29. * @inheritdoc
  30. */
  31. render() {
  32. return (
  33. <FlatList
  34. data = { this.props.messages }
  35. inverted = { true }
  36. keyExtractor = { this._keyExtractor }
  37. renderItem = { this._renderMessage }
  38. style = { styles.messageContainer } />
  39. );
  40. }
  41. _keyExtractor: Object => string
  42. /**
  43. * Key extractor for the flatlist.
  44. *
  45. * @param {Object} item - The flatlist item that we need the key to be
  46. * generated for.
  47. * @param {number} index - The index of the element.
  48. * @returns {string}
  49. */
  50. _keyExtractor(item, index) {
  51. return `key_${index}`;
  52. }
  53. _renderMessage: Object => React$Element<*>;
  54. /**
  55. * Renders a single chat message.
  56. *
  57. * @param {Object} message - The chat message to render.
  58. * @returns {React$Element<*>}
  59. */
  60. _renderMessage({ index, item: message }) {
  61. return (
  62. <ChatMessage
  63. message = { message }
  64. showAvatar = {
  65. this.props.messages[0].messageType !== 'local'
  66. && index === this.props.messages.length - 1
  67. }
  68. showDisplayName = {
  69. this.props.messages[0].messageType === 'remote'
  70. && index === this.props.messages.length - 1
  71. }
  72. showTimestamp = { index === 0 } />
  73. );
  74. }
  75. }