UNPKG

@coreui/react

Version:

UI Components Library for React.js

90 lines (87 loc) 4.15 kB
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