UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

123 lines (122 loc) 4.25 kB
"use strict"; "use client"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _clsx = _interopRequireDefault(require("clsx")); var _componentHelper = require("../../shared/component-helper.js"); var _defaults = require("../../shared/defaults.js"); var _Space = _interopRequireDefault(require("../space/Space.js")); var _SpacingUtils = require("../space/SpacingUtils.js"); var _Context = _interopRequireDefault(require("../../shared/Context.js")); var _Provider = _interopRequireDefault(require("../../shared/Provider.js")); var _withComponentMarkers = _interopRequireDefault(require("../../shared/helpers/withComponentMarkers.js")); var _jsxRuntime = require("react/jsx-runtime"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const skeletonDefaultProps = { show: null, skeleton: null, noAnimation: null, figure: null, ariaBusy: null, ariaReady: null, element: null, className: null, children: null }; function Skeleton(props) { const context = _react.default.useContext(_Context.default); const [ariaLiveUpdate, setAriaLiveUpdate] = _react.default.useState(null); const ariaLiveUpdateTimeoutRef = _react.default.useRef(null); const prevShowRef = _react.default.useRef(props.show); const getProps = _react.default.useCallback((propsToExtend = props, ctx = context) => { return (0, _componentHelper.extendExistingPropsWithContext)({ ...skeletonDefaultProps, ...(0, _componentHelper.removeUndefinedProps)({ ...propsToExtend }) }, skeletonDefaultProps, { skeleton: ctx.Skeleton || ctx.skeleton, noAnimation: ctx.skeletonNoAnimation }, ctx.getTranslation(propsToExtend).Skeleton); }, [props, context]); const updateAriaLive = _react.default.useCallback(() => { clearTimeout(ariaLiveUpdateTimeoutRef.current); ariaLiveUpdateTimeoutRef.current = setTimeout(() => { const { ariaBusy, ariaReady } = getProps(); let newString = null; if (props.show) { newString = ariaBusy; } else { newString = ariaReady; } if (newString) { setAriaLiveUpdate(newString); ariaLiveUpdateTimeoutRef.current = setTimeout(() => { setAriaLiveUpdate(null); }, 1e3); } }, 1e3); }, [props.show, getProps]); _react.default.useEffect(() => { if (prevShowRef.current !== props.show) { updateAriaLive(); } prevShowRef.current = props.show; }, [props.show, updateAriaLive]); _react.default.useEffect(() => { return () => { clearTimeout(ariaLiveUpdateTimeoutRef.current); }; }, []); const extendedProps = getProps(); const { show, noAnimation, figure, skeleton, ariaBusy, ariaReady, className, children, ...attributes } = extendedProps; const showSkeleton = typeof show === 'boolean' || typeof show === 'string' ? show : skeleton; const params = (0, _SpacingUtils.applySpacing)(extendedProps, { className: (0, _clsx.default)(figure ? 'dnb-skeleton__figure' : 'dnb-skeleton__root', className, showSkeleton && 'dnb-skeleton', noAnimation && 'dnb-skeleton--no-animation'), 'aria-busy': showSkeleton, 'aria-label': showSkeleton ? ariaBusy : undefined, lang: context.locale || _defaults.LOCALE, ...attributes }); (0, _componentHelper.validateDOMAttributes)(props, params); return (0, _jsxRuntime.jsxs)(_Space.default, { ...params, children: [figure ? showSkeleton ? typeof figure === 'function' ? figure() : figure : children : (0, _jsxRuntime.jsx)(_Provider.default, { skeleton: showSkeleton, skeletonNoAnimation: noAnimation, children: children }), (0, _jsxRuntime.jsx)("span", { className: "dnb-sr-only", "aria-live": "assertive", children: ariaLiveUpdate })] }); } var _default = exports.default = Skeleton; function Exclude(props) { return (0, _jsxRuntime.jsx)(_Provider.default, { ...props, skeleton: false }); } Skeleton.Exclude = Exclude; (0, _withComponentMarkers.default)(Skeleton, { _supportsSpacingProps: true }); //# sourceMappingURL=Skeleton.js.map