import * as React from 'react'; import Spinner from '../spinner/Spinner'; import type {SpinnerColorType, SpinnerSizeType} from '../spinner/Spinner'; import classnames from 'classnames'; export {SPINNER_SIZE, SPINNER_COLOR} from '../spinner/Spinner'; type AriaStatusLabelType = { loading?: string; loaded?: string; }; export type AriaLiveType = 'polite' | 'assertive'; export type SpinnerContainerPropsType = { loading?: boolean; color?: SpinnerColorType; fullWidth?: boolean; size?: SpinnerSizeType; children?: React.ReactNode; ariaStatusLabel?: AriaStatusLabelType; 'aria-live'?: AriaLiveType; } & Omit< React.AllHTMLAttributes, | 'loading' | 'color' | 'fullWidth' | 'size' | 'children' | 'ariaStatusLabel' | 'undefined' >; const SpinnerContainer = ({ loading, color, fullWidth, size, children, ariaStatusLabel = { loaded: 'content loaded', loading: 'content is loading', }, 'aria-live': ariaLive = 'assertive', ...props }: SpinnerContainerPropsType) => { const childrenWithAriaBusy = React.useMemo(() => { if (!loading) { return children; } return React.Children.map(children, child => { if (React.isValidElement(child)) { return React.cloneElement(child, { // @ts-ignore ts migration 'aria-busy': loading, }); } return child; }); }, [children, loading]); return (
{loading ? (
) : ( {ariaStatusLabel.loaded} )} {childrenWithAriaBusy}
); }; export default SpinnerContainer;