saveinmed/saveinmed-frontend/src/hooks/useUsuariosApi.ts
Tiago Yamamoto b39caf0fd0 first commit
2025-12-17 13:58:26 -03:00

117 lines
No EOL
3.5 KiB
TypeScript

import { useState, useCallback } from 'react';
import { usuarioApiService, UsuarioBff, UsuariosBffParams } from '@/services/usuarioApiService';
export interface UseUsuariosApiReturn {
usuarios: UsuarioBff[];
loading: boolean;
error: string | null;
totalUsuarios: number;
currentPage: number;
totalPages: number;
listarUsuarios: (params?: UsuariosBffParams) => Promise<void>;
buscarUsuarioPorId: (id: string) => Promise<UsuarioBff | null>;
atualizarUsuario: (id: string, data: Partial<UsuarioBff>) => Promise<UsuarioBff | null>;
setCurrentPage: (page: number) => void;
limparErro: () => void;
}
const DEFAULT_PAGE_SIZE = 20;
export const useUsuariosApi = (): UseUsuariosApiReturn => {
const [usuarios, setUsuarios] = useState<UsuarioBff[]>([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const [totalUsuarios, setTotalUsuarios] = useState(0);
const [currentPage, setCurrentPage] = useState(1);
const [totalPages, setTotalPages] = useState(0);
const listarUsuarios = useCallback(async (params: UsuariosBffParams = {}) => {
setLoading(true);
setError(null);
try {
// Usar parâmetros fornecidos ou valores padrão
const requestParams = {
page: params.page || currentPage,
limit: params.limit || DEFAULT_PAGE_SIZE,
search: params.search,
};
const response = await usuarioApiService.listar(requestParams);
setUsuarios(response.items);
setTotalUsuarios(response.total);
setCurrentPage(response.page);
setTotalPages(Math.ceil(response.total / response.limit));
} catch (err) {
const errorMessage = err instanceof Error ? err.message : 'Erro desconhecido ao carregar usuários';
setError(errorMessage);
console.error('❌ Erro no hook useUsuariosApi:', err);
// Limpar dados em caso de erro
setUsuarios([]);
setTotalUsuarios(0);
setTotalPages(0);
} finally {
setLoading(false);
}
}, [currentPage]);
const buscarUsuarioPorId = useCallback(async (id: string): Promise<UsuarioBff | null> => {
try {
setError(null);
return await usuarioApiService.buscarPorId(id);
} catch (err) {
const errorMessage = err instanceof Error ? err.message : 'Erro desconhecido ao buscar usuário';
setError(errorMessage);
console.error('❌ Erro ao buscar usuário por ID:', err);
return null;
}
}, []);
const atualizarUsuario = useCallback(async (id: string, data: Partial<UsuarioBff>): Promise<UsuarioBff | null> => {
try {
setError(null);
const usuarioAtualizado = await usuarioApiService.atualizar(id, data);
// Atualizar o usuário na lista local
setUsuarios(prevUsuarios =>
prevUsuarios.map(usuario =>
usuario.id === id ? usuarioAtualizado : usuario
)
);
return usuarioAtualizado;
} catch (err) {
const errorMessage = err instanceof Error ? err.message : 'Erro desconhecido ao atualizar usuário';
setError(errorMessage);
console.error('❌ Erro ao atualizar usuário:', err);
return null;
}
}, []);
const handleSetCurrentPage = useCallback((page: number) => {
setCurrentPage(page);
}, []);
const limparErro = useCallback(() => {
setError(null);
}, []);
return {
usuarios,
loading,
error,
totalUsuarios,
currentPage,
totalPages,
listarUsuarios,
buscarUsuarioPorId,
atualizarUsuario,
setCurrentPage: handleSetCurrentPage,
limparErro,
};
};