You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ReactButton.tsx 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { Theme } from '@mui/material';
  2. import React, { useCallback, useState } from 'react';
  3. import { useTranslation } from 'react-i18next';
  4. import { useDispatch } from 'react-redux';
  5. import { makeStyles } from 'tss-react/mui';
  6. import { IconFaceSmile } from '../../../base/icons/svg';
  7. import Popover from '../../../base/popover/components/Popover.web';
  8. import Button from '../../../base/ui/components/web/Button';
  9. import { BUTTON_TYPES } from '../../../base/ui/constants.any';
  10. import { sendReaction } from '../../actions.any';
  11. import EmojiSelector from './EmojiSelector';
  12. interface IProps {
  13. messageId: string;
  14. receiverId: string;
  15. }
  16. const useStyles = makeStyles()((theme: Theme) => {
  17. return {
  18. reactButton: {
  19. padding: '2px'
  20. },
  21. reactionPanelContainer: {
  22. position: 'relative',
  23. display: 'inline-block'
  24. },
  25. popoverContent: {
  26. backgroundColor: theme.palette.background.paper,
  27. borderRadius: theme.shape.borderRadius,
  28. boxShadow: theme.shadows[3],
  29. overflow: 'hidden'
  30. }
  31. };
  32. });
  33. const ReactButton = ({ messageId, receiverId }: IProps) => {
  34. const { classes } = useStyles();
  35. const dispatch = useDispatch();
  36. const { t } = useTranslation();
  37. const onSendReaction = useCallback(emoji => {
  38. dispatch(sendReaction(emoji, messageId, receiverId));
  39. }, [ dispatch, messageId, receiverId ]);
  40. const [ isPopoverOpen, setIsPopoverOpen ] = useState(false);
  41. const handleReactClick = useCallback(() => {
  42. setIsPopoverOpen(true);
  43. }, []);
  44. const handleClose = useCallback(() => {
  45. setIsPopoverOpen(false);
  46. }, []);
  47. const handleEmojiSelect = useCallback((emoji: string) => {
  48. onSendReaction(emoji);
  49. handleClose();
  50. }, [ onSendReaction, handleClose ]);
  51. const popoverContent = (
  52. <div className = { classes.popoverContent }>
  53. <EmojiSelector onSelect = { handleEmojiSelect } />
  54. </div>
  55. );
  56. return (
  57. <Popover
  58. content = { popoverContent }
  59. onPopoverClose = { handleClose }
  60. position = 'top'
  61. trigger = 'click'
  62. visible = { isPopoverOpen }>
  63. <div className = { classes.reactionPanelContainer }>
  64. <Button
  65. accessibilityLabel = { t('toolbar.accessibilityLabel.react') }
  66. className = { classes.reactButton }
  67. icon = { IconFaceSmile }
  68. onClick = { handleReactClick }
  69. type = { BUTTON_TYPES.TERTIARY } />
  70. </div>
  71. </Popover>
  72. );
  73. };
  74. export default ReactButton;