import { window } from 'ssr-window';
|
import Utils from '../../utils/utils';
|
|
const History = {
|
init() {
|
const swiper = this;
|
if (!swiper.params.history) return;
|
if (!window.history || !window.history.pushState) {
|
swiper.params.history.enabled = false;
|
swiper.params.hashNavigation.enabled = true;
|
return;
|
}
|
const history = swiper.history;
|
history.initialized = true;
|
history.paths = History.getPathValues();
|
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() {
|
const swiper = this;
|
if (!swiper.params.history.replaceState) {
|
window.removeEventListener('popstate', swiper.history.setHistoryPopState);
|
}
|
},
|
setHistoryPopState() {
|
const swiper = this;
|
swiper.history.paths = History.getPathValues();
|
swiper.history.scrollToSlide(swiper.params.speed, swiper.history.paths.value, false);
|
},
|
getPathValues() {
|
const pathArray = window.location.pathname.slice(1).split('/').filter((part) => part !== '');
|
const total = pathArray.length;
|
const key = pathArray[total - 2];
|
const value = pathArray[total - 1];
|
return { key, value };
|
},
|
setHistory(key, index) {
|
const swiper = this;
|
if (!swiper.history.initialized || !swiper.params.history.enabled) return;
|
const slide = swiper.slides.eq(index);
|
let value = History.slugify(slide.attr('data-history'));
|
if (!window.location.pathname.includes(key)) {
|
value = `${key}/${value}`;
|
}
|
const currentState = window.history.state;
|
if (currentState && currentState.value === value) {
|
return;
|
}
|
if (swiper.params.history.replaceState) {
|
window.history.replaceState({ value }, null, value);
|
} else {
|
window.history.pushState({ value }, null, value);
|
}
|
},
|
slugify(text) {
|
return text.toString()
|
.replace(/\s+/g, '-')
|
.replace(/[^\w-]+/g, '')
|
.replace(/--+/g, '-')
|
.replace(/^-+/, '')
|
.replace(/-+$/, '');
|
},
|
scrollToSlide(speed, value, runCallbacks) {
|
const swiper = this;
|
if (value) {
|
for (let i = 0, length = swiper.slides.length; i < length; i += 1) {
|
const slide = swiper.slides.eq(i);
|
const slideHistory = History.slugify(slide.attr('data-history'));
|
if (slideHistory === value && !slide.hasClass(swiper.params.slideDuplicateClass)) {
|
const 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() {
|
const swiper = this;
|
Utils.extend(swiper, {
|
history: {
|
init: History.init.bind(swiper),
|
setHistory: History.setHistory.bind(swiper),
|
setHistoryPopState: History.setHistoryPopState.bind(swiper),
|
scrollToSlide: History.scrollToSlide.bind(swiper),
|
destroy: History.destroy.bind(swiper),
|
},
|
});
|
},
|
on: {
|
init() {
|
const swiper = this;
|
if (swiper.params.history.enabled) {
|
swiper.history.init();
|
}
|
},
|
destroy() {
|
const swiper = this;
|
if (swiper.params.history.enabled) {
|
swiper.history.destroy();
|
}
|
},
|
transitionEnd() {
|
const swiper = this;
|
if (swiper.history.initialized) {
|
swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
|
}
|
},
|
slideChange() {
|
const swiper = this;
|
if (swiper.history.initialized && swiper.params.cssMode) {
|
swiper.history.setHistory(swiper.params.history.key, swiper.activeIndex);
|
}
|
},
|
},
|
};
|