EmojiPicker.tsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. 'use client';
  2. import '@/styles/emoji-picker.scss';
  3. import dynamic from 'next/dynamic';
  4. import { useState, useRef, useEffect } from 'react';
  5. import { EmojiClickData, EmojiStyle, Categories } from 'emoji-picker-react';
  6. import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
  7. import { faFaceSmile } from '@fortawesome/free-regular-svg-icons';
  8. const Picker = dynamic(
  9. () => {
  10. return import('emoji-picker-react');
  11. },
  12. { ssr: false }
  13. );
  14. type Props = {
  15. onEmojiSelect: (emoji: string) => void;
  16. };
  17. export default function EmojiPicker({ onEmojiSelect }: Props) {
  18. const [showPicker, setShowPicker] = useState(false);
  19. const wrapperRef = useRef<HTMLDivElement>(null);
  20. const handleEmojiClick = (emojiData: EmojiClickData) => {
  21. onEmojiSelect(emojiData.emoji);
  22. setShowPicker(false); // 선택 후 자동으로 닫기
  23. };
  24. useEffect(() => {
  25. const handleClickOutside = (event: MouseEvent) => {
  26. if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) {
  27. setShowPicker(false);
  28. }
  29. };
  30. if (showPicker) {
  31. document.addEventListener('mousedown', handleClickOutside);
  32. } else {
  33. document.removeEventListener('mousedown', handleClickOutside);
  34. }
  35. return () => {
  36. document.removeEventListener('mousedown', handleClickOutside);
  37. };
  38. }, [showPicker]);
  39. return (
  40. <>
  41. <div id='emojiPicker' ref={wrapperRef}>
  42. <button type="button" onClick={() => setShowPicker(prev => !prev)} title='이모지 선택'>
  43. <FontAwesomeIcon icon={faFaceSmile} />
  44. </button>
  45. {showPicker && (
  46. <Picker
  47. searchPlaceholder="그림 이모니콘 검색"
  48. onEmojiClick={handleEmojiClick}
  49. emojiStyle={EmojiStyle.NATIVE}
  50. previewConfig={{
  51. showPreview: false
  52. }}
  53. lazyLoadEmojis={true}
  54. width="30rem"
  55. height="20rem"
  56. categories={[
  57. { category: Categories.SMILEYS_PEOPLE, name: '인물' },
  58. { category: Categories.ANIMALS_NATURE, name: '자연' },
  59. { category: Categories.FOOD_DRINK, name: '음식' },
  60. { category: Categories.TRAVEL_PLACES, name: '여행' },
  61. { category: Categories.ACTIVITIES, name: '활동' },
  62. { category: Categories.OBJECTS, name: '사물' },
  63. { category: Categories.SYMBOLS, name: '기호' },
  64. { category: Categories.FLAGS, name: '국기' }
  65. ]}
  66. />
  67. )}
  68. </div>
  69. </>
  70. );
  71. }