@@ -20,14 +20,17 @@ import {
20
20
export const GameChat = ( ) => {
21
21
let [ messages , setMessages ] = useState ( [ ] )
22
22
let divRef = useRef ( )
23
-
23
+ let messageRef = useRef ( )
24
+ let needsScroll = useRef ( false )
24
25
let stompClient = useContext ( StompContext )
25
26
let { gameId} = useParams ( )
26
27
let auth = useAuthStore ( state => state . auth )
27
28
28
29
useEffect ( ( ) => {
29
30
stompClient . subscribe ( "/topic/chat/" + gameId , ( m ) => {
30
31
let message = JSON . parse ( m . body )
32
+ let msg = messageRef . current
33
+ needsScroll . current = msg . scrollHeight <= msg . scrollTop + msg . offsetHeight
31
34
setMessages ( previous => {
32
35
if ( previous . length && previous [ previous . length - 1 ] . n === message . n ) {
33
36
return previous
@@ -49,7 +52,10 @@ export const GameChat = () => {
49
52
} , [ stompClient , auth , gameId ] )
50
53
51
54
useEffect ( ( ) => {
52
- divRef . current ?. scrollIntoView ( { behavior : "smooth" } )
55
+ if ( ! needsScroll . current ) {
56
+ return
57
+ }
58
+ window . setTimeout ( ( ) => divRef . current ?. scrollIntoView ( { behavior : "smooth" } ) , 0 )
53
59
} , [ messages ] )
54
60
55
61
let onSendMessage = useCallback ( ( event ) => doTry ( async ( ) => {
@@ -66,7 +72,7 @@ export const GameChat = () => {
66
72
} ) , [ stompClient , gameId ] )
67
73
68
74
return < >
69
- < div
75
+ < div ref = { messageRef }
70
76
className = "grow border border-gray-500 bg-gray-900 rounded-lg p-1 overflow-y-scroll" >
71
77
{ messages . map ( message => (
72
78
< p key = { message . n } > { message . user + ": " + message . message } </ p >
0 commit comments