redux-devtools/packages/react-json-tree/src/JSONNode.tsx
Nathan Bierema 81926f3212
Remove UNSAFE methods from react-json-tree (#1288)
* Remove UNSAFE method from JSONTree

* Bump peer dep

* Fix types

* Remove proptypes

* Remove unused

* shouldExpandNode => shouldExpandNodeInitially

* Cleanup

* Update usages

* Tighten types

* Create four-parrots-poke.md

* Format

* Fix inspector-monitor types

* Fix log-monitor types

* Fix rtk-query-monitor types

* Fix type
2023-01-04 23:17:44 -05:00

103 lines
2.3 KiB
TypeScript

import React from 'react';
import objType from './objType';
import JSONObjectNode from './JSONObjectNode';
import JSONArrayNode from './JSONArrayNode';
import JSONIterableNode from './JSONIterableNode';
import JSONValueNode from './JSONValueNode';
import type { CommonInternalProps } from './types';
interface Props extends CommonInternalProps {
value: unknown;
}
export default function JSONNode({
getItemString,
keyPath,
labelRenderer,
styling,
value,
valueRenderer,
isCustomNode,
...rest
}: Props) {
const nodeType = isCustomNode(value) ? 'Custom' : objType(value);
const simpleNodeProps = {
getItemString,
key: keyPath[0],
keyPath,
labelRenderer,
nodeType,
styling,
value,
valueRenderer,
};
const nestedNodeProps = {
...rest,
...simpleNodeProps,
data: value,
isCustomNode,
};
switch (nodeType) {
case 'Object':
case 'Error':
case 'WeakMap':
case 'WeakSet':
return <JSONObjectNode {...nestedNodeProps} />;
case 'Array':
return <JSONArrayNode {...nestedNodeProps} />;
case 'Iterable':
case 'Map':
case 'Set':
return <JSONIterableNode {...nestedNodeProps} />;
case 'String':
return (
<JSONValueNode
{...simpleNodeProps}
valueGetter={(raw: string) => `"${raw}"`}
/>
);
case 'Number':
return <JSONValueNode {...simpleNodeProps} />;
case 'Boolean':
return (
<JSONValueNode
{...simpleNodeProps}
valueGetter={(raw) => (raw ? 'true' : 'false')}
/>
);
case 'Date':
return (
<JSONValueNode
{...simpleNodeProps}
valueGetter={(raw) => raw.toISOString()}
/>
);
case 'Null':
return <JSONValueNode {...simpleNodeProps} valueGetter={() => 'null'} />;
case 'Undefined':
return (
<JSONValueNode {...simpleNodeProps} valueGetter={() => 'undefined'} />
);
case 'Function':
case 'Symbol':
return (
<JSONValueNode
{...simpleNodeProps}
valueGetter={(raw) => raw.toString()}
/>
);
case 'Custom':
return <JSONValueNode {...simpleNodeProps} />;
default:
return (
<JSONValueNode
{...simpleNodeProps}
valueGetter={() => `<${nodeType}>`}
/>
);
}
}