import React, { useCallback, useEffect, useRef, useState } from 'react' import data from '@emoji-mart/data' import Picker from '@emoji-mart/react' /** * A button that opens a floating emoji picker. * When the user selects an emoji, `onEmojiSelect(emojiNative)` is called * with the native Unicode character. * * Props: * onEmojiSelect (string) → void Called with the emoji character * disabled boolean Disables the button * className string Additional classes for the trigger button */ export default function EmojiPickerButton({ onEmojiSelect, disabled = false, className = '' }) { const [open, setOpen] = useState(false) const wrapRef = useRef(null) // Close on outside click useEffect(() => { if (!open) return function handleClick(e) { if (wrapRef.current && !wrapRef.current.contains(e.target)) { setOpen(false) } } document.addEventListener('mousedown', handleClick) return () => document.removeEventListener('mousedown', handleClick) }, [open]) // Close on Escape useEffect(() => { if (!open) return function handleKey(e) { if (e.key === 'Escape') setOpen(false) } document.addEventListener('keydown', handleKey) return () => document.removeEventListener('keydown', handleKey) }, [open]) const handleSelect = useCallback( (emoji) => { onEmojiSelect?.(emoji.native) setOpen(false) }, [onEmojiSelect], ) return (
{open && (
)}
) }