emoji.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import EmojiPicker, {
  2. Emoji,
  3. EmojiStyle,
  4. Theme as EmojiTheme,
  5. } from "emoji-picker-react";
  6. import { ModelType } from "../store";
  7. import BotIconDefault from "../icons/llm-icons/default.svg";
  8. import BotIconOpenAI from "../icons/llm-icons/openai.svg";
  9. import BotIconGemini from "../icons/llm-icons/gemini.svg";
  10. import BotIconGemma from "../icons/llm-icons/gemma.svg";
  11. import BotIconClaude from "../icons/llm-icons/claude.svg";
  12. import BotIconMeta from "../icons/llm-icons/meta.svg";
  13. import BotIconMistral from "../icons/llm-icons/mistral.svg";
  14. import BotIconDeepseek from "../icons/llm-icons/deepseek.svg";
  15. import BotIconMoonshot from "../icons/llm-icons/moonshot.svg";
  16. import BotIconQwen from "../icons/llm-icons/qwen.svg";
  17. import BotIconWenxin from "../icons/llm-icons/wenxin.svg";
  18. import BotIconGrok from "../icons/llm-icons/grok.svg";
  19. import BotIconHunyuan from "../icons/llm-icons/hunyuan.svg";
  20. import BotIconDoubao from "../icons/llm-icons/doubao.svg";
  21. import BotIconChatglm from "../icons/llm-icons/chatglm.svg";
  22. export function getEmojiUrl(unified: string, style: EmojiStyle) {
  23. // Whoever owns this Content Delivery Network (CDN), I am using your CDN to serve emojis
  24. // Old CDN broken, so I had to switch to this one
  25. // Author: https://github.com/H0llyW00dzZ
  26. return `https://fastly.jsdelivr.net/npm/emoji-datasource-apple/img/${style}/64/${unified}.png`;
  27. }
  28. export function AvatarPicker(props: {
  29. onEmojiClick: (emojiId: string) => void;
  30. }) {
  31. return (
  32. <EmojiPicker
  33. width={"100%"}
  34. lazyLoadEmojis
  35. theme={EmojiTheme.AUTO}
  36. getEmojiUrl={getEmojiUrl}
  37. onEmojiClick={(e) => {
  38. props.onEmojiClick(e.unified);
  39. }}
  40. />
  41. );
  42. }
  43. export function Avatar(props: { model?: ModelType; avatar?: string }) {
  44. let LlmIcon = BotIconDefault;
  45. if (props.model) {
  46. const modelName = props.model.toLowerCase();
  47. if (
  48. modelName.startsWith("gpt") ||
  49. modelName.startsWith("chatgpt") ||
  50. modelName.startsWith("o1") ||
  51. modelName.startsWith("o3")
  52. ) {
  53. LlmIcon = BotIconOpenAI;
  54. } else if (modelName.startsWith("gemini")) {
  55. LlmIcon = BotIconGemini;
  56. } else if (modelName.startsWith("gemma")) {
  57. LlmIcon = BotIconGemma;
  58. } else if (modelName.startsWith("claude")) {
  59. LlmIcon = BotIconClaude;
  60. } else if (modelName.startsWith("llama")) {
  61. LlmIcon = BotIconMeta;
  62. } else if (modelName.startsWith("mixtral")) {
  63. LlmIcon = BotIconMistral;
  64. } else if (modelName.startsWith("deepseek")) {
  65. LlmIcon = BotIconDeepseek;
  66. } else if (modelName.startsWith("moonshot")) {
  67. LlmIcon = BotIconMoonshot;
  68. } else if (modelName.startsWith("qwen")) {
  69. LlmIcon = BotIconQwen;
  70. } else if (modelName.startsWith("ernie")) {
  71. LlmIcon = BotIconWenxin;
  72. } else if (modelName.startsWith("grok")) {
  73. LlmIcon = BotIconGrok;
  74. } else if (modelName.startsWith("hunyuan")) {
  75. LlmIcon = BotIconHunyuan;
  76. } else if (modelName.startsWith("doubao")) {
  77. LlmIcon = BotIconDoubao;
  78. } else if (modelName.startsWith("glm")) {
  79. LlmIcon = BotIconChatglm;
  80. }
  81. return (
  82. <div className="no-dark">
  83. <LlmIcon className="user-avatar" width={30} height={30} />
  84. </div>
  85. );
  86. }
  87. return (
  88. <div className="user-avatar">
  89. {props.avatar && <EmojiAvatar avatar={props.avatar} />}
  90. </div>
  91. );
  92. }
  93. export function EmojiAvatar(props: { avatar: string; size?: number }) {
  94. return (
  95. <Emoji
  96. unified={props.avatar}
  97. size={props.size ?? 18}
  98. getEmojiUrl={getEmojiUrl}
  99. />
  100. );
  101. }