1- import React , { useCallback , useEffect } from 'react' ;
1+ import { useEffect , useRef , useState } from 'react' ;
22import { StreamMessage } from '../../../../context' ;
33import { DefaultStreamChatGenerics } from '../../../../types/types' ;
44
55type UseScrollToBottomOnNewMessageParams <
66 StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics
77> = {
8- /** */
98 scrollToBottom : ( ) => void ;
109 messages ?: StreamMessage < StreamChatGenerics > [ ] ;
1110 /** When `true`, the list will scroll to the latest message when the window regains focus */
@@ -19,41 +18,43 @@ export const useScrollToBottomOnNewMessage = <
1918 scrollToBottom,
2019 scrollToLatestMessageOnFocus,
2120} : UseScrollToBottomOnNewMessageParams < StreamChatGenerics > ) => {
22- const [ newMessagesReceivedInBackground , setNewMessagesReceivedInBackground ] = React . useState (
23- false ,
24- ) ;
21+ const [ newMessagesReceivedInBackground , setNewMessagesReceivedInBackground ] = useState ( false ) ;
2522
26- const resetNewMessagesReceivedInBackground = useCallback ( ( ) => {
27- setNewMessagesReceivedInBackground ( false ) ;
28- } , [ ] ) ;
23+ const scrollToBottomIfConfigured = useRef < ( e : Event ) => void > ( ) ;
24+
25+ scrollToBottomIfConfigured . current = ( event : Event ) => {
26+ if (
27+ ! scrollToLatestMessageOnFocus ||
28+ ! newMessagesReceivedInBackground ||
29+ event . target !== window
30+ ) {
31+ return ;
32+ }
33+
34+ setTimeout ( scrollToBottom , 100 ) ;
35+ } ;
2936
3037 useEffect ( ( ) => {
3138 setNewMessagesReceivedInBackground ( true ) ;
3239 } , [ messages ] ) ;
3340
34- const scrollToBottomIfConfigured = useCallback (
35- ( event : Event ) => {
36- if (
37- ! scrollToLatestMessageOnFocus ||
38- ! newMessagesReceivedInBackground ||
39- event . target !== window
40- )
41- return ;
42- setTimeout ( scrollToBottom , 100 ) ;
43- } ,
44- [ scrollToLatestMessageOnFocus , scrollToBottom , newMessagesReceivedInBackground ] ,
45- ) ;
46-
4741 useEffect ( ( ) => {
42+ const handleFocus = ( event : Event ) => {
43+ scrollToBottomIfConfigured . current ?.( event ) ;
44+ } ;
45+
46+ const handleBlur = ( ) => {
47+ setNewMessagesReceivedInBackground ( false ) ;
48+ } ;
49+
4850 if ( typeof window !== 'undefined' ) {
49- window . addEventListener ( 'focus' , scrollToBottomIfConfigured ) ;
50- window . addEventListener ( 'blur' , resetNewMessagesReceivedInBackground ) ;
51+ window . addEventListener ( 'focus' , handleFocus ) ;
52+ window . addEventListener ( 'blur' , handleBlur ) ;
5153 }
5254
5355 return ( ) => {
54- window . removeEventListener ( 'focus' , scrollToBottomIfConfigured ) ;
55- window . removeEventListener ( 'blur' , resetNewMessagesReceivedInBackground ) ;
56+ window . removeEventListener ( 'focus' , handleFocus ) ;
57+ window . removeEventListener ( 'blur' , handleBlur ) ;
5658 } ;
57- // eslint-disable-next-line react-hooks/exhaustive-deps
58- } , [ scrollToBottomIfConfigured ] ) ;
59+ } , [ ] ) ;
5960} ;
0 commit comments