117 lines
No EOL
3.5 KiB
TypeScript
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,
|
|
};
|
|
}; |