swiper
Version:
Most modern mobile touch slider and framework with hardware accelerated transitions
154 lines (139 loc) • 4.66 kB
JavaScript
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
import { getWindow } from 'ssr-window';
import { bindModuleMethods } from '../../utils/utils';
var History = {
init: function init() {
var swiper = this;
var window = getWindow();
if (!swiper.params.history) return;
if (!window.history || !window.history.pushState) {
swiper.params.history.enabled = false;
swiper.params.hashNavigation.enabled = true;
return;
}
var history = swiper.history;
history.initialized = true;
history.paths = History.getPathValues(swiper.params.url);
if (!history.paths.key && !history.paths.value) return;
history.scrollToSlide(0, history.paths.value, swiper.params.runCallbacksOnInit);
if (!swiper.params.history.replaceState) {
window.addEventListener('popstate', swiper.history.setHistoryPopState);
}
},
destroy: function destroy() {
var swiper = this;
var window = getWindow();
if (!swiper.params.history.replaceState) {
window.removeEventListener('popstate', swiper.history.setHistoryPopState);
}
},
setHistoryPopState: function setHistoryPopState() {
var swiper = this;
swiper.history.paths = History.getPathValues(swiper.params.url);
swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);
},
getPathValues: function getPathValues(urlOverride) {
var window = getWindow();
var location;
if (urlOverride) {
location = new URL(urlOverride);
} else {
location = window.location;
}
var pathArray = location.pathname.slice(1).split('/').filter(function (part) {
return part !== '';
});
var total = pathArray.length;
var key = pathArray[total - 2];
var value = pathArray[total - 1];
return {
key: key,
value: value
};
},
setHistory: function setHistory(key, index) {
var swiper = this;
var window = getWindow();
if (!swiper.history.initialized || !swiper.params.history.enabled) return;
var location;
if (swiper.params.url) {
location = new URL(swiper.params.url);
} else {
location = window.location;
}
var slide = swiper.slides.eq(index);
var value = History.slugify(slide.attr('data-history'));
if (!location.pathname.includes(key)) {
value = key + "/" + value;
}
var currentState = window.history.state;
if (currentState && currentState.value === value) {
return;
}
if (swiper.params.history.replaceState) {
window.history.replaceState({
value: value
}, null, value);
} else {
window.history.pushState({
value: value
}, null, value);
}
},
slugify: function slugify(text) {
return text.toString().replace(/\s+/g, '-').replace(/[^\w-]+/g, '').replace(/--+/g, '-').replace(/^-+/, '').replace(/-+$/, '');
},
scrollToSlide: function scrollToSlide(speed, value, runCallbacks) {
var swiper = this;
if (value) {
for (var i = 0, length = swiper.slides.length; i < length; i += 1) {
var slide = swiper.slides.eq(i);
var slideHistory = History.slugify(slide.attr('data-history'));
if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {
var index = slide.index();
swiper.slideTo(index, speed, runCallbacks);
}
}
} else {
swiper.slideTo(0, speed, runCallbacks);
}
}
};
export default {
name: 'history',
params: {
history: {
enabled: false,
replaceState: false,
key: 'slides'
}
},
create: function create() {
var swiper = this;
bindModuleMethods(swiper, {
history: _extends({}, History)
});
},
on: {
init: function init(swiper) {
if (swiper.params.history.enabled) {
swiper.history.init();
}
},
destroy: function destroy(swiper) {
if (swiper.params.history.enabled) {
swiper.history.destroy();
}
},
transitionEnd: function transitionEnd(swiper) {
if (swiper.history.initialized) {
swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
}
},
slideChange: function slideChange(swiper) {
if (swiper.history.initialized && swiper.params.cssMode) {
swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
}
}
}
};