File size: 1,735 Bytes
a8b3f00
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import { memo } from 'react'
import cn from '@/utils/classnames'

type ProgressCircleProps = {
  className?: string
  percentage?: number
  size?: number
  circleStrokeWidth?: number
  circleStrokeColor?: string
  circleFillColor?: string
  sectorFillColor?: string
}

const ProgressCircle: React.FC<ProgressCircleProps> = ({
  className,
  percentage = 0,
  size = 12,
  circleStrokeWidth = 1,
  circleStrokeColor = 'stroke-components-progress-brand-border',
  circleFillColor = 'fill-components-progress-brand-bg',
  sectorFillColor = 'fill-components-progress-brand-progress',
}) => {
  const radius = size / 2
  const center = size / 2
  const angle = (percentage / 101) * 360
  const radians = (angle * Math.PI) / 180
  const x = center + radius * Math.cos(radians - Math.PI / 2)
  const y = center + radius * Math.sin(radians - Math.PI / 2)
  const largeArcFlag = percentage > 50 ? 1 : 0

  const pathData = `
    M ${center},${center}
    L ${center},${center - radius}
    A ${radius},${radius} 0 ${largeArcFlag} 1 ${x},${y}
    Z
  `

  return (
    <svg
      width={size + circleStrokeWidth}
      height={size + circleStrokeWidth}
      viewBox={`0 0 ${size + circleStrokeWidth} ${size + circleStrokeWidth}`}
      className={className}
    >
      <circle
        className={cn(
          circleFillColor,
          circleStrokeColor,
        )}
        cx={center + circleStrokeWidth / 2}
        cy={center + circleStrokeWidth / 2}
        r={radius}
        strokeWidth={circleStrokeWidth}
      />
      <path
        className={cn(sectorFillColor)}
        d={pathData}
        transform={`translate(${circleStrokeWidth / 2}, ${circleStrokeWidth / 2})`}
      />
    </svg>
  )
}

export default memo(ProgressCircle)