|
import { refreshActiveHighlight } from "./highlight"; |
|
import { emit } from "./emitter"; |
|
import { getState, setState } from "./state"; |
|
|
|
function requireRefresh() { |
|
const resizeTimeout = getState("resizeTimeout"); |
|
if (resizeTimeout) { |
|
window.cancelAnimationFrame(resizeTimeout); |
|
} |
|
|
|
setState("resizeTimeout", window.requestAnimationFrame(refreshActiveHighlight)); |
|
} |
|
|
|
function onKeyup(e: KeyboardEvent) { |
|
if (e.key === "Escape") { |
|
emit("escape"); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function onDriverClick( |
|
element: Element, |
|
listener: (pointer: MouseEvent | PointerEvent) => void, |
|
shouldPreventDefault?: (target: HTMLElement) => boolean |
|
) { |
|
const listenerWrapper = (e: MouseEvent | PointerEvent, listener?: (pointer: MouseEvent | PointerEvent) => void) => { |
|
const target = e.target as HTMLElement; |
|
if (!element.contains(target)) { |
|
return; |
|
} |
|
|
|
if (!shouldPreventDefault || shouldPreventDefault(target)) { |
|
e.preventDefault(); |
|
} |
|
|
|
e.stopPropagation(); |
|
e.stopImmediatePropagation(); |
|
|
|
listener?.(e); |
|
}; |
|
|
|
|
|
const useCapture = true; |
|
|
|
|
|
document.addEventListener("pointerdown", listenerWrapper, useCapture); |
|
document.addEventListener("mousedown", listenerWrapper, useCapture); |
|
document.addEventListener("pointerup", listenerWrapper, useCapture); |
|
document.addEventListener("mouseup", listenerWrapper, useCapture); |
|
|
|
|
|
document.addEventListener( |
|
"click", |
|
e => { |
|
listenerWrapper(e, listener); |
|
}, |
|
useCapture |
|
); |
|
} |
|
|
|
export function initEvents() { |
|
window.addEventListener("keyup", onKeyup, false); |
|
window.addEventListener("resize", requireRefresh); |
|
window.addEventListener("scroll", requireRefresh); |
|
} |
|
|
|
export function destroyEvents() { |
|
window.removeEventListener("resize", requireRefresh); |
|
window.removeEventListener("scroll", requireRefresh); |
|
} |
|
|