Skip to content

Commit 4b9d66d

Browse files
committed
fix: improve uselatestmessagepreview
1 parent 5c31e75 commit 4b9d66d

File tree

1 file changed

+32
-31
lines changed

1 file changed

+32
-31
lines changed

package/src/components/ChannelPreview/hooks/useLatestMessagePreview.ts

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
AttachmentManagerState,
66
Channel,
77
ChannelState,
8+
DraftMessage,
89
MessageResponse,
910
PollState,
1011
PollVote,
@@ -85,8 +86,7 @@ const getMentionUsers = (mentionedUser: UserResponse[] | undefined) => {
8586
const getLatestMessageDisplayText = (
8687
channel: Channel,
8788
client: StreamChat,
88-
draftText: string | undefined,
89-
draftAttachments: boolean | undefined,
89+
draftMessage: DraftMessage | undefined,
9090
message: LatestMessage | undefined,
9191
t: (key: string) => string,
9292
pollState: LatestMessagePreviewSelectorReturnType | undefined,
@@ -106,18 +106,21 @@ const getLatestMessageDisplayText = (
106106
? `${messageSender === t('You') ? '' : '@'}${messageSender}: `
107107
: '';
108108
const boldOwner = messageSenderText.includes('@');
109-
if (draftText) {
110-
return [
111-
{ bold: true, draft: true, text: 'Draft:' },
112-
{ bold: false, text: draftText },
113-
];
114-
}
115-
if (draftAttachments) {
116-
return [
117-
{ bold: true, draft: true, text: 'Draft:' },
118-
{ bold: false, text: t('🏙 Attachment...') },
119-
];
109+
if (draftMessage) {
110+
if (draftMessage.attachments?.length) {
111+
return [
112+
{ bold: true, draft: true, text: 'Draft:' },
113+
{ bold: false, text: t('🏙 Attachment...') },
114+
];
115+
}
116+
if (draftMessage.text) {
117+
return [
118+
{ bold: true, draft: true, text: 'Draft:' },
119+
{ bold: false, text: draftMessage.text },
120+
];
121+
}
120122
}
123+
121124
if (message.text) {
122125
// rough guess optimization to limit string preview to max 100 characters
123126
const shortenedText = message.text.substring(0, 100).replace(/\n/g, ' ');
@@ -218,15 +221,13 @@ const getLatestMessageReadStatus = (
218221
const getLatestMessagePreview = (params: {
219222
channel: Channel;
220223
client: StreamChat;
221-
draftText?: string;
222-
draftAttachments?: boolean;
224+
draftMessage?: DraftMessage;
223225
pollState: LatestMessagePreviewSelectorReturnType | undefined;
224226
readEvents: boolean;
225227
t: TFunction;
226228
lastMessage?: ReturnType<ChannelState['formatMessage']> | MessageResponse;
227229
}) => {
228-
const { channel, client, draftText, draftAttachments, lastMessage, pollState, readEvents, t } =
229-
params;
230+
const { channel, client, draftMessage, lastMessage, pollState, readEvents, t } = params;
230231

231232
const messages = channel.state.messages;
232233

@@ -251,15 +252,7 @@ const getLatestMessagePreview = (params: {
251252
return {
252253
created_at: message?.created_at,
253254
messageObject: message,
254-
previews: getLatestMessageDisplayText(
255-
channel,
256-
client,
257-
draftText,
258-
draftAttachments,
259-
message,
260-
t,
261-
pollState,
262-
),
255+
previews: getLatestMessageDisplayText(channel, client, draftMessage, message, t, pollState),
263256
status: getLatestMessageReadStatus(channel, client, message, readEvents),
264257
};
265258
};
@@ -297,7 +290,17 @@ export const useLatestMessagePreview = (
297290
stateSelector,
298291
);
299292

300-
const draftAttachments = attachments.length > 0;
293+
const draftMessage: DraftMessage | undefined = useMemo(
294+
() =>
295+
!channel.messageComposer.compositionIsEmpty
296+
? {
297+
attachments,
298+
id: channel.messageComposer.id,
299+
text: draftText,
300+
}
301+
: undefined,
302+
[channel.messageComposer, attachments, draftText],
303+
);
301304

302305
const channelConfigExists = typeof channel?.getConfig === 'function';
303306

@@ -330,8 +333,7 @@ export const useLatestMessagePreview = (
330333
return getLatestMessagePreview({
331334
channel,
332335
client,
333-
draftAttachments,
334-
draftText,
336+
draftMessage,
335337
lastMessage: translatedLastMessage,
336338
pollState,
337339
readEvents,
@@ -340,8 +342,7 @@ export const useLatestMessagePreview = (
340342
// eslint-disable-next-line react-hooks/exhaustive-deps
341343
}, [
342344
channelLastMessageString,
343-
draftText,
344-
draftAttachments,
345+
draftMessage,
345346
forceUpdate,
346347
readEvents,
347348
readStatus,

0 commit comments

Comments
 (0)