refactor: 枚举移入Models目录,命名空间更新为Rainbow.Entity.Models
大石头 authored at 2026-07-02 12:54:58
1.42 KiB
RainbowBridge
import { useState, useEffect } from 'react'
import { cn } from '@/lib/utils'

interface AvatarProps {
  type: 'user' | 'ai'
  src?: string
  alt?: string
  size?: 'sm' | 'md' | 'lg'
  letter?: string
  className?: string
}

const sizeStyles = {
  sm: 'w-7 h-7 text-[8px]',
  md: 'w-8 h-8 text-xs',
  lg: 'w-10 h-10 text-sm',
}

export function Avatar({ type, src, alt, size = 'md', letter, className }: AvatarProps) {
  const [imgError, setImgError] = useState(false)

  useEffect(() => {
    setImgError(false)
  }, [src])

  if (type === 'ai') {
    return (
      <div
        className={cn(
          'rounded-full bg-[image:var(--gradient-brand)] shadow-[0_4px_12px_-4px_rgba(91,91,255,0.55)]',
          'flex items-center justify-center text-white font-bold shadow-sm',
          sizeStyles[size],
          className,
        )}
      >
        {letter ?? 'N'}
      </div>
    )
  }

  const validSrc = src && src.trim() ? src : undefined

  return (
    <div
      className={cn(
        'bg-blue-100 rounded-full flex items-center justify-center overflow-hidden',
        sizeStyles[size],
        className,
      )}
    >
      {validSrc && !imgError ? (
        <img
          src={validSrc}
          alt={alt ?? 'User'}
          className="w-full h-full object-cover"
          onError={() => setImgError(true)}
        />
      ) : (
        <span className="text-blue-600 font-bold">{letter ?? 'U'}</span>
      )}
    </div>
  )
}