import { useState, useRef, useEffect } from "react"; interface Props { onEmojiSelect: (emoji: string) => void; disabled?: boolean; } // Compact emoji set organized by category โ€” covers the most commonly used emojis const EMOJI_CATEGORIES = [ { name: "Smileys", emojis: ["๐Ÿ˜€","๐Ÿ˜ƒ","๐Ÿ˜„","๐Ÿ˜","๐Ÿ˜‚","๐Ÿคฃ","๐Ÿ˜Š","๐Ÿ˜‡","๐Ÿ™‚","๐Ÿ˜‰","๐Ÿ˜","๐Ÿฅฐ","๐Ÿ˜˜","๐Ÿ˜‹","๐Ÿ˜Ž","๐Ÿคฉ","๐Ÿฅณ","๐Ÿ˜","๐Ÿ˜’","๐Ÿ˜ž","๐Ÿ˜”","๐Ÿ˜Ÿ","๐Ÿ˜•","๐Ÿ˜ข","๐Ÿ˜ญ","๐Ÿ˜ค","๐Ÿคฌ","๐Ÿ˜ก","๐Ÿคฏ","๐Ÿ˜ณ","๐Ÿฅบ","๐Ÿ˜ฑ","๐Ÿ˜จ","๐Ÿ˜ฐ","๐Ÿค—","๐Ÿค”","๐Ÿคซ","๐Ÿคญ","๐Ÿ˜","๐Ÿ˜‘","๐Ÿ˜ฌ","๐Ÿ™„","๐Ÿ˜ด","๐Ÿคฎ","๐Ÿคข","๐Ÿคง","๐Ÿ˜ท","๐Ÿค’"] }, { name: "Gestures", emojis: ["๐Ÿ‘","๐Ÿ‘Ž","๐Ÿ‘Š","โœŠ","๐Ÿค›","๐Ÿคœ","๐Ÿ‘","๐Ÿ™Œ","๐Ÿ‘","๐Ÿค","๐Ÿ™","๐Ÿ’ช","๐Ÿคž","โœŒ๏ธ","๐ŸคŸ","๐Ÿค˜","๐Ÿ‘Œ","๐Ÿค™","๐Ÿ‘ˆ","๐Ÿ‘‰","๐Ÿ‘†","๐Ÿ‘‡","โ˜๏ธ","โœ‹","๐Ÿคš","๐Ÿ–๏ธ","๐Ÿ––","๐Ÿ‘‹","๐Ÿค","โœ๏ธ"] }, { name: "Hearts", emojis: ["โค๏ธ","๐Ÿงก","๐Ÿ’›","๐Ÿ’š","๐Ÿ’™","๐Ÿ’œ","๐Ÿ–ค","๐Ÿค","๐ŸคŽ","๐Ÿ’”","โค๏ธโ€๐Ÿ”ฅ","๐Ÿ’•","๐Ÿ’ž","๐Ÿ’“","๐Ÿ’—","๐Ÿ’–","๐Ÿ’˜","๐Ÿ’","๐Ÿ’Ÿ","โ™ฅ๏ธ"] }, { name: "People", emojis: ["๐Ÿ‘ถ","๐Ÿ‘ง","๐Ÿง’","๐Ÿ‘ฆ","๐Ÿ‘ฉ","๐Ÿง‘","๐Ÿ‘จ","๐Ÿ‘ฉโ€๐Ÿฆฑ","๐Ÿ‘จโ€๐Ÿฆฑ","๐Ÿ‘ฉโ€๐Ÿฆฐ","๐Ÿ‘จโ€๐Ÿฆฐ","๐Ÿ‘ฑโ€โ™€๏ธ","๐Ÿ‘ฑโ€โ™‚๏ธ","๐Ÿ‘ฉโ€๐Ÿฆณ","๐Ÿ‘จโ€๐Ÿฆณ","๐Ÿ‘ฉโ€๐Ÿฆฒ","๐Ÿ‘จโ€๐Ÿฆฒ","๐Ÿง”","๐Ÿ‘ต","๐Ÿง“","๐Ÿ‘ด","๐Ÿคด","๐Ÿ‘ธ","๐ŸŽ…","๐Ÿคถ"] }, { name: "Animals", emojis: ["๐Ÿถ","๐Ÿฑ","๐Ÿญ","๐Ÿน","๐Ÿฐ","๐ŸฆŠ","๐Ÿป","๐Ÿผ","๐Ÿจ","๐Ÿฏ","๐Ÿฆ","๐Ÿฎ","๐Ÿท","๐Ÿธ","๐Ÿต","๐Ÿ™ˆ","๐Ÿ™‰","๐Ÿ™Š","๐Ÿ”","๐Ÿง","๐Ÿฆ","๐Ÿฆ†","๐Ÿฆ…","๐Ÿฆ‰","๐Ÿฆ‡","๐Ÿบ","๐Ÿ—","๐Ÿด","๐Ÿฆ„","๐Ÿ","๐Ÿ›","๐Ÿฆ‹","๐ŸŒ","๐Ÿž","๐Ÿœ"] }, { name: "Food", emojis: ["๐ŸŽ","๐ŸŠ","๐Ÿ‹","๐ŸŒ","๐Ÿ‰","๐Ÿ‡","๐Ÿ“","๐Ÿซ","๐Ÿˆ","๐Ÿ’","๐Ÿ‘","๐Ÿฅญ","๐Ÿ","๐Ÿฅฅ","๐Ÿฅ","๐Ÿ…","๐Ÿฅ‘","๐ŸŒฎ","๐Ÿ•","๐Ÿ”","๐ŸŸ","๐ŸŒญ","๐Ÿฟ","๐Ÿง","๐Ÿฐ","๐ŸŽ‚","๐Ÿฉ","๐Ÿช","๐Ÿซ","๐Ÿฌ"] }, { name: "Travel", emojis: ["๐Ÿš—","๐Ÿš•","๐ŸšŒ","๐ŸšŽ","๐ŸŽ๏ธ","๐Ÿš“","๐Ÿš‘","๐Ÿš’","โœˆ๏ธ","๐Ÿš€","๐Ÿ›ธ","๐Ÿš","๐Ÿ›ถ","โ›ต","๐Ÿšข","๐Ÿ ","๐Ÿก","๐Ÿข","๐Ÿฐ","๐Ÿ—ผ","๐Ÿ—ฝ","โ›ช","๐Ÿ•Œ","๐Ÿ›•","๐Ÿ›๏ธ","โ›ฉ๏ธ","๐Ÿ—ป","๐ŸŒ‹","๐Ÿœ๏ธ","๐Ÿ๏ธ"] }, { name: "Objects", emojis: ["โŒš","๐Ÿ“ฑ","๐Ÿ’ป","โŒจ๏ธ","๐Ÿ–ฅ๏ธ","๐Ÿ–จ๏ธ","๐Ÿ–ฑ๏ธ","๐Ÿ’ก","๐Ÿ”ฆ","๐Ÿ“ท","๐Ÿ“น","๐ŸŽฅ","๐Ÿ“ž","โ˜Ž๏ธ","๐Ÿ“บ","๐Ÿ“ป","๐ŸŽ™๏ธ","๐ŸŽง","๐ŸŽฌ","๐Ÿ’ฐ","๐Ÿ’ณ","๐Ÿ’Ž","๐Ÿ”‘","๐Ÿ”’","๐Ÿ“ฆ","๐Ÿ“ซ","โœ๏ธ","๐Ÿ“","๐Ÿ“Œ","๐Ÿ“Ž"] }, { name: "Symbols", emojis: ["โญ","๐ŸŒŸ","โœจ","๐Ÿ’ซ","๐Ÿ”ฅ","๐Ÿ’ฅ","๐Ÿ’ฏ","โœ…","โŒ","โญ•","โ—","โ“","๐Ÿ’ค","๐Ÿ’ฌ","๐Ÿ’ญ","๐Ÿ—ฏ๏ธ","โ™ป๏ธ","๐Ÿ””","๐ŸŽต","๐ŸŽถ","๐Ÿ†","๐Ÿฅ‡","๐Ÿฅˆ","๐Ÿฅ‰","โšฝ","๐Ÿ€","๐Ÿˆ","โšพ","๐ŸŽฏ","๐ŸŽฎ"] }, { name: "Flags", emojis: ["๐Ÿณ๏ธ","๐Ÿด","๐Ÿ","๐Ÿšฉ","๐Ÿณ๏ธโ€๐ŸŒˆ","๐Ÿ‡บ๐Ÿ‡ธ","๐Ÿ‡ฌ๐Ÿ‡ง","๐Ÿ‡จ๐Ÿ‡ฆ","๐Ÿ‡ฆ๐Ÿ‡บ","๐Ÿ‡ซ๐Ÿ‡ท","๐Ÿ‡ฉ๐Ÿ‡ช","๐Ÿ‡ฎ๐Ÿ‡น","๐Ÿ‡ช๐Ÿ‡ธ","๐Ÿ‡ง๐Ÿ‡ท","๐Ÿ‡ฏ๐Ÿ‡ต","๐Ÿ‡ฐ๐Ÿ‡ท","๐Ÿ‡จ๐Ÿ‡ณ","๐Ÿ‡ฎ๐Ÿ‡ณ","๐Ÿ‡ฒ๐Ÿ‡ฝ","๐Ÿ‡ท๐Ÿ‡บ"] }, ]; export default function EmojiPicker({ onEmojiSelect, disabled }: Props) { const [open, setOpen] = useState(false); const [activeCategory, setActiveCategory] = useState(0); const [search, setSearch] = useState(""); const ref = useRef(null); useEffect(() => { if (!open) return; const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); }; document.addEventListener("mousedown", handler); return () => document.removeEventListener("mousedown", handler); }, [open]); useEffect(() => { if (!open) return; const handler = (e: KeyboardEvent) => { if (e.key === "Escape") setOpen(false); }; document.addEventListener("keydown", handler); return () => document.removeEventListener("keydown", handler); }, [open]); const filteredEmojis = search ? EMOJI_CATEGORIES.flatMap((c) => c.emojis) : EMOJI_CATEGORIES[activeCategory]?.emojis || []; return (
{open && (
{/* Search */}
setSearch(e.target.value)} placeholder="Search..." className="vr-w-full vr-px-2.5 vr-py-1.5 vr-text-xs vr-rounded-md vr-border vr-border-gray-200 vr-outline-none focus:vr-border-primary-300 vr-bg-gray-50" autoFocus />
{/* Category tabs */} {!search && (
{EMOJI_CATEGORIES.map((cat, i) => ( ))}
)} {/* Emoji grid */}
{filteredEmojis.map((emoji, i) => ( ))}
)}
); }