Skip to content

Commit afe8207

Browse files
authored
Merge pull request #267 from GetStream/vishal/channel-preview-messenger-tests
Optimizing ChannelPreview hooks
2 parents 382d4d6 + 779f5af commit afe8207

File tree

3 files changed

+81
-53
lines changed

3 files changed

+81
-53
lines changed

src/components/ChannelPreview/hooks/useChannelPreviewDisplayAvatar.js

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,32 +9,41 @@ import { ChatContext } from '../../../context';
99
*/
1010
export const useChannelPreviewDisplayAvatar = (channel) => {
1111
const { client } = useContext(ChatContext);
12-
const [displayAvatar, setDisplayAvatar] = useState({});
12+
const [displayAvatar, setDisplayAvatar] = useState(
13+
getChannelPreviewDisplayAvatar(channel, client),
14+
);
1315

1416
useEffect(() => {
15-
if (channel.data.image) {
16-
setDisplayAvatar({
17-
image: channel.data.image,
18-
name: channel.data.name,
19-
});
20-
} else {
21-
const members = Object.values(channel?.state?.members || {});
22-
const otherMembers = members.filter(
23-
(member) => member.user.id !== client.user.id,
24-
);
25-
26-
if (otherMembers.length === 1) {
27-
setDisplayAvatar({
28-
image: otherMembers[0].user.image,
29-
name: channel.data.name || otherMembers[0].user.name,
30-
});
31-
} else {
32-
setDisplayAvatar({
33-
name: channel.data.name,
34-
});
35-
}
36-
}
17+
setDisplayAvatar(getChannelPreviewDisplayAvatar(channel, client));
3718
}, [channel]);
3819

3920
return displayAvatar;
4021
};
22+
23+
const getChannelPreviewDisplayAvatar = (channel, client) => {
24+
const currentUserId = client?.user?.id;
25+
const channelName = channel?.data?.name;
26+
const channelImage = channel?.data?.image;
27+
28+
if (channelImage) {
29+
return {
30+
image: channelImage,
31+
name: channelName,
32+
};
33+
} else if (currentUserId) {
34+
const members = Object.values(channel?.state?.members || {});
35+
const otherMembers = members.filter(
36+
(member) => member.user.id !== currentUserId,
37+
);
38+
39+
if (otherMembers.length === 1) {
40+
return {
41+
image: otherMembers[0].user.image,
42+
name: channelName || otherMembers[0].user.name,
43+
};
44+
}
45+
}
46+
return {
47+
name: channelName,
48+
};
49+
};

src/components/ChannelPreview/hooks/useChannelPreviewDisplayName.js

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,32 @@ import { ChatContext } from '../../../context';
33

44
export const useChannelPreviewDisplayName = (channel) => {
55
const { client } = useContext(ChatContext);
6-
const [displayName, setDisplayName] = useState('');
6+
const [displayName, setDisplayName] = useState(
7+
getChannelPreviewDisplayName(channel, client),
8+
);
79

810
useEffect(() => {
9-
if (typeof channel?.data?.name === 'string') {
10-
setDisplayName(channel.data.name);
11-
} else {
12-
const members = Object.values(channel?.state?.members || {});
13-
const otherMembers = members.filter(
14-
(member) => member.user.id !== client.user.id,
15-
);
16-
const name = otherMembers
17-
.map((member) => member.user.name || member.user.id || 'Unnamed User')
18-
.join(', ');
19-
20-
setDisplayName(name);
21-
}
11+
setDisplayName(getChannelPreviewDisplayName(channel, client));
2212
}, [channel]);
2313

2414
return displayName;
2515
};
16+
17+
const getChannelPreviewDisplayName = (channel, client) => {
18+
const currentUserId = client?.user?.id;
19+
const channelName = channel?.data?.name;
20+
21+
if (typeof channelName === 'string') {
22+
return channelName;
23+
} else {
24+
const members = Object.values(channel?.state?.members || {});
25+
const otherMembers = members.filter(
26+
(member) => member.user.id !== currentUserId,
27+
);
28+
const name = otherMembers
29+
.map((member) => member.user.name || member.user.id || 'Unnamed User')
30+
.join(', ');
31+
32+
return name;
33+
}
34+
};

src/components/ChannelPreview/hooks/useLatestMessagePreview.js

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,26 @@ const getLatestMessageDisplayDate = (message, tDateTimeParser) => {
2828
}
2929
};
3030

31+
const getLatestMessagePreview = (channel, t, tDateTimeParser) => {
32+
const messages = channel?.state?.messages;
33+
34+
if (!messages || !messages.length) {
35+
return {
36+
created_at: '',
37+
messageObject: {},
38+
text: '',
39+
};
40+
} else {
41+
const message = messages[messages.length - 1];
42+
43+
return {
44+
created_at: getLatestMessageDisplayDate(message, tDateTimeParser),
45+
messageObject: { ...message },
46+
text: getLatestMessageDisplayText(message, t),
47+
};
48+
}
49+
};
50+
3151
/**
3252
* Hook to set the display preview for latest message on channel.
3353
*
@@ -37,24 +57,14 @@ const getLatestMessageDisplayDate = (message, tDateTimeParser) => {
3757
*/
3858
export const useLatestMessagePreview = (channel, lastMessage) => {
3959
const { t, tDateTimeParser } = useContext(TranslationContext);
40-
const [latestMessagePreview, setLatestMessagePreview] = useState({});
60+
const [latestMessagePreview, setLatestMessagePreview] = useState(
61+
getLatestMessagePreview(channel, t, tDateTimeParser),
62+
);
4163

4264
useEffect(() => {
43-
if (!channel.state.messages || !channel.state.messages.length) {
44-
setLatestMessagePreview({
45-
created_at: '',
46-
messageObject: {},
47-
text: '',
48-
});
49-
} else {
50-
const message = channel.state.messages[channel.state.messages.length - 1];
51-
52-
setLatestMessagePreview({
53-
created_at: getLatestMessageDisplayDate(message, tDateTimeParser),
54-
messageObject: { ...message },
55-
text: getLatestMessageDisplayText(message, t),
56-
});
57-
}
65+
setLatestMessagePreview(
66+
getLatestMessagePreview(channel, t, tDateTimeParser),
67+
);
5868
}, [channel, lastMessage]);
5969

6070
return latestMessagePreview;

0 commit comments

Comments
 (0)