import { useBackend } from "../nwb/useBackend"; import type { BackendMode } from "../nwb/useBackend"; import { useNwbData, WINDOW_SAMPLES } from "../nwb/useNwbData"; import { LinePlot } from "./LinePlot"; type Props = { title: string; description: string; mode: BackendMode; downloadUrl: string; dandisetId: string; }; // Decimate a long array down to ~maxPoints for light SVG rendering. const decimate = ( arr: T, maxPoints = 1500, ): number[] => { const step = Math.max(1, Math.floor(arr.length / maxPoints)); const out: number[] = []; for (let i = 0; i < arr.length; i += step) out.push(arr[i]); return out; }; export const BackendPanel = ({ title, description, mode, downloadUrl, dandisetId, }: Props) => { const backend = useBackend(downloadUrl, dandisetId, mode); const data = useNwbData(backend.file); return (

{title}

{description}

Status:{" "} {backend.status === "opening" && "opening remote file…"} {backend.status === "ready" && ( opened in {backend.openMs?.toFixed(0)} ms )} {backend.status === "error" && ( error )} {backend.status === "idle" && "idle"}
{backend.resolvedUrl && (
Resolved: {backend.resolvedUrl}
)} {backend.error && (
{backend.error}
)} {backend.status === "ready" && ( <>
Reading:{" "} {data.done ? ( data.error ? ( {data.error} ) : ( complete ) ) : ( {data.step}… )}
{data.rootGroup && (
Root group: {data.rootGroup.subgroups.length} groups,{" "} {data.rootGroup.datasets.length} datasets
{data.rootGroup.subgroups.map((g) => (
πŸ“ {g.name}/
))} {data.rootGroup.datasets.map((d) => (
πŸ“„ {d.name}
))}
)} {data.meta && ( {Object.entries(data.meta).map(([k, v]) => ( ))}
{k} {v || β€”}
)} {data.timeseries && (
Loaded first {data.timeseries.t.length.toLocaleString()} of{" "} {data.timeseries.totalSamples.toLocaleString()} samples ( {( (data.timeseries.t.length / (data.timeseries.totalSamples || 1)) * 100 ).toFixed(2)} % of the trace β€” only those bytes were fetched).
)} {data.trials && (
Trials table: {data.trials.stimFrequency.length.toLocaleString()}{" "} trials β€” stimulus frequency over the session.
)} )}
Window size: {WINDOW_SAMPLES.toLocaleString()} samples
); };