Skip to content

Commit 8980016

Browse files
refactor: useScrollToBottomOnNewMessage hook (#2532)
### 🎯 Goal Refactor `useScrollToBottomOnNewMessage` hook using `useRef`.
1 parent 698684a commit 8980016

File tree

1 file changed

+28
-27
lines changed

1 file changed

+28
-27
lines changed
Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import React, { useCallback, useEffect } from 'react';
1+
import { useEffect, useRef, useState } from 'react';
22
import { StreamMessage } from '../../../../context';
33
import { DefaultStreamChatGenerics } from '../../../../types/types';
44

55
type 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

Comments
 (0)