import { useState, useRef, useEffect } from 'react' import { Users, Check, X } from 'lucide-react' /** * 多选成员选择器 * 支持搜索、已选 Tag 展示、点击外部关闭 */ export default function MemberSelector({ members = [], selected = [], onChange }) { const [open, setOpen] = useState(false) const [search, setSearch] = useState('') const ref = useRef(null) // 点击外部关闭 useEffect(() => { function handler(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false) } document.addEventListener('mousedown', handler) return () => document.removeEventListener('mousedown', handler) }, []) const filtered = members.filter((m) => { if (!search) return true return ( m.accountName?.includes(search) || m.groupNickname?.includes(search) || m.platformId?.includes(search) ) }) const toggle = (id) => { if (selected.includes(id)) { onChange(selected.filter((s) => s !== id)) } else { onChange([...selected, id]) } } const getMember = (id) => members.find((m) => m.platformId === id) return (
setOpen(!open)} id="member-selector-trigger" > {selected.length === 0 ? ( 全部成员 ) : ( 已选 {selected.length} 人 )}
{open && (
{/* 搜索框 */}
setSearch(e.target.value)} autoFocus />
{/* 列表 */}
{filtered.length === 0 && (
无匹配成员
)} {filtered.map((m) => { const checked = selected.includes(m.platformId) return (
toggle(m.platformId)} >
{checked && }
{m.accountName}
{m.groupNickname && m.groupNickname !== m.accountName && (
{m.groupNickname}
)}
) })}
{/* 已选 + 清空 */}
{selected.length === 0 && ( 未选择(显示全部) )} {selected.map((id) => { const m = getMember(id) return (
{m?.accountName || id} { e.stopPropagation(); toggle(id) }}>
) })}
{selected.length > 0 && ( )}
)}
) }