react-slidy
Version:
🍃 React Slidy - Minimalistic and smooth touch slider component for React ⚛️
210 lines (182 loc) • 6.61 kB
JavaScript
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = ReactSlidySlider;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _react = _interopRequireWildcard(require("react"));
var _slidy = _interopRequireDefault(require("./slidy"));
var _jsxRuntime = require("react/jsx-runtime");
var __jsx = _react["default"].createElement;
function noop(_) {}
function convertToArrayFrom(children) {
return Array.isArray(children) ? children : [children];
}
function getItemsToRender(_ref) {
var index = _ref.index,
maxIndex = _ref.maxIndex,
items = _ref.items,
itemsToPreload = _ref.itemsToPreload,
numOfSlides = _ref.numOfSlides;
var preload = Math.max(itemsToPreload, numOfSlides);
if (index >= items.length - numOfSlides) {
var addNewItems = items.length > numOfSlides ? items.slice(0, numOfSlides - 1) : [];
return [].concat(items.slice(0, maxIndex + preload), addNewItems);
} else {
return items.slice(0, maxIndex + preload);
}
}
function destroySlider(slidyInstance, doAfterDestroy) {
slidyInstance && slidyInstance.clean() && slidyInstance.destroy();
doAfterDestroy();
}
var renderItem = function renderItem(numOfSlides) {
return function (item, index) {
var inlineStyle = numOfSlides !== 1 ? {
width: 100 / numOfSlides + "%"
} : {};
return /*#__PURE__*/(0, _jsxRuntime.jsx)("li", {
style: inlineStyle,
children: item
}, index);
};
};
function ReactSlidySlider(_ref2) {
var ArrowLeft = _ref2.ArrowLeft,
ArrowRight = _ref2.ArrowRight,
children = _ref2.children,
classNameBase = _ref2.classNameBase,
doAfterDestroy = _ref2.doAfterDestroy,
doAfterInit = _ref2.doAfterInit,
doAfterSlide = _ref2.doAfterSlide,
doBeforeSlide = _ref2.doBeforeSlide,
ease = _ref2.ease,
infiniteLoop = _ref2.infiniteLoop,
initialSlide = _ref2.initialSlide,
itemsToPreload = _ref2.itemsToPreload,
keyboardNavigation = _ref2.keyboardNavigation,
numOfSlides = _ref2.numOfSlides,
showArrows = _ref2.showArrows,
slide = _ref2.slide,
slideSpeed = _ref2.slideSpeed;
var _useState = (0, _react.useState)({
goTo: noop,
next: noop,
prev: noop,
updateItems: noop
}),
slidyInstance = _useState[0],
setSlidyInstance = _useState[1];
var _useState2 = (0, _react.useState)(initialSlide),
index = _useState2[0],
setIndex = _useState2[1];
var _useState3 = (0, _react.useState)(initialSlide),
maxIndex = _useState3[0],
setMaxIndex = _useState3[1];
var sliderContainerDOMEl = (0, _react.useRef)(null);
var slidesDOMEl = (0, _react.useRef)(null);
var items = convertToArrayFrom(children);
(0, _react.useEffect)(function () {
slide !== index && slidyInstance.goTo(slide);
}, [slide] // eslint-disable-line
);
(0, _react.useEffect)(function () {
var handleKeyboard;
var slidyInstance = (0, _slidy["default"])(sliderContainerDOMEl.current, {
ease: ease,
doAfterSlide: doAfterSlide,
doBeforeSlide: doBeforeSlide,
numOfSlides: numOfSlides,
slideSpeed: slideSpeed,
infiniteLoop: infiniteLoop,
slidesDOMEl: slidesDOMEl.current,
initialSlide: index,
items: items.length,
onNext: function onNext(nextIndex) {
setIndex(nextIndex);
nextIndex > maxIndex && setMaxIndex(nextIndex);
return nextIndex;
},
onPrev: function onPrev(nextIndex) {
setIndex(nextIndex);
return nextIndex;
}
});
setSlidyInstance(slidyInstance);
doAfterInit();
if (keyboardNavigation) {
handleKeyboard = function handleKeyboard(e) {
if (e.keyCode === 39) slidyInstance.next(e);else if (e.keyCode === 37) slidyInstance.prev(e);
};
document.addEventListener('keydown', handleKeyboard);
}
return function () {
destroySlider(slidyInstance, doAfterDestroy);
if (keyboardNavigation) {
document.removeEventListener('keydown', handleKeyboard);
}
};
}, [] // eslint-disable-line
);
(0, _react.useEffect)(function () {
slidyInstance && slidyInstance.updateItems(items.length);
});
var itemsToRender = getItemsToRender({
index: index,
maxIndex: maxIndex,
items: items,
itemsToPreload: itemsToPreload,
numOfSlides: numOfSlides
});
var handlePrev = function handlePrev(e) {
return slidyInstance.prev(e);
};
var handleNext = function handleNext(e) {
return items.length > numOfSlides && slidyInstance.next(e);
};
var renderLeftArrow = function renderLeftArrow() {
var disabled = index === 0 && !infiniteLoop;
var props = {
disabled: disabled,
onClick: handlePrev
};
var leftArrowClasses = classNameBase + "-arrow " + classNameBase + "-arrowLeft";
if (ArrowLeft) return /*#__PURE__*/(0, _jsxRuntime.jsx)(ArrowLeft, (0, _extends2["default"])({}, props, {
className: leftArrowClasses
}));
return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", (0, _extends2["default"])({
"aria-label": "Previous",
className: leftArrowClasses + " " + classNameBase + "-prev",
role: "button"
}, props));
};
var renderRightArrow = function renderRightArrow() {
var disabled = (items.length <= numOfSlides || index === items.length - 1) && !infiniteLoop;
var props = {
disabled: disabled,
onClick: handleNext
};
var rightArrowClasses = classNameBase + "-arrow " + classNameBase + "-arrowRight";
if (ArrowRight) return /*#__PURE__*/(0, _jsxRuntime.jsx)(ArrowRight, (0, _extends2["default"])({}, props, {
className: rightArrowClasses
}));
return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", (0, _extends2["default"])({
"aria-label": "Next",
className: rightArrowClasses + " " + classNameBase + "-next",
role: "button"
}, props));
};
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [showArrows && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [renderLeftArrow(), renderRightArrow()]
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
ref: sliderContainerDOMEl,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", {
ref: slidesDOMEl,
children: itemsToRender.map(renderItem(numOfSlides))
})
})]
});
}
;