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.

ChatMessage.web.js 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // @flow
  2. import React, { PureComponent } from 'react';
  3. import { translate } from '../../base/i18n';
  4. import { processReplacements } from '../replacement';
  5. /**
  6. * The type of the React {@code Component} props of {@link Chat}.
  7. */
  8. type Props = {
  9. /**
  10. * The redux representation of a chat message.
  11. */
  12. message: Object,
  13. /**
  14. * Invoked to receive translated strings.
  15. */
  16. t: Function
  17. };
  18. /**
  19. * Displays as passed in chat message.
  20. *
  21. * @extends Component
  22. */
  23. class ChatMessage extends PureComponent<Props> {
  24. /**
  25. * Implements React's {@link Component#render()}.
  26. *
  27. * @inheritdoc
  28. * @returns {ReactElement}
  29. */
  30. render() {
  31. const { message } = this.props;
  32. let messageTypeClassname = '';
  33. let messagetoDisplay = message.message;
  34. switch (message.messageType) {
  35. case 'local':
  36. messageTypeClassname = 'localuser';
  37. break;
  38. case 'error':
  39. messageTypeClassname = 'error';
  40. messagetoDisplay = this.props.t('chat.error', {
  41. error: message.error,
  42. originalText: messagetoDisplay
  43. });
  44. break;
  45. default:
  46. messageTypeClassname = 'remoteuser';
  47. }
  48. // replace links and smileys
  49. // Strophe already escapes special symbols on sending,
  50. // so we escape here only tags to avoid double &amp;
  51. const escMessage = messagetoDisplay.replace(/</g, '&lt;')
  52. .replace(/>/g, '&gt;')
  53. .replace(/\n/g, '<br/>');
  54. const messageWithHTML = processReplacements(escMessage);
  55. return (
  56. <div className = { `chatmessage ${messageTypeClassname}` }>
  57. <img
  58. className = 'chatArrow'
  59. src = 'images/chatArrow.svg' />
  60. <div className = 'display-name'>
  61. { message.displayName }
  62. </div>
  63. <div className = { 'timestamp' }>
  64. { ChatMessage.formatTimestamp(message.timestamp) }
  65. </div>
  66. <div
  67. className = 'usermessage'
  68. // eslint-disable-next-line react/no-danger
  69. dangerouslySetInnerHTML = {{ __html: messageWithHTML }} />
  70. </div>
  71. );
  72. }
  73. /**
  74. * Returns a timestamp formatted for display.
  75. *
  76. * @param {number} timestamp - The timestamp for the chat message.
  77. * @private
  78. * @returns {string}
  79. */
  80. static formatTimestamp(timestamp) {
  81. const now = new Date(timestamp);
  82. let hour = now.getHours();
  83. let minute = now.getMinutes();
  84. let second = now.getSeconds();
  85. if (hour.toString().length === 1) {
  86. hour = `0${hour}`;
  87. }
  88. if (minute.toString().length === 1) {
  89. minute = `0${minute}`;
  90. }
  91. if (second.toString().length === 1) {
  92. second = `0${second}`;
  93. }
  94. return `${hour}:${minute}:${second}`;
  95. }
  96. }
  97. export default translate(ChatMessage, { wait: false });