import { useEffect, useState } from "react"; import { experimentRequest } from "./api"; import { LocalLoginShell } from "../local-login-shell"; type Pairing = { input: { label: string; repository: string; commit: string }; owner: string; documents: Array<{ id: string; title: string }>; }; export default function PairingPage() { let id = new URLSearchParams(location.search).get("pairing"); let [pairing, setPairing] = useState(); let [documentId, setDocumentId] = useState(""); let [error, setError] = useState(""); let [busy, setBusy] = useState(false); let [url, setUrl] = useState(""); useEffect(() => { let abort = new AbortController(); if (!id) { setError("Pairing link is missing."); return; } experimentRequest( `/api/connector/pairings/${encodeURIComponent(id)}`, undefined, abort.signal, ) .then(setPairing).catch(error => { if (!abort.signal.aborted) setError(String(error.message)); }); return () => abort.abort(); }, [id]); async function connect() { setBusy(true); setError(""); try { let result = await experimentRequest<{ url: string }>( `/api/connector/pairings/${encodeURIComponent(id!)}/approve`, { documentId }, ); setUrl(result.url); } catch (error) { setError(error instanceof Error ? error.message : "Connection failed"); } finally { setBusy(false); } } return (

Connect local workspace

{error &&

{error}

} {pairing && (

{pairing.input.label} · {pairing.input.repository} · {pairing.input.commit.slice(0, 8)}

Connected as {pairing.owner}. You authorize each investigation on this workspace.

{url ? Open document : ( )}
)}
); }