UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

132 lines (131 loc) 5.25 kB
"use client"; import _extends from "@babel/runtime-corejs3/helpers/esm/extends"; import React, { useCallback, useContext, useEffect, useRef, useState } from 'react'; import classnames from 'classnames'; import Context from "../../shared/Context.js"; import { isTrue, validateDOMAttributes, dispatchCustomElementEvent, extendPropsWithContext } from "../../shared/component-helper.js"; import { convertSnakeCaseProps } from "../../shared/helpers/withSnakeCaseProps.js"; import { createSpacingClasses } from "../space/SpacingHelper.js"; import ProgressIndicatorCircular from "./ProgressIndicatorCircular.js"; import ProgressIndicatorLinear from "./ProgressIndicatorLinear.js"; import { format } from "../number-format/NumberUtils.js"; import { isValidSize } from "./types.js"; function ProgressIndicator(props) { const undeprecatedProps = handleDeprecatedBehavior(props); const allProps = updatePropsWithContext(undeprecatedProps, useContext(Context)); const { type = 'circular', size = 'default', noAnimation = false, onComplete, label, children, indicator_label, labelDirection = 'horizontal', showDefaultLabel = false, className, title, progress, visible = true, customColors, customCircleWidth, style, ...rest } = allProps; const remainingDOMProps = validateDOMAttributes(allProps, { ...rest }); const [sizeVariant, customSize] = isValidSize(size) ? [size, undefined] : ['custom-size', size]; const completeTimeout = useRef(); const fadeOutTimeout = useRef(); const [complete, setCompleteState] = useState(false); const progressNumber = typeof progress === 'string' ? parseFloat(progress) : typeof progress === 'number' ? progress : undefined; const indicatorLabel = label || children || isTrue(showDefaultLabel) && indicator_label; const progressTitle = title || formatProgress(progressNumber); useEffect(() => { return () => { clearTimeout(completeTimeout.current); clearTimeout(fadeOutTimeout.current); }; }, []); useEffect(() => { if (visible) { setCompleteState(false); } }, [visible]); const callOnCompleteHandler = useCallback(() => { completeTimeout.current = setTimeout(() => { setCompleteState(true); if (onComplete) { fadeOutTimeout.current = setTimeout(() => { dispatchCustomElementEvent({ onComplete }, 'onComplete'); }, 600); } }, 200); }, [onComplete]); return React.createElement("span", _extends({ className: classnames('dnb-progress-indicator', createSpacingClasses(allProps), className, visible && 'dnb-progress-indicator--visible', complete && 'dnb-progress-indicator--complete', labelDirection && `dnb-progress-indicator--${labelDirection}`, sizeVariant && `dnb-progress-indicator--${sizeVariant}`, isTrue(noAnimation) && 'dnb-progress-indicator--no-animation', type === 'linear' && 'dnb-progress-indicator--full-width'), style: { ...style, ...{ '--progress-indicator-circular-size': customSize, '--progress-indicator-circular-stroke-width': customCircleWidth, '--progress-indicator-linear-size': customSize } } }, remainingDOMProps), (type === 'circular' || type === 'countdown') && React.createElement(ProgressIndicatorCircular, { size: sizeVariant, progress: progressNumber, visible: visible, onComplete: onComplete, callOnCompleteHandler: callOnCompleteHandler, title: progressTitle === null || progressTitle === void 0 ? void 0 : progressTitle.toString(), customColors: customColors, customCircleWidth: customCircleWidth, counterClockwise: type === 'countdown' }), type === 'linear' && React.createElement(ProgressIndicatorLinear, { size: sizeVariant, progress: progressNumber, visible: visible, onComplete: onComplete, callOnCompleteHandler: callOnCompleteHandler, title: progressTitle === null || progressTitle === void 0 ? void 0 : progressTitle.toString(), customColors: customColors }), indicatorLabel && React.createElement("span", { className: "dnb-progress-indicator__label dnb-p" }, indicatorLabel)); } function updatePropsWithContext(props, context) { const localPropsFromContext = context === null || context === void 0 ? void 0 : context.getTranslation(props).ProgressIndicator; const componentPropsFromContext = context === null || context === void 0 ? void 0 : context.ProgressIndicator; return extendPropsWithContext(props, {}, localPropsFromContext, componentPropsFromContext); } function handleDeprecatedBehavior(oldProps) { const { show_label: showDefaultLabel, indicator_label, ...propsToConvertToCamelCase } = oldProps; return { showDefaultLabel, indicator_label, ...convertSnakeCaseProps(propsToConvertToCamelCase, { overrideExistingValue: false }) }; } function formatProgress(progress) { if (parseFloat(progress) > -1) { return format(progress, { decimals: 2, percent: true }); } return null; } ProgressIndicator.displayName = 'ProgressIndicator'; export default ProgressIndicator; ProgressIndicator._supportsSpacingProps = true; //# sourceMappingURL=ProgressIndicator.js.map