// @flow import React from 'react'; import { toArray } from 'react-emoji-render'; import Linkify from 'react-linkify'; import { translate } from '../../../base/i18n'; import AbstractChatMessage, { type Props } from '../AbstractChatMessage'; /** * Renders a single chat message. */ class ChatMessage extends AbstractChatMessage { /** * Implements React's {@link Component#render()}. * * @inheritdoc * @returns {ReactElement} */ render() { const { message } = this.props; const messageToDisplay = message.messageType === 'error' ? this.props.t('chat.error', { error: message.error, originalText: message.message }) : message.message; // replace links and smileys // Strophe already escapes special symbols on sending, // so we escape here only tags to avoid double & const escMessage = messageToDisplay.replace(//g, '>') .replace(/\n/g, '
'); const processedMessage = []; // content is an array of text and emoji components const content = toArray(escMessage, { className: 'smiley' }); content.forEach(i => { if (typeof i === 'string') { processedMessage.push( { i }); } else { processedMessage.push(i); } }); return (
{ this.props.showDisplayName && this._renderDisplayName() }
{ processedMessage }
{ this.props.showTimestamp && this._renderTimestamp() }
); } _getFormattedTimestamp: () => string; /** * Renders the display name of the sender. * * @returns {React$Element<*>} */ _renderDisplayName() { return (
{ this.props.message.displayName }
); } /** * Renders the time at which the message was sent. * * @returns {React$Element<*>} */ _renderTimestamp() { return (
{ this._getFormattedTimestamp() }
); } } export default translate(ChatMessage, { wait: false });