import { JsonValue } from 'type-fest' import React, { useState } from 'react' import { useValueAugmentations } from './hooks' import { ArrayIndex, BracketDecoration, ObjectKey, Item, ItemList, PrimitiveValue, ToggleObjectButton, DefaultToggleIcon, LabelDecorations, ColonSeparator } from './style' export type ToggleObjectButtonProps = { collapsed: boolean } export type ObjectViewProps = { value: JsonValue | Record expandButtonIcon?: React.FC label?: React.ReactNode } export const JSONView = ({ value, label, expandButtonIcon: ToggleIcon = DefaultToggleIcon }: ObjectViewProps) => { const { isObjectLike, decorations } = useValueAugmentations(value) const [isCollapsed, setIsCollapsed] = useState(!!label) return ( <> {label && ( {label} {isObjectLike && ( <> setIsCollapsed(!isCollapsed)}> {decorations[0]} {isCollapsed && ( <> ... {decorations[1]} )} )} )} {isObjectLike && !isCollapsed && ( <> {!label && {decorations[0]}} {(Array.isArray(value) && ( {value.map((item, i) => ( {i}} /> ))} )) || (typeof value === 'object' && value !== null && ( {Object.entries(value).map(([k, v]) => ( {k}} /> ))} ))} {decorations[1]} )} {!isObjectLike && {value?.toString()}} ) }