Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

ChatMessage.js 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // @flow
  2. import React from 'react';
  3. import { translate } from '../../../base/i18n';
  4. import Message from '../../../base/react/components/web/Message';
  5. import { MESSAGE_TYPE_LOCAL } from '../../constants';
  6. import AbstractChatMessage, { type Props } from '../AbstractChatMessage';
  7. import PrivateMessageButton from './PrivateMessageButton';
  8. /**
  9. * Renders a single chat message.
  10. */
  11. class ChatMessage extends AbstractChatMessage<Props> {
  12. /**
  13. * Implements React's {@link Component#render()}.
  14. *
  15. * @inheritdoc
  16. * @returns {ReactElement}
  17. */
  18. render() {
  19. const { message, t } = this.props;
  20. return (
  21. <div
  22. className = 'chatmessage-wrapper'
  23. tabIndex = { -1 }>
  24. <div className = { `chatmessage ${message.privateMessage ? 'privatemessage' : ''}` }>
  25. <div className = 'replywrapper'>
  26. <div className = 'messagecontent'>
  27. { this.props.showDisplayName && this._renderDisplayName() }
  28. <div className = 'usermessage'>
  29. <span className = 'sr-only'>
  30. { this.props.message.displayName === this.props.message.recipient
  31. ? t('chat.messageAccessibleTitleMe')
  32. : t('chat.messageAccessibleTitle',
  33. { user: this.props.message.displayName }) }
  34. </span>
  35. <Message text = { this._getMessageText() } />
  36. </div>
  37. { message.privateMessage && this._renderPrivateNotice() }
  38. </div>
  39. { message.privateMessage && message.messageType !== MESSAGE_TYPE_LOCAL
  40. && (
  41. <div className = 'messageactions'>
  42. <PrivateMessageButton
  43. participantID = { message.id }
  44. reply = { true }
  45. showLabel = { false } />
  46. </div>
  47. ) }
  48. </div>
  49. </div>
  50. { this.props.showTimestamp && this._renderTimestamp() }
  51. </div>
  52. );
  53. }
  54. _getFormattedTimestamp: () => string;
  55. _getMessageText: () => string;
  56. _getPrivateNoticeMessage: () => string;
  57. /**
  58. * Renders the display name of the sender.
  59. *
  60. * @returns {React$Element<*>}
  61. */
  62. _renderDisplayName() {
  63. return (
  64. <div
  65. aria-hidden = { true }
  66. className = 'display-name'>
  67. { this.props.message.displayName }
  68. </div>
  69. );
  70. }
  71. /**
  72. * Renders the message privacy notice.
  73. *
  74. * @returns {React$Element<*>}
  75. */
  76. _renderPrivateNotice() {
  77. return (
  78. <div className = 'privatemessagenotice'>
  79. { this._getPrivateNoticeMessage() }
  80. </div>
  81. );
  82. }
  83. /**
  84. * Renders the time at which the message was sent.
  85. *
  86. * @returns {React$Element<*>}
  87. */
  88. _renderTimestamp() {
  89. return (
  90. <div className = 'timestamp'>
  91. { this._getFormattedTimestamp() }
  92. </div>
  93. );
  94. }
  95. }
  96. export default translate(ChatMessage);