// @flow import React, { useCallback, useState } from 'react'; import type { Element } from 'react'; import EditableValue from './EditableValue'; import ExpandCollapseToggle from './ExpandCollapseToggle'; import { getMetaValueLabel } from '../utils'; import { meta } from '../../../hydration'; import styles from './KeyValue.css'; type OverrideValueFn = (path: Array, value: any) => void; type KeyValueProps = {| depth: number, hidden?: boolean, name: string, overrideValueFn?: ?OverrideValueFn, path?: Array, value: any, |}; export default function KeyValue({ depth, hidden, name, overrideValueFn, path = [], value, }: KeyValueProps) { const [isOpen, setIsOpen] = useState(false); const toggleIsOpen = useCallback( () => setIsOpen(prevIsOpen => !prevIsOpen), [] ); const dataType = typeof value; const isSimpleType = dataType === 'number' || dataType === 'string' || dataType === 'boolean' || value == null; const style = { paddingLeft: `${(depth - 1) * 0.75}rem`, }; let children = null; if (isSimpleType) { let displayValue = value; if (dataType === 'string') { displayValue = `"${value}"`; } else if (dataType === 'boolean') { displayValue = value ? 'true' : 'false'; } else if (value === null) { displayValue = 'null'; } else if (value === undefined) { displayValue = 'undefined'; } const nameClassName = typeof overrideValueFn === 'function' ? styles.EditableName : styles.Name; children = (