Files
IdP/apps/frontend/hooks/use-chat-drag-selection.ts
2026-06-25 23:48:57 +03:00

58 lines
1.5 KiB
TypeScript

'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<Set<string>>(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
};
}