emoji.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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") || modelName.startsWith("ep-")) {
  77. LlmIcon = BotIconDoubao;
  78. } else if (
  79. modelName.startsWith("glm") ||
  80. modelName.startsWith("cogview-") ||
  81. modelName.startsWith("cogvideox-")
  82. ) {
  83. LlmIcon = BotIconChatglm;
  84. }
  85. return (
  86. <div className="no-dark">
  87. <LlmIcon className="user-avatar" width={30} height={30} />
  88. </div>
  89. );
  90. }
  91. return (
  92. <div className="user-avatar">
  93. {props.avatar && <EmojiAvatar avatar={props.avatar} />}
  94. </div>
  95. );
  96. }
  97. export function EmojiAvatar(props: { avatar: string; size?: number }) {
  98. return (
  99. <Emoji
  100. unified={props.avatar}
  101. size={props.size ?? 18}
  102. getEmojiUrl={getEmojiUrl}
  103. />
  104. );
  105. }