EmojiPicker.tsx 1.6 KB

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