Progress.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. "use client";
  2. import * as React from 'react';
  3. import classNames from 'classnames';
  4. import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
  5. const viewSize = 100;
  6. const borderWidth = viewSize / 5;
  7. const radius = viewSize / 2 - borderWidth / 2;
  8. const circumference = radius * 2 * Math.PI;
  9. const position = 50;
  10. const CustomCircle = props => {
  11. const {
  12. dotClassName,
  13. style,
  14. hasCircleCls
  15. } = props;
  16. return /*#__PURE__*/React.createElement("circle", {
  17. className: classNames(`${dotClassName}-circle`, {
  18. [`${dotClassName}-circle-bg`]: hasCircleCls
  19. }),
  20. r: radius,
  21. cx: position,
  22. cy: position,
  23. strokeWidth: borderWidth,
  24. style: style
  25. });
  26. };
  27. const Progress = ({
  28. percent,
  29. prefixCls
  30. }) => {
  31. const dotClassName = `${prefixCls}-dot`;
  32. const holderClassName = `${dotClassName}-holder`;
  33. const hideClassName = `${holderClassName}-hidden`;
  34. const [render, setRender] = React.useState(false);
  35. // ==================== Visible =====================
  36. useLayoutEffect(() => {
  37. if (percent !== 0) {
  38. setRender(true);
  39. }
  40. }, [percent !== 0]);
  41. // ==================== Progress ====================
  42. const safePtg = Math.max(Math.min(percent, 100), 0);
  43. // ===================== Render =====================
  44. if (!render) {
  45. return null;
  46. }
  47. const circleStyle = {
  48. strokeDashoffset: `${circumference / 4}`,
  49. strokeDasharray: `${circumference * safePtg / 100} ${circumference * (100 - safePtg) / 100}`
  50. };
  51. return /*#__PURE__*/React.createElement("span", {
  52. className: classNames(holderClassName, `${dotClassName}-progress`, safePtg <= 0 && hideClassName)
  53. }, /*#__PURE__*/React.createElement("svg", {
  54. viewBox: `0 0 ${viewSize} ${viewSize}`,
  55. role: "progressbar",
  56. "aria-valuemin": 0,
  57. "aria-valuemax": 100,
  58. "aria-valuenow": safePtg
  59. }, /*#__PURE__*/React.createElement(CustomCircle, {
  60. dotClassName: dotClassName,
  61. hasCircleCls: true
  62. }), /*#__PURE__*/React.createElement(CustomCircle, {
  63. dotClassName: dotClassName,
  64. style: circleStyle
  65. })));
  66. };
  67. export default Progress;