Skip to content

Commit 578f008

Browse files
fix: Added avatar in thread message (RocketChat#921)
* add user avatar * format header * format * add_tooltip * add_participant * add optional chaining * add fallback also * aligned --------- Co-authored-by: Zishan Ahmad <zishan.barun@gmail.com>
1 parent 16afe82 commit 578f008

File tree

5 files changed

+91
-29
lines changed

5 files changed

+91
-29
lines changed

packages/react/src/views/ChatHeader/ChatHeader.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,6 @@ const ChatHeader = ({
102102

103103
const isThreadOpen = useMessageStore((state) => state.isThreadOpen);
104104
const threadMainMessage = useMessageStore((state) => state.threadMainMessage);
105-
const threadTitle =
106-
threadMainMessage?.msg ||
107-
(threadMainMessage?.file ? threadMainMessage.file.name : '');
108105

109106
const closeThread = useMessageStore((state) => state.closeThread);
110107

@@ -432,7 +429,7 @@ const ChatHeader = ({
432429
</Box>
433430
{isThreadOpen && (
434431
<DynamicHeader
435-
title={threadTitle}
432+
title={threadMainMessage}
436433
handleClose={closeThread}
437434
iconName="arrow-back"
438435
/>

packages/react/src/views/DynamicHeader/DynamicHeader.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
33
import { css } from '@emotion/react';
44
import { Box, Icon, ActionButton, Heading } from '@embeddedchat/ui-elements';
55
import useDynamicHeaderStyles from './DynamicHeader.styles';
6+
import { Markdown } from '../Markdown';
67

78
const DynamicHeader = ({
89
title,
@@ -11,6 +12,22 @@ const DynamicHeader = ({
1112
iconName,
1213
headerIconName,
1314
}) => {
15+
const messageDescription = (msg) => {
16+
if (msg.file) {
17+
if (msg.attachments[0]?.description) {
18+
return (
19+
<Markdown
20+
body={msg.attachments[0].description}
21+
md={msg.attachments[0].descriptionMd}
22+
isReaction={false}
23+
/>
24+
);
25+
}
26+
return msg.file.name;
27+
}
28+
return <Markdown body={msg} md={msg.md} isReaction={false} />;
29+
};
30+
1431
const styles = useDynamicHeaderStyles();
1532
return (
1633
<Box css={styles.container}>
@@ -32,8 +49,8 @@ const DynamicHeader = ({
3249
<Icon name={iconName} size="1.25rem" />
3350
</ActionButton>
3451

35-
<Heading level={6} css={styles.clearSpacing}>
36-
{title}
52+
<Heading level={5} css={styles.clearSpacing}>
53+
{messageDescription(title)}
3754
</Heading>
3855
{isHeaderIcon && <Icon name={headerIconName} size="1.25rem" />}
3956
</Box>

packages/react/src/views/DynamicHeader/DynamicHeader.styles.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const useDynamicHeaderStyles = () => {
1212
`,
1313

1414
clearSpacing: css`
15-
margin: 0;
15+
margin-bottom: 1px;
1616
padding: 0;
1717
text-overflow: ellipsis;
1818
white-space: nowrap;

packages/react/src/views/Message/Message.styles.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,20 @@ export const MessageMetricsStyles = {
203203
display: flex;
204204
justify-content: center;
205205
align-items: center;
206-
margin-left: ${isFirstMessage ? '0.5rem' : '0.25rem'};
206+
margin-left: ${isFirstMessage ? '0.5rem' : '0.3rem'};
207+
margin-top: 1.2px;
208+
`,
209+
210+
metricsAvatarItem: css`
211+
letter-spacing: 0rem;
212+
font-size: 0.625rem;
213+
font-weight: 700;
214+
line-height: 0.75rem;
215+
display: flex;
216+
justify-content: center;
217+
align-items: center;
218+
margin-left: 10px;
219+
margin-top: 2px;
207220
`,
208221

209222
metricsItemLabel: css`

packages/react/src/views/Message/MessageMetrics.js

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1-
import React from 'react';
1+
import React, { useContext } from 'react';
22
import { formatDistance } from 'date-fns';
33
import {
44
Box,
55
Button,
66
Icon,
77
useComponentOverrides,
88
appendClassNames,
9+
Avatar,
10+
Tooltip,
911
} from '@embeddedchat/ui-elements';
1012
import { MessageMetricsStyles as styles } from './Message.styles';
13+
import RCContext from '../../context/RCInstance';
14+
1115
import BubbleThreadBtn from './BubbleVariant/BubbleThreadBtn';
1216

1317
export const MessageMetrics = ({
@@ -25,6 +29,18 @@ export const MessageMetrics = ({
2529
style
2630
);
2731

32+
const { RCInstance } = useContext(RCContext);
33+
34+
const getUserAvatarUrl = (username) => {
35+
const host = RCInstance.getHost();
36+
return `${host}/avatar/${username}`;
37+
};
38+
39+
const participantsList =
40+
(message?.replies?.length ?? 0) - 1 > 0
41+
? `+${message.replies.length - 1}`
42+
: null;
43+
2844
return (
2945
<Box
3046
css={variantStyles.metricsContainer || styles.metrics}
@@ -46,31 +62,50 @@ export const MessageMetrics = ({
4662
onClick={handleOpenThread(message)}
4763
css={variantStyles && variantStyles.threadReplyButton}
4864
>
49-
Reply
65+
View thread
5066
</Button>
51-
<Box css={styles.metricsItem(true)} title="Replies">
52-
<Icon size="1.25rem" name="thread" />
53-
<Box css={styles.metricsItemLabel}>{message.tcount}</Box>
54-
</Box>
5567
{!!message.tcount && (
56-
<Box css={styles.metricsItem} title="Participants">
57-
<Icon size="1.25rem" name="user" />
58-
<Box css={styles.metricsItemLabel}>
59-
{message.replies.length}
60-
</Box>
61-
</Box>
68+
<>
69+
<Tooltip text="Followers" position="top">
70+
<Box css={styles.metricsAvatarItem}>
71+
<Avatar
72+
url={getUserAvatarUrl(message?.u.username)}
73+
alt="avatar"
74+
size="1rem"
75+
/>
76+
{participantsList && (
77+
<span css={styles.metricsItemLabel}>
78+
{participantsList}
79+
</span>
80+
)}
81+
</Box>
82+
</Tooltip>
83+
</>
6284
)}
63-
<Box
64-
css={styles.metricsItem}
65-
title={new Date(message.tlm).toLocaleString()}
85+
86+
<Tooltip
87+
text={`Last message: ${new Date(message.tlm).toLocaleTimeString(
88+
[],
89+
{
90+
hour: '2-digit',
91+
minute: '2-digit',
92+
hour12: false,
93+
}
94+
)}`}
95+
position="top"
6696
>
67-
<Icon size="1.25rem" name="clock" />
68-
<Box css={styles.metricsItemLabel}>
69-
{formatDistance(new Date(message.tlm), new Date(), {
70-
addSuffix: true,
71-
})}
97+
<Box css={styles.metricsItem(true)}>
98+
<Icon size="1.15rem" name="thread" />
99+
<Box css={styles.metricsItemLabel}>
100+
{message.tcount} replies,{' '}
101+
{new Date(message.tlm).toLocaleTimeString([], {
102+
hour: '2-digit',
103+
minute: '2-digit',
104+
hour12: false,
105+
})}
106+
</Box>
72107
</Box>
73-
</Box>
108+
</Tooltip>
74109
</>
75110
))}
76111
</Box>

0 commit comments

Comments
 (0)