@coreui/react-pro
Version:
UI Components Library for React.js
92 lines (88 loc) • 3.98 kB
JavaScript
;
var tslib_es6 = require('../../node_modules/tslib/tslib.es6.js');
var React = require('react');
var PropTypes = require('prop-types');
var index = require('../../_virtual/index.js');
require('@popperjs/core');
var useForkedRef = require('../../hooks/useForkedRef.js');
var CCarouselContext = require('./CCarouselContext.js');
const CCarouselItem = React.forwardRef((_a, ref) => {
var { children, className, active, direction, interval = false } = _a, rest = tslib_es6.__rest(_a, ["children", "className", "active", "direction", "interval"]);
const { setAnimating, setCustomInterval } = React.useContext(CCarouselContext.CCarouselContext);
const carouselItemRef = React.useRef(null);
const forkedRef = useForkedRef.useForkedRef(ref, carouselItemRef);
const prevActive = React.useRef(undefined);
const [directionClassName, setDirectionClassName] = React.useState();
const [orderClassName, setOrderClassName] = React.useState();
const [activeClassName, setActiveClassName] = React.useState(active && 'active');
const [count, setCount] = React.useState(0);
React.useEffect(() => {
if (active) {
setCustomInterval(interval);
if (count !== 0)
setOrderClassName(`carousel-item-${direction}`);
}
if (prevActive.current && !active) {
setActiveClassName('active');
}
if (active || prevActive.current) {
setTimeout(() => {
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-${direction === 'next' ? 'start' : 'end'}`);
}
}, 0);
}
prevActive.current = active;
if (count === 0)
setCount(count + 1);
}, [active]);
React.useEffect(() => {
var _a, _b;
(_a = carouselItemRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener('transitionstart', () => {
active && setAnimating(true);
});
(_b = carouselItemRef.current) === null || _b === void 0 ? void 0 : _b.addEventListener('transitionend', () => {
active && setAnimating(false);
setDirectionClassName('');
setOrderClassName('');
if (active) {
setActiveClassName('active');
}
if (!active) {
setActiveClassName('');
}
});
return () => {
var _a, _b;
(_a = carouselItemRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('transitionstart', () => {
active && setAnimating(true);
});
(_b = carouselItemRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener('transitionend', () => {
active && setAnimating(false);
setDirectionClassName('');
setOrderClassName('');
if (active) {
setActiveClassName('active');
}
if (!active) {
setActiveClassName('');
}
});
};
});
return (React.createElement("div", Object.assign({ className: index.default('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';
exports.CCarouselItem = CCarouselItem;
//# sourceMappingURL=CCarouselItem.js.map