import { computed, ref } from 'vue';
|
|
export type UseDragOptions = {
|
target: HTMLElement;
|
onDrag: (e: MouseEvent) => void;
|
onDragEnd: (e: MouseEvent) => void;
|
};
|
export const useDrag = () => {
|
|
const isDragging = ref(false);
|
const startPos = ref({ x: 0, y: 0 });
|
const offset = ref({ x: 0, y: 0 });
|
const startDrag = (e: MouseEvent) => {
|
isDragging.value = true;
|
startPos.value = {
|
x: e.clientX - offset.value.x,
|
y: e.clientY - offset.value.y,
|
};
|
|
const handleMouseMove = (e: MouseEvent) => {
|
if (!isDragging.value) return;
|
|
offset.value = {
|
x: e.clientX - startPos.value.x,
|
y: e.clientY - startPos.value.y,
|
};
|
};
|
|
const handleMouseUp = () => {
|
isDragging.value = false;
|
document.removeEventListener('mousemove', handleMouseMove);
|
document.removeEventListener('mouseup', handleMouseUp);
|
};
|
|
document.addEventListener('mousemove', handleMouseMove);
|
document.addEventListener('mouseup', handleMouseUp);
|
};
|
const style = computed(
|
() =>
|
({
|
position: 'absolute',
|
transform: `translate(${offset.value.x}px, ${offset.value.y}px)`,
|
cursor: isDragging.value ? 'grabbing' : 'grab',
|
} as any)
|
);
|
|
|
return {
|
isDragging,
|
startDrag,
|
style,
|
};
|
};
|