UNPKG

zmp-react

Version:

Build full featured iOS & Android apps using ZMP & React

171 lines (158 loc) 5.14 kB
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;