UNPKG

@appbuckets/react-ui

Version:
124 lines (121 loc) 3.85 kB
import { __rest, __assign } from 'tslib'; import * as React from 'react'; import clsx from 'clsx'; import { createShorthandFactory, useElementType, } from '@appbuckets/react-ui-core'; import '../BucketTheme/BucketTheme.js'; import { useWithDefaultProps } from '../BucketTheme/BucketContext.js'; import useProgressProps from '../LinearProgress/lib/useProgressProps.js'; import useProgressIndicator from '../LinearProgress/lib/useProgressIndicator.js'; /* -------- * Component Render * -------- */ var CircularProgress = function (receivedProps) { var props = useWithDefaultProps('circularProgress', receivedProps); var _a = useProgressProps(props), className = _a.className, progress = _a.progress, _b = _a.rest; _b.as; var indicator = _b.indicator, radius = _b.radius, strokeWidth = _b.strokeWidth, userDefinedStyle = _b.style, rest = __rest(_b, ['as', 'indicator', 'radius', 'strokeWidth', 'style']); var ElementType = useElementType(CircularProgress, receivedProps, props); var classes = clsx(className, 'circular'); /** Build the Indicator Element */ var indicatorElement = useProgressIndicator(indicator, progress); // ---- // Circle Build Value // ---- var circle = React.useMemo( function () { if (typeof strokeWidth !== 'number' || typeof radius !== 'number') { return { radius: 0, stroke: 0 }; } var startingStrokeWidth = indicatorElement ? strokeWidth - 2 : strokeWidth; var startingRadius = indicatorElement ? radius + 1 : radius; switch (props.size) { case 'extra small': return { radius: startingRadius / 3, stroke: startingStrokeWidth / 2, }; case 'small': return { radius: startingRadius / 1.75, stroke: startingStrokeWidth / 1.5, }; case 'large': return { radius: startingRadius * 1.75, stroke: startingStrokeWidth * 1.5, }; case 'big': return { radius: startingRadius * 3, stroke: startingStrokeWidth * 2.5, }; case 'huge': return { radius: startingRadius * 4.5, stroke: startingStrokeWidth * 4, }; default: return { radius: startingRadius, stroke: startingStrokeWidth }; } }, [indicatorElement, strokeWidth, radius, props.size] ); var size = Math.ceil(circle.radius * 2 + circle.stroke); var viewBox = [0, 0, size, size].join(' '); var dashArray = circle.radius * Math.PI * 2; var dashOffset = dashArray - (dashArray * progress.width) / 100; return React.createElement( ElementType, __assign({}, rest, { className: classes, style: __assign(__assign({}, userDefinedStyle), { height: ''.concat(size, 'px'), width: ''.concat(size, 'px'), }), }), React.createElement( 'svg', { width: size, height: size, viewBox: viewBox }, React.createElement('circle', { className: 'bar', cx: size / 2, cy: size / 2, r: circle.radius, strokeWidth: ''.concat(circle.stroke, 'px'), }), React.createElement('circle', { className: 'value', cx: size / 2, cy: size / 2, r: circle.radius, strokeWidth: ''.concat(circle.stroke, 'px'), transform: 'rotate(-90 '.concat(size / 2, ' ').concat(size / 2, ')'), style: { strokeDasharray: dashArray, strokeDashoffset: dashOffset, }, }) ), indicatorElement ); }; CircularProgress.displayName = 'CircularProgress'; CircularProgress.create = createShorthandFactory( CircularProgress, function (value) { return { value: value }; } ); export { CircularProgress as default };