'use client'; import { useCallback, useEffect, useRef, useState } from 'react'; interface UseChatDragSelectionOptions { selectionMode: boolean; enterSelectionMode: (messageId: string) => void; addSelectedMessage: (messageId: string) => void; } export function useChatDragSelection({ selectionMode, enterSelectionMode, addSelectedMessage }: UseChatDragSelectionOptions) { const [isDragging, setIsDragging] = useState(false); const visitedRef = useRef>(new Set()); const startDragSelection = useCallback( (messageId: string) => { setIsDragging(true); visitedRef.current = new Set([messageId]); if (!selectionMode) { enterSelectionMode(messageId); } else { addSelectedMessage(messageId); } }, [addSelectedMessage, enterSelectionMode, selectionMode] ); const handleDragEnterMessage = useCallback( (messageId: string) => { if (!isDragging || visitedRef.current.has(messageId)) return; visitedRef.current.add(messageId); addSelectedMessage(messageId); }, [addSelectedMessage, isDragging] ); const endDragSelection = useCallback(() => { setIsDragging(false); visitedRef.current.clear(); }, []); useEffect(() => { window.addEventListener('mouseup', endDragSelection); return () => window.removeEventListener('mouseup', endDragSelection); }, [endDragSelection]); return { isDragging, startDragSelection, handleDragEnterMessage, endDragSelection }; }