mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-05-15 04:38:17 +08:00
65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
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)
|