mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 10:53:02 +00: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)
 | 
