EmojiPicker.tsx 1.6 KB

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