@i-novus/ui-core
Version:
Базовые UI компоненты
27 lines (26 loc) • 1.41 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { useEffect, useState, forwardRef } from 'react';
import { debounce } from 'throttle-debounce';
import classNames from 'classnames';
import { useConfigProvider } from '../core';
import { SpinnerIcon } from '../core/icons';
import { Icon } from '../data-display/Icon';
export const Spin = forwardRef((props, ref) => {
const { className, iconClassName, prefix, indicator = _jsx(SpinnerIcon, {}), spinning = true, delay = 500, variant = 'transparent', children, ...restProps } = props;
const { getPrefix } = useConfigProvider();
const prefixCls = getPrefix(prefix);
const [spinningInternal, setSpinningInternal] = useState(false);
useEffect(() => {
if (spinning) {
const showSpinner = debounce(delay, () => { setSpinningInternal(true); });
showSpinner();
return () => {
showSpinner?.cancel();
};
}
return () => { };
}, [delay, spinning]);
return (_jsxs("div", { ref: ref, className: classNames(`${prefixCls}-spin`, `${prefixCls}-spin_${variant}`, {
[`${prefixCls}-spin_spinning`]: spinning,
}, className), ...restProps, children: [children, spinningInternal && (_jsx("div", { className: `${prefixCls}-spin__container`, children: _jsx(Icon, { icon: indicator, className: iconClassName }) }))] }));
});