2023-03-31 01:41:41 +08:00
|
|
|
import { clsx } from 'clsx';
|
|
|
|
|
import React from 'react';
|
|
|
|
|
import { twMerge } from 'tailwind-merge';
|
|
|
|
|
import GPTIcon from '../components/svg/GPTIcon';
|
|
|
|
|
import BingIcon from '../components/svg/BingIcon';
|
2023-05-16 00:51:58 +09:00
|
|
|
import { useAuthContext } from '~/hooks/AuthContext';
|
2023-03-31 01:41:41 +08:00
|
|
|
|
2023-05-18 11:09:31 -07:00
|
|
|
const getIcon = (props) => {
|
2023-03-31 01:41:41 +08:00
|
|
|
// { size = 30, isCreatedByUser, model, chatGptLabel, error, ...props }
|
2023-04-02 15:23:28 -04:00
|
|
|
const { size = 30, isCreatedByUser, button, model } = props;
|
2023-05-16 00:51:58 +09:00
|
|
|
const { user, logout } = useAuthContext();
|
2023-03-31 01:41:41 +08:00
|
|
|
|
|
|
|
|
if (isCreatedByUser)
|
|
|
|
|
return (
|
|
|
|
|
<div
|
2023-05-16 00:51:58 +09:00
|
|
|
title={user.name}
|
2023-03-31 01:41:41 +08:00
|
|
|
style={{
|
|
|
|
|
width: size,
|
|
|
|
|
height: size
|
|
|
|
|
}}
|
2023-05-16 00:51:58 +09:00
|
|
|
className={`relative flex items-center justify-center` + props?.className}
|
2023-03-31 01:41:41 +08:00
|
|
|
>
|
2023-05-16 00:51:58 +09:00
|
|
|
<img
|
|
|
|
|
className="rounded-sm"
|
2023-05-18 11:09:31 -07:00
|
|
|
src={
|
|
|
|
|
user?.avatar ||
|
|
|
|
|
`https://api.dicebear.com/6.x/initials/svg?seed=${user?.name}&fontFamily=Verdana&fontSize=36`
|
|
|
|
|
}
|
2023-05-15 12:15:33 -04:00
|
|
|
alt="avatar"
|
2023-05-16 00:51:58 +09:00
|
|
|
/>
|
2023-03-31 01:41:41 +08:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
else if (!isCreatedByUser) {
|
|
|
|
|
const { endpoint, error } = props;
|
|
|
|
|
|
2023-03-31 03:22:57 +08:00
|
|
|
let icon, bg, name;
|
2023-03-31 01:41:41 +08:00
|
|
|
if (endpoint === 'azureOpenAI') {
|
|
|
|
|
const { chatGptLabel } = props;
|
|
|
|
|
icon = <GPTIcon size={size * 0.7} />;
|
|
|
|
|
bg = 'linear-gradient(0.375turn, #61bde2, #4389d0)';
|
|
|
|
|
name = chatGptLabel || 'ChatGPT';
|
|
|
|
|
} else if (endpoint === 'openAI') {
|
|
|
|
|
const { chatGptLabel } = props;
|
|
|
|
|
icon = <GPTIcon size={size * 0.7} />;
|
2023-05-18 11:09:31 -07:00
|
|
|
bg =
|
|
|
|
|
model && model.toLowerCase().startsWith('gpt-4')
|
|
|
|
|
? '#AB68FF'
|
|
|
|
|
: chatGptLabel
|
|
|
|
|
? `rgba(16, 163, 127, ${button ? 0.75 : 1})`
|
|
|
|
|
: `rgba(16, 163, 127, ${button ? 0.75 : 1})`;
|
2023-03-31 01:41:41 +08:00
|
|
|
name = chatGptLabel || 'ChatGPT';
|
2023-05-13 16:29:06 -04:00
|
|
|
} else if (endpoint === 'google') {
|
|
|
|
|
const { modelLabel } = props;
|
2023-05-18 11:09:31 -07:00
|
|
|
icon = <img src="/assets/palm.png" />;
|
2023-05-13 16:29:06 -04:00
|
|
|
name = modelLabel || 'PaLM2';
|
2023-03-31 01:41:41 +08:00
|
|
|
} else if (endpoint === 'bingAI') {
|
|
|
|
|
const { jailbreak } = props;
|
|
|
|
|
icon = <BingIcon size={size * 0.7} />;
|
|
|
|
|
bg = jailbreak ? `radial-gradient(circle at 90% 110%, #F0F0FA, #D0E0F9)` : `transparent`;
|
|
|
|
|
name = jailbreak ? 'Sydney' : 'BingAI';
|
|
|
|
|
} else if (endpoint === 'chatGPTBrowser') {
|
|
|
|
|
icon = <GPTIcon size={size * 0.7} />;
|
2023-05-18 11:09:31 -07:00
|
|
|
bg =
|
|
|
|
|
model && model.toLowerCase().startsWith('gpt-4')
|
|
|
|
|
? '#AB68FF'
|
|
|
|
|
: `rgba(0, 163, 255, ${button ? 0.75 : 1})`;
|
2023-03-31 01:41:41 +08:00
|
|
|
name = 'ChatGPT';
|
|
|
|
|
} else if (endpoint === null) {
|
|
|
|
|
icon = <GPTIcon size={size * 0.7} />;
|
|
|
|
|
bg = `grey`;
|
|
|
|
|
name = 'N/A';
|
2023-03-31 03:22:57 +08:00
|
|
|
} else {
|
|
|
|
|
icon = <GPTIcon size={size * 0.7} />;
|
|
|
|
|
bg = `grey`;
|
|
|
|
|
name = 'UNKNOWN';
|
2023-03-31 01:41:41 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div
|
|
|
|
|
title={name}
|
|
|
|
|
style={{
|
|
|
|
|
background: bg || 'transparent',
|
|
|
|
|
width: size,
|
|
|
|
|
height: size
|
|
|
|
|
}}
|
2023-05-18 11:09:31 -07:00
|
|
|
className={
|
|
|
|
|
`relative flex items-center justify-center rounded-sm text-white ` + props?.className
|
|
|
|
|
}
|
2023-03-31 01:41:41 +08:00
|
|
|
>
|
|
|
|
|
{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 getIcon;
|