import { Check, Copy } from "lucide-react"; import type React from "react"; import { useEffect, useRef, useState } from "react"; export interface JsonBlockProps { data: unknown; title?: string; initialCollapsed?: boolean; } export function JsonBlock({ data, title, initialCollapsed = false }: JsonBlockProps) { const [collapsed, setCollapsed] = useState(initialCollapsed); const [copied, setCopied] = useState(false); const copyResetRef = useRef(0); const jsonStr = JSON.stringify(data, null, 2); // Clear the pending "Copied" reset if the block unmounts (e.g. drawer close). useEffect(() => () => window.clearTimeout(copyResetRef.current), []); const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); setCollapsed(!collapsed); } }; const handleCopy = async (e: React.MouseEvent) => { // Don't toggle the collapse state when copying. e.stopPropagation(); try { await navigator.clipboard.writeText(jsonStr); setCopied(true); window.clearTimeout(copyResetRef.current); copyResetRef.current = window.setTimeout(() => setCopied(false), 1500); } catch { // Clipboard API unavailable (e.g. insecure context); silently no-op. } }; return (
setCollapsed(!collapsed)} onKeyDown={handleKeyDown} tabIndex={0} role="button" aria-expanded={!collapsed} > {title || "JSON"}
{collapsed ? "▶ Show" : "▼ Hide"}
{!collapsed && (
						{jsonStr}
					
)}
); }