@merchantlabs/react-carousel
Version:
Merchant Labs React component library.
155 lines (133 loc) • 5.4 kB
JavaScript
var _templateObject = _taggedTemplateLiteralLoose(['\n margin: 0 auto;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n position: relative;\n'], ['\n margin: 0 auto;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n position: relative;\n']),
_templateObject2 = _taggedTemplateLiteralLoose(['\n margin: 0 auto;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n'], ['\n margin: 0 auto;\n width: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n']),
_templateObject3 = _taggedTemplateLiteralLoose(['\n margin: 0 auto;\n padding: 25px 0 0;\n position: relative;\n'], ['\n margin: 0 auto;\n padding: 25px 0 0;\n position: relative;\n']),
_templateObject4 = _taggedTemplateLiteralLoose(['\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n position: absolute;\n top: 40%;\n'], ['\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n position: absolute;\n top: 40%;\n']);
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
import React, { useState, useEffect, forwardRef } from 'react';
import PropTypes from 'prop-types';
import styled from 'styled-components';
import SwipeableViews from 'react-swipeable-views';
import { autoPlay, virtualize } from 'react-swipeable-views-utils';
import { mod } from 'react-swipeable-views-core';
var SwipeableView = autoPlay(virtualize(SwipeableViews));
var Slider = forwardRef(function (_ref, ref) {
var slides = _ref.slides,
interval = _ref.interval,
slideRenderer = _ref.slideRenderer,
Dot = _ref.dotComponent,
Button = _ref.buttonComponent,
className = _ref.className;
var _useState = useState(true),
auto = _useState[0],
setAuto = _useState[1];
var _useState2 = useState(0),
activeIndex = _useState2[0],
setActiveIndex = _useState2[1];
var _useState3 = useState(0),
infiniteIndex = _useState3[0],
setInfiniteIndex = _useState3[1];
var _useState4 = useState(true),
pageIsVisible = _useState4[0],
setPageIsVisible = _useState4[1];
useEffect(function () {
if (typeof window === 'undefined') return;
function handlePageVisibilityChange() {
setPageIsVisible(document.visibilityState === 'visible');
}
document.addEventListener('visibilitychange', handlePageVisibilityChange);
return function () {
document.removeEventListener('visibilitychange', handlePageVisibilityChange);
};
});
function onChangeIndex(index, indexLatest, meta) {
setActiveIndex(mod(index, indexLatest));
setInfiniteIndex(index);
}
function onMouseEnter() {
setAuto(false);
}
function onMouseLeave() {
setAuto(true);
}
function moveLeft() {
setActiveIndex(mod(infiniteIndex - 1, slides.length));
setInfiniteIndex(infiniteIndex - 1);
}
function moveRight() {
setActiveIndex(mod(infiniteIndex + 1, slides.length));
setInfiniteIndex(infiniteIndex + 1);
}
function slideToIndex(index) {
setActiveIndex(index);
setInfiniteIndex(infiniteIndex + (index - activeIndex));
}
function renderSlides(_ref2) {
var index = _ref2.index,
key = _ref2.key;
var slideData = slides[mod(index, slides.length)];
return React.createElement(
'div',
{ key: key, className: className },
slideRenderer(slideData)
);
}
return React.createElement(
CarouselContainer,
{ ref: ref },
React.createElement(
SlideContainer,
null,
React.createElement(SwipeableView, {
onMouseEnter: onMouseEnter,
onMouseLeave: onMouseLeave,
onChangeIndex: onChangeIndex,
index: infiniteIndex,
autoplay: auto && slides.length > 1 && pageIsVisible,
interval: interval,
springConfig: {
duration: '.8s',
easeFunction: 'cubic-bezier(0.15, 0.3, 0.25, 1)',
delay: '0s'
},
slideRenderer: renderSlides
})
),
Button && slides.length !== 1 && React.createElement(
ButtonContainer,
null,
React.createElement(Button, { onClick: moveLeft, left: true }),
React.createElement(Button, { onClick: moveRight, right: true })
),
Dot && slides.length > 1 && React.createElement(
DotsContainer,
null,
slides.map(function (slide, i) {
var isActive = i === activeIndex;
return React.createElement(Dot, {
key: i,
isActive: isActive,
onClick: function onClick() {
return slideToIndex(i);
}
});
})
)
);
});
Slider.propTypes = process.env.NODE_ENV !== "production" ? {
slides: PropTypes.array.isRequired,
slideRenderer: PropTypes.func.isRequired,
dotComponent: PropTypes.object,
buttonComponent: PropTypes.object,
interval: PropTypes.number,
className: PropTypes.string,
autoPlay: PropTypes.bool
} : {};
Slider.defaultProps = {
interval: 5000
};
export default Slider;
var CarouselContainer = styled.div(_templateObject);
var SlideContainer = styled.div(_templateObject2);
var DotsContainer = styled.ul(_templateObject3);
var ButtonContainer = styled.div(_templateObject4);