ProfileImage.tsx 904 B

12345678910111213141516171819202122232425262728293031323334
  1. import { User } from 'icons'
  2. import Image from 'next/image'
  3. import { ReactNode, useState } from 'react'
  4. import { cn } from 'ui'
  5. interface ProfileImageProps {
  6. alt?: string
  7. src?: string
  8. placeholder?: ReactNode
  9. className?: string
  10. }
  11. export const ProfileImage = ({ alt, src, placeholder, className }: ProfileImageProps) => {
  12. const [hasInvalidImg, setHasInvalidImg] = useState(false)
  13. return !!src && !hasInvalidImg ? (
  14. <Image
  15. alt={alt ?? ''}
  16. src={src}
  17. width="24"
  18. height="24"
  19. className={cn('aspect-square bg-foreground rounded-full object-cover', className)}
  20. onError={() => setHasInvalidImg(true)}
  21. />
  22. ) : (
  23. (placeholder ?? (
  24. <figure
  25. className={cn('bg-foreground rounded-full flex items-center justify-center', className)}
  26. >
  27. <User size={18} strokeWidth={1.5} className="text-background" />
  28. </figure>
  29. ))
  30. )
  31. }