// touch/mouse detection import Events from "../_events"; import Consts from "../_consts"; export default ((W) => { const NAME = "_main.touch"; const D = document; const BODY = D.body; let prev_touch_event_name; let touch_timeout; const SET_TOUCH_SCREEN = (bool, event_name) => { if (touch_timeout || event_name === prev_touch_event_name) { return; } if (bool) { console.log(`${NAME}: Touch screen enabled`); BODY.classList.add("is-touch"); BODY.classList.remove("is-mouse"); W.dispatchEvent(new Event(Events.TOUCHENABLE)); } else { console.log(`${NAME}: Touch screen disabled`); BODY.classList.add("is-mouse"); BODY.classList.remove("is-touch"); W.dispatchEvent(new Event(Events.TOUCHDISABLED)); } prev_touch_event_name = event_name; // prevent firing touch and mouse events together if (!touch_timeout) { touch_timeout = setTimeout(() => { clearTimeout(touch_timeout); touch_timeout = null; }, 500); } }; SET_TOUCH_SCREEN( "ontouchstart" in W || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 || W.matchMedia("(hover: none)").matches, "init" ); D.addEventListener("touchend", (e) => { let touch = false; if (e.type !== "click") { touch = true; } SET_TOUCH_SCREEN(touch, "click-touchend"); }); // disable touch on mouse events D.addEventListener("click", (e) => { let touch = false; if (e.type !== "click") { touch = true; } SET_TOUCH_SCREEN(touch, "click-touchend"); }); })(window);