EmojiPicker.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import React, { FC, useRef, useEffect } from 'react';
  2. import { Picker } from 'emoji-mart';
  3. import EmojiPickerHelper, { getEmojiTranslation } from './EmojiPickerHelper';
  4. type Props = {
  5. onClose: () => void,
  6. emojiSearchText: string,
  7. editor: any
  8. }
  9. const EmojiPicker: FC<Props> = (props: Props) => {
  10. const { onClose, emojiSearchText, editor } = props;
  11. const emojiPickerContainer = useRef<HTMLDivElement>(null);
  12. useEffect(() => {
  13. if (emojiSearchText != null) {
  14. // Get input element of emoji picker search
  15. const input = document.querySelector('[id^="emoji-mart-search"]') as HTMLInputElement;
  16. const valueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set;
  17. // Set value to input of emoji picker search and trigger the search
  18. valueSetter?.call(input, emojiSearchText);
  19. const event = new Event('input', { bubbles: true });
  20. input.dispatchEvent(event);
  21. }
  22. function handleClickOutside(event) {
  23. if (emojiPickerContainer.current && !emojiPickerContainer.current.contains(event.target)) {
  24. onClose();
  25. }
  26. }
  27. document.addEventListener('mousedown', handleClickOutside);
  28. return () => {
  29. // Unbind the event listener on clean up
  30. document.removeEventListener('mousedown', handleClickOutside);
  31. };
  32. }, [emojiPickerContainer, onClose, emojiSearchText]);
  33. const emojiPickerHelper = new EmojiPickerHelper(editor);
  34. const selectEmoji = (emoji) => {
  35. if (emojiSearchText !== null) {
  36. emojiPickerHelper.addEmojiOnSearch(emoji);
  37. }
  38. else {
  39. emojiPickerHelper.addEmoji(emoji);
  40. }
  41. props.onClose();
  42. };
  43. const translation = getEmojiTranslation();
  44. return (
  45. <div className="overlay">
  46. <div ref={emojiPickerContainer}>
  47. <Picker autoFocus onSelect={selectEmoji} i18n={translation} title={translation.title} emojiTooltip />
  48. </div>
  49. </div>
  50. );
  51. };
  52. export default EmojiPicker;