emoji.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import EmojiPicker, {
  2. Emoji,
  3. EmojiStyle,
  4. Theme as EmojiTheme,
  5. } from "emoji-picker-react";
  6. import { ModelType } from "../store";
  7. import BotIcon from "../icons/bot.svg";
  8. import BlackBotIcon from "../icons/black-bot.svg";
  9. export function getEmojiUrl(unified: string, style: EmojiStyle) {
  10. // Whoever owns this Content Delivery Network (CDN), I am using your CDN to serve emojis
  11. // Old CDN broken, so I had to switch to this one
  12. // Author: https://github.com/H0llyW00dzZ
  13. return `https://fastly.jsdelivr.net/npm/emoji-datasource-apple/img/${style}/64/${unified}.png`;
  14. }
  15. export function AvatarPicker(props: {
  16. onEmojiClick: (emojiId: string) => void;
  17. }) {
  18. return (
  19. <EmojiPicker
  20. lazyLoadEmojis
  21. theme={EmojiTheme.AUTO}
  22. getEmojiUrl={getEmojiUrl}
  23. onEmojiClick={(e) => {
  24. props.onEmojiClick(e.unified);
  25. }}
  26. />
  27. );
  28. }
  29. export function Avatar(props: { model?: ModelType; avatar?: string }) {
  30. if (props.model) {
  31. return (
  32. <div className="no-dark">
  33. {props.model?.startsWith("gpt-4") ? (
  34. <BlackBotIcon className="user-avatar" />
  35. ) : (
  36. <BotIcon className="user-avatar" />
  37. )}
  38. </div>
  39. );
  40. }
  41. return (
  42. <div className="user-avatar">
  43. {props.avatar && <EmojiAvatar avatar={props.avatar} />}
  44. </div>
  45. );
  46. }
  47. export function EmojiAvatar(props: { avatar: string; size?: number }) {
  48. return (
  49. <Emoji
  50. unified={props.avatar}
  51. size={props.size ?? 18}
  52. getEmojiUrl={getEmojiUrl}
  53. />
  54. );
  55. }