12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- 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)
|