mattermost-mobile/app/components/post_body/system_message_helpers.js
Mattermost Build c48a5e3b61
MM-22043 Render Channel purpose message without markdown (#4180)
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2020-04-17 22:50:50 -07:00

191 lines
6.5 KiB
JavaScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React from 'react';
import {Text} from 'react-native';
import {Posts} from '@mm-redux/constants';
import Markdown from 'app/components/markdown';
import {t} from 'app/utils/i18n';
const renderUsername = (value = '') => {
if (value) {
return (value[0] === '@') ? value : `@${value}`;
}
return value;
};
const renderMessage = (postBodyProps, styles, intl, localeHolder, values, skipMarkdown = false) => {
const {onPress} = postBodyProps;
const {messageStyle, textStyles} = styles;
if (skipMarkdown) {
return (
<Text style={messageStyle}>
{intl.formatMessage(localeHolder, values)}
</Text>
);
}
return (
<Markdown
baseTextStyle={messageStyle}
disableAtChannelMentionHighlight={true}
onPostPress={onPress}
textStyles={textStyles}
value={intl.formatMessage(localeHolder, values)}
/>
);
};
const renderHeaderChangeMessage = (postBodyProps, styles, intl) => {
const {postProps} = postBodyProps;
let values;
if (!postProps.username) {
return null;
}
const username = renderUsername(postProps.username);
const oldHeader = postProps.old_header;
const newHeader = postProps.new_header;
let localeHolder;
if (postProps.new_header) {
if (postProps.old_header) {
localeHolder = {
id: t('mobile.system_message.update_channel_header_message_and_forget.updated_from'),
defaultMessage: '{username} updated the channel header from: {oldHeader} to: {newHeader}',
};
values = {username, oldHeader, newHeader};
return renderMessage(postBodyProps, styles, intl, localeHolder, values);
}
localeHolder = {
id: t('mobile.system_message.update_channel_header_message_and_forget.updated_to'),
defaultMessage: '{username} updated the channel header to: {newHeader}',
};
values = {username, oldHeader, newHeader};
return renderMessage(postBodyProps, styles, intl, localeHolder, values);
} else if (postProps.old_header) {
localeHolder = {
id: t('mobile.system_message.update_channel_header_message_and_forget.removed'),
defaultMessage: '{username} removed the channel header (was: {oldHeader})',
};
values = {username, oldHeader, newHeader};
return renderMessage(postBodyProps, styles, intl, localeHolder, values);
}
return null;
};
const renderPurposeChangeMessage = (postBodyProps, styles, intl) => {
const {postProps} = postBodyProps;
let values;
if (!postProps.username) {
return null;
}
const username = renderUsername(postProps.username);
const oldPurpose = postProps.old_purpose;
const newPurpose = postProps.new_purpose;
let localeHolder;
if (postProps.new_purpose) {
if (postProps.old_purpose) {
localeHolder = {
id: t('mobile.system_message.update_channel_purpose_message.updated_from'),
defaultMessage: '{username} updated the channel purpose from: {oldPurpose} to: {newPurpose}',
};
values = {username, oldPurpose, newPurpose};
return renderMessage(postBodyProps, styles, intl, localeHolder, values, true);
}
localeHolder = {
id: t('mobile.system_message.update_channel_purpose_message.updated_to'),
defaultMessage: '{username} updated the channel purpose to: {newPurpose}',
};
values = {username, oldPurpose, newPurpose};
return renderMessage(postBodyProps, styles, intl, localeHolder, values, true);
} else if (postProps.old_purpose) {
localeHolder = {
id: t('mobile.system_message.update_channel_purpose_message.removed'),
defaultMessage: '{username} removed the channel purpose (was: {oldPurpose})',
};
values = {username, oldPurpose, newPurpose};
return renderMessage(postBodyProps, styles, intl, localeHolder, values, true);
}
return null;
};
const renderDisplayNameChangeMessage = (postBodyProps, styles, intl) => {
const {postProps} = postBodyProps;
const oldDisplayName = postProps.old_displayname;
const newDisplayName = postProps.new_displayname;
if (!(postProps.username && postProps.old_displayname && postProps.new_displayname)) {
return null;
}
const username = renderUsername(postProps.username);
const localeHolder = {
id: t('mobile.system_message.update_channel_displayname_message_and_forget.updated_from'),
defaultMessage: '{username} updated the channel display name from: {oldDisplayName} to: {newDisplayName}',
};
const values = {username, oldDisplayName, newDisplayName};
return renderMessage(postBodyProps, styles, intl, localeHolder, values);
};
const renderArchivedMessage = (postBodyProps, styles, intl) => {
const {postProps} = postBodyProps;
const username = renderUsername(postProps.username);
const localeHolder = {
id: t('mobile.system_message.channel_archived_message'),
defaultMessage: '{username} archived the channel',
};
const values = {username};
return renderMessage(postBodyProps, styles, intl, localeHolder, values);
};
const renderUnarchivedMessage = (postBodyProps, styles, intl) => {
const {postProps} = postBodyProps;
if (!postProps?.username) {
return null;
}
const username = renderUsername(postProps.username);
const localeHolder = {
id: t('mobile.system_message.channel_unarchived_message'),
defaultMessage: '{username} unarchived the channel',
};
const values = {username};
return renderMessage(postBodyProps, styles, intl, localeHolder, values);
};
const systemMessageRenderers = {
[Posts.POST_TYPES.HEADER_CHANGE]: renderHeaderChangeMessage,
[Posts.POST_TYPES.DISPLAYNAME_CHANGE]: renderDisplayNameChangeMessage,
[Posts.POST_TYPES.PURPOSE_CHANGE]: renderPurposeChangeMessage,
[Posts.POST_TYPES.CHANNEL_DELETED]: renderArchivedMessage,
[Posts.POST_TYPES.CHANNEL_UNARCHIVED]: renderUnarchivedMessage,
};
export const renderSystemMessage = (postBodyProps, styles, intl) => {
const renderer = systemMessageRenderers[postBodyProps.postType];
if (!renderer) {
return null;
}
return renderer(postBodyProps, styles, intl);
};