global update and global fix
This commit is contained in:
57
apps/frontend/hooks/use-chat-drag-selection.ts
Normal file
57
apps/frontend/hooks/use-chat-drag-selection.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
'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
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user