import * as React from 'react'; import classNames from 'classnames'; import { classNameModifier } from '../shared/utils'; import { ComponentClassNames } from '../shared/constants'; import { BaseLoaderProps, LoaderProps } from '../types/loader'; import { ForwardRefPrimitive, Primitive } from '../types/view'; import { View } from '../View'; export const LINEAR_EMPTY = 'linear-empty'; export const LINEAR_FILLED = 'linear-filled'; export const CIRCULAR_EMPTY = 'circular-empty'; export const CIRCULAR_FILLED = 'circular-filled'; // radius + strokeWidth = 50 export const CIRCULAR_STROKE_WIDTH = 8; export const RADIUS = 42; // circumference = 2 * r * PI (r = 42) export const CIRCUMFERENCE = 2 * RADIUS * Math.PI; const LoaderPrimitive: Primitive = ( { className, filledColor, emptyColor, size, variation, isDeterminate = false, isPercentageTextHidden = false, percentage = 0, ...rest }, ref ) => { percentage = Math.min(percentage, 100); percentage = Math.max(percentage, 0); const percent = `${percentage}%`; const componentClasses = classNames( ComponentClassNames.Loader, classNameModifier(ComponentClassNames.Loader, size), classNameModifier(ComponentClassNames.Loader, variation), isDeterminate ? ComponentClassNames.LoaderDeterminate : null, className ); const linearLoader = ( {isDeterminate ? ( {percent} ) : null} ); // r + stroke-width should add up to 50% to avoid overflow const circularLoader = ( {isDeterminate ? ( {percent} ) : null} ); return ( {variation === 'linear' ? linearLoader : circularLoader} ); }; /** * [📖 Docs](https://ui.docs.amplify.aws/react/components/loader) */ export const Loader: ForwardRefPrimitive = React.forwardRef(LoaderPrimitive); Loader.displayName = 'Loader';