UNPKG

@s-ui/react-atom-spinner

Version:

> An animated loop used for giving users feedback while the content of a page or section is being loaded.

58 lines 2.41 kB
import { forwardRef, useEffect, useRef, useState } from 'react'; import PropTypes from 'prop-types'; import Injector from '@s-ui/react-primitive-injector'; import SUILoader from './SUILoader/index.js'; import DefaultSpinner from './DefaultSpinner.js'; import { addParentClass, DELAY, getParentClassName, OVERLAY_TYPES, removeParentClass, SIZES, TYPES } from './settings.js'; import { jsx as _jsx } from "react/jsx-runtime"; var AtomSpinner = /*#__PURE__*/forwardRef(function (_ref, forwardedRef) { var _ref$children = _ref.children, children = _ref$children === void 0 ? /*#__PURE__*/_jsx(DefaultSpinner, {}) : _ref$children, _ref$isDelayed = _ref.isDelayed, isDelayedFromProps = _ref$isDelayed === void 0 ? false : _ref$isDelayed, _ref$loader = _ref.loader, loader = _ref$loader === void 0 ? /*#__PURE__*/_jsx(SUILoader, {}) : _ref$loader, _ref$overlayType = _ref.overlayType, overlayType = _ref$overlayType === void 0 ? OVERLAY_TYPES.LIGHT : _ref$overlayType, _ref$size = _ref.size, size = _ref$size === void 0 ? SIZES.MEDIUM : _ref$size, _ref$type = _ref.type, type = _ref$type === void 0 ? TYPES.SECTION : _ref$type; var _useState = useState(isDelayedFromProps), isDelayed = _useState[0], setIsDelayed = _useState[1]; var refSpinner = useRef(); useEffect(function () { var parentClassName = getParentClassName({ overlayType: overlayType, size: size, type: type }); var parentNodeClassList = refSpinner.current.parentNode.classList; if (!isDelayed) addParentClass(parentNodeClassList)(parentClassName); var timer = setTimeout(function () { setIsDelayed(false); addParentClass(parentNodeClassList)(parentClassName); }, DELAY); return function () { clearTimeout(timer); removeParentClass(parentNodeClassList)(parentClassName); }; }, [isDelayed, overlayType, size, type]); return /*#__PURE__*/_jsx("div", { ref: refSpinner, className: "sui-AtomSpinner-content", children: /*#__PURE__*/_jsx(Injector, { isDelayed: isDelayed, loader: loader, overlayType: overlayType, ref: forwardedRef, size: size, type: type, children: children }) }); }); AtomSpinner.displayName = 'AtomSpinner'; export { OVERLAY_TYPES as atomSpinnerOverlayTypes, TYPES as atomSpinnerTypes, SIZES as atomSpinnerSizes }; export default AtomSpinner;