|
import React from 'react'; |
|
import { Plugin, GPTIcon, AnthropicIcon, AzureMinimalIcon } from '~/components/svg'; |
|
import { useAuthContext } from '~/hooks'; |
|
import { cn } from '~/utils'; |
|
import { IconProps } from '~/common'; |
|
|
|
const Icon: React.FC<IconProps> = (props) => { |
|
const { size = 30, isCreatedByUser, button, model = true, endpoint, error, jailbreak } = props; |
|
|
|
const { user } = useAuthContext(); |
|
|
|
if (isCreatedByUser) { |
|
const username = user?.name || 'User'; |
|
|
|
return ( |
|
<div |
|
title={username} |
|
style={{ |
|
width: size, |
|
height: size, |
|
}} |
|
className={`relative flex items-center justify-center ${props.className ?? ''}`} |
|
> |
|
<img |
|
className="rounded-sm" |
|
src={ |
|
user?.avatar || |
|
`https://api.dicebear.com/6.x/initials/svg?seed=${username}&fontFamily=Verdana&fontSize=36` |
|
} |
|
alt="avatar" |
|
/> |
|
</div> |
|
); |
|
} else { |
|
const endpointIcons = { |
|
azureOpenAI: { |
|
icon: <AzureMinimalIcon size={size * 0.5555555555555556} />, |
|
bg: 'linear-gradient(0.375turn, #61bde2, #4389d0)', |
|
name: 'ChatGPT', |
|
}, |
|
openAI: { |
|
icon: <GPTIcon size={size * 0.5555555555555556} />, |
|
bg: |
|
typeof model === 'string' && model.toLowerCase().includes('gpt-4') |
|
? '#AB68FF' |
|
: '#19C37D', |
|
name: 'ChatGPT', |
|
}, |
|
gptPlugins: { |
|
icon: <Plugin size={size * 0.7} />, |
|
bg: `rgba(69, 89, 164, ${button ? 0.75 : 1})`, |
|
name: 'Plugins', |
|
}, |
|
google: { icon: <img src="/assets/google-palm.svg" alt="Palm Icon" />, name: 'PaLM2' }, |
|
anthropic: { |
|
icon: <AnthropicIcon size={size * 0.5555555555555556} />, |
|
bg: '#d09a74', |
|
name: 'Claude', |
|
}, |
|
bingAI: { |
|
icon: jailbreak ? ( |
|
<img src="/assets/bingai-jb.png" alt="Bing Icon" /> |
|
) : ( |
|
<img src="/assets/bingai.png" alt="Sydney Icon" /> |
|
), |
|
name: jailbreak ? 'Sydney' : 'BingAI', |
|
}, |
|
chatGPTBrowser: { |
|
icon: <GPTIcon size={size * 0.5555555555555556} />, |
|
bg: |
|
typeof model === 'string' && model.toLowerCase().includes('gpt-4') |
|
? '#AB68FF' |
|
: `rgba(0, 163, 255, ${button ? 0.75 : 1})`, |
|
name: 'ChatGPT', |
|
}, |
|
null: { icon: <GPTIcon size={size * 0.7} />, bg: 'grey', name: 'N/A' }, |
|
default: { icon: <GPTIcon size={size * 0.7} />, bg: 'grey', name: 'UNKNOWN' }, |
|
}; |
|
|
|
const { icon, bg, name } = endpointIcons[endpoint ?? 'default']; |
|
|
|
return ( |
|
<div |
|
title={name} |
|
style={{ |
|
background: bg || 'transparent', |
|
width: size, |
|
height: size, |
|
}} |
|
className={cn( |
|
'relative flex items-center justify-center rounded-sm text-white ', |
|
props.className || '', |
|
)} |
|
> |
|
{icon} |
|
{error && ( |
|
<span className="absolute right-0 top-[20px] -mr-2 flex h-4 w-4 items-center justify-center rounded-full border border-white bg-red-500 text-[10px] text-white"> |
|
! |
|
</span> |
|
)} |
|
</div> |
|
); |
|
} |
|
}; |
|
|
|
export default Icon; |
|
|