/* * Beamer Viewer, a web-based PDF presentation viewer * Copyright 2018-2024 Pacien TRAN-GIRARD * SPDX-License-Identifier: EUPL-1.2 */ "use strict"; class ActionEventHandler { constructor(onNext, onPrevious) { this.onNext = onNext; this.onPrevious = onPrevious; } } class KeyboardEventHandler extends ActionEventHandler { register(window) { window.addEventListener("keydown", event => this._onCommand(event)); } _onCommand(keyboardEvent) { switch (keyboardEvent.key) { case "Enter": case " ": case "ArrowRight": case "ArrowDown": case "PageDown": case "n": return this.onNext(); case "ArrowLeft": case "ArrowUp": case "PageUp": case "p": return this.onPrevious(); } } } class MouseClickEventHandler extends ActionEventHandler { register(window) { window.addEventListener("click", event => this._onCommand(event)); } _onCommand(mouseEvent) { this.onNext(); } } class TouchSwipeEventHandler extends ActionEventHandler { constructor(onNext, onPrevious) { super(onNext, onPrevious); this.touchStartEvent = null; this.touchMoveEvent = null; } register(window) { window.addEventListener("touchstart", event => { event.preventDefault(); this._onTouchStart(event); }); window.addEventListener("touchmove", event => { event.preventDefault(); this._onTouchMove(event); }); window.addEventListener("touchend", event => { event.preventDefault(); this._onTouchEnd(); }); window.addEventListener("touchcancel", event => { event.preventDefault(); }); } _onTouchStart(touchEvent) { this.touchStartEvent = touchEvent; } _onTouchMove(touchEvent) { this.touchMoveEvent = touchEvent; } _onTouchEnd() { if (this.touchStartEvent == null || this.touchMoveEvent == null) return; const touchDown = this._xCoordinate(this.touchStartEvent); const touchUp = this._xCoordinate(this.touchMoveEvent); const xDelta = touchDown - touchUp; if (xDelta > 0) this.onNext(); else if (xDelta < 0) this.onPrevious(); this.touchStartEvent = null; this.touchMoveEvent = null; } _xCoordinate(touchEvent) { return touchEvent.touches[0].clientX; // first finger } }