import type React from "react"; import { useState } from "react"; type JsonValue = string | number | boolean | null | JsonObject | JsonArray; type JsonObject = { [key: string]: JsonValue }; type JsonArray = JsonValue[]; const isJsonString = (str: string): boolean => { if (typeof str !== "string") return false; const trimmed = str.trim(); // Check if it looks like JSON (starts with { or [) if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) return false; try { const parsed = JSON.parse(trimmed); // Ensure it's actually an object or array, not just a primitive console.log("JSON parse successful:", parsed); return typeof parsed === "object" && parsed !== null; } catch (error) { console.log("JSON parse failed:", error); return false; } }; const JsonCollapsible: React.FC<{ data: JsonValue; isString?: boolean }> = ({ data, isString = false, }) => { const [isCollapsed, setIsCollapsed] = useState(true); let jsonData: JsonValue; try { jsonData = isString ? JSON.parse(data as string) : data; } catch { // If parsing fails, display as string return (
{String(data)}); } const isObject = typeof jsonData === "object" && jsonData !== null; if (!isObject) { return {JSON.stringify(jsonData)}; } const keys = Object.keys(jsonData as JsonObject); const preview = Array.isArray(jsonData) ? `[${jsonData.length} items]` : `{${keys.length} keys}`; return (
{JSON.stringify(jsonData, null, 2)}
{String(result)}); }; return (
Error: {error}
: null}