您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

EmojiSelector.tsx 1.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { Theme } from '@mui/material';
  2. import React, { useCallback } from 'react';
  3. import { makeStyles } from 'tss-react/mui';
  4. interface IProps {
  5. onSelect: (emoji: string) => void;
  6. }
  7. const useStyles = makeStyles()((theme: Theme) => {
  8. return {
  9. emojiGrid: {
  10. display: 'flex',
  11. flexDirection: 'row',
  12. borderRadius: '4px',
  13. backgroundColor: theme.palette.ui03
  14. },
  15. emojiButton: {
  16. cursor: 'pointer',
  17. padding: '5px',
  18. fontSize: '1.5em'
  19. }
  20. };
  21. });
  22. const EmojiSelector: React.FC<IProps> = ({ onSelect }) => {
  23. const { classes } = useStyles();
  24. const emojiMap: Record<string, string> = {
  25. thumbsUp: '👍',
  26. redHeart: '❤️',
  27. faceWithTearsOfJoy: '😂',
  28. faceWithOpenMouth: '😮',
  29. fire: '🔥'
  30. };
  31. const emojiNames = Object.keys(emojiMap);
  32. const handleSelect = useCallback(
  33. (emoji: string) => (event: React.MouseEvent<HTMLSpanElement>) => {
  34. event.preventDefault();
  35. onSelect(emoji);
  36. },
  37. [ onSelect ]
  38. );
  39. return (
  40. <div className = { classes.emojiGrid }>
  41. {emojiNames.map(name => (
  42. <span
  43. className = { classes.emojiButton }
  44. key = { name }
  45. onClick = { handleSelect(emojiMap[name]) }>
  46. {emojiMap[name]}
  47. </span>
  48. ))}
  49. </div>
  50. );
  51. };
  52. export default EmojiSelector;