import { JSONHeroPath } from "@jsonhero/path"; import { useMemo, useState } from "react"; import { useJsonSchema } from "~/hooks/useJsonSchema"; import { CodeViewer } from "./CodeViewer"; import { CopyTextButton } from "./CopyTextButton"; import {usePreferences} from '~/components/PreferencesProvider' export function JsonSchemaViewer({ path }: { path: string }) { const schema = useJsonSchema(); const schemaPath = schemaPathFromPath(path); const schemaJson = schemaPath.first(schema); const [hovering, setHovering] = useState(false); const [preferences] = usePreferences(); const code = useMemo(() => { return JSON.stringify(schemaJson, null, preferences?.indent || 2); }, [schemaJson, preferences]); return (
setHovering(true)} onMouseLeave={() => setHovering(false)} >
); } function schemaPathFromPath(path: JSONHeroPath | string): JSONHeroPath { const heroPath = typeof path === "string" ? new JSONHeroPath(path) : path; if (heroPath.isRoot) { return heroPath; } return heroPath.components.slice(1).reduce((acc, component) => { if (component.isArray) { return acc.child("items"); } else { return acc.child("properties").child(component.toString()); } }, new JSONHeroPath("$")); }