UNPKG

@appbuckets/react-ui

Version:
169 lines (162 loc) 4.82 kB
'use strict'; var tslib = require('tslib'); var React = require('react'); var clsx = require('clsx'); var reactUiCore = require('@appbuckets/react-ui-core'); require('../BucketTheme/BucketTheme.js'); var BucketContext = require('../BucketTheme/BucketContext.js'); var useProgressProps = require('../LinearProgress/lib/useProgressProps.js'); var useProgressIndicator = require('../LinearProgress/lib/useProgressIndicator.js'); function _interopDefaultLegacy(e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty( n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; }, } ); } }); } n['default'] = e; return Object.freeze(n); } var React__namespace = /*#__PURE__*/ _interopNamespace(React); var clsx__default = /*#__PURE__*/ _interopDefaultLegacy(clsx); /* -------- * Component Render * -------- */ var CircularProgress = function (receivedProps) { var props = BucketContext.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 = tslib.__rest(_b, [ 'as', 'indicator', 'radius', 'strokeWidth', 'style', ]); var ElementType = reactUiCore.useElementType( CircularProgress, receivedProps, props ); var classes = clsx__default['default'](className, 'circular'); /** Build the Indicator Element */ var indicatorElement = useProgressIndicator(indicator, progress); // ---- // Circle Build Value // ---- var circle = React__namespace.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__namespace.createElement( ElementType, tslib.__assign({}, rest, { className: classes, style: tslib.__assign(tslib.__assign({}, userDefinedStyle), { height: ''.concat(size, 'px'), width: ''.concat(size, 'px'), }), }), React__namespace.createElement( 'svg', { width: size, height: size, viewBox: viewBox }, React__namespace.createElement('circle', { className: 'bar', cx: size / 2, cy: size / 2, r: circle.radius, strokeWidth: ''.concat(circle.stroke, 'px'), }), React__namespace.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 = reactUiCore.createShorthandFactory( CircularProgress, function (value) { return { value: value }; } ); module.exports = CircularProgress;