| 'use client' | |
| import { useState } from 'react' | |
| import cn from '@/utils/classnames' | |
| type AvatarProps = { | |
| name: string | |
| avatar?: string | |
| size?: number | |
| className?: string | |
| textClassName?: string | |
| } | |
| const Avatar = ({ | |
| name, | |
| avatar, | |
| size = 30, | |
| 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` } | |
| const [imgError, setImgError] = useState(false) | |
| const handleError = () => { | |
| setImgError(true) | |
| } | |
| if (avatar && !imgError) { | |
| return ( | |
| <img | |
| className={cn(avatarClassName, className)} | |
| style={style} | |
| alt={name} | |
| src={avatar} | |
| onError={handleError} | |
| /> | |
| ) | |
| } | |
| return ( | |
| <div | |
| className={cn(avatarClassName, className)} | |
| style={style} | |
| > | |
| <div | |
| className={cn(textClassName, 'text-center text-white scale-[0.4]')} | |
| style={style} | |
| > | |
| {name[0].toLocaleUpperCase()} | |
| </div> | |
| </div> | |
| ) | |
| } | |
| export default Avatar | |