import { useMemo, useState } from "react"; import { useAtlasStore } from "../store/useAtlasStore.js"; import { MICROSCOPY_HOTSPOTS } from "../data/microscopyHotspots.js"; import { MICROSCOPY_CREDITS } from "../data/microscopyCredits.js"; import type { Structure } from "../lib/api.js"; // Generalização do SkinDiagram.tsx pra sistemas sem malha 3D que precisam // de MAIS de uma imagem (histologia tem uma fotomicrografia real por // tecido, ao contrário do tegumentar, que é uma imagem só) — ver a decisão // de usar fotos reais em vez de geometria procedural em // data-pipeline/seed/build-manifest-microscopy.mjs. export function MicroscopyDiagram({ bySlug, systemSlug, title, }: { bySlug: Map; systemSlug: string; title: string; }) { const selectedStructureId = useAtlasStore((s) => s.selectedStructureId); const selectStructure = useAtlasStore((s) => s.selectStructure); const toggleSystem = useAtlasStore((s) => s.toggleSystem); const structures = useMemo( () => [...bySlug.values()].filter((s) => s.system.slug === systemSlug), [bySlug, systemSlug], ); // Cada "modelFile" aqui não é uma malha — é o caminho da fotomicrografia // que aquela estrutura pertence (ver build-manifest-microscopy.mjs). // Agrupar por ele é o que separa as estruturas em "lâminas" navegáveis. const byImage = useMemo(() => { const map = new Map(); for (const s of structures) { if (!map.has(s.modelFile)) map.set(s.modelFile, []); map.get(s.modelFile)!.push(s); } return map; }, [structures]); const images = useMemo(() => [...byImage.keys()], [byImage]); const [activeImage, setActiveImage] = useState(null); const currentImage = activeImage && byImage.has(activeImage) ? activeImage : images[0]; if (structures.length === 0 || !currentImage) return null; const currentStructures = byImage.get(currentImage) ?? []; // O último trecho do regionPath é o "nome da lâmina" (ex: "Tecido Ósseo") // — mesma lista usada pra dar nome de cada estrutura, reaproveitada aqui // só como rótulo da aba, pra não precisar de mais um arquivo de dados. const tabLabel = (image: string) => { const first = byImage.get(image)?.[0]; return first?.regionPath[first.regionPath.length - 1] ?? image; }; return (

{title} — clique nos pontos pra explorar

{images.length > 1 && (
{images.map((image) => ( ))}
)}
{tabLabel(currentImage)} {currentStructures.map((structure) => { const hotspot = MICROSCOPY_HOTSPOTS[structure.slug]; if (!hotspot) return null; const isSelected = structure.id === selectedStructureId; return (

Fotomicrografia real (não ilustração). {MICROSCOPY_CREDITS[currentImage] ?? ""}

); }