UNPKG

@coreui/react-pro

Version:

UI Components Library for React.js

92 lines (88 loc) 3.98 kB
'use strict'; 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