import { createContext, useContext, useState } from 'react' import ChevronIcon from './ChevronDownSvg' import Copy from './Copy' const JsonViewContext = createContext({ collapseStringsAfterLength: 99, collapseObjectsAfterLength: 20, enableClipboard: true }) export default function JsonView({ src, collapseStringsAfterLength = 99, collapseObjectsAfterLength = 20, enableClipboard = true }: { src: any collapseStringsAfterLength?: number collapseObjectsAfterLength?: number enableClipboard?: boolean }) { return ( ) } function JsonNode({ node }: { node: any }) { const jv = useContext(JsonViewContext) if (Array.isArray(node) || isObject(node)) { return } else if (typeof node === 'number') return ( <> {node} {jv.enableClipboard && } ) else if (typeof node === 'string') return node.length > jv.collapseStringsAfterLength ? ( <> {jv.enableClipboard && } ) : ( <> "{node}" {jv.enableClipboard && } ) else if (typeof node === 'boolean') return ( <> {String(node)} {jv.enableClipboard && } ) else if (node === null) return ( <> null {jv.enableClipboard && } ) else return {String(node)} } function ObjectNode({ node }: { node: Record | Array }) { const jv = useContext(JsonViewContext) const [fold, setFold] = useState( Array.isArray(node) && node.length > jv.collapseObjectsAfterLength ? true : isObject(node) && Object.keys(node).length > jv.collapseObjectsAfterLength ? true : false ) if (Array.isArray(node)) { return ( <> {'['} {!fold && setFold(true)} className='jv-chevron' />} {!fold && jv.enableClipboard && } {!fold ? (
{node.map((n, i) => ( ))}
) : ( )} {']'} ) } else if (isObject(node)) { return ( <> {'{'} {!fold && setFold(true)} className='jv-chevron' />} {!fold && jv.enableClipboard && } {!fold ? (
{Object.entries(node).map(([name, value]) => ( ))}
) : ( )} {'}'} ) } return null } function LongString({ str }: { str: string }) { if (str.length <= 10) return "{str}" const [fold, setFold] = useState(true) return ( setFold(!fold)} className='json-view--string cursor-pointer'> "{fold ? str.slice(0, 6) + '...' + str.slice(-4) : str}" ) } function NameValue({ name, value }: { name: number | string; value: any }) { return (
{name}:{' '}
) } function isObject(node: any) { return Object.prototype.toString.call(node) === '[object Object]' }