@coreui/react
Version:
UI Components Library for React.js
90 lines (87 loc) • 4.15 kB
JavaScript
import { __rest, __assign } from '../../node_modules/tslib/tslib.es6.js';
import React, { forwardRef, useContext, useRef, useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import classNames from '../../_virtual/index.js';
import { useForkedRef } from '../../hooks/useForkedRef.js';
import '@popperjs/core';
import { CCarouselContext } from './CCarouselContext.js';
var CCarouselItem = forwardRef(function (_a, ref) {
var children = _a.children, className = _a.className, active = _a.active, direction = _a.direction, _b = _a.interval, interval = _b === void 0 ? false : _b, rest = __rest(_a, ["children", "className", "active", "direction", "interval"]);
var _c = useContext(CCarouselContext), setAnimating = _c.setAnimating, setCustomInterval = _c.setCustomInterval;
var carouselItemRef = useRef(null);
var forkedRef = useForkedRef(ref, carouselItemRef);
var prevActive = useRef(undefined);
var _d = useState(), directionClassName = _d[0], setDirectionClassName = _d[1];
var _e = useState(), orderClassName = _e[0], setOrderClassName = _e[1];
var _f = useState(active && 'active'), activeClassName = _f[0], setActiveClassName = _f[1];
var _g = useState(0), count = _g[0], setCount = _g[1];
useEffect(function () {
if (active) {
setCustomInterval(interval);
if (count !== 0)
setOrderClassName("carousel-item-".concat(direction));
}
if (prevActive.current && !active) {
setActiveClassName('active');
}
if (active || prevActive.current) {
setTimeout(function () {
var _a;
if (count !== 0) {
// @ts-expect-error reflow is necessary to proper transition
// eslint-disable-next-line @typescript-eslint/no-unused-vars
(_a = carouselItemRef.current) === null || _a === void 0 ? void 0 : _a.offsetHeight;
setDirectionClassName("carousel-item-".concat(direction === 'next' ? 'start' : 'end'));
}
}, 0);
}
prevActive.current = active;
if (count === 0)
setCount(count + 1);
}, [active]);
useEffect(function () {
var _a, _b;
(_a = carouselItemRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener('transitionstart', function () {
active && setAnimating(true);
});
(_b = carouselItemRef.current) === null || _b === void 0 ? void 0 : _b.addEventListener('transitionend', function () {
active && setAnimating(false);
setDirectionClassName('');
setOrderClassName('');
if (active) {
setActiveClassName('active');
}
if (!active) {
setActiveClassName('');
}
});
return function () {
var _a, _b;
(_a = carouselItemRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('transitionstart', function () {
active && setAnimating(true);
});
(_b = carouselItemRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener('transitionend', function () {
active && setAnimating(false);
setDirectionClassName('');
setOrderClassName('');
if (active) {
setActiveClassName('active');
}
if (!active) {
setActiveClassName('');
}
});
};
});
return (React.createElement("div", __assign({ className: classNames('carousel-item', activeClassName, directionClassName, orderClassName, className), ref: forkedRef }, rest), children));
});
CCarouselItem.propTypes = {
active: PropTypes.bool,
children: PropTypes.node,
className: PropTypes.string,
direction: PropTypes.string,
interval: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]),
};
CCarouselItem.displayName = 'CCarouselItem';
export { CCarouselItem };
//# sourceMappingURL=CCarouselItem.js.map