EmojiPicker.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import React, { FC, useCallback } from 'react';
  2. import { Picker } from 'emoji-mart';
  3. import { Modal } from 'reactstrap';
  4. import { useNextThemes } from '~/stores/use-next-themes';
  5. import EmojiPickerHelper, { getEmojiTranslation } from './EmojiPickerHelper';
  6. import 'emoji-mart/css/emoji-mart.css';
  7. type Props = {
  8. onClose: () => void,
  9. onSelected: (emoji: string) => void,
  10. emojiSearchText: string,
  11. emojiPickerHelper: EmojiPickerHelper,
  12. isOpen: boolean
  13. }
  14. const EmojiPicker: FC<Props> = (props: Props) => {
  15. const {
  16. onClose, onSelected, emojiSearchText, emojiPickerHelper, isOpen,
  17. } = props;
  18. const { resolvedTheme } = useNextThemes();
  19. // Set search emoji input and trigger search
  20. const searchEmoji = useCallback(() => {
  21. const input = window.document.querySelector('[id^="emoji-mart-search"]') as HTMLInputElement;
  22. const valueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set;
  23. valueSetter?.call(input, emojiSearchText);
  24. const event = new Event('input', { bubbles: true });
  25. input.dispatchEvent(event);
  26. input.focus();
  27. }, [emojiSearchText]);
  28. const selectEmoji = useCallback((emoji) => {
  29. onSelected(emoji);
  30. onClose();
  31. }, [onClose, onSelected]);
  32. const translation = getEmojiTranslation();
  33. return (
  34. <Modal isOpen={isOpen} toggle={onClose} onOpened={searchEmoji} backdropClassName="emoji-picker-modal" fade={false}>
  35. <Picker
  36. onSelect={selectEmoji}
  37. i18n={translation}
  38. title={translation.title}
  39. emojiTooltip
  40. style={emojiPickerHelper.setStyle()}
  41. theme={resolvedTheme}
  42. />
  43. </Modal>
  44. );
  45. };
  46. export default EmojiPicker;