feature/add-appointments-endpoint #54

Merged
M-Gabrielly merged 2 commits from feature/add-appointments-endpoint into develop 2025-10-21 03:17:51 +00:00
Showing only changes of commit 369846f1c2 - Show all commits

View File

@ -849,7 +849,23 @@ const ProfissionalPage = () => {
try {
if (isMaybeId(term)) {
try {
const r = await buscarRelatorioPorId(term);
let r: any = null;
// Try direct API lookup first
try {
r = await buscarRelatorioPorId(term);
} catch (e) {
console.warn('[SearchBox] buscarRelatorioPorId failed, will try loadReportById fallback', e);
}
// Fallback: use hook loader if direct API didn't return
if (!r) {
try {
r = await loadReportById(term);
} catch (e) {
console.warn('[SearchBox] loadReportById fallback failed', e);
}
}
if (r) {
// If token exists, attempt batch enrichment like useReports
const enriched: any = { ...r };
@ -935,8 +951,14 @@ const ProfissionalPage = () => {
const handleClear = async () => {
setSearchTerm('');
await loadReports();
try {
// Reuse the same logic as initial load so Clear restores the doctor's assigned laudos
await loadAssignedLaudos();
} catch (err) {
console.warn('[SearchBox] erro ao restaurar laudos do médico ao limpar busca:', err);
// Safe fallback to whatever reports are available
setLaudos(reports || []);
}
};
return (
@ -965,31 +987,26 @@ const ProfissionalPage = () => {
);
}
// carregar laudos ao montar - somente dos pacientes atribuídos ao médico logado
useEffect(() => {
let mounted = true;
(async () => {
// helper to load laudos for the patients assigned to the logged-in user
const loadAssignedLaudos = async () => {
try {
// obter assignments para o usuário logado
const assignments = await import('@/lib/assignment').then(m => m.listAssignmentsForUser(user?.id || ''));
const patientIds = Array.isArray(assignments) ? assignments.map(a => String(a.patient_id)).filter(Boolean) : [];
if (patientIds.length === 0) {
if (mounted) setLaudos([]);
setLaudos([]);
return;
}
// Tentar carregar todos os relatórios em uma única chamada usando in.(...)
try {
const reportsMod = await import('@/lib/reports');
if (typeof reportsMod.listarRelatoriosPorPacientes === 'function') {
const batch = await reportsMod.listarRelatoriosPorPacientes(patientIds);
// Filtrar apenas relatórios criados/solicitados por este usuário (evita mostrar laudos de outros médicos)
const mineOnly = (batch || []).filter((r: any) => {
const requester = ((r.requested_by ?? r.created_by ?? r.executante ?? r.requestedBy ?? r.createdBy) || '').toString();
return user?.id && requester && requester === user.id;
});
// Enrich reports with paciente objects so UI shows name/cpf immediately
const enriched = await (async (reportsArr: any[]) => {
if (!reportsArr || !reportsArr.length) return reportsArr;
const pids = reportsArr.map(r => String(getReportPatientId(r))).filter(Boolean);
@ -997,23 +1014,22 @@ const ProfissionalPage = () => {
try {
const patients = await buscarPacientesPorIds(pids);
const map = new Map((patients || []).map((p: any) => [String(p.id), p]));
return reportsArr.map(r => {
return reportsArr.map((r: any) => {
const pid = String(getReportPatientId(r));
return { ...r, paciente: r.paciente ?? map.get(pid) ?? r.paciente };
return { ...r, paciente: r.paciente ?? map.get(pid) ?? r.paciente } as any;
});
} catch (e) {
return reportsArr;
}
})(mineOnly);
if (mounted) setLaudos(enriched || []);
setLaudos(enriched || []);
return;
} else {
// fallback: 请求 por paciente individual
const allReports: any[] = [];
for (const pid of patientIds) {
try {
const rels = await import('@/lib/reports').then(m => m.listarRelatoriosPorPaciente(pid));
if (Array.isArray(rels) && rels.length) {
// filtrar por autor (requested_by / created_by / executante)
const mine = rels.filter((r: any) => {
const requester = ((r.requested_by ?? r.created_by ?? r.executante ?? r.requestedBy ?? r.createdBy) || '').toString();
return user?.id && requester && requester === user.id;
@ -1024,7 +1040,7 @@ const ProfissionalPage = () => {
console.warn('[LaudoManager] falha ao carregar relatórios para paciente', pid, err);
}
}
// enrich fallback results too
const enrichedAll = await (async (reportsArr: any[]) => {
if (!reportsArr || !reportsArr.length) return reportsArr;
const pids = reportsArr.map(r => String(getReportPatientId(r))).filter(Boolean);
@ -1032,12 +1048,13 @@ const ProfissionalPage = () => {
try {
const patients = await buscarPacientesPorIds(pids);
const map = new Map((patients || []).map((p: any) => [String(p.id), p]));
return reportsArr.map(r => ({ ...r, paciente: r.paciente ?? map.get(String(getReportPatientId(r))) ?? r.paciente }));
return reportsArr.map((r: any) => ({ ...r, paciente: r.paciente ?? map.get(String(getReportPatientId(r))) ?? r.paciente } as any));
} catch (e) {
return reportsArr;
}
})(allReports);
if (mounted) setLaudos(enrichedAll);
setLaudos(enrichedAll);
return;
}
} catch (err) {
console.warn('[LaudoManager] erro ao carregar relatórios em batch, tentando por paciente individual', err);
@ -1063,17 +1080,26 @@ const ProfissionalPage = () => {
try {
const patients = await buscarPacientesPorIds(pids);
const map = new Map((patients || []).map((p: any) => [String(p.id), p]));
return reportsArr.map(r => ({ ...r, paciente: r.paciente ?? map.get(String(getReportPatientId(r))) ?? r.paciente }));
return reportsArr.map((r: any) => ({ ...r, paciente: r.paciente ?? map.get(String(getReportPatientId(r))) ?? r.paciente } as any));
} catch (e) {
return reportsArr;
}
})(allReports);
if (mounted) setLaudos(enrichedAll);
setLaudos(enrichedAll);
return;
}
} catch (e) {
console.warn('[LaudoManager] erro ao carregar laudos para pacientes atribuídos:', e);
if (mounted) setLaudos(reports || []);
setLaudos(reports || []);
}
};
// carregar laudos ao montar - somente dos pacientes atribuídos ao médico logado
useEffect(() => {
let mounted = true;
(async () => {
// call the helper and bail if the component unmounted during async work
await loadAssignedLaudos();
})();
return () => { mounted = false; };
}, [user?.id]);