UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

84 lines (83 loc) 3.95 kB
"use client"; import _extends from "@babel/runtime/helpers/esm/extends"; import _defineProperty from "@babel/runtime/helpers/esm/defineProperty"; import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties"; var _b; const _excluded = ["className", "children", "state", "showLabel", "label"]; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } import React, { useCallback, useMemo, useRef, useState } from 'react'; import classnames from 'classnames'; import { Space } from '../../../../components'; import { omitSpacingProps, pickSpacingProps } from '../../../../components/flex/utils'; import useTranslation from '../../hooks/useTranslation'; import { convertJsxToString } from '../../../../shared/component-helper'; const useLayoutEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect; function SubmitIndicator(props) { const translation = useTranslation(); const { className, children, state, showLabel, label = translation.SubmitIndicator.label } = props, rest = _objectWithoutProperties(props, _excluded); const childrenRef = useRef(null); const [willWrap, setWillWrap] = useState(false); const key = useMemo(() => convertJsxToString(children), [children]); const recalculate = useCallback(() => { setWillWrap(willWordWrap(childrenRef.current, '. . . ')); }, [childrenRef]); useLayoutEffect(() => { if (key) { recalculate(); window.addEventListener('resize', recalculate); return () => { window.removeEventListener('resize', recalculate); }; } }, [key, recalculate]); const params = _objectSpread({ className: classnames('dnb-forms-submit-indicator', className, state && `dnb-forms-submit-indicator--state-${state}`, willWrap && 'dnb-forms-submit-indicator--inline-wrap') }, pickSpacingProps(rest)); const ariaAttributes = state === 'pending' ? { role: 'status', 'aria-busy': true, 'aria-label': convertJsxToString(label) } : { 'aria-hidden': true }; const dot = _b || (_b = React.createElement("b", null, ".")); const indicator = React.createElement("span", _extends({ className: "dnb-forms-submit-indicator__content" }, ariaAttributes, omitSpacingProps(rest)), showLabel && React.createElement("span", { className: "dnb-forms-submit-indicator__label" }, label), state && state !== 'success' && state !== 'abort' && React.createElement(React.Fragment, null, dot, dot, dot)); return React.createElement(Space, _extends({}, params, { element: "span" }), children && React.createElement("span", { ref: childrenRef, key: key }, children), indicator); } function willWordWrap(element, word) { var _element$parentElemen; if (!element) { return; } const { offsetHeight, innerHTML } = element; const clone = element.cloneNode(true); (_element$parentElemen = element.parentElement) === null || _element$parentElemen === void 0 ? void 0 : _element$parentElemen.insertBefore(clone, element); clone.innerHTML += word; const height = clone.offsetHeight; clone.innerHTML = innerHTML; clone.remove(); return height > offsetHeight; } SubmitIndicator._supportsSpacingProps = true; export default SubmitIndicator; //# sourceMappingURL=SubmitIndicator.js.map