UNPKG

@ionic/core

Version:
79 lines (76 loc) 2.65 kB
/*! * (C) Ionic http://ionicframework.com - MIT License */ import { k as clamp } from './helpers.js'; import { i as isRTL } from './dir.js'; import { createGesture } from './index3.js'; const createSwipeBackGesture = (el, canStartHandler, onStartHandler, onMoveHandler, onEndHandler) => { const win = el.ownerDocument.defaultView; let rtl = isRTL(el); /** * Determine if a gesture is near the edge * of the screen. If true, then the swipe * to go back gesture should proceed. */ const isAtEdge = (detail) => { const threshold = 50; const { startX } = detail; if (rtl) { return startX >= win.innerWidth - threshold; } return startX <= threshold; }; const getDeltaX = (detail) => { return rtl ? -detail.deltaX : detail.deltaX; }; const getVelocityX = (detail) => { return rtl ? -detail.velocityX : detail.velocityX; }; const canStart = (detail) => { /** * The user's locale can change mid-session, * so we need to check text direction at * the beginning of every gesture. */ rtl = isRTL(el); return isAtEdge(detail) && canStartHandler(); }; const onMove = (detail) => { // set the transition animation's progress const delta = getDeltaX(detail); const stepValue = delta / win.innerWidth; onMoveHandler(stepValue); }; const onEnd = (detail) => { // the swipe back gesture has ended const delta = getDeltaX(detail); const width = win.innerWidth; const stepValue = delta / width; const velocity = getVelocityX(detail); const z = width / 2.0; const shouldComplete = velocity >= 0 && (velocity > 0.2 || delta > z); const missing = shouldComplete ? 1 - stepValue : stepValue; const missingDistance = missing * width; let realDur = 0; if (missingDistance > 5) { const dur = missingDistance / Math.abs(velocity); realDur = Math.min(dur, 540); } onEndHandler(shouldComplete, stepValue <= 0 ? 0.01 : clamp(0, stepValue, 0.9999), realDur); }; return createGesture({ el, gestureName: 'goback-swipe', /** * Swipe to go back should have priority over other horizontal swipe * gestures. These gestures have a priority of 100 which is why 101 was chosen here. */ gesturePriority: 101, threshold: 10, canStart, onStart: onStartHandler, onMove, onEnd, }); }; export { createSwipeBackGesture };