import React, { memo, useState, useMemo } from 'react'; import { UserIcon, useAvatar } from '@librechat/client'; import type { TUser } from 'librechat-data-provider'; import type { IconProps } from '~/common'; import MessageEndpointIcon from './MessageEndpointIcon'; import { useAuthContext } from '~/hooks/AuthContext'; import { useLocalize } from '~/hooks'; import { cn } from '~/utils'; type UserAvatarProps = { size: number; user?: TUser; avatarSrc: string; username: string; className?: string; }; const UserAvatar = memo(({ size, user, avatarSrc, username, className }: UserAvatarProps) => { const [imageError, setImageError] = useState(false); const [imageLoaded, setImageLoaded] = useState(false); const handleImageError = () => { setImageError(true); setImageLoaded(false); }; const handleImageLoad = () => { setImageLoaded(true); }; const renderDefaultAvatar = () => (
); const hasAvatar = useMemo(() => (user?.avatar ?? '') || avatarSrc, [user?.avatar, avatarSrc]); const showImage = useMemo(() => hasAvatar && !imageError, [hasAvatar, imageError]); const imageSrc = useMemo(() => (user?.avatar ?? '') || avatarSrc, [user?.avatar, avatarSrc]); /** Check if we're using a custom avatar (not initials) */ const isCustomAvatar = useMemo(() => !!(user?.avatar && user.avatar !== ''), [user?.avatar]); /** Only show default while loading for custom avatars, not for initials */ const showDefaultWhileLoading = useMemo( () => isCustomAvatar && !imageLoaded && showImage, [isCustomAvatar, imageLoaded, showImage], ); return (
{!showImage || showDefaultWhileLoading ? renderDefaultAvatar() : null} {showImage && ( avatar )}
); }); UserAvatar.displayName = 'UserAvatar'; const Icon: React.FC = memo((props) => { const { user } = useAuthContext(); const { size = 30, isCreatedByUser } = props; const avatarSrc = useAvatar(user); const localize = useLocalize(); const username = useMemo( () => user?.name ?? user?.username ?? localize('com_nav_user'), [user?.name, user?.username, localize], ); if (isCreatedByUser) { return ( ); } return ; }); Icon.displayName = 'Icon'; export default Icon;