Skip to content

Commit

Permalink
Merge pull request #18495 from robertKozik/17885_custom_user_mentions…
Browse files Browse the repository at this point in the history
…_renderer_text_based

create UserMentionRenderer for rendering mentions inside chat
  • Loading branch information
puneetlath authored May 8, 2023
2 parents 6f0949b + 76ec3a0 commit 6bf31f3
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ const customHTMLElementModels = {
tagName: 'strong',
mixedUAStyles: {whiteSpace: 'pre'},
}),
'mention-user': defaultHTMLElementModels.span.extend({tagName: 'mention-user'}),
};

// We are using the explicit composite architecture for performance gains.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import React from 'react';
import _ from 'underscore';
import {
TNodeChildrenRenderer,
} from 'react-native-render-html';
import Navigation from '../../../libs/Navigation/Navigation';
import ROUTES from '../../../ROUTES';
import Text from '../../Text';
import Tooltip from '../../Tooltip';
import htmlRendererPropTypes from './htmlRendererPropTypes';
import withCurrentUserPersonalDetails from '../../withCurrentUserPersonalDetails';
import personalDetailsPropType from '../../../pages/personalDetailsPropType';
import * as StyleUtils from '../../../styles/StyleUtils';

const propTypes = {
...htmlRendererPropTypes,

/**
* Current user personal details
*/
currentUserPersonalDetails: personalDetailsPropType.isRequired,
};

/**
* Navigates to user details screen based on email
* @param {String} email
* @returns {void}
* */
const showUserDetails = email => Navigation.navigate(ROUTES.getDetailsRoute(email));

const MentionUserRenderer = (props) => {
const defaultRendererProps = _.omit(props, ['TDefaultRenderer', 'style']);

// We need to remove the leading @ from data as it is not part of the login
const loginWhithoutLeadingAt = props.tnode.data.slice(1);

const isOurMention = loginWhithoutLeadingAt === props.currentUserPersonalDetails.login;

return (
<Text>
<Tooltip absolute text={loginWhithoutLeadingAt}>
<Text
// eslint-disable-next-line react/jsx-props-no-spreading
{...defaultRendererProps}
color={StyleUtils.getUserMentionTextColor(isOurMention)}
style={StyleUtils.getUserMentionStyle(isOurMention)}
onPress={() => showUserDetails(loginWhithoutLeadingAt)}
>
<TNodeChildrenRenderer tnode={props.tnode} />
</Text>
</Tooltip>
</Text>
);
};

MentionUserRenderer.propTypes = propTypes;
MentionUserRenderer.displayName = 'MentionUserRenderer';

export default withCurrentUserPersonalDetails(MentionUserRenderer);
2 changes: 2 additions & 0 deletions src/components/HTMLEngineProvider/HTMLRenderers/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import AnchorRenderer from './AnchorRenderer';
import CodeRenderer from './CodeRenderer';
import EditedRenderer from './EditedRenderer';
import ImageRenderer from './ImageRenderer';
import MentionUserRenderer from './MentionUserRenderer';
import PreRenderer from './PreRenderer';

/**
Expand All @@ -16,4 +17,5 @@ export default {
// Custom tag renderers
edited: EditedRenderer,
pre: PreRenderer,
'mention-user': MentionUserRenderer,
};
25 changes: 25 additions & 0 deletions src/styles/StyleUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -1109,6 +1109,29 @@ function getGoogleListViewStyle(shouldDisplayBorder) {
};
}

/**
* Returns style object for the user mention component based on whether the mention is ours or not.
* @param {Boolean} isOurMention
* @returns {Object}
*/
function getUserMentionStyle(isOurMention) {
const backgroundColor = isOurMention ? themeColors.ourMentionBG : themeColors.mentionBG;
return {
backgroundColor,
borderRadius: variables.componentBorderRadiusSmall,
paddingHorizontal: 2,
};
}

/**
* Returns text color for the user mention text based on whether the mention is ours or not.
* @param {Boolean} isOurMention
* @returns {Object}
*/
function getUserMentionTextColor(isOurMention) {
return isOurMention ? themeColors.ourMentionText : themeColors.mentionText;
}

export {
getAvatarSize,
getAvatarStyle,
Expand Down Expand Up @@ -1169,4 +1192,6 @@ export {
getFontSizeStyle,
getSignInWordmarkWidthStyle,
getGoogleListViewStyle,
getUserMentionStyle,
getUserMentionTextColor,
};
4 changes: 4 additions & 0 deletions src/styles/colors.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,17 @@ export default {
midnight: '#002140',

// Brand Colors from Figma
blue100: '#B0D9FF',
blue200: '#8DC8FF',
blue400: '#0185FF',
blue600: '#0164BF',
blue700: '#003C73',
blue800: '#002140',

green100: '#B1F2D6',
green200: '#8EECC4',
green400: '#03D47C',
green600: '#008C59',
green700: '#085239',
green800: '#002E22',

Expand Down
4 changes: 4 additions & 0 deletions src/styles/themes/default.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ const darkTheme = {
reactionActive: '#003C73',
badgeAdHoc: colors.pink600,
badgeAdHocHover: colors.pink700,
mentionText: colors.blue100,
mentionBG: colors.blue600,
ourMentionText: colors.green100,
ourMentionBG: colors.green600,
};

const oldTheme = {
Expand Down

0 comments on commit 6bf31f3

Please sign in to comment.