'use client'; import { useQuery } from '@tanstack/react-query'; import { useState, type FormEvent } from 'react'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { EmptyState } from '@/components/ui/empty-state'; import { Skeleton } from '@/components/ui/skeleton'; import { Table, Td, Th, Tr } from '@/components/ui/table'; import { Link } from '@/i18n/navigation'; import { useT } from '@/i18n/t'; import { api } from '@/lib/api'; /** Two characters is the shortest thing the server treats as a search. */ const MIN_LENGTH = 2; /** Flow H: search by email, RUC or name, then open one account. */ export function UsersScreen() { const t = useT(); const [draft, setDraft] = useState(''); const [term, setTerm] = useState(''); const results = useQuery({ queryKey: ['admin', 'users', term], queryFn: ({ signal }) => api.searchUsers(term, signal), enabled: term.length >= MIN_LENGTH, }); function submit(event: FormEvent) { event.preventDefault(); setTerm(draft.trim()); } return (

{t('admin.users.title')}

setDraft(event.target.value)} className="h-10 rounded-lg text-sm" autoComplete="off" />

{t('admin.users.searchHint')}

{term.length < MIN_LENGTH ? : null} {results.isPending && term.length >= MIN_LENGTH ? ( ) : null} {results.isError ? (

{t('common.error.generic')}

) : null} {results.data && results.data.items.length === 0 ? ( ) : null} {results.data && results.data.items.length > 0 ? ( {results.data.items.map((user) => ( ))}
{t('admin.users.col.email')} {t('admin.users.col.name')} {t('admin.users.col.doc')} {t('admin.users.col.role')} {t('admin.users.col.created')}
{user.email} {user.fullName} {user.doc ?? t('common.none')} {t(`admin.role.${user.role}` as const)} {user.createdAt.slice(0, 10)}
) : null}
); }