zmp-react
Version:
Build full featured iOS & Android apps using ZMP & React
171 lines (158 loc) • 5.14 kB
JavaScript
import React, { useRef, useState, forwardRef, useImperativeHandle } from 'react';
import { extend, classNames, getSlots, noUndefinedProps } from '../shared/utils';
import { colorClasses } from '../shared/mixins';
import { useIsomorphicLayoutEffect } from '../shared/use-isomorphic-layout-effect';
import { zmpready } from '../shared/zmp';
/* dts-props
id?: string | number;
className?: string;
style?: React.CSSProperties;
pagination: boolean;
scrollbar: boolean;
navigation: boolean;
autoplay?: boolean;
allowSlideNext?: boolean;
allowSlidePrev?: boolean;
allowTouchMove?: boolean;
centeredSlides?: boolean;
direction?: 'horizontal' | 'vertical';
effect?: 'slide' | 'fade' | 'cube' | 'coverflow' | 'flip' | 'creative' | 'cards';
enabled?: boolean;
loop?: boolean;
loopedSlides?: number;
slidesPerView?: number | 'auto';
spaceBetween?: number;
speed?: number;
onSlideChange?: (instance?: swiper) => void
ref?: React.MutableRefObject<{el: HTMLElement | null}>;
CHILDREN_PROP
*/
var Swiper = /*#__PURE__*/forwardRef(function (props, ref) {
var _useState = useState(false),
initialUpdate = _useState[0],
setInitialUpdate = _useState[1];
var elRef = useRef(null);
var paginationElRef = useRef(null);
var scrollbarElRef = useRef(null);
var nextElRef = useRef(null);
var prevElRef = useRef(null);
var swiper = useRef(null);
var id = props.id,
style = props.style,
className = props.className,
pagination = props.pagination,
scrollbar = props.scrollbar,
navigation = props.navigation,
autoplay = props.autoplay,
allowSlideNext = props.allowSlideNext,
allowSlidePrev = props.allowSlidePrev,
allowTouchMove = props.allowTouchMove,
centeredSlides = props.centeredSlides,
direction = props.direction,
effect = props.effect,
enabled = props.enabled,
loop = props.loop,
slidesPerView = props.slidesPerView,
spaceBetween = props.spaceBetween,
speed = props.speed,
onSlideChange = props.onSlideChange,
loopedSlides = props.loopedSlides;
var paginationEl;
var scrollbarEl;
var buttonNextEl;
var buttonPrevEl;
useIsomorphicLayoutEffect(function () {
zmpready(function (zmp) {
// eslint-disable-next-line no-use-before-define
initSwiper(zmp);
});
return function () {
if (swiper.current && !swiper.current.destroyed) {
swiper.current.destroy(true, false);
}
};
}, []);
useIsomorphicLayoutEffect(function () {
if (!initialUpdate) {
setInitialUpdate(true);
return;
}
if (swiper.current && swiper.current.update && !swiper.current.destroyed) {
swiper.current.update();
}
});
useImperativeHandle(ref, function () {
return {
el: elRef.current
};
});
var initSwiper = function initSwiper(zmp) {
var newParams = {
pagination: {},
navigation: {},
scrollbar: {}
};
var params = {
autoplay: autoplay,
allowSlideNext: allowSlideNext,
allowSlidePrev: allowSlidePrev,
allowTouchMove: allowTouchMove,
centeredSlides: centeredSlides,
direction: direction,
effect: effect,
enabled: enabled,
loop: loop,
slidesPerView: slidesPerView,
spaceBetween: spaceBetween,
speed: speed,
loopedSlides: loopedSlides
};
if (typeof onSlideChange === 'function') {
params.on = {
slideChange: onSlideChange
};
}
if (params) extend(newParams, noUndefinedProps(params));
if (pagination && !newParams.pagination.el) newParams.pagination.el = paginationElRef.current;
if (navigation && !newParams.navigation.nextEl && !newParams.navigation.prevEl) {
newParams.navigation.nextEl = nextElRef.current;
newParams.navigation.prevEl = prevElRef.current;
}
if (scrollbar && !newParams.scrollbar.el) newParams.scrollbar.el = scrollbarElRef.current;
swiper.current = zmp.swiper.create(elRef.current, newParams);
};
var slots = getSlots(props);
if (pagination) {
paginationEl = /*#__PURE__*/React.createElement("div", {
ref: paginationElRef,
className: "swiper-pagination"
});
}
if (scrollbar) {
scrollbarEl = /*#__PURE__*/React.createElement("div", {
ref: scrollbarElRef,
className: "swiper-scrollbar"
});
}
if (navigation) {
buttonNextEl = /*#__PURE__*/React.createElement("div", {
ref: nextElRef,
className: "swiper-button-next"
});
buttonPrevEl = /*#__PURE__*/React.createElement("div", {
ref: prevElRef,
className: "swiper-button-prev"
});
}
var classes = classNames(className, 'swiper-container', colorClasses(props));
return /*#__PURE__*/React.createElement("div", {
id: id,
style: style,
ref: elRef,
className: classes
}, slots['before-wrapper'], /*#__PURE__*/React.createElement("div", {
className: "swiper-wrapper"
}, slots.default), paginationEl, scrollbarEl, buttonPrevEl, buttonNextEl, slots['after-wrapper']);
});
Swiper.displayName = 'zmp-swiper';
export default Swiper;