import React, { useState, useMemo } from 'react'; import { Search } from 'lucide-react'; interface NativeEmojiPickerProps { onEmojiSelect: (emoji: string) => void; searchPlaceholder?: string; } const EMOJI_CATEGORIES: { name: string; emojis: string[] }[] = [ { name: 'Smileys & Emotion', emojis: [ '๐Ÿ˜€', '๐Ÿ˜ƒ', '๐Ÿ˜„', '๐Ÿ˜', '๐Ÿ˜†', '๐Ÿ˜…', '๐Ÿ˜‚', '๐Ÿคฃ', '๐Ÿ˜Š', '๐Ÿ˜‡', '๐Ÿ™‚', '๐Ÿ™ƒ', '๐Ÿ˜‰', '๐Ÿ˜Œ', '๐Ÿ˜', '๐Ÿฅฐ', '๐Ÿ˜˜', '๐Ÿ˜—', '๐Ÿ˜™', '๐Ÿ˜š', '๐Ÿ˜‹', '๐Ÿ˜›', '๐Ÿ˜œ', '๐Ÿคช', '๐Ÿ˜', '๐Ÿค‘', '๐Ÿค—', '๐Ÿคญ', '๐Ÿคซ', '๐Ÿค”', '๐Ÿค', '๐Ÿคจ', '๐Ÿ˜', '๐Ÿ˜‘', '๐Ÿ˜ถ', '๐Ÿ˜', '๐Ÿ˜’', '๐Ÿ™„', '๐Ÿ˜ฌ', '๐Ÿคฅ', '๐Ÿ˜Œ', '๐Ÿ˜”', '๐Ÿ˜ช', '๐Ÿคค', '๐Ÿ˜ด', '๐Ÿ˜ท', '๐Ÿค’', '๐Ÿค•', '๐Ÿคข', '๐Ÿคฎ', '๐Ÿคง', '๐Ÿฅต', '๐Ÿฅถ', '๐Ÿฅด', '๐Ÿ˜ต', '๐Ÿคฏ', '๐Ÿค ', '๐Ÿฅณ', '๐Ÿ˜Ž', '๐Ÿค“' ] }, { name: 'Chat & Communication', emojis: [ '๐Ÿ’ฌ', '๐Ÿ—จ๏ธ', '๐Ÿ—ฏ๏ธ', '๐Ÿ’ญ', '๐Ÿ“ž', '๐Ÿ“ฑ', '๐Ÿ“ฒ', 'โ˜Ž๏ธ', '๐Ÿ“Ÿ', 'โœ‰๏ธ', '๐Ÿ“ง', '๐Ÿ“จ', '๐Ÿ“ฉ', '๐Ÿ“ค', '๐Ÿ“ฅ', '๐Ÿ“ฆ', '๐Ÿท๏ธ', '๐Ÿ›’', '๐Ÿ›๏ธ', '๐Ÿ’ณ', '๐Ÿ’ฐ', '๐Ÿ’ต', '๐Ÿ’ธ', '๐Ÿ’Ž', '๐Ÿ”ฅ', 'โšก', 'โญ', '๐ŸŒŸ', 'โœจ', '๐ŸŽ‰', '๐ŸŽŠ', '๐ŸŽฏ', '๐Ÿ””', '๐Ÿ“ข', '๐Ÿ“ฃ', '๐ŸŸข', '๐Ÿ”ด', '๐ŸŸก', '๐Ÿ”ต', 'โšช' ] }, { name: 'Gestures & People', emojis: [ '๐Ÿ‘‹', '๐Ÿคš', '๐Ÿ–๏ธ', 'โœ‹', '๐Ÿ––', '๐Ÿ‘Œ', '๐Ÿค', 'โœŒ๏ธ', '๐Ÿคž', '๐ŸคŸ', '๐Ÿค˜', '๐Ÿค™', '๐Ÿ‘ˆ', '๐Ÿ‘‰', '๐Ÿ‘†', '๐Ÿ–•', '๐Ÿ‘‡', 'โ˜๏ธ', '๐Ÿ‘', '๐Ÿ‘Ž', 'โœŠ', '๐Ÿ‘Š', '๐Ÿค›', '๐Ÿคœ', '๐Ÿ‘', '๐Ÿ™Œ', '๐Ÿ‘', '๐Ÿคฒ', '๐Ÿค', '๐Ÿ™', 'โœ๏ธ', '๐Ÿ’…', '๐Ÿคณ', '๐Ÿ’ช', 'โค๏ธ', '๐Ÿงก', '๐Ÿ’›', '๐Ÿ’š', '๐Ÿ’™', '๐Ÿ’œ' ] }, { name: 'Symbols & Indicators', emojis: [ 'โœ…', 'โŒ', 'โœ”๏ธ', 'โœ–๏ธ', 'โž•', 'โž–', 'โž—', 'โ“', 'โ”', 'โ•', 'โ—', '๐Ÿ’ฏ', 'โš ๏ธ', '๐Ÿš€', '๐Ÿ”’', '๐Ÿ”“', '๐Ÿ”—', '๐Ÿ“Œ', '๐Ÿ“', '๐Ÿ†', '๐Ÿ‘‘', 'โฐ', 'โณ', '๐Ÿ’ก', '๐Ÿ”', '๐Ÿ”Ž', '๐Ÿ›ก๏ธ', 'โš™๏ธ', '๐Ÿ“ˆ', '๐Ÿ“Š' ] } ]; export const NativeEmojiPicker: React.FC = ({ onEmojiSelect, searchPlaceholder = 'Search emoji...' }) => { const [searchTerm, setSearchTerm] = useState(''); const [activeCategory, setActiveCategory] = useState('All'); const filteredCategories = useMemo(() => { if (!searchTerm.trim()) { if (activeCategory === 'All') return EMOJI_CATEGORIES; return EMOJI_CATEGORIES.filter((c) => c.name === activeCategory); } const query = searchTerm.toLowerCase(); return EMOJI_CATEGORIES.map((cat) => ({ ...cat, emojis: cat.emojis.filter((e) => e.includes(query) || cat.name.toLowerCase().includes(query)) })).filter((cat) => cat.emojis.length > 0); }, [searchTerm, activeCategory]); return (
{/* Search Header */}
setSearchTerm(e.target.value)} placeholder={searchPlaceholder} className="w-full pl-8 pr-2.5 py-1.5 text-xs bg-white border border-slate-200 rounded-lg outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 text-slate-700" autoFocus />
{/* Category Filter Pills */} {!searchTerm && (
{EMOJI_CATEGORIES.map((cat) => ( ))}
)}
{/* Emoji Grid */}
{filteredCategories.map((cat) => (
{cat.name}
{cat.emojis.map((emoji, idx) => ( ))}
))} {filteredCategories.length === 0 && (
No emojis found
)}
); };