@appbuckets/react-ui
Version:
Just Another React UI Framework
124 lines (121 loc) • 3.85 kB
JavaScript
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 };