mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.6 KiB
78 lines
2.6 KiB
/*!
|
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
*/
|
|
import { f 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 };
|
|
|