import { useState, useEffect, useCallback } from 'react'; import { Search, X, Users, Check } from 'lucide-react'; import { comms } from '@/communication'; import { GroupUser } from '@/types'; interface UserSearchDialogProps { isOpen: boolean; onClose: () => void; onSelect: (user: GroupUser) => void; title?: string; excludeUsers?: string[]; // 제외할 사용자 ID 목록 initialSearchKey?: string; // 초기 검색어 } export function UserSearchDialog({ isOpen, onClose, onSelect, title = '사용자 검색', excludeUsers = [], initialSearchKey = '', }: UserSearchDialogProps) { const [users, setUsers] = useState([]); const [filteredUsers, setFilteredUsers] = useState([]); const [searchKey, setSearchKey] = useState(''); const [loading, setLoading] = useState(false); const [selectedUser, setSelectedUser] = useState(null); // 사용자 목록 로드 const loadUsers = useCallback(async () => { setLoading(true); try { const result = await comms.getUserList('%'); if (Array.isArray(result)) { // 제외 목록에 없고, 계정 사용 중이고, 퇴사하지 않은 사용자만 표시 const filtered = result.filter( (u: GroupUser) => u.useUserState && !excludeUsers.includes(u.id) && !u.outdate // 퇴사일이 없는 사용자만 (재직 중) ); setUsers(filtered); setFilteredUsers(filtered); } } catch (error) { console.error('사용자 목록 로드 실패:', error); } finally { setLoading(false); } }, [excludeUsers]); // 다이얼로그 열릴 때 데이터 로드 useEffect(() => { if (isOpen) { loadUsers(); setSearchKey(initialSearchKey); // 초기 검색어 설정 setSelectedUser(null); } }, [isOpen, loadUsers, initialSearchKey]); // 검색 필터링 useEffect(() => { if (!searchKey.trim()) { setFilteredUsers(users); } else { const key = searchKey.toLowerCase(); setFilteredUsers( users.filter( (u) => u.id.toLowerCase().includes(key) || (u.name || '').toLowerCase().includes(key) || (u.email || '').toLowerCase().includes(key) ) ); } }, [searchKey, users]); // 선택 확정 const handleConfirm = () => { if (selectedUser) { onSelect(selectedUser); onClose(); } }; // ESC 키로 닫기 useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape' && isOpen) { onClose(); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [isOpen, onClose]); if (!isOpen) return null; return (
e.stopPropagation()} > {/* 헤더 */}

{title}

{/* 검색 */}
setSearchKey(e.target.value)} placeholder="사번, 이름, 이메일로 검색..." autoFocus className="w-full pl-10 pr-4 py-2 bg-white/10 border border-white/20 rounded-lg text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-primary-400" />
{/* 사용자 목록 */}
{loading ? (

로딩 중...

) : filteredUsers.length === 0 ? (
{searchKey ? '검색 결과가 없습니다' : '사용자가 없습니다'}
) : (
{filteredUsers.map((user) => ( ))}
)}
{/* 푸터 */}
{filteredUsers.length}명 {selectedUser && `| 선택: ${selectedUser.id} (${selectedUser.name})`}
); }