UNPKG

stem-core

Version:

Frontend and core-library framework

79 lines (71 loc) 3.48 kB
import {Device} from "../../base/Device"; import {Dispatcher} from "../../base/Dispatcher"; import {StemDate} from "../../time/Time"; let maxDistanceFromSide = 25; // Pixels let minSwipeDistance = 60; // Pixels let minSwipeSpeed = 0.5; // Pixels per millisecond function touchEventHandler(ignoreCondition, successCondition, onSuccess, xType="client") { return (event) => { if (ignoreCondition(event.targetTouches[0][xType + "X"])) { return; } let startX = event.targetTouches[0][xType + "X"]; let panelToggler = new Dispatcher(); let startTime = StemDate.now(); let touchCallback = (event) => { if (successCondition(event.targetTouches[0][xType + "X"], startX, StemDate.now() - startTime)) { panelToggler.dispatch(true); } }; let touchendCallback = () => { panelToggler.dispatch(false); }; document.addEventListener("touchmove", touchCallback); document.addEventListener("touchend", touchendCallback); panelToggler.addListener((success) => { if (success) { onSuccess(); } document.removeEventListener("touchmove", touchCallback); document.removeEventListener("touchend", touchendCallback); }); } } function initializeSwipeRight(navManager, maxDistance=maxDistanceFromSide, minDistance=minSwipeDistance, minSpeed=minSwipeSpeed) { document.addEventListener("touchstart", touchEventHandler( (touchX) => (navManager.leftSidePanel.visible || window.pageXOffset !== 0 || touchX > maxDistance), (touchX, startX, duration) => (touchX - startX >= minDistance && (touchX - startX) / duration >= minSpeed), () => navManager.toggleLeftSidePanel() )); navManager.leftSidePanel.addNodeListener("touchstart", touchEventHandler( () => (!navManager.leftSidePanel.visible), (touchX, startX) => (startX - touchX >= minDistance && (startX - touchX) >= minSpeed), () => navManager.toggleLeftSidePanel() )); } function initializeSwipeLeft(navManager, maxDistance=maxDistanceFromSide, minDistance=minSwipeDistance, minSpeed=minSwipeSpeed) { document.addEventListener("touchstart", touchEventHandler( (touchX) => (navManager.rightSidePanel.visible || window.innerWidth - touchX > maxDistance), (touchX, startX, duration) => (startX - touchX >= minDistance && (startX - touchX) / duration >= minSpeed), () => navManager.toggleRightSidePanel() )); navManager.rightSidePanel.addNodeListener("touchstart", touchEventHandler( () => (!navManager.rightSidePanel.visible), (touchX, startX, duration) => (touchX - startX >= minDistance && (touchX - startX) / duration >= minSpeed), () => navManager.toggleRightSidePanel() )); } function initializeSwipeEvents(navManager, maxDistanceFromSide=maxDistanceFromSide, minDistance=minSwipeDistance, minSpeed=minSwipeSpeed) { if (!Device.isTouchDevice()) { return; } if (navManager.leftSidePanel) { initializeSwipeRight(navManager, maxDistanceFromSide, minDistance, minSpeed); } if (navManager.rightSidePanel) { initializeSwipeLeft(navManager, maxDistanceFromSide, minDistance, minSpeed); } } export {maxDistanceFromSide, initializeSwipeRight, initializeSwipeLeft, initializeSwipeEvents};