function StatCard({ icon, label, n, sub }) { return (
{label}
{n}
); } // `perfil` e `podeEditar` chegam do shell (RF-USUARIOS-01/02). Hoje o painel não // os consome — nenhum de seus elementos é privativo de perfil —, mas recebê-los // mantém a decisão de acesso num lugar só, o `app-portal.jsx`. function DashboardView({ onGoPatients, onOpenPatient, perfil, podeEditar }) { const [cases, setCases] = React.useState([]); const [loading, setLoading] = React.useState(true); const user = { nome: "Bem-vindo(a)" }; React.useEffect(() => { setLoading(true); window.API.listCases({ limit: 50 }).then(data => { setCases((data.items || []).filter(item => item.status !== "archived")); setLoading(false); }).catch(() => { setCases([]); setLoading(false); }); }, []); const published = cases.filter(c => c.status === "published").length; const recentP = cases.slice(0, 4); return (
Visão geral

Bom dia, {user.nome.split(" ")[0]}.

Acompanhe o acervo clínico e o uso nos óculos Meta Quest.

${published} publicados`} />
{loading ? (
Carregando casos...
) : (
Casos recentes
{recentP.map(p => ( onOpenPatient(p.id)}> ))} {recentP.length === 0 && ( )}
{(p.nome || "?").split(" ").map(w => w[0]).slice(0, 2).join("") || "?"}
{p.nome}
{p.ref} · por {p.data && p.data.pessoais ? p.data.pessoais.idade + " anos · " + p.data.pessoais.profissao : ""}
{p.data && p.data.diagnostico ? {p.data.diagnostico.queixaClassificada || "—"} : null}
Nenhum caso cadastrado.
Sessões recentes
Meta Quest 3s
Histórico de sessões em breve.
)}
); } window.DashboardView = DashboardView;