Change-Id: I066c0e7f8ce87ec00b1141a1b44430444a819b42 (cherry picked from commit 05907a1a42da82737090d55046974d401f8af057)
178 lines
4.4 KiB
Svelte
178 lines
4.4 KiB
Svelte
<script>
|
|
import {
|
|
onMount,
|
|
onDestroy,
|
|
afterUpdate,
|
|
createEventDispatcher,
|
|
tick,
|
|
beforeUpdate,
|
|
} from 'svelte';
|
|
import { getParams } from './get-params.js';
|
|
import { initSwiper, mountSwiper } from './init-swiper.js';
|
|
import {
|
|
needsScrollbar,
|
|
needsNavigation,
|
|
needsPagination,
|
|
uniqueClasses,
|
|
extend,
|
|
} from './utils.js';
|
|
import { getChangedParams } from './get-changed-params.js';
|
|
import { updateSwiper } from './update-swiper.js';
|
|
|
|
const dispatch = createEventDispatcher();
|
|
|
|
let className = undefined;
|
|
export { className as class };
|
|
|
|
let containerClasses = 'swiper';
|
|
let breakpointChanged = false;
|
|
let swiperInstance = null;
|
|
let oldPassedParams = null;
|
|
|
|
let paramsData;
|
|
let swiperParams;
|
|
let passedParams;
|
|
let restProps;
|
|
|
|
let swiperEl = null;
|
|
let prevEl = null;
|
|
let nextEl = null;
|
|
let scrollbarEl = null;
|
|
let paginationEl = null;
|
|
let virtualData = { slides: [] };
|
|
|
|
export function swiper() {
|
|
return swiperInstance;
|
|
}
|
|
|
|
const setVirtualData = (data) => {
|
|
virtualData = data;
|
|
|
|
tick().then(() => {
|
|
swiperInstance.$wrapperEl.children('.swiper-slide').each((el) => {
|
|
if (el.onSwiper) el.onSwiper(swiperInstance);
|
|
});
|
|
swiperInstance.updateSlides();
|
|
swiperInstance.updateProgress();
|
|
swiperInstance.updateSlidesClasses();
|
|
if (swiperInstance.lazy && swiperInstance.params.lazy.enabled) {
|
|
swiperInstance.lazy.load();
|
|
}
|
|
});
|
|
};
|
|
|
|
const calcParams = () => {
|
|
paramsData = getParams($$restProps);
|
|
swiperParams = paramsData.params;
|
|
passedParams = paramsData.passedParams;
|
|
restProps = paramsData.rest;
|
|
};
|
|
|
|
calcParams();
|
|
oldPassedParams = passedParams;
|
|
|
|
const onBeforeBreakpoint = () => {
|
|
breakpointChanged = true;
|
|
};
|
|
|
|
swiperParams.onAny = (event, ...args) => {
|
|
dispatch(event, [args]);
|
|
};
|
|
Object.assign(swiperParams.on, {
|
|
_beforeBreakpoint: onBeforeBreakpoint,
|
|
_containerClasses(_swiper, classes) {
|
|
containerClasses = classes;
|
|
},
|
|
});
|
|
|
|
swiperInstance = initSwiper(swiperParams);
|
|
if (swiperInstance.virtual && swiperInstance.params.virtual.enabled) {
|
|
const extendWith = {
|
|
cache: false,
|
|
renderExternal: (data) => {
|
|
setVirtualData(data);
|
|
if (swiperParams.virtual && swiperParams.virtual.renderExternal) {
|
|
swiperParams.virtual.renderExternal(data);
|
|
}
|
|
},
|
|
renderExternalUpdate: false,
|
|
};
|
|
extend(swiperInstance.params.virtual, extendWith);
|
|
extend(swiperInstance.originalParams.virtual, extendWith);
|
|
}
|
|
|
|
onMount(() => {
|
|
if (!swiperEl) return;
|
|
mountSwiper(
|
|
{
|
|
el: swiperEl,
|
|
nextEl: nextEl,
|
|
prevEl: prevEl,
|
|
paginationEl: paginationEl,
|
|
scrollbarEl: scrollbarEl,
|
|
swiper: swiperInstance,
|
|
},
|
|
swiperParams,
|
|
);
|
|
dispatch('swiper', [swiperInstance]);
|
|
if (swiperParams.virtual) return;
|
|
swiperInstance.slides.each((el) => {
|
|
if (el.onSwiper) el.onSwiper(swiperInstance);
|
|
});
|
|
});
|
|
|
|
afterUpdate(() => {
|
|
if (!swiperInstance) return;
|
|
calcParams();
|
|
|
|
const changedParams = getChangedParams(passedParams, oldPassedParams);
|
|
if (
|
|
(changedParams.length || breakpointChanged) &&
|
|
swiperInstance &&
|
|
!swiperInstance.destroyed
|
|
) {
|
|
updateSwiper({
|
|
swiper: swiperInstance,
|
|
passedParams,
|
|
changedParams,
|
|
nextEl,
|
|
prevEl,
|
|
scrollbarEl,
|
|
paginationEl,
|
|
});
|
|
}
|
|
breakpointChanged = false;
|
|
oldPassedParams = passedParams;
|
|
});
|
|
|
|
onDestroy(() => {
|
|
// eslint-disable-next-line
|
|
if (typeof window !== 'undefined' && swiperInstance && !swiperInstance.destroyed) {
|
|
swiperInstance.destroy(true, false);
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<div
|
|
bind:this={swiperEl}
|
|
class={uniqueClasses(`${containerClasses}${className ? ` ${className}` : ''}`)}
|
|
{...restProps}
|
|
>
|
|
<slot name="container-start" />
|
|
{#if needsNavigation(swiperParams)}
|
|
<div bind:this={prevEl} class="swiper-button-prev" />
|
|
<div bind:this={nextEl} class="swiper-button-next" />
|
|
{/if}
|
|
{#if needsScrollbar(swiperParams)}
|
|
<div bind:this={scrollbarEl} class="swiper-scrollbar" />
|
|
{/if}
|
|
{#if needsPagination(swiperParams)}
|
|
<div bind:this={paginationEl} class="swiper-pagination" />
|
|
{/if}
|
|
<div class="swiper-wrapper">
|
|
<slot name="wrapper-start" />
|
|
<slot {virtualData} />
|
|
<slot name="wrapper-end" />
|
|
</div>
|
|
<slot name="container-end" />
|
|
</div>
|