export function mousedown(target: HTMLElement, [clientX, clientY]: number[]) {
const event = new MouseEvent("mousedown", {
clientX,
clientY,
});
target.dispatchEvent(event);
}
export function getMouseInit(startRect: { left: number, top: number }, offset: number[]) {
return {
buttons: 1,
screenX: startRect.left + offset[0],
screenY: startRect.top + offset[1],
clientX: startRect.left + offset[0],
clientY: startRect.top + offset[1],
offsetX: offset[0],
offsetY: offset[1],
bubbles: true,
cancelable: true,
};
}
export function dispatchDrag(
target: HTMLElement,
offset: number[],
[distX, distY]: number[],
options: { duration: number, interval: number } = { duration: 50, interval: 5 },
) {
const startRect = target.getBoundingClientRect();
const mousedown = new MouseEvent("mousedown", getMouseInit(startRect, offset));
target.dispatchEvent(mousedown);
const count = Math.floor(options.duration / options.interval);
for (let i = 1; i <= count; ++i) {
dispatchMouseMove(target, getMouseInit(startRect, [
offset[0] + distX / count * i,
offset[1] + distY / count * i,
]), options.interval * i);
}
return new Promise(resolve => {
setTimeout(() => {
const mosueup = new MouseEvent("mouseup", getMouseInit(startRect, [offset[0] + distX, offset[1] + distY]));
target.dispatchEvent(mosueup);
resolve();
}, options.duration);
});
}
export async function dispatchMouseMove(target: HTMLElement, moustInit: any, time: number) {
setTimeout(() => {
const mousemove = new MouseEvent("mousemove", moustInit);
target.dispatchEvent(mousemove);
}, time);
}