2025-10-08 21:40:06 -03:00

219 lines
5.3 KiB
TypeScript

// hooks/useReports.ts
import { useState, useEffect, useCallback } from 'react';
import {
Report,
CreateReportData,
UpdateReportData,
ApiError
} from '@/types/report-types';
import {
listarRelatorios,
buscarRelatorioPorId,
criarRelatorio,
atualizarRelatorio,
deletarRelatorio,
listarRelatoriosPorPaciente,
listarRelatoriosPorMedico
} from '@/lib/reports';
interface UseReportsReturn {
// Estados
reports: Report[];
selectedReport: Report | null;
loading: boolean;
error: string | null;
// Ações
loadReports: () => Promise<void>;
loadReportById: (id: string) => Promise<void>;
createNewReport: (data: CreateReportData) => Promise<Report>;
updateExistingReport: (id: string, data: UpdateReportData) => Promise<Report>;
deleteExistingReport: (id: string) => Promise<void>;
loadReportsByPatient: (patientId: string) => Promise<void>;
loadReportsByDoctor: (doctorId: string) => Promise<void>;
clearError: () => void;
clearSelectedReport: () => void;
}
export function useReports(): UseReportsReturn {
// Estados
const [reports, setReports] = useState<Report[]>([]);
const [selectedReport, setSelectedReport] = useState<Report | null>(null);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
// Função para tratar erros
const handleError = useCallback((error: any) => {
console.error('❌ [useReports] Erro:', error);
if (error && typeof error === 'object' && 'message' in error) {
setError(error.message);
} else if (typeof error === 'string') {
setError(error);
} else {
setError('Ocorreu um erro inesperado');
}
}, []);
// Carregar todos os relatórios
const loadReports = useCallback(async () => {
setLoading(true);
setError(null);
try {
const data = await listarRelatorios();
setReports(data);
} catch (err) {
handleError(err);
} finally {
setLoading(false);
}
}, [handleError]);
// Carregar um relatório específico
const loadReportById = useCallback(async (id: string) => {
setLoading(true);
setError(null);
try {
const report = await buscarRelatorioPorId(id);
setSelectedReport(report);
} catch (err) {
handleError(err);
} finally {
setLoading(false);
}
}, [handleError]);
// Criar novo relatório
const createNewReport = useCallback(async (data: CreateReportData): Promise<Report> => {
setLoading(true);
setError(null);
try {
const newReport = await criarRelatorio(data);
// Adicionar o novo relatório à lista
setReports(prev => [newReport, ...prev]);
return newReport;
} catch (err) {
handleError(err);
throw err;
} finally {
setLoading(false);
}
}, [handleError]);
// Atualizar relatório existente
const updateExistingReport = useCallback(async (id: string, data: UpdateReportData): Promise<Report> => {
setLoading(true);
setError(null);
try {
const updatedReport = await atualizarRelatorio(id, data);
// Atualizar na lista
setReports(prev =>
prev.map(report =>
report.id === id ? updatedReport : report
)
);
// Atualizar o selecionado se for o mesmo
if (selectedReport?.id === id) {
setSelectedReport(updatedReport);
}
return updatedReport;
} catch (err) {
handleError(err);
throw err;
} finally {
setLoading(false);
}
}, [handleError, selectedReport]);
// Deletar relatório
const deleteExistingReport = useCallback(async (id: string): Promise<void> => {
setLoading(true);
setError(null);
try {
await deletarRelatorio(id);
// Remover da lista
setReports(prev => prev.filter(report => report.id !== id));
// Limpar seleção se for o mesmo
if (selectedReport?.id === id) {
setSelectedReport(null);
}
} catch (err) {
handleError(err);
throw err;
} finally {
setLoading(false);
}
}, [handleError, selectedReport]);
// Carregar relatórios por paciente
const loadReportsByPatient = useCallback(async (patientId: string) => {
setLoading(true);
setError(null);
try {
const data = await listarRelatoriosPorPaciente(patientId);
setReports(data);
} catch (err) {
handleError(err);
} finally {
setLoading(false);
}
}, [handleError]);
// Carregar relatórios por médico
const loadReportsByDoctor = useCallback(async (doctorId: string) => {
setLoading(true);
setError(null);
try {
const data = await listarRelatoriosPorMedico(doctorId);
setReports(data);
} catch (err) {
handleError(err);
} finally {
setLoading(false);
}
}, [handleError]);
// Limpar erro
const clearError = useCallback(() => {
setError(null);
}, []);
// Limpar relatório selecionado
const clearSelectedReport = useCallback(() => {
setSelectedReport(null);
}, []);
return {
// Estados
reports,
selectedReport,
loading,
error,
// Ações
loadReports,
loadReportById,
createNewReport,
updateExistingReport,
deleteExistingReport,
loadReportsByPatient,
loadReportsByDoctor,
clearError,
clearSelectedReport,
};
}