import { useState, useCallback, useRef, useEffect } from 'react' import { Search, User } from 'lucide-react' import { api } from '../../api/client' export interface PickedAccount { id: number username: string domain: string email: string status: string ipAddress: string | null package?: { name: string } } interface Props { onSelect: (account: PickedAccount) => void selected?: PickedAccount | null placeholder?: string } const statusColor: Record = { active: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20', suspended: 'bg-amber-500/10 text-amber-400 border-amber-500/20', terminated: 'bg-red-500/10 text-red-400 border-red-500/20', } export default function AccountPicker({ onSelect, selected, placeholder = 'Search by username, domain, or email...' }: Props) { const [search, setSearch] = useState('') const [results, setResults] = useState([]) const [loading, setLoading] = useState(false) const [open, setOpen] = useState(false) const timerRef = useRef | null>(null) const containerRef = useRef(null) const doSearch = useCallback(async (q: string) => { if (!q.trim()) { setResults([]); setOpen(false); return } setLoading(true) try { const r = await api.get(`/nixserver/accounts?search=${encodeURIComponent(q)}&limit=10`) setResults(r.data.data.items) setOpen(true) } catch { setResults([]) } finally { setLoading(false) } }, []) const handleInput = (val: string) => { setSearch(val) if (timerRef.current) clearTimeout(timerRef.current) timerRef.current = setTimeout(() => doSearch(val), 300) } const handleSelect = (acc: PickedAccount) => { onSelect(acc) setSearch('') setResults([]) setOpen(false) } useEffect(() => { const handler = (e: MouseEvent) => { if (containerRef.current && !containerRef.current.contains(e.target as Node)) { setOpen(false) } } document.addEventListener('mousedown', handler) return () => document.removeEventListener('mousedown', handler) }, []) return (
{loading && (
)} handleInput(e.target.value)} placeholder={placeholder} className="w-full bg-[#1a1d27] border border-[#2a2d3e] text-white text-sm rounded-lg pl-9 pr-9 py-2 focus:outline-none focus:border-indigo-500" /> {open && results.length > 0 && (
{results.map(acc => ( ))}
)} {open && !loading && results.length === 0 && search.trim() && (

No accounts found

)}
{selected && (

{selected.username}

{selected.domain} — {selected.email}

{selected.package && (

Package: {selected.package.name}

)}
{selected.status}
)}
) }