infinity-forge
Version:
246 lines • 10.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.freeMode = freeMode;
var utils_1 = require("../shared/utils.js");
function freeMode(_a) {
var swiper = _a.swiper, extendParams = _a.extendParams, emit = _a.emit, once = _a.once;
extendParams({
freeMode: {
enabled: false,
momentum: true,
momentumRatio: 1,
momentumBounce: true,
momentumBounceRatio: 1,
momentumVelocityRatio: 1,
sticky: false,
minimumVelocity: 0.02,
},
});
function onTouchStart() {
if (swiper.params.cssMode)
return;
var translate = swiper.getTranslate();
swiper.setTranslate(translate);
swiper.setTransition(0);
swiper.touchEventsData.velocities.length = 0;
swiper.freeMode.onTouchEnd({ currentPos: swiper.rtl ? swiper.translate : -swiper.translate });
}
function onTouchMove() {
if (swiper.params.cssMode)
return;
var data = swiper.touchEventsData, touches = swiper.touches;
// Velocity
if (data.velocities.length === 0) {
data.velocities.push({
position: touches[swiper.isHorizontal() ? 'startX' : 'startY'],
time: data.touchStartTime,
});
}
data.velocities.push({
position: touches[swiper.isHorizontal() ? 'currentX' : 'currentY'],
time: (0, utils_1.now)(),
});
}
function onTouchEnd(_a) {
var currentPos = _a.currentPos;
if (swiper.params.cssMode)
return;
var params = swiper.params, wrapperEl = swiper.wrapperEl, rtl = swiper.rtlTranslate, snapGrid = swiper.snapGrid, data = swiper.touchEventsData;
// Time diff
var touchEndTime = (0, utils_1.now)();
var timeDiff = touchEndTime - data.touchStartTime;
if (currentPos < -swiper.minTranslate()) {
swiper.slideTo(swiper.activeIndex);
return;
}
if (currentPos > -swiper.maxTranslate()) {
if (swiper.slides.length < snapGrid.length) {
swiper.slideTo(snapGrid.length - 1);
}
else {
swiper.slideTo(swiper.slides.length - 1);
}
return;
}
if (params.freeMode.momentum) {
if (data.velocities.length > 1) {
var lastMoveEvent = data.velocities.pop();
var velocityEvent = data.velocities.pop();
var distance = lastMoveEvent.position - velocityEvent.position;
var time = lastMoveEvent.time - velocityEvent.time;
swiper.velocity = distance / time;
swiper.velocity /= 2;
if (Math.abs(swiper.velocity) < params.freeMode.minimumVelocity) {
swiper.velocity = 0;
}
// this implies that the user stopped moving a finger then released.
// There would be no events with distance zero, so the last event is stale.
if (time > 150 || (0, utils_1.now)() - lastMoveEvent.time > 300) {
swiper.velocity = 0;
}
}
else {
swiper.velocity = 0;
}
swiper.velocity *= params.freeMode.momentumVelocityRatio;
data.velocities.length = 0;
var momentumDuration = 1000 * params.freeMode.momentumRatio;
var momentumDistance = swiper.velocity * momentumDuration;
var newPosition = swiper.translate + momentumDistance;
if (rtl)
newPosition = -newPosition;
var doBounce = false;
var afterBouncePosition_1;
var bounceAmount = Math.abs(swiper.velocity) * 20 * params.freeMode.momentumBounceRatio;
var needsLoopFix = void 0;
if (newPosition < swiper.maxTranslate()) {
if (params.freeMode.momentumBounce) {
if (newPosition + swiper.maxTranslate() < -bounceAmount) {
newPosition = swiper.maxTranslate() - bounceAmount;
}
afterBouncePosition_1 = swiper.maxTranslate();
doBounce = true;
data.allowMomentumBounce = true;
}
else {
newPosition = swiper.maxTranslate();
}
if (params.loop && params.centeredSlides)
needsLoopFix = true;
}
else if (newPosition > swiper.minTranslate()) {
if (params.freeMode.momentumBounce) {
if (newPosition - swiper.minTranslate() > bounceAmount) {
newPosition = swiper.minTranslate() + bounceAmount;
}
afterBouncePosition_1 = swiper.minTranslate();
doBounce = true;
data.allowMomentumBounce = true;
}
else {
newPosition = swiper.minTranslate();
}
if (params.loop && params.centeredSlides)
needsLoopFix = true;
}
else if (params.freeMode.sticky) {
var nextSlide = void 0;
for (var j = 0; j < snapGrid.length; j += 1) {
if (snapGrid[j] > -newPosition) {
nextSlide = j;
break;
}
}
if (Math.abs(snapGrid[nextSlide] - newPosition) <
Math.abs(snapGrid[nextSlide - 1] - newPosition) ||
swiper.swipeDirection === 'next') {
newPosition = snapGrid[nextSlide];
}
else {
newPosition = snapGrid[nextSlide - 1];
}
newPosition = -newPosition;
}
if (needsLoopFix) {
once('transitionEnd', function () {
swiper.loopFix();
});
}
// Fix duration
if (swiper.velocity !== 0) {
if (rtl) {
momentumDuration = Math.abs((-newPosition - swiper.translate) / swiper.velocity);
}
else {
momentumDuration = Math.abs((newPosition - swiper.translate) / swiper.velocity);
}
if (params.freeMode.sticky) {
// If freeMode.sticky is active and the user ends a swipe with a slow-velocity
// event, then durations can be 20+ seconds to slide one (or zero!) slides.
// It's easy to see this when simulating touch with mouse events. To fix this,
// limit single-slide swipes to the default slide duration. This also has the
// nice side effect of matching slide speed if the user stopped moving before
// lifting finger or mouse vs. moving slowly before lifting the finger/mouse.
// For faster swipes, also apply limits (albeit higher ones).
var moveDistance = Math.abs((rtl ? -newPosition : newPosition) - swiper.translate);
var currentSlideSize = swiper.slidesSizesGrid[swiper.activeIndex];
if (moveDistance < currentSlideSize) {
momentumDuration = params.speed;
}
else if (moveDistance < 2 * currentSlideSize) {
momentumDuration = params.speed * 1.5;
}
else {
momentumDuration = params.speed * 2.5;
}
}
}
else if (params.freeMode.sticky) {
swiper.slideToClosest();
return;
}
if (params.freeMode.momentumBounce && doBounce) {
swiper.updateProgress(afterBouncePosition_1);
swiper.setTransition(momentumDuration);
swiper.setTranslate(newPosition);
swiper.transitionStart(true, swiper.swipeDirection);
swiper.animating = true;
(0, utils_1.elementTransitionEnd)(wrapperEl, function () {
if (!swiper || swiper.destroyed || !data.allowMomentumBounce)
return;
emit('momentumBounce');
swiper.setTransition(params.speed);
setTimeout(function () {
swiper.setTranslate(afterBouncePosition_1);
(0, utils_1.elementTransitionEnd)(wrapperEl, function () {
if (!swiper || swiper.destroyed)
return;
swiper.transitionEnd();
});
}, 0);
});
}
else if (swiper.velocity) {
emit('_freeModeNoMomentumRelease');
swiper.updateProgress(newPosition);
swiper.setTransition(momentumDuration);
swiper.setTranslate(newPosition);
swiper.transitionStart(true, swiper.swipeDirection);
if (!swiper.animating) {
swiper.animating = true;
(0, utils_1.elementTransitionEnd)(wrapperEl, function () {
if (!swiper || swiper.destroyed)
return;
swiper.transitionEnd();
});
}
}
else {
swiper.updateProgress(newPosition);
}
swiper.updateActiveIndex();
swiper.updateSlidesClasses();
}
else if (params.freeMode.sticky) {
swiper.slideToClosest();
return;
}
else if (params.freeMode) {
emit('_freeModeNoMomentumRelease');
}
if (!params.freeMode.momentum || timeDiff >= params.longSwipesMs) {
emit('_freeModeStaticRelease');
swiper.updateProgress();
swiper.updateActiveIndex();
swiper.updateSlidesClasses();
}
}
Object.assign(swiper, {
freeMode: {
onTouchStart: onTouchStart,
onTouchMove: onTouchMove,
onTouchEnd: onTouchEnd,
},
});
}
//# sourceMappingURL=free-mode.js.map