Skip to content

Commit dfba1ed

Browse files
committed
fix: update ChannelHeader and ChannelPreview titles and images on channel.updated
1 parent 153bd75 commit dfba1ed

File tree

4 files changed

+36
-46
lines changed

4 files changed

+36
-46
lines changed

src/components/Channel/hooks/useCreateChannelStateContext.ts

+1
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ export const useCreateChannelStateContext = <
140140
}),
141141
// eslint-disable-next-line react-hooks/exhaustive-deps
142142
[
143+
channel.data?.name, // otherwise ChannelHeader will not be updated
143144
channelId,
144145
channelUnreadUiState,
145146
debounceURLEnrichmentMs,

src/components/ChannelHeader/ChannelHeader.tsx

+4-6
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ export type ChannelHeaderProps = {
2424
title?: string;
2525
};
2626

27-
const UnMemoizedChannelHeader = <
27+
/**
28+
* The ChannelHeader component renders some basic information about a Channel.
29+
*/
30+
export const ChannelHeader = <
2831
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
2932
>(
3033
props: ChannelHeaderProps,
@@ -86,8 +89,3 @@ const UnMemoizedChannelHeader = <
8689
</div>
8790
);
8891
};
89-
90-
/**
91-
* The ChannelHeader component renders some basic information about a Channel.
92-
*/
93-
export const ChannelHeader = React.memo(UnMemoizedChannelHeader) as typeof UnMemoizedChannelHeader;

src/components/ChannelPreview/hooks/useChannelPreviewInfo.ts

+17-16
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,29 @@ export const useChannelPreviewInfo = <
2121
) => {
2222
const { channel, overrideImage, overrideTitle } = props;
2323

24-
const { client } = useChatContext<StreamChatGenerics>('ChannelPreview');
25-
const [displayTitle, setDisplayTitle] = useState(getDisplayTitle(channel, client.user));
26-
const [displayImage, setDisplayImage] = useState(getDisplayImage(channel, client.user));
24+
const { client } = useChatContext<StreamChatGenerics>('useChannelPreviewInfo');
25+
const [displayTitle, setDisplayTitle] = useState(
26+
overrideTitle || getDisplayTitle(channel, client.user),
27+
);
28+
const [displayImage, setDisplayImage] = useState(
29+
overrideImage || getDisplayImage(channel, client.user),
30+
);
2731

2832
useEffect(() => {
29-
const handleEvent = () => {
30-
setDisplayTitle((displayTitle) => {
31-
const newDisplayTitle = getDisplayTitle(channel, client.user);
32-
return displayTitle !== newDisplayTitle ? newDisplayTitle : displayTitle;
33-
});
34-
setDisplayImage((displayImage) => {
35-
const newDisplayImage = getDisplayImage(channel, client.user);
36-
return displayImage !== newDisplayImage ? newDisplayImage : displayImage;
37-
});
33+
if (overrideTitle && overrideImage) return;
34+
35+
const updateTitles = () => {
36+
if (!overrideTitle) setDisplayTitle(getDisplayTitle(channel, client.user));
37+
if (!overrideImage) setDisplayImage(getDisplayImage(channel, client.user));
3838
};
3939

40-
client.on('user.updated', handleEvent);
40+
updateTitles();
41+
42+
client.on('user.updated', updateTitles);
4143
return () => {
42-
client.off('user.updated', handleEvent);
44+
client.off('user.updated', updateTitles);
4345
};
44-
// eslint-disable-next-line react-hooks/exhaustive-deps
45-
}, []);
46+
}, [channel, channel.data, client, overrideImage, overrideTitle]);
4647

4748
return {
4849
displayImage: overrideImage || displayImage,

src/components/ChannelPreview/utils.tsx

+14-24
Original file line numberDiff line numberDiff line change
@@ -47,40 +47,30 @@ export const getLatestMessagePreview = <
4747
return t('Empty message...');
4848
};
4949

50-
export const getDisplayTitle = <
50+
const getChannelDisplayInfo = <
5151
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
5252
>(
53+
info: 'name' | 'image',
5354
channel: Channel<StreamChatGenerics>,
5455
currentUser?: UserResponse<StreamChatGenerics>,
5556
) => {
56-
let title = channel.data?.name;
57+
if (channel.data?.[info]) return channel.data[info];
5758
const members = Object.values(channel.state.members);
58-
59-
if (!title && members.length === 2) {
60-
const otherMember = members.find((member) => member.user?.id !== currentUser?.id);
61-
if (otherMember?.user?.name) {
62-
title = otherMember.user.name;
63-
}
64-
}
65-
66-
return title;
59+
if (members.length !== 2) return;
60+
const otherMember = members.find((member) => member.user?.id !== currentUser?.id);
61+
return otherMember?.user?.[info];
6762
};
6863

69-
export const getDisplayImage = <
64+
export const getDisplayTitle = <
7065
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
7166
>(
7267
channel: Channel<StreamChatGenerics>,
7368
currentUser?: UserResponse<StreamChatGenerics>,
74-
) => {
75-
let image = channel.data?.image;
76-
const members = Object.values(channel.state.members);
69+
) => getChannelDisplayInfo('name', channel, currentUser);
7770

78-
if (!image && members.length === 2) {
79-
const otherMember = members.find((member) => member.user?.id !== currentUser?.id);
80-
if (otherMember?.user?.image) {
81-
image = otherMember.user.image;
82-
}
83-
}
84-
85-
return image;
86-
};
71+
export const getDisplayImage = <
72+
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
73+
>(
74+
channel: Channel<StreamChatGenerics>,
75+
currentUser?: UserResponse<StreamChatGenerics>,
76+
) => getChannelDisplayInfo('image', channel, currentUser);

0 commit comments

Comments
 (0)