| import React, { memo, useState } 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 handleImageError = () => { |
| setImageError(true); |
| }; |
|
|
| const renderDefaultAvatar = () => ( |
| <div |
| style={{ |
| backgroundColor: 'rgb(121, 137, 255)', |
| width: '20px', |
| height: '20px', |
| boxShadow: 'rgba(240, 246, 252, 0.1) 0px 0px 0px 1px', |
| }} |
| className="relative flex h-9 w-9 items-center justify-center rounded-sm p-1 text-white" |
| > |
| <UserIcon /> |
| </div> |
| ); |
|
|
| return ( |
| <div |
| title={username} |
| style={{ |
| width: size, |
| height: size, |
| }} |
| className={cn('relative flex items-center justify-center', className ?? '')} |
| > |
| {(!(user?.avatar ?? '') && (!(user?.username ?? '') || user?.username.trim() === '')) || |
| imageError ? ( |
| renderDefaultAvatar() |
| ) : ( |
| <img |
| className="rounded-full" |
| src={(user?.avatar ?? '') || avatarSrc} |
| alt="avatar" |
| onError={handleImageError} |
| /> |
| )} |
| </div> |
| ); |
| }); |
|
|
| UserAvatar.displayName = 'UserAvatar'; |
|
|
| const Icon: React.FC<IconProps> = memo((props) => { |
| const { user } = useAuthContext(); |
| const { size = 30, isCreatedByUser } = props; |
|
|
| const avatarSrc = useAvatar(user); |
| const localize = useLocalize(); |
|
|
| if (isCreatedByUser) { |
| const username = user?.name ?? user?.username ?? localize('com_nav_user'); |
| return ( |
| <UserAvatar |
| size={size} |
| user={user} |
| avatarSrc={avatarSrc} |
| username={username} |
| className={props.className} |
| /> |
| ); |
| } |
| return <MessageEndpointIcon {...props} />; |
| }); |
|
|
| Icon.displayName = 'Icon'; |
|
|
| export default Icon; |
|
|