|
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