import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from '@/components/ui/drawer' import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' import { preloadEmojiPicker } from '@/lib/emoji-picker-preload' import { useScreenSize } from '@/providers/ScreenSizeProvider' import { TEmoji } from '@/types' import { useCallback, useEffect, useState } from 'react' import EmojiPicker from '../EmojiPicker' export default function EmojiPickerDialog({ children, onEmojiClick, portalContainer }: { children: React.ReactNode onEmojiClick?: (emoji: string | TEmoji | undefined) => void /** When set (e.g. inside a modal), picker content portals here so it stays on top of the modal */ portalContainer?: HTMLElement | null }) { const { isSmallScreen } = useScreenSize() const [open, setOpen] = useState(false) /** Keep picker mounted after first open so emoji-picker-element is not cold-started every time. */ const [pickerMounted, setPickerMounted] = useState(false) useEffect(() => { if (open) setPickerMounted(true) }, [open]) useEffect(() => { void preloadEmojiPicker() }, []) const handleOpenChange = useCallback((next: boolean) => { setOpen(next) }, []) if (isSmallScreen) { return ( {children} { const t = e.target as HTMLElement | null if (t?.closest?.('[data-vaul-overlay]')) return e.preventDefault() }} > Emoji Picker {pickerMounted ? ( { e.stopPropagation() setOpen(false) onEmojiClick?.(emoji) }} /> ) : null} ) } return ( {children} { e.stopPropagation() setOpen(false) onEmojiClick?.(emoji) }} /> ) }