in client/client/modules/render/heatmap/interactions/build-callbacks.js [33:184]
export default function buildCallbacks(
viewport,
onHover = functionMock,
checkInteractiveZone = functionMockArray
) {
let mouseDownEvent = undefined;
let moved = undefined;
let clickHandler = undefined;
let disableClickHandler = undefined;
let clickDisabled = false;
let over = false;
/**
*
* @type {InteractiveZone[]}
*/
let draggingZones = [];
const clearClickHandler = () => {
if (clickHandler) {
clearTimeout(clickHandler);
clickHandler = undefined;
}
};
const clearDisableClickHandler = () => {
if (disableClickHandler) {
clearTimeout(disableClickHandler);
disableClickHandler = undefined;
}
clickDisabled = false;
};
const mouseOver = () => {
over = true;
};
const mouseOut = () => {
over = false;
onHover();
};
const mouseDown = (e) => {
mouseDownEvent = new InteractiveZoneDragEvent(e, viewport);
draggingZones = checkInteractiveZone(mouseDownEvent)
.map(zone => {
if (mouseDownEvent.immediatePropagationStopped) {
return undefined;
}
if (zone.shouldDrag(mouseDownEvent)) {
zone.onDragStart(mouseDownEvent);
return zone;
}
return undefined;
})
.filter(Boolean);
};
const mouseMove = (e) => {
const info = new InteractiveZoneEvent(e, viewport);
if (mouseDownEvent) {
onHover();
const dragEvent = new InteractiveZoneDragEvent(e, viewport, mouseDownEvent);
moved = true;
e.stopPropagation();
e.preventDefault();
draggingZones.forEach(zone => {
if (!dragEvent.immediatePropagationStopped) {
zone.onDrag(dragEvent);
}
});
} else if (over) {
onHover(info, checkInteractiveZone(info));
} else {
onHover();
}
};
const mouseUp = (e) => {
if (mouseDownEvent && moved) {
mouseMove(e);
const dragEndEvent = new InteractiveZoneDragEvent(e, viewport, mouseDownEvent);
e.stopImmediatePropagation();
clearDisableClickHandler();
clickDisabled = true;
disableClickHandler = setTimeout(clearDisableClickHandler, DISABLE_CLICK_TIMEOUT);
if (draggingZones.length > 0) {
draggingZones.forEach(zone => {
if (!dragEndEvent.immediatePropagationStopped) {
zone.onDragEnd(dragEndEvent);
}
});
}
}
draggingZones = [];
moved = false;
mouseDownEvent = undefined;
};
const handleClick = (clickEvent) => {
clearClickHandler();
if (!clickEvent) {
return;
}
const zones = checkInteractiveZone(clickEvent);
if (clickEvent.doubleClick) {
zones.forEach(zone => {
if (!clickEvent.immediatePropagationStopped) {
zone.onDoubleClick(clickEvent);
}
});
} else {
zones.forEach(zone => {
if (!clickEvent.immediatePropagationStopped) {
zone.onClick(clickEvent);
}
});
}
};
const click = (e) => {
if (clickDisabled) {
clearDisableClickHandler();
clickDisabled = false;
return;
}
const clickInfo = new InteractiveZoneClickEvent(e, viewport);
clearClickHandler();
clickHandler = setTimeout(() => handleClick(clickInfo), DOUBLE_CLICK_TIMEOUT);
};
const doubleClick = (e) => {
clearClickHandler();
const clickInfo = new InteractiveZoneClickEvent(e, viewport, true);
handleClick(clickInfo);
};
const mouseWheel = (e) => {
if (mouseDownEvent && moved) {
return;
}
const event = new InteractiveZoneScrollEvent(e, viewport);
const zones = checkInteractiveZone(event);
zones.forEach(zone => {
if (!event.immediatePropagationStopped) {
zone.onScroll(event);
}
});
if (event.defaultIsPrevented) {
e.preventDefault();
}
onHover();
};
return {
mouseOver,
mouseOut,
mouseDown,
mouseMove,
mouseUp,
click,
doubleClick,
mouseWheel
};
}