| import React from 'react'; |
| import { Bot } from 'lucide-react'; |
| import type t from 'librechat-data-provider'; |
|
|
| |
| |
| |
| |
| export const getAgentAvatarUrl = (agent: t.Agent | null | undefined): string | null => { |
| if (!agent?.avatar) { |
| return null; |
| } |
|
|
| if (typeof agent.avatar === 'string') { |
| return agent.avatar; |
| } |
|
|
| if (agent.avatar && typeof agent.avatar === 'object' && 'filepath' in agent.avatar) { |
| return agent.avatar.filepath; |
| } |
|
|
| return null; |
| }; |
|
|
| |
| |
| |
| |
| export const renderAgentAvatar = ( |
| agent: t.Agent | null | undefined, |
| options: { |
| size?: 'sm' | 'md' | 'lg' | 'xl'; |
| className?: string; |
| showBorder?: boolean; |
| } = {}, |
| ): React.ReactElement => { |
| const { size = 'md', className = '', showBorder = true } = options; |
|
|
| const avatarUrl = getAgentAvatarUrl(agent); |
|
|
| |
| const sizeClasses = { |
| sm: 'h-12 w-12 sm:h-14 sm:w-14', |
| md: 'h-16 w-16 sm:h-20 sm:w-20 md:h-24 md:w-24', |
| lg: 'h-20 w-20 sm:h-24 sm:w-24 md:h-28 md:w-28', |
| xl: 'h-24 w-24', |
| }; |
|
|
| const iconSizeClasses = { |
| sm: 'h-6 w-6 sm:h-7 sm:w-7', |
| md: 'h-6 w-6 sm:h-8 sm:w-8 md:h-10 md:w-10', |
| lg: 'h-8 w-8 sm:h-10 sm:w-10 md:h-12 md:w-12', |
| xl: 'h-10 w-10', |
| }; |
|
|
| const placeholderSizeClasses = { |
| sm: 'h-10 w-10 sm:h-12 sm:w-12', |
| md: 'h-12 w-12 sm:h-16 sm:w-16 md:h-20 md:w-20', |
| lg: 'h-16 w-16 sm:h-20 sm:w-20 md:h-24 md:w-24', |
| xl: 'h-20 w-20', |
| }; |
|
|
| const borderClasses = showBorder ? 'border-1 border-border-medium' : ''; |
|
|
| if (avatarUrl) { |
| return ( |
| <div className={`flex items-center justify-center ${sizeClasses[size]} ${className}`}> |
| <img |
| src={avatarUrl} |
| alt={`${agent?.name || 'Agent'} avatar`} |
| className={`${sizeClasses[size]} rounded-full object-cover shadow-lg ${borderClasses}`} |
| loading="lazy" |
| /> |
| </div> |
| ); |
| } |
|
|
| |
| return ( |
| <div className={`relative flex items-center justify-center ${sizeClasses[size]} ${className}`}> |
| {/* Subtle minimalistic placeholder */} |
| <div className="absolute inset-0 rounded-full border border-border-medium bg-surface-secondary"></div> |
| <div |
| className={`relative flex items-center justify-center rounded-full ${placeholderSizeClasses[size]}`} |
| > |
| <Bot className={`text-text-primary ${iconSizeClasses[size]}`} strokeWidth={1.5} /> |
| </div> |
| </div> |
| ); |
| }; |
|
|
| |
| |
| |
| export const getContactDisplayName = (agent: t.Agent | null | undefined): string | null => { |
| if (!agent) return null; |
|
|
| const supportName = (agent as any).support_contact?.name; |
| const supportEmail = (agent as any).support_contact?.email; |
| const authorName = (agent as any).authorName; |
|
|
| return supportName || authorName || supportEmail || null; |
| }; |
|
|
| |
|
|