swiper
Version:
Most modern mobile touch slider and framework with hardware accelerated transitions
102 lines (92 loc) • 2.84 kB
JSX
import { createEffect, createSignal, onCleanup, splitProps } from 'solid-js';
import { Dynamic } from 'solid-js/web';
import { SwiperSlideContext } from './context.js';
import { uniqueClasses } from '../components-shared/utils.js';
const SwiperSlide = (props) => {
const [local, rest] = splitProps(props, [
'children',
'class',
'ref',
'swiper',
'tag',
'virtualIndex',
'zoom',
]);
const [slideClasses, setSlideClasses] = createSignal('swiper-slide');
let ref = null;
function updateClasses(_s, el, classNames) {
if (el === ref) {
setSlideClasses(classNames);
}
}
createEffect(() => {
if (!ref || !local.swiper) {
return;
}
if (local.swiper.destroyed) {
if (slideClasses() !== 'swiper-slide') {
setSlideClasses('swiper-slide');
}
return;
}
local.swiper.on('_slideClass', updateClasses);
// eslint-disable-next-line
onCleanup(() => {
if (!local.swiper) return;
local.swiper.off('_slideClass', updateClasses);
});
});
createEffect(() => {
if (local.swiper && ref && !local.swiper.destroyed) {
setSlideClasses(local.swiper.getSlideClasses(ref));
}
});
const slideData = () => ({
isActive:
slideClasses().indexOf('swiper-slide-active') >= 0 ||
slideClasses().indexOf('swiper-slide-duplicate-active') >= 0,
isVisible: slideClasses().indexOf('swiper-slide-visible') >= 0,
isDuplicate: slideClasses().indexOf('swiper-slide-duplicate') >= 0,
isPrev:
slideClasses().indexOf('swiper-slide-prev') >= 0 ||
slideClasses().indexOf('swiper-slide-duplicate-prev') >= 0,
isNext:
slideClasses().indexOf('swiper-slide-next') >= 0 ||
slideClasses().indexOf('swiper-slide-duplicate-next') >= 0,
});
const renderChildren = () => {
return typeof local.children === 'function' ? local.children(slideData()) : local.children;
};
/* eslint-disable react/react-in-jsx-scope */
/* eslint-disable react/no-unknown-property */
return (
<Dynamic
component={local.tag || 'div'}
ref={(el) => {
ref = el;
if (typeof local.ref === 'function') {
local.ref(el);
} else {
local.ref = el;
}
}}
class={uniqueClasses(`${slideClasses()}${local.class ? ` ${local.class}` : ''}`)}
data-swiper-slide-index={local.virtualIndex}
{...rest}
>
<SwiperSlideContext.Provider value={slideData()}>
{local.zoom ? (
<div
class="swiper-zoom-container"
data-swiper-zoom={typeof local.zoom === 'number' ? local.zoom : undefined}
>
{renderChildren()}
</div>
) : (
renderChildren()
)}
</SwiperSlideContext.Provider>
</Dynamic>
);
};
export { SwiperSlide };