FieldTree.tsx 1.2 KB

1234567891011121314151617181920212223242526272829
  1. import { Fragment } from "react";
  2. function scalar(value: unknown): string {
  3. if (value === null) return "null";
  4. if (typeof value === "boolean") return value ? "true" : "false";
  5. if (typeof value === "string") return value || '""';
  6. return String(value);
  7. }
  8. export function FieldTree({ value, depth = 0 }: { value: unknown; depth?: number }) {
  9. if (Array.isArray(value)) {
  10. if (!value.length) return <span className="emptyValue">[]</span>;
  11. return <div className="nestedValue">{value.map((item, index) => <div className="arrayItem" key={index}>
  12. <span className="indexBadge">{index}</span><FieldTree value={item} depth={depth + 1} />
  13. </div>)}</div>;
  14. }
  15. if (value !== null && typeof value === "object") {
  16. const entries = Object.entries(value as Record<string, unknown>);
  17. if (!entries.length) return <span className="emptyValue">{"{}"}</span>;
  18. return <dl className={`fieldTree depth-${Math.min(depth, 3)}`}>
  19. {entries.map(([key, item]) => <Fragment key={key}>
  20. <dt>{key}</dt>
  21. <dd><FieldTree value={item} depth={depth + 1} /></dd>
  22. </Fragment>)}
  23. </dl>;
  24. }
  25. return <span className={`scalar scalar-${value === null ? "null" : typeof value}`}>{scalar(value)}</span>;
  26. }