You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

credential-icon.tsx 1.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import cn from '@/utils/classnames'
  2. import React, { useMemo } from 'react'
  3. type CredentialIconProps = {
  4. avatar_url?: string
  5. name: string
  6. size?: number
  7. className?: string
  8. }
  9. const ICON_BG_COLORS = [
  10. 'bg-components-icon-bg-orange-dark-solid',
  11. 'bg-components-icon-bg-pink-solid',
  12. 'bg-components-icon-bg-indigo-solid',
  13. 'bg-components-icon-bg-teal-solid',
  14. ]
  15. export const CredentialIcon: React.FC<CredentialIconProps> = ({
  16. avatar_url,
  17. name,
  18. size = 20,
  19. className = '',
  20. }) => {
  21. const firstLetter = useMemo(() => name.charAt(0).toUpperCase(), [name])
  22. const bgColor = useMemo(() => ICON_BG_COLORS[firstLetter.charCodeAt(0) % ICON_BG_COLORS.length], [firstLetter])
  23. if (avatar_url && avatar_url !== 'default') {
  24. return (
  25. <img
  26. src={avatar_url}
  27. alt={`${name} logo`}
  28. width={size}
  29. height={size}
  30. className={cn('shrink-0 rounded-md border border-divider-regular object-contain', className)}
  31. />
  32. )
  33. }
  34. return (
  35. <div
  36. className={cn(
  37. 'flex shrink-0 items-center justify-center rounded-md border border-divider-regular',
  38. bgColor,
  39. className,
  40. )}
  41. style={{ width: `${size}px`, height: `${size}px` }}
  42. >
  43. <span className='bg-gradient-to-b from-components-avatar-shape-fill-stop-0 to-components-avatar-shape-fill-stop-100 bg-clip-text text-[13px] font-semibold leading-[1.2] text-transparent opacity-90'>
  44. {firstLetter}
  45. </span>
  46. </div>
  47. )
  48. }