1
1
import { Send } from "lucide-react" ;
2
2
import { extractMessageFromOutput , getAnimationOrigin , getChatPosition } from "../utils" ;
3
- import React , { useEffect , useRef , useState , MouseEvent } from "react" ;
3
+ import React , { useEffect , useRef , useState , MouseEvent , useCallback } from "react" ;
4
4
import { ChatMessageType } from "../../types/chatWidget" ;
5
5
import ChatMessage from "./chatMessage" ;
6
6
import { sendMessage } from "../../controllers" ;
@@ -205,31 +205,8 @@ export default function ChatWindow({
205
205
} , 100 ) ;
206
206
} , [ messages , open ] ) ;
207
207
208
- // Resize event handlers
209
- const handleResizeStart = ( e : MouseEvent < HTMLDivElement > ) => {
210
- if ( ! resizable ) return ;
211
-
212
- e . preventDefault ( ) ;
213
- setIsResizing ( true ) ;
214
-
215
- // Store initial mouse position
216
- resizeStartPos . current = {
217
- x : e . clientX ,
218
- y : e . clientY
219
- } ;
220
-
221
- // Store initial size
222
- initialSize . current = {
223
- width : currentWidth || width ,
224
- height : currentHeight || height
225
- } ;
226
-
227
- // Add resize event listeners
228
- document . addEventListener ( 'mousemove' , handleResizeMove ) ;
229
- document . addEventListener ( 'mouseup' , handleResizeEnd ) ;
230
- } ;
231
-
232
- const handleResizeMove = ( e : MouseEvent | any ) => {
208
+ // Define resize handlers with useCallback to prevent unnecessary re-renders
209
+ const handleResizeMove = useCallback ( ( e : MouseEvent | any ) => {
233
210
if ( ! isResizing ) return ;
234
211
235
212
// Calculate the change in mouse position
@@ -246,24 +223,52 @@ export default function ChatWindow({
246
223
247
224
setCurrentWidth ( newWidth ) ;
248
225
setCurrentHeight ( newHeight ) ;
249
- } ;
226
+ } , [ isResizing , min_width , max_width , min_height , max_height ] ) ;
250
227
251
- const handleResizeEnd = ( ) => {
228
+ const handleResizeEnd = useCallback ( ( ) => {
252
229
setIsResizing ( false ) ;
253
230
254
231
// Clean up event listeners
255
232
document . removeEventListener ( 'mousemove' , handleResizeMove ) ;
256
233
document . removeEventListener ( 'mouseup' , handleResizeEnd ) ;
257
- } ;
234
+ } , [ handleResizeMove ] ) ;
258
235
259
- // Add resize event listeners on mount and remove on unmount
236
+ // Add a useEffect to manage event listener cleanup
260
237
useEffect ( ( ) => {
238
+ const currentHandleResizeMove = handleResizeMove ;
239
+ const currentHandleResizeEnd = handleResizeEnd ;
240
+
261
241
return ( ) => {
262
- document . removeEventListener ( 'mousemove' , handleResizeMove ) ;
263
- document . removeEventListener ( 'mouseup' , handleResizeEnd ) ;
242
+ document . removeEventListener ( 'mousemove' , currentHandleResizeMove ) ;
243
+ document . removeEventListener ( 'mouseup' , currentHandleResizeEnd ) ;
264
244
} ;
265
245
} , [ handleResizeMove , handleResizeEnd ] ) ;
266
246
247
+ const handleResizeStart = useCallback ( ( e : MouseEvent < HTMLDivElement > ) => {
248
+ if ( ! resizable ) return ;
249
+
250
+ e . preventDefault ( ) ;
251
+ setIsResizing ( true ) ;
252
+
253
+ // Store initial mouse position
254
+ resizeStartPos . current = {
255
+ x : e . clientX ,
256
+ y : e . clientY
257
+ } ;
258
+
259
+ // Store initial size
260
+ initialSize . current = {
261
+ width : currentWidth || width ,
262
+ height : currentHeight || height
263
+ } ;
264
+
265
+ // Add resize event listeners
266
+ document . addEventListener ( 'mousemove' , handleResizeMove ) ;
267
+ document . addEventListener ( 'mouseup' , handleResizeEnd ) ;
268
+ } , [ resizable , currentWidth , currentHeight , width , height , handleResizeMove , handleResizeEnd ] ) ;
269
+
270
+ // The cleanup for event listeners is now handled in the useEffect above
271
+
267
272
268
273
return (
269
274
< div
0 commit comments