function PatientsView({ onOpenPatient, onNewPatient, podeEditar = true }) { const [cases, setCases] = React.useState([]); const [loading, setLoading] = React.useState(true); const [filter, setFilter] = React.useState("all"); const [q, setQ] = React.useState(""); const [lifecycle, setLifecycle] = React.useState(null); const [acting, setActing] = React.useState(false); const [actionError, setActionError] = React.useState(null); const requestId = React.useRef(0); const loadCases = () => { const currentRequest = ++requestId.current; setLoading(true); window.API.listCases({ limit: 100, ...(filter !== "all" ? { status: filter } : {}), ...(q.trim() ? { q: q.trim() } : {}), }).then(data => { if (currentRequest !== requestId.current) return; const items = data.items || []; setCases(filter === "all" ? items.filter(item => item.status !== "archived") : items); setLoading(false); }).catch(() => { if (currentRequest !== requestId.current) return; setCases([]); setLoading(false); }); }; React.useEffect(loadCases, [filter, q]); const openLifecycle = async (patient, action) => { setActionError(null); let warnings = []; if (action === "publish") { setActing(true); try { const check = await window.API.validateCasePublication(patient.id); warnings = check.warnings; } catch (error) { setActing(false); if (error.issues && error.issues.length) { onOpenPatient(patient.id, { publicationIssues: error.issues }); return; } alert(userErrorMessage(error)); return; } setActing(false); } setLifecycle({ patient, action, warnings }); }; const closeLifecycle = () => { if (acting) return; setLifecycle(null); setActionError(null); }; const confirmLifecycle = () => { if (!lifecycle) return; const method = lifecycle.action + "Case"; setActing(true); setActionError(null); window.API[method](lifecycle.patient.id).then(() => { setActing(false); setLifecycle(null); loadCases(); }).catch(error => { setActing(false); setActionError(error); }); }; const lifecycleCopy = lifecycle && { publish: ["Publicar caso clínico", "Publicar", "checkCircle", "Após a publicação, o conteúdo ficará somente leitura até ser despublicado."], unpublish: ["Despublicar caso clínico", "Despublicar", "edit", "O caso voltará a ser um rascunho editável e sairá do acervo disponível para simulação."], archive: ["Arquivar caso clínico", "Arquivar", "archive", "O caso sairá do acervo ativo e poderá ser restaurado depois."], restore: ["Restaurar caso clínico", "Restaurar", "restore", "O caso voltará ao acervo como rascunho."], }[lifecycle.action]; return (
Casos clínicos configuráveis usados diretamente nas simulações para o Meta Quest.
| Caso | Perfil | Queixa principal | Atualizado | Status | Ações |
|---|---|---|---|---|---|
{(patient.nome || "?").split(" ").map(word => word[0]).slice(0, 2).join("")} {patient.nome} {patient.ref} |
{pessoais.idade ? pessoais.idade + " anos" : "—"} · {pessoais.profissao || "—"} | {tags.map(tag => |
{updatedLabel} | event.stopPropagation()}>
{patient.status === "draft" && <>
|
{lifecycle.patient.nome}
{lifecycleCopy[3]}