Skip to content

Commit 38356fc

Browse files
committed
fix: improve scrolling fast scenario for scroll to target message
1 parent 4dbaef2 commit 38356fc

File tree

7 files changed

+29
-7
lines changed

7 files changed

+29
-7
lines changed

package/src/components/Channel/Channel.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ const ChannelWithContext = <
675675

676676
const syncingChannelRef = useRef(false);
677677

678-
const { setTargetedMessage, targetedMessage } = useTargetedMessage();
678+
const { highlightedMessageId, setTargetedMessage, targetedMessage } = useTargetedMessage();
679679

680680
/**
681681
* This ref will hold the abort controllers for
@@ -1648,6 +1648,7 @@ const ChannelWithContext = <
16481648
!!(clientChannelConfig?.commands || [])?.some((command) => command.name === 'giphy'),
16491649
hideDateSeparators,
16501650
hideStickyDateHeader,
1651+
highlightedMessageId,
16511652
isChannelActive: shouldSyncChannel,
16521653
lastRead,
16531654
loadChannelAroundMessage,

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const useCreateChannelContext = <
1616
giphyEnabled,
1717
hideDateSeparators,
1818
hideStickyDateHeader,
19+
highlightedMessageId,
1920
isChannelActive,
2021
lastRead,
2122
loadChannelAroundMessage,
@@ -60,6 +61,7 @@ export const useCreateChannelContext = <
6061
giphyEnabled,
6162
hideDateSeparators,
6263
hideStickyDateHeader,
64+
highlightedMessageId,
6365
isChannelActive,
6466
lastRead,
6567
loadChannelAroundMessage,
@@ -89,6 +91,7 @@ export const useCreateChannelContext = <
8991
disabled,
9092
error,
9193
isChannelActive,
94+
highlightedMessageId,
9295
lastReadTime,
9396
loading,
9497
membersLength,

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@ export const useMessageListPagination = <
210210
firstUnreadMessageId =
211211
messageIdx > -1 ? channel.state.messages[messageIdx + 1]?.id : undefined;
212212
} else {
213-
// TODO
214213
const lastReadTimestamp = last_read.getTime();
215214
const { index: lastReadIdx, message: lastReadMessage } = findInMessagesByDate(
216215
channel.state.messages,

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,41 @@ import { useEffect, useRef, useState } from 'react';
22

33
export const useTargetedMessage = (messageId?: string) => {
44
const clearTargetedMessageCall = useRef<ReturnType<typeof setTimeout>>();
5-
const [targetedMessage, setTargetedMessage] = useState(messageId);
5+
const [targetedMessage, setTargetedMessage] = useState<string | undefined>(messageId);
6+
const [highlightedMessageId, setHighlightedMessageId] = useState<string | undefined>();
67
const prevTargetedMessageRef = useRef<string>();
78

89
useEffect(() => {
910
prevTargetedMessageRef.current = targetedMessage;
11+
if (targetedMessage) {
12+
setHighlightedMessageId(targetedMessage);
13+
}
1014
}, [targetedMessage]);
1115

1216
useEffect(() => {
1317
clearTargetedMessageCall.current = setTimeout(() => {
1418
setTargetedMessage(undefined);
19+
setHighlightedMessageId(undefined);
1520
}, 3000);
1621

1722
return () => {
1823
clearTargetedMessageCall.current && clearTimeout(clearTargetedMessageCall.current);
1924
};
2025
}, []);
2126

22-
const setTargetedMessageTimeoutRef = useRef((messageId: string) => {
27+
const setTargetedMessageTimeoutRef = useRef((messageId: string | undefined) => {
2328
clearTargetedMessageCall.current && clearTimeout(clearTargetedMessageCall.current);
2429

2530
clearTargetedMessageCall.current = setTimeout(() => {
2631
setTargetedMessage(undefined);
32+
setHighlightedMessageId(undefined);
2733
}, 3000);
2834

2935
setTargetedMessage(messageId);
3036
});
3137

3238
return {
39+
highlightedMessageId,
3340
prevTargetedMessage: prevTargetedMessageRef.current,
3441
setTargetedMessage: setTargetedMessageTimeoutRef.current,
3542
targetedMessage,

package/src/components/MessageList/InlineUnreadIndicator.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ export const InlineUnreadIndicator = () => {
1616
const { t } = useTranslationContext();
1717

1818
return (
19-
<View style={[styles.container, { backgroundColor: light_gray }, container]}>
19+
<View
20+
accessibilityLabel='Inline unread indicator'
21+
style={[styles.container, { backgroundColor: light_gray }, container]}
22+
>
2023
<Text style={[styles.text, { color: grey }, text]}>{t<string>('Unread Messages')}</Text>
2124
</View>
2225
);

package/src/components/MessageList/MessageList.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ type MessageListPropsWithContext<
113113
| 'disabled'
114114
| 'EmptyStateIndicator'
115115
| 'hideStickyDateHeader'
116+
| 'highlightedMessageId'
116117
| 'loadChannelAroundMessage'
117118
| 'loadChannelAtFirstUnreadMessage'
118119
| 'loading'
@@ -243,6 +244,7 @@ const MessageListWithContext = <
243244
FooterComponent = InlineLoadingMoreIndicator,
244245
HeaderComponent = LoadingMoreRecentIndicator,
245246
hideStickyDateHeader,
247+
highlightedMessageId,
246248
initialScrollToFirstUnreadMessage,
247249
InlineDateSeparator,
248250
InlineUnreadIndicator,
@@ -615,7 +617,7 @@ const MessageListWithContext = <
615617
<Message
616618
goToMessage={goToMessage}
617619
groupStyles={isMessageWithStylesReadByAndDateSeparator(message) ? message.groupStyles : []}
618-
isTargetedMessage={targetedMessage === message.id}
620+
isTargetedMessage={highlightedMessageId === message.id}
619621
lastReceivedId={
620622
lastReceivedId === message.id || message.quoted_message_id ? lastReceivedId : undefined
621623
}
@@ -916,6 +918,7 @@ const MessageListWithContext = <
916918
index: indexOfParentInMessageList,
917919
viewPosition: 0.5, // try to place message in the center of the screen
918920
});
921+
setTargetedMessage(undefined);
919922
}
920923
}, 50);
921924

@@ -1181,6 +1184,7 @@ export const MessageList = <
11811184
enableMessageGroupingByUser,
11821185
error,
11831186
hideStickyDateHeader,
1187+
highlightedMessageId,
11841188
isChannelActive,
11851189
loadChannelAroundMessage,
11861190
loadChannelAtFirstUnreadMessage,
@@ -1235,6 +1239,7 @@ export const MessageList = <
12351239
error,
12361240
FlatList,
12371241
hideStickyDateHeader,
1242+
highlightedMessageId,
12381243
initialScrollToFirstUnreadMessage,
12391244
InlineDateSeparator,
12401245
InlineUnreadIndicator,

package/src/contexts/channelContext/ChannelContext.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ export type ChannelContextValue<
129129
React.SetStateAction<ChannelUnreadState<StreamChatGenerics> | undefined>
130130
>;
131131
setLastRead: React.Dispatch<React.SetStateAction<Date | undefined>>;
132-
setTargetedMessage: (messageId: string) => void;
132+
setTargetedMessage: (messageId?: string) => void;
133133
/**
134134
* Abort controller for cancelling async requests made for uploading images/files
135135
* Its a map of filename and AbortController
@@ -138,6 +138,10 @@ export type ChannelContextValue<
138138
channelUnreadState?: ChannelUnreadState<StreamChatGenerics>;
139139
disabled?: boolean;
140140
enableMessageGroupingByUser?: boolean;
141+
/**
142+
* Id of message, which is highlighted in the channel.
143+
*/
144+
highlightedMessageId?: string;
141145
isChannelActive?: boolean;
142146

143147
lastRead?: Date;

0 commit comments

Comments
 (0)