import React, { useState, useEffect, useRef } from 'react' import ReactDOM from 'react-dom' import { EMOJI_CATEGORIES } from './CollabChat.constants' import { TwemojiImg } from './CollabChatTwemojiImg' /* ── Emoji Picker ── */ interface EmojiPickerProps { onSelect: (emoji: string) => void onClose: () => void anchorRef: React.RefObject containerRef: React.RefObject } export function EmojiPicker({ onSelect, onClose, anchorRef, containerRef }: EmojiPickerProps) { const [cat, setCat] = useState(Object.keys(EMOJI_CATEGORIES)[0]) const ref = useRef(null) const getPos = () => { const container = containerRef?.current const anchor = anchorRef?.current if (container && anchor) { const cRect = container.getBoundingClientRect() const aRect = anchor.getBoundingClientRect() return { bottom: window.innerHeight - aRect.top + 16, left: cRect.left + cRect.width / 2 - 140 } } return { bottom: 80, left: 0 } } const pos = getPos() useEffect(() => { const close = (e) => { if (ref.current && ref.current.contains(e.target)) return if (anchorRef?.current && anchorRef.current.contains(e.target)) return onClose() } document.addEventListener('mousedown', close) return () => document.removeEventListener('mousedown', close) }, [onClose, anchorRef]) return ReactDOM.createPortal(
{/* Category tabs */}
{Object.keys(EMOJI_CATEGORIES).map(c => ( ))}
{/* Emoji grid */}
{EMOJI_CATEGORIES[cat].map((emoji, i) => ( ))}
, document.body ) }