Skip to content

Commit d9e83fc

Browse files
committed
fix: add improvements around read channel state
1 parent fe294a2 commit d9e83fc

File tree

4 files changed

+19
-10
lines changed

4 files changed

+19
-10
lines changed

examples/SampleApp/src/screens/ChannelListScreen.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ export const ChannelListScreen: React.FC = () => {
187187
filters={filters}
188188
HeaderNetworkDownIndicator={() => null}
189189
maxUnreadCount={99}
190-
onSelect={async (channel) => {
190+
onSelect={(channel) => {
191191
navigation.navigate('ChannelScreen', {
192192
channel,
193193
});

package/src/components/Channel/Channel.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ const ChannelWithContext = <
517517
CreatePollContent,
518518
DateHeader = DateHeaderDefault,
519519
deletedMessagesVisibilityType = 'always',
520-
disableIfFrozenChannel = false,
520+
disableIfFrozenChannel = true,
521521
disableKeyboardCompatibleView = false,
522522
disableTypingIndicator,
523523
dismissKeyboardOnMessageTouch = true,
@@ -716,6 +716,7 @@ const ChannelWithContext = <
716716
const {
717717
copyStateFromChannel,
718718
initStateFromChannel,
719+
setRead,
719720
setTyping,
720721
state: channelState,
721722
} = useChannelDataState<StreamChatGenerics>(channel);
@@ -878,7 +879,7 @@ const ChannelWithContext = <
878879
*/
879880
useEffect(() => {
880881
const handleEvent: EventHandler<StreamChatGenerics> = (event) => {
881-
if (channel.cid === event.cid) copyChannelState();
882+
if (channel.cid === event.cid) setRead(channel);
882883
};
883884

884885
const { unsubscribe } = client.on('notification.mark_read', handleEvent);

package/src/components/Channel/hooks/useChannelDataState.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,13 @@ export const useChannelDataState = <
219219
}));
220220
}, []);
221221

222+
const setRead = useCallback((channel: Channel<StreamChatGenerics>) => {
223+
setState((prev) => ({
224+
...prev,
225+
read: { ...channel.state.read }, // Synchronize the read state from the channel
226+
}));
227+
}, []);
228+
222229
const setTyping = useCallback((channel: Channel<StreamChatGenerics>) => {
223230
setState((prev) => ({
224231
...prev,
@@ -229,6 +236,7 @@ export const useChannelDataState = <
229236
return {
230237
copyStateFromChannel,
231238
initStateFromChannel,
239+
setRead,
232240
setTyping,
233241
state,
234242
};

package/src/components/Channel/hooks/useMessageListPagination.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -197,27 +197,27 @@ export const useMessageListPagination = <
197197
let firstUnreadMessageId = first_unread_message_id;
198198
let lastReadMessageId = last_read_message_id;
199199
let isInCurrentMessageSet = false;
200+
const messagesState = channel.state.messages;
200201

201202
// If the first unread message is already in the current message set, we don't need to load more messages.
202203
if (firstUnreadMessageId) {
203-
const messageIdx = findInMessagesById(channel.state.messages, firstUnreadMessageId);
204+
const messageIdx = findInMessagesById(messagesState, firstUnreadMessageId);
204205
isInCurrentMessageSet = messageIdx !== -1;
205206
}
206207
// If the last read message is already in the current message set, we don't need to load more messages, and we set the first unread message id as that is what we want to operate on.
207208
else if (lastReadMessageId) {
208-
const messageIdx = findInMessagesById(channel.state.messages, lastReadMessageId);
209+
const messageIdx = findInMessagesById(messagesState, lastReadMessageId);
209210
isInCurrentMessageSet = messageIdx !== -1;
210-
firstUnreadMessageId =
211-
messageIdx > -1 ? channel.state.messages[messageIdx + 1]?.id : undefined;
211+
firstUnreadMessageId = messageIdx > -1 ? messagesState[messageIdx + 1]?.id : undefined;
212212
} else {
213213
const lastReadTimestamp = last_read.getTime();
214214
const { index: lastReadIdx, message: lastReadMessage } = findInMessagesByDate(
215-
channel.state.messages,
215+
messagesState,
216216
last_read,
217217
);
218218
if (lastReadMessage) {
219219
lastReadMessageId = lastReadMessage.id;
220-
firstUnreadMessageId = channel.state.messages[lastReadIdx + 1].id;
220+
firstUnreadMessageId = messagesState[lastReadIdx + 1].id;
221221
isInCurrentMessageSet = !!firstUnreadMessageId;
222222
} else {
223223
setLoadingMore(true);
@@ -227,7 +227,7 @@ export const useMessageListPagination = <
227227
messages = await fetchMessagesAround(channel, last_read.toISOString(), limit);
228228
} catch (error) {
229229
setLoading(false);
230-
loadMoreFinished(channel.state.messagePagination.hasPrev, channel.state.messages);
230+
loadMoreFinished(channel.state.messagePagination.hasPrev, messagesState);
231231
console.log('Loading channel at first unread message failed with error:', error);
232232
return;
233233
}

0 commit comments

Comments
 (0)