Skip to content

Commit 6ff8c0d

Browse files
committed
chore: enhance unread message detection logic in GroupChannelMessageList
1 parent b65b30b commit 6ff8c0d

File tree

1 file changed

+29
-14
lines changed

1 file changed

+29
-14
lines changed

packages/uikit-react-native/src/domain/groupChannel/component/GroupChannelMessageList.tsx

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -104,31 +104,46 @@ const GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {
104104
confirmAndMarkAsRead([props.channel]);
105105
}, [updateHasSeenNewLine, updateHasUserMarkedAsUnread, props.channel.url, props.resetNewMessages]);
106106

107+
const getPrevNonSilentMessage = useCallback(
108+
(messages: SendbirdMessage[], prevMessageIndex: number): SendbirdMessage | null => {
109+
if (messages.length <= prevMessageIndex) {
110+
return null;
111+
}
112+
113+
const prevMessage = props.messages[prevMessageIndex];
114+
if (prevMessage) {
115+
if (prevMessage.silent) {
116+
return getPrevNonSilentMessage(messages, prevMessageIndex + 1);
117+
} else {
118+
return prevMessage;
119+
}
120+
}
121+
return null;
122+
},
123+
[],
124+
);
125+
107126
const findUnreadFirstMessage = useFreshCallback((isNewLineExistInChannel: boolean) => {
108127
if (!sbOptions.uikit.groupChannel.channel.enableMarkAsUnread || !isNewLineExistInChannel) {
109128
return;
110129
}
111130

112131
return props.messages.find((msg, index) => {
132+
if (msg.silent) {
133+
return false;
134+
}
135+
113136
const isMarkedAsUnreadMessage = props.channel.myLastRead === msg.createdAt - 1;
114137
if (isMarkedAsUnreadMessage) {
115138
return true;
116139
}
117140

118-
let isFirstUnreadAfterReadMessages;
119-
if (index < props.messages.length - 1) {
120-
const prevMessage = props.messages[index + 1];
121-
const hasNoPreviousAndNoPrevMessage = !props.hasPrevious?.() && prevMessage == null;
122-
const prevMessageIsRead = prevMessage != null && prevMessage.createdAt <= props.channel.myLastRead;
123-
const isMessageUnread = props.channel.myLastRead < msg.createdAt;
124-
isFirstUnreadAfterReadMessages = (hasNoPreviousAndNoPrevMessage || prevMessageIsRead) && isMessageUnread;
125-
} else {
126-
const hasNoPreviousAndNoPrevMessage = !props.hasPrevious?.();
127-
const isMessageUnread = props.channel.myLastRead < msg.createdAt;
128-
isFirstUnreadAfterReadMessages = hasNoPreviousAndNoPrevMessage && isMessageUnread;
129-
}
130-
131-
return isFirstUnreadAfterReadMessages;
141+
const prevNonSilentMessage = getPrevNonSilentMessage(props.messages, index + 1);
142+
const hasNoPreviousAndNoPrevMessage = !props.hasPrevious?.() && prevNonSilentMessage == null;
143+
const prevMessageIsRead =
144+
prevNonSilentMessage != null && prevNonSilentMessage.createdAt <= props.channel.myLastRead;
145+
const isMessageUnread = props.channel.myLastRead < msg.createdAt;
146+
return (hasNoPreviousAndNoPrevMessage || prevMessageIsRead) && isMessageUnread;
132147
});
133148
});
134149

0 commit comments

Comments
 (0)