28 lines
803 B
TypeScript
Executable File
28 lines
803 B
TypeScript
Executable File
import {InteractableEvent} from '../interactable-event';
|
|
import {useEffect, useId, useRef} from 'react';
|
|
import {dragMonitors, DragSessionStatus} from './drag-state';
|
|
import {ConnectedDraggable} from './use-draggable';
|
|
|
|
export interface DragMonitor {
|
|
type: string;
|
|
onDragStart?: (e: InteractableEvent, dragTarget: ConnectedDraggable) => void;
|
|
onDragMove?: (e: InteractableEvent, dragTarget: ConnectedDraggable) => void;
|
|
onDragEnd?: (
|
|
e: InteractableEvent,
|
|
dragTarget: ConnectedDraggable,
|
|
status: DragSessionStatus
|
|
) => void;
|
|
}
|
|
|
|
export function useDragMonitor(monitor: DragMonitor) {
|
|
const monitorRef = useRef(monitor);
|
|
const id = useId();
|
|
|
|
useEffect(() => {
|
|
dragMonitors.set(id, monitorRef.current);
|
|
return () => {
|
|
dragMonitors.delete(id);
|
|
};
|
|
}, [id]);
|
|
}
|