UNPKG

@nutui/nutui-react-taro

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

140 lines (139 loc) 6.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "CircleProgress", { enumerable: true, get: function() { return CircleProgress; } }); var _interop_require_default = require("@swc/helpers/_/_interop_require_default"); var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard"); var _object_spread = require("@swc/helpers/_/_object_spread"); var _object_spread_props = require("@swc/helpers/_/_object_spread_props"); var _object_without_properties = require("@swc/helpers/_/_object_without_properties"); var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react")); var _classnames = /*#__PURE__*/ _interop_require_default._(require("classnames")); var _components = require("@tarojs/components"); var _utils = require("../../utils"); var _typings = require("../../utils/typings"); var _useforceupdate = require("../../hooks/use-force-update"); var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), { strokeWidth: 5, radius: 50, strokeLinecap: 'round', color: '#FF0F23', background: '#e5e9f2', clockwise: true }); var classPrefix = "nut-circleprogress"; var CircleProgress = function CircleProgress(props) { var _ref = (0, _object_spread._)({}, defaultProps, props), children = _ref.children, percent = _ref.percent, className = _ref.className, radius = _ref.radius, background = _ref.background, clockwise = _ref.clockwise, color = _ref.color, strokeWidth = _ref.strokeWidth, style = _ref.style, strokeLinecap = _ref.strokeLinecap, restProps = (0, _object_without_properties._)(_ref, [ "children", "percent", "className", "radius", "background", "clockwise", "color", "strokeWidth", "style", "strokeLinecap" ]); var oldValue = (0, _react.useRef)(percent); var forceUpdate = (0, _useforceupdate.useForceUpdate)(); var classes = (0, _classnames.default)(classPrefix, className); var refRandomId = Math.random().toString(36).slice(-8); var animateIdRef = (0, _react.useRef)(0); var styles = (0, _object_spread._)({ height: "".concat(Number(radius) * 2, "px"), width: "".concat(Number(radius) * 2, "px") }, style); (0, _react.useEffect)(function() { var startTime = Date.now(); var startRate = Number(oldValue.current) // 30 ; var endRate = Number(percent) // 40 ; var duration = Math.abs((startRate - endRate) * 1000 / +100) // 100 ; var animate = function animate1() { var now = Date.now(); var progress = Math.min((now - startTime) / duration, 1); var rate = progress * (endRate - startRate) + startRate; oldValue.current = Math.min(Math.max(+rate, 0), 100); if (endRate > startRate ? rate < endRate : rate > endRate) { forceUpdate(); animateIdRef.current = window.requestAnimationFrame(animate); } else { window.cancelAnimationFrame(animateIdRef.current); } }; animateIdRef.current = window.requestAnimationFrame(animate); return function() { return window.cancelAnimationFrame(animateIdRef.current); }; }, [ percent ]); var stop = function stop() { if (!(0, _utils.isObject)(color)) { return []; } var colorArr = Object.keys(color).sort(function(a, b) { return parseFloat(a) - parseFloat(b); }); var stopArr = []; colorArr.forEach(function(item) { var obj = { key: '', value: '' }; obj.key = item; obj.value = color[item]; stopArr.push(obj); }); return stopArr; }; var transColor = function transColor(color) { return color && color.replace('#', '%23'); }; var format = function format(progress) { return Math.min(Math.max(+progress, 0), 100); }; var circleStyle = function circleStyle() { var stopArr = stop(); var stopDom = []; if (stopArr) { stopArr.forEach(function(item) { var obj = ''; obj = "%3Cstop offset='".concat(item.key, "' stop-color='").concat(transColor(item.value), "'/%3E"); stopDom.push(obj); }); } var perimeter = 283; var progress = +oldValue.current; var offset = perimeter * Number(format(parseFloat(progress.toFixed(1)))) / 100; var isWise = clockwise ? 1 : 0; var realColor = (0, _utils.isObject)(color) ? "url(%23".concat(refRandomId, ")") : transColor(color); var d = "M 50 50 m 0 -45 a 45 45 0 1 ".concat(isWise, " 0 90 a 45 45 0 1, ").concat(isWise, " 0 -90"); var pa = "%3Cdefs%3E%3ClinearGradient id='".concat(refRandomId, "' x1='100%25' y1='0%25' x2='0%25' y2='0%25'%3E").concat(stopDom, "%3C/linearGradient%3E%3C/defs%3E"); var path = "%3Cpath d='".concat(d, "' stroke-width='").concat(strokeWidth, "' stroke='").concat(transColor(background), "' fill='none'/%3E"); var path1 = "%3Cpath d='".concat(d, "' stroke-width='").concat(strokeWidth, "' stroke-dasharray='").concat(offset, ",").concat(perimeter, "' stroke-linecap='round' stroke='").concat(transColor(realColor), "' fill='none'/%3E"); return { background: "url(\"data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E".concat(pa).concat(path).concat(path1, '%3C/svg%3E")'), width: '100%', height: '100%' }; }; return /*#__PURE__*/ _react.default.createElement("div", (0, _object_spread._)({ className: classes, style: styles }, restProps), /*#__PURE__*/ _react.default.createElement(_components.View, { style: circleStyle() }), /*#__PURE__*/ _react.default.createElement(_components.View, { className: "nut-circleprogress-text" }, children)); }; CircleProgress.displayName = 'NutCircleProgress';