import * as React from "react"; import Markdown from "react-markdown"; import { api } from "../api/client"; const { useEffect, useRef, useState } = React; const STAGE_LABELS: Record = { upcoming: "Upcoming", current: "Current", qa: "QA", merge: "To Merge", done: "Done", archived: "Archived", }; interface WorkItemDetailPanelProps { storyId: string; onClose: () => void; } export function WorkItemDetailPanel({ storyId, onClose, }: WorkItemDetailPanelProps) { const [content, setContent] = useState(null); const [stage, setStage] = useState(""); const [name, setName] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const panelRef = useRef(null); useEffect(() => { setLoading(true); setError(null); api .getWorkItemContent(storyId) .then((data) => { setContent(data.content); setStage(data.stage); setName(data.name); }) .catch((err: unknown) => { setError(err instanceof Error ? err.message : "Failed to load content"); }) .finally(() => { setLoading(false); }); }, [storyId]); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === "Escape") { onClose(); } }; window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, [onClose]); const stageLabel = STAGE_LABELS[stage] ?? stage; return (
{/* Header */}
{name ?? storyId}
{stage && (
{stageLabel}
)}
{/* Scrollable content area */}
{loading && (
Loading...
)} {error && (
{error}
)} {!loading && !error && content !== null && (
(

{children}

), // biome-ignore lint/suspicious/noExplicitAny: react-markdown requires any for component props h2: ({ children }: any) => (

{children}

), // biome-ignore lint/suspicious/noExplicitAny: react-markdown requires any for component props h3: ({ children }: any) => (

{children}

), }} > {content}
)} {/* Placeholder sections for future content */}
{( [ { id: "agent-logs", label: "Agent Logs" }, { id: "test-output", label: "Test Output" }, { id: "coverage", label: "Coverage" }, ] as { id: string; label: string }[] ).map(({ id, label }) => (
{label}
Coming soon
))}
); }