File size: 1,799 Bytes
c867d8f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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)