import { useState, useRef, useEffect, useCallback } from 'react' import { createPortal } from 'react-dom' import { Check, ChevronDown, X } from 'lucide-react' export default function ApproverMultiSelect({ users = [], selected = [], onChange }) { const [open, setOpen] = useState(false) const triggerRef = useRef(null) const dropdownRef = useRef(null) const [pos, setPos] = useState({ top: 0, left: 0, width: 0 }) const updatePosition = useCallback(() => { if (!triggerRef.current) return const rect = triggerRef.current.getBoundingClientRect() const spaceBelow = window.innerHeight - rect.bottom const dropdownHeight = Math.min(users.length * 40 + 8, 220) const showAbove = spaceBelow < dropdownHeight && rect.top > dropdownHeight setPos({ top: showAbove ? rect.top - dropdownHeight - 4 : rect.bottom + 4, left: rect.left, width: rect.width, }) }, [users.length]) useEffect(() => { if (!open) return const handleClick = (e) => { if (triggerRef.current?.contains(e.target)) return if (dropdownRef.current?.contains(e.target)) return setOpen(false) } const handleEsc = (e) => { if (e.key === 'Escape') setOpen(false) } const handleScroll = () => updatePosition() document.addEventListener('mousedown', handleClick) document.addEventListener('keydown', handleEsc) window.addEventListener('scroll', handleScroll, true) return () => { document.removeEventListener('mousedown', handleClick) document.removeEventListener('keydown', handleEsc) window.removeEventListener('scroll', handleScroll, true) } }, [open, updatePosition]) const handleOpen = () => { updatePosition() setOpen(!open) } const toggle = (userId) => { const id = String(userId) const next = selected.includes(id) ? selected.filter(s => s !== id) : [...selected, id] onChange(next) } const remove = (id) => { onChange(selected.filter(s => s !== String(id))) } const selectedUsers = selected.map(id => users.find(u => String(u._id || u.id || u.Id) === String(id))).filter(Boolean) return ( <>