| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 'use client' | 
					
						
							| 
									
										
										
										
											2023-09-14 13:31:35 +08:00
										 |  |  | import { useState } from 'react' | 
					
						
							| 
									
										
										
										
											2024-07-09 15:05:40 +08:00
										 |  |  | import cn from '@/utils/classnames' | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-22 11:11:31 +09:00
										 |  |  | export type AvatarProps = { | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |   name: string | 
					
						
							| 
									
										
										
										
											2025-01-22 11:11:31 +09:00
										 |  |  |   avatar: string | null | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |   size?: number | 
					
						
							|  |  |  |   className?: string | 
					
						
							| 
									
										
										
										
											2023-07-18 16:57:14 +08:00
										 |  |  |   textClassName?: string | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | } | 
					
						
							|  |  |  | const Avatar = ({ | 
					
						
							|  |  |  |   name, | 
					
						
							|  |  |  |   avatar, | 
					
						
							|  |  |  |   size = 30, | 
					
						
							| 
									
										
										
										
											2023-07-18 16:57:14 +08:00
										 |  |  |   className, | 
					
						
							|  |  |  |   textClassName, | 
					
						
							|  |  |  | }: AvatarProps) => { | 
					
						
							|  |  |  |   const avatarClassName = 'shrink-0 flex items-center rounded-full bg-primary-600' | 
					
						
							|  |  |  |   const style = { width: `${size}px`, height: `${size}px`, fontSize: `${size}px`, lineHeight: `${size}px` } | 
					
						
							| 
									
										
										
										
											2023-09-14 13:31:35 +08:00
										 |  |  |   const [imgError, setImgError] = useState(false) | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-14 13:31:35 +08:00
										 |  |  |   const handleError = () => { | 
					
						
							|  |  |  |     setImgError(true) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (avatar && !imgError) { | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |     return ( | 
					
						
							| 
									
										
										
										
											2023-07-18 16:57:14 +08:00
										 |  |  |       <img | 
					
						
							|  |  |  |         className={cn(avatarClassName, className)} | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         style={style} | 
					
						
							| 
									
										
										
										
											2023-07-18 16:57:14 +08:00
										 |  |  |         alt={name} | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         src={avatar} | 
					
						
							| 
									
										
										
										
											2023-09-14 13:31:35 +08:00
										 |  |  |         onError={handleError} | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |       /> | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ( | 
					
						
							| 
									
										
										
										
											2023-07-18 16:57:14 +08:00
										 |  |  |     <div | 
					
						
							|  |  |  |       className={cn(avatarClassName, className)} | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |       style={style} | 
					
						
							|  |  |  |     > | 
					
						
							| 
									
										
										
										
											2023-07-18 16:57:14 +08:00
										 |  |  |       <div | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |         className={cn(textClassName, 'scale-[0.4] text-center text-white')} | 
					
						
							| 
									
										
										
										
											2023-05-15 08:51:32 +08:00
										 |  |  |         style={style} | 
					
						
							|  |  |  |       > | 
					
						
							|  |  |  |         {name[0].toLocaleUpperCase()} | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-18 16:57:14 +08:00
										 |  |  | export default Avatar |