Skip to content

Commit 0b77f9a

Browse files
committed
fix: improve channel preview display hooks and long title issue
1 parent a9397c4 commit 0b77f9a

File tree

5 files changed

+44
-73
lines changed

5 files changed

+44
-73
lines changed

Diff for: package/src/components/ChannelPreview/hooks/useChannelPreviewDisplayAvatar.ts

+4-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState } from 'react';
1+
import { useMemo } from 'react';
22

33
import type { Channel, StreamChat } from 'stream-chat';
44

@@ -61,19 +61,10 @@ export const useChannelPreviewDisplayAvatar = <
6161
) => {
6262
const { client } = useChatContext<StreamChatGenerics>();
6363

64-
const channelData = channel?.data;
65-
const image = channelData?.image;
66-
const name = channelData?.name;
67-
const id = client?.user?.id;
68-
69-
const [displayAvatar, setDisplayAvatar] = useState(
70-
getChannelPreviewDisplayAvatar(channel, client),
64+
const displayAvatar = useMemo(
65+
() => getChannelPreviewDisplayAvatar(channel, client),
66+
[channel, client],
7167
);
7268

73-
useEffect(() => {
74-
setDisplayAvatar(getChannelPreviewDisplayAvatar(channel, client));
75-
// eslint-disable-next-line react-hooks/exhaustive-deps
76-
}, [id, image, name]);
77-
7869
return displayAvatar;
7970
};

Diff for: package/src/components/ChannelPreview/hooks/useChannelPreviewDisplayName.ts

+9-17
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState } from 'react';
1+
import { useMemo } from 'react';
22

33
import type { Channel, ChannelMemberResponse } from 'stream-chat';
44

@@ -26,7 +26,9 @@ export const getChannelPreviewDisplayName = <
2626
members?: Channel<StreamChatGenerics>['state']['members'];
2727
}): string => {
2828
if (channelName) {
29-
return channelName;
29+
return channelName.length > characterLimit
30+
? `${channelName.slice(0, characterLimit - ELLIPSIS.length)}${ELLIPSIS}`
31+
: channelName;
3032
}
3133

3234
const channelMembers = Object.values(members || {});
@@ -83,33 +85,23 @@ export const useChannelPreviewDisplayName = <
8385
const { client } = useChatContext<StreamChatGenerics>();
8486
const { vw } = useViewport();
8587

86-
const DEFAULT_MAX_CHARACTER_LENGTH = (vw(100) - 16) / 6;
88+
const DEFAULT_MAX_CHARACTER_LENGTH = Math.floor((vw(100) - 16) / 6);
8789

8890
const currentUserId = client?.userID;
8991
const members = channel?.state?.members;
90-
const numOfMembers = Object.keys(members || {}).length;
9192
const channelName = channel?.data?.name;
9293
const characterLimit = characterLength || DEFAULT_MAX_CHARACTER_LENGTH;
93-
const [displayName, setDisplayName] = useState(
94-
getChannelPreviewDisplayName({
95-
channelName,
96-
characterLimit,
97-
currentUserId,
98-
members,
99-
}),
100-
);
10194

102-
useEffect(() => {
103-
setDisplayName(
95+
const displayName = useMemo(
96+
() =>
10497
getChannelPreviewDisplayName({
10598
channelName,
10699
characterLimit,
107100
currentUserId,
108101
members,
109102
}),
110-
);
111-
// eslint-disable-next-line react-hooks/exhaustive-deps
112-
}, [channelName, currentUserId, characterLimit, numOfMembers]);
103+
[channelName, characterLimit, currentUserId, members],
104+
);
113105

114106
return displayName;
115107
};

Diff for: package/src/components/ChannelPreview/hooks/useChannelPreviewDisplayPresence.ts

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState } from 'react';
1+
import { useMemo } from 'react';
22

33
import type { Channel, StreamChat } from 'stream-chat';
44

@@ -44,11 +44,10 @@ export const useChannelPreviewDisplayPresence = <
4444
);
4545
const channelMemberOnline = members.some((member) => member.user?.online);
4646

47-
const [displayPresence, setDisplayPresence] = useState(false);
48-
49-
useEffect(() => {
50-
setDisplayPresence(getChannelPreviewDisplayPresence(channel, client));
51-
}, [channel, channelMemberOnline, client]);
47+
const displayPresence = useMemo(() => {
48+
return getChannelPreviewDisplayPresence(channel, client);
49+
// eslint-disable-next-line react-hooks/exhaustive-deps
50+
}, [channel, client, channelMemberOnline]);
5251

5352
return displayPresence;
5453
};

Diff for: package/src/components/ChannelPreview/hooks/useIsChannelMuted.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ import { useChatContext } from '../../../contexts/chatContext/ChatContext';
66

77
import type { DefaultStreamChatGenerics } from '../../../types/types';
88

9+
const defaultMuteStatus = {
10+
createdAt: null,
11+
expiresAt: null,
12+
muted: false,
13+
};
14+
915
export const useIsChannelMuted = <
1016
StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
1117
>(
@@ -24,5 +30,5 @@ export const useIsChannelMuted = <
2430
return () => client.off('notification.channel_mutes_updated', handleEvent);
2531
}, [channel, client, muted]);
2632

27-
return muted || { createdAt: null, expiresAt: null, muted: false };
33+
return muted ?? defaultMuteStatus;
2834
};

Diff for: package/src/components/ChannelPreview/hooks/useLatestMessagePreview.ts

+19-36
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useState } from 'react';
1+
import { useEffect, useMemo, useState } from 'react';
22

33
import { TFunction } from 'i18next';
44
import type {
@@ -286,19 +286,6 @@ export const useLatestMessagePreview = <
286286
: '';
287287

288288
const [readEvents, setReadEvents] = useState(true);
289-
const [latestMessagePreview, setLatestMessagePreview] = useState<
290-
LatestMessagePreview<StreamChatGenerics>
291-
>({
292-
created_at: '',
293-
messageObject: undefined,
294-
previews: [
295-
{
296-
bold: false,
297-
text: '',
298-
},
299-
],
300-
status: MessageReadStatus.NOT_SENT_BY_CURRENT_USER,
301-
});
302289

303290
const readStatus = getLatestMessageReadStatus(channel, client, translatedLastMessage, readEvents);
304291

@@ -319,29 +306,25 @@ export const useLatestMessagePreview = <
319306
useStateStore(poll?.state, selector) ?? {};
320307
const { createdBy, latestVotesByOption, name } = pollState;
321308

322-
useEffect(
323-
() =>
324-
setLatestMessagePreview(
325-
getLatestMessagePreview({
326-
channel,
327-
client,
328-
lastMessage: translatedLastMessage,
329-
pollState,
330-
readEvents,
331-
t,
332-
}),
333-
),
334-
// eslint-disable-next-line react-hooks/exhaustive-deps
335-
[
336-
channelLastMessageString,
337-
forceUpdate,
309+
const latestMessagePreview = useMemo(() => {
310+
return getLatestMessagePreview({
311+
channel,
312+
client,
313+
lastMessage: translatedLastMessage,
314+
pollState,
338315
readEvents,
339-
readStatus,
340-
latestVotesByOption,
341-
createdBy,
342-
name,
343-
],
344-
);
316+
t,
317+
});
318+
// eslint-disable-next-line react-hooks/exhaustive-deps
319+
}, [
320+
channelLastMessageString,
321+
forceUpdate,
322+
readEvents,
323+
readStatus,
324+
latestVotesByOption,
325+
createdBy,
326+
name,
327+
]);
345328

346329
return latestMessagePreview;
347330
};

0 commit comments

Comments
 (0)