您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

Chat.js 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // @flow
  2. import React from 'react';
  3. import { SafeAreaView, View } from 'react-native';
  4. import { GiftedChat } from 'react-native-gifted-chat';
  5. import { translate } from '../../../base/i18n';
  6. import {
  7. BackButton,
  8. Header,
  9. HeaderLabel,
  10. SlidingView
  11. } from '../../../base/react';
  12. import { connect } from '../../../base/redux';
  13. import AbstractChat, {
  14. _mapDispatchToProps,
  15. _mapStateToProps,
  16. type Props
  17. } from '../AbstractChat';
  18. import ChatMessage from './ChatMessage';
  19. import styles from './styles';
  20. /**
  21. * Implements a React native component that renders the chat window (modal) of
  22. * the mobile client.
  23. */
  24. class Chat extends AbstractChat<Props> {
  25. /**
  26. * Initializes a new instance.
  27. *
  28. * @inheritdoc
  29. */
  30. constructor(props: Props) {
  31. super(props);
  32. this._onSend = this._onSend.bind(this);
  33. this._renderMessage = this._renderMessage.bind(this);
  34. this._transformMessage = this._transformMessage.bind(this);
  35. }
  36. /**
  37. * Implements React's {@link Component#render()}.
  38. *
  39. * @inheritdoc
  40. */
  41. render() {
  42. // Gifted chat requires a special object format and a reversed list
  43. // of messages.
  44. const messages
  45. = this.props._messages.map(this._transformMessage).reverse();
  46. return (
  47. <SlidingView
  48. position = 'bottom'
  49. show = { this.props._isOpen } >
  50. <View style = { styles.chatContainer }>
  51. <Header>
  52. <BackButton onPress = { this.props._onToggleChat } />
  53. <HeaderLabel labelKey = 'chat.title' />
  54. </Header>
  55. <SafeAreaView style = { styles.backdrop }>
  56. <GiftedChat
  57. messages = { messages }
  58. onSend = { this._onSend }
  59. renderMessage = { this._renderMessage } />
  60. </SafeAreaView>
  61. </View>
  62. </SlidingView>
  63. );
  64. }
  65. _onSend: (Array<Object>) => void;
  66. /**
  67. * Callback to trigger a message send action.
  68. *
  69. * @param {string} message - The chat message to display.
  70. * @returns {void}
  71. */
  72. _onSend([ message ]) {
  73. this.props._onSendMessage(message.text);
  74. }
  75. _renderMessage: Object => React$Element<*>
  76. /**
  77. * Renders a single message.
  78. *
  79. * @param {Object} messageProps - The message props object to be rendered.
  80. * @returns {React$Element<*>}
  81. */
  82. _renderMessage(messageProps) {
  83. const { currentMessage } = messageProps;
  84. return (
  85. <ChatMessage message = { currentMessage } />
  86. );
  87. }
  88. _transformMessage: (Object, number) => Object;
  89. /**
  90. * Transforms a Jitsi message object to a format that gifted-chat can
  91. * handle.
  92. *
  93. * @param {Object} message - The chat message in our internal format.
  94. * @param {number} index - The index of the message in the array.
  95. * @returns {Object}
  96. */
  97. _transformMessage(message, index) {
  98. const system = message.messageType === 'error';
  99. return (
  100. {
  101. _id: index,
  102. createdAt: new Date(message.timestamp),
  103. messageType: message.messageType,
  104. system,
  105. text: system
  106. ? this.props.t('chat.error', {
  107. error: message.error,
  108. originalText: message.message
  109. })
  110. : message.message,
  111. user: {
  112. _id: message.id,
  113. name: message.displayName
  114. }
  115. }
  116. );
  117. }
  118. }
  119. export default translate(connect(_mapStateToProps, _mapDispatchToProps)(Chat));