@coreui/react-pro
Version:
UI Components Library for React.js
90 lines (87 loc) • 3.9 kB
JavaScript
import { __rest } 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 '@popperjs/core';
import { useForkedRef } from '../../hooks/useForkedRef.js';
import { CCarouselContext } from './CCarouselContext.js';
const CCarouselItem = forwardRef((_a, ref) => {
var { children, className, active, direction, interval = false } = _a, rest = __rest(_a, ["children", "className", "active", "direction", "interval"]);
const { setAnimating, setCustomInterval } = useContext(CCarouselContext);
const carouselItemRef = useRef(null);
const forkedRef = useForkedRef(ref, carouselItemRef);
const prevActive = useRef(undefined);
const [directionClassName, setDirectionClassName] = useState();
const [orderClassName, setOrderClassName] = useState();
const [activeClassName, setActiveClassName] = useState(active && 'active');
const [count, setCount] = useState(0);
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]);
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: 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