import { useEffect, useState, useSyncExternalStore } from "react"; import { ExperimentView } from "@chopin/experiment/react"; import { StaticPlanEditor } from "@chopin/editor/static"; import { NavigationDialog } from "../navigation-dialog"; import type { ExperimentStore } from "./store"; import { EvidenceActions, EvidenceDecisions } from "./evidence"; import { RequestIdentity } from "./request-id"; export function ExperimentsPanel({ store, userId, canEdit, onClose }: { store: ExperimentStore; userId: string; canEdit: boolean; onClose: () => void; }) { useSyncExternalStore(store.subscribe, store.snapshot); let [selected, setSelected] = useState(""); let [brief, setBrief] = useState(""); let [connectionId, setConnectionId] = useState(""); let [busy, setBusy] = useState(false); let [error, setError] = useState(""); let [creation] = useState(() => new RequestIdentity()); let item = store.get(selected); let owned = store.connections.filter(connection => connection.owner === userId); useEffect(() => { if (selected) void store.load(selected); }, [store, selected]); async function act(action: () => Promise) { setBusy(true); setError(""); try { await action(); } catch (error) { setError(String((error as Error).message)); } finally { setBusy(false); } } return (

{store.connections.length ? store.connections.map(connection => `${connection.login}: ${connection.label} (${connection.source.commit.slice(0, 8)})` ).join(" · ") : "Connect a local workspace with chopin connect to run an investigation."}

{(error || store.error) && (

{error || store.error}

)} {canEdit && (
{ event.preventDefault(); void act(async () => { let value = await store.action("", "", { id: creation.key({ brief }), brief }); creation.clear(); setSelected(value.id); setBrief(""); }); }} >