infinity-forge
Version:
154 lines • 5.52 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = onTouchStart;
//@ts-nocheck
var utils_1 = require("../../shared/utils.js");
var document_1 = require("../../ssr-window/document.js");
var window_1 = require("../../ssr-window/window.js");
// Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd
function closestElement(selector, base) {
if (base === void 0) { base = this; }
function __closestFrom(el) {
if (!el || el === (0, document_1.getDocument)() || el === (0, window_1.getWindow)())
return null;
if (el.assignedSlot)
el = el.assignedSlot;
var found = el.closest(selector);
if (!found && !el.getRootNode) {
return null;
}
return found || __closestFrom(el.getRootNode().host);
}
return __closestFrom(base);
}
function preventEdgeSwipe(swiper, event, startX) {
var window = (0, window_1.getWindow)();
var params = swiper.params;
var edgeSwipeDetection = params.edgeSwipeDetection;
var edgeSwipeThreshold = params.edgeSwipeThreshold;
if (edgeSwipeDetection &&
(startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {
if (edgeSwipeDetection === 'prevent') {
event.preventDefault();
return true;
}
return false;
}
return true;
}
function onTouchStart(event) {
var swiper = this;
var document = (0, document_1.getDocument)();
var e = event;
if (e.originalEvent)
e = e.originalEvent;
var data = swiper.touchEventsData;
if (e.type === 'pointerdown') {
if (data.pointerId !== null && data.pointerId !== e.pointerId) {
return;
}
data.pointerId = e.pointerId;
}
else if (e.type === 'touchstart' && e.targetTouches.length === 1) {
data.touchId = e.targetTouches[0].identifier;
}
if (e.type === 'touchstart') {
// don't proceed touch event
preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX);
return;
}
var params = swiper.params, touches = swiper.touches, enabled = swiper.enabled;
if (!enabled)
return;
if (!params.simulateTouch && e.pointerType === 'mouse')
return;
if (swiper.animating && params.preventInteractionOnTransition) {
return;
}
if (!swiper.animating && params.cssMode && params.loop) {
swiper.loopFix();
}
var targetEl = e.target;
if (params.touchEventsTarget === 'wrapper') {
if (!swiper.wrapperEl.contains(targetEl))
return;
}
if ('which' in e && e.which === 3)
return;
if ('button' in e && e.button > 0)
return;
if (data.isTouched && data.isMoved)
return;
// change target el for shadow root component
var swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';
// eslint-disable-next-line
var eventPath = e.composedPath ? e.composedPath() : e.path;
if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {
targetEl = eventPath[0];
}
var noSwipingSelector = params.noSwipingSelector
? params.noSwipingSelector
: ".".concat(params.noSwipingClass);
var isTargetShadow = !!(e.target && e.target.shadowRoot);
// use closestElement for shadow root element to get the actual closest for nested shadow root element
if (params.noSwiping &&
(isTargetShadow
? closestElement(noSwipingSelector, targetEl)
: targetEl.closest(noSwipingSelector))) {
swiper.allowClick = true;
return;
}
if (params.swipeHandler) {
if (!targetEl.closest(params.swipeHandler))
return;
}
touches.currentX = e.pageX;
touches.currentY = e.pageY;
var startX = touches.currentX;
var startY = touches.currentY;
// Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore
if (!preventEdgeSwipe(swiper, e, startX)) {
return;
}
Object.assign(data, {
isTouched: true,
isMoved: false,
allowTouchCallbacks: true,
isScrolling: undefined,
startMoving: undefined,
});
touches.startX = startX;
touches.startY = startY;
data.touchStartTime = (0, utils_1.now)();
swiper.allowClick = true;
swiper.updateSize();
swiper.swipeDirection = undefined;
if (params.threshold > 0)
data.allowThresholdMove = false;
var preventDefault = true;
if (targetEl.matches(data.focusableElements)) {
preventDefault = false;
if (targetEl.nodeName === 'SELECT') {
data.isTouched = false;
}
}
if (document.activeElement &&
document.activeElement.matches(data.focusableElements) &&
document.activeElement !== targetEl) {
document.activeElement.blur();
}
var shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
if ((params.touchStartForcePreventDefault || shouldPreventDefault) &&
!targetEl.isContentEditable) {
e.preventDefault();
}
if (params.freeMode &&
params.freeMode.enabled &&
swiper.freeMode &&
swiper.animating &&
!params.cssMode) {
swiper.freeMode.onTouchStart();
}
swiper.emit('touchStart', e);
}
//# sourceMappingURL=onTouchStart.js.map