|
1 | 1 | import type { ViewToken } from '@react-native/virtualized-lists';
|
2 |
| -import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; |
| 2 | +import React, { useCallback, useContext, useEffect, useRef, useState } from 'react'; |
3 | 3 |
|
4 | 4 | import { useToast } from '@sendbird/uikit-react-native-foundation';
|
5 | 5 | import { useGroupChannelHandler } from '@sendbird/uikit-tools';
|
@@ -32,10 +32,19 @@ const GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {
|
32 | 32 |
|
33 | 33 | const isFirstMount = useIsFirstMount();
|
34 | 34 |
|
35 |
| - const { hasSeenNewLineRef, isNewLineInViewportRef, updateHasSeenNewLine, updateIsNewLineInViewport } = |
36 |
| - useNewLineTracker({ |
37 |
| - onNewLineSeenChange: props.onNewLineSeenChange, |
38 |
| - }); |
| 35 | + const hasSeenNewLineRef = useRef(false); |
| 36 | + const isNewLineInViewportRef = useRef(false); |
| 37 | + const [isVisibleUnreadMessageFloating, setIsVisibleUnreadMessageFloating] = useState(false); |
| 38 | + |
| 39 | + const updateHasSeenNewLine = useCallback( |
| 40 | + (hasSeenNewLine: boolean) => { |
| 41 | + if (hasSeenNewLineRef.current !== hasSeenNewLine) { |
| 42 | + hasSeenNewLineRef.current = hasSeenNewLine; |
| 43 | + props.onNewLineSeenChange?.(hasSeenNewLine); |
| 44 | + } |
| 45 | + }, |
| 46 | + [props.onNewLineSeenChange], |
| 47 | + ); |
39 | 48 |
|
40 | 49 | const viewableMessages = useRef<SendbirdMessage[]>();
|
41 | 50 | const hasUserMarkedAsUnreadRef = useRef(false);
|
@@ -135,11 +144,16 @@ const GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {
|
135 | 144 | );
|
136 | 145 |
|
137 | 146 | if (isNewLineInViewportRef.current !== isNewLineInViewport) {
|
138 |
| - updateIsNewLineInViewport(isNewLineInViewport); |
139 |
| - if (!isNewLineInViewport || hasSeenNewLineRef.current) return; |
| 147 | + isNewLineInViewportRef.current = isNewLineInViewport; |
| 148 | + updateUnreadMessagesFloatingProps(); |
| 149 | + if (!isNewLineInViewport || hasSeenNewLineRef.current) { |
| 150 | + return; |
| 151 | + } |
140 | 152 |
|
141 | 153 | updateHasSeenNewLine(true);
|
142 |
| - if (hasUserMarkedAsUnreadRef.current) return; |
| 154 | + if (hasUserMarkedAsUnreadRef.current) { |
| 155 | + return; |
| 156 | + } |
143 | 157 |
|
144 | 158 | if (0 < props.newMessages.length) {
|
145 | 159 | props.channel.markAsUnread(props.newMessages[0]);
|
@@ -170,20 +184,25 @@ const GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {
|
170 | 184 | [sbOptions.uikit.groupChannel.channel.enableMarkAsUnread, updateHasUserMarkedAsUnread],
|
171 | 185 | );
|
172 | 186 |
|
173 |
| - const unreadMessagesFloatingProps: UnreadMessagesFloatingProps = useMemo(() => { |
174 |
| - return { |
| 187 | + const unreadMessagesFloatingPropsRef = useRef<UnreadMessagesFloatingProps>(); |
| 188 | + const updateUnreadMessagesFloatingProps = useFreshCallback(() => { |
| 189 | + unreadMessagesFloatingPropsRef.current = { |
175 | 190 | visible:
|
176 | 191 | sbOptions.uikit.groupChannel.channel.enableMarkAsUnread &&
|
| 192 | + !!props.isNewLineExistInChannel && |
177 | 193 | 0 < props.channel.unreadMessageCount &&
|
178 | 194 | !isNewLineInViewportRef.current,
|
179 | 195 | onPressClose: onPressUnreadMessagesFloatingCloseButton,
|
180 | 196 | unreadMessageCount: props.channel.unreadMessageCount,
|
181 | 197 | };
|
182 |
| - }, [ |
183 |
| - isNewLineInViewportRef.current, |
184 |
| - props.channel.unreadMessageCount, |
185 |
| - sbOptions.uikit.groupChannel.channel.enableMarkAsUnread, |
186 |
| - ]); |
| 198 | + if (isVisibleUnreadMessageFloating !== unreadMessagesFloatingPropsRef.current.visible) { |
| 199 | + setIsVisibleUnreadMessageFloating(unreadMessagesFloatingPropsRef.current.visible); |
| 200 | + } |
| 201 | + }); |
| 202 | + |
| 203 | + useEffect(() => { |
| 204 | + updateUnreadMessagesFloatingProps(); |
| 205 | + }, [props.isNewLineExistInChannel, sbOptions.uikit.groupChannel.channel.enableMarkAsUnread]); |
187 | 206 |
|
188 | 207 | useGroupChannelHandler(sdk, {
|
189 | 208 | onReactionUpdated(channel, event) {
|
@@ -231,6 +250,10 @@ const GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {
|
231 | 250 | scrollToBottom(false);
|
232 | 251 | break;
|
233 | 252 | }
|
| 253 | + case 'ON_MARKED_AS_READ_BY_CURRENT_USER': { |
| 254 | + updateUnreadMessagesFloatingProps(); |
| 255 | + break; |
| 256 | + } |
234 | 257 | case 'ON_MARKED_AS_UNREAD_BY_CURRENT_USER': {
|
235 | 258 | const foundUnreadFirstMessage = findUnreadFirstMessage(true);
|
236 | 259 | processNewLineVisibility(foundUnreadFirstMessage);
|
@@ -293,34 +316,9 @@ const GroupChannelMessageList = (props: GroupChannelProps['MessageList']) => {
|
293 | 316 | onPressScrollToBottomButton={scrollToBottom}
|
294 | 317 | onPressMarkAsUnreadMessage={onPressMarkAsUnreadMessage}
|
295 | 318 | unreadFirstMessage={unreadFirstMessage}
|
296 |
| - unreadMessagesFloatingProps={unreadMessagesFloatingProps} |
| 319 | + unreadMessagesFloatingProps={unreadMessagesFloatingPropsRef.current} |
297 | 320 | />
|
298 | 321 | );
|
299 | 322 | };
|
300 | 323 |
|
301 |
| -const useNewLineTracker = (params: Pick<GroupChannelProps['MessageList'], 'onNewLineSeenChange'>) => { |
302 |
| - const hasSeenNewLineRef = useRef(false); |
303 |
| - const isNewLineInViewportRef = useRef(false); |
304 |
| - |
305 |
| - const updateHasSeenNewLine = useCallback( |
306 |
| - (hasSeenNewLine: boolean) => { |
307 |
| - if (hasSeenNewLineRef.current !== hasSeenNewLine) { |
308 |
| - hasSeenNewLineRef.current = hasSeenNewLine; |
309 |
| - params.onNewLineSeenChange?.(hasSeenNewLine); |
310 |
| - } |
311 |
| - }, |
312 |
| - [params.onNewLineSeenChange], |
313 |
| - ); |
314 |
| - |
315 |
| - const updateIsNewLineInViewport = useCallback((isNewLineInViewport: boolean) => { |
316 |
| - isNewLineInViewportRef.current = isNewLineInViewport; |
317 |
| - }, []); |
318 |
| - |
319 |
| - return { |
320 |
| - hasSeenNewLineRef, |
321 |
| - isNewLineInViewportRef, |
322 |
| - updateHasSeenNewLine, |
323 |
| - updateIsNewLineInViewport, |
324 |
| - }; |
325 |
| -}; |
326 | 324 | export default React.memo(GroupChannelMessageList);
|
0 commit comments