import { createSelector, Selector } from '@reduxjs/toolkit'; import React, { ComponentProps, ReactNode } from 'react'; import { JSONTree } from 'react-json-tree'; import { Base16Theme, StylingFunction } from 'react-base16-styling'; import { DATA_TYPE_KEY } from '../monitor-config'; import { getJsonTreeTheme, StyleUtilsContext, } from '../styles/createStylingFromTheme'; import { createTreeItemLabelRenderer, getItemString } from '../styles/tree'; import { identity } from '../utils/object'; export interface TreeViewProps extends Partial< Pick< ComponentProps, 'keyPath' | 'shouldExpandNode' | 'hideRoot' > > { data: unknown; isWideLayout: boolean; before?: ReactNode; after?: ReactNode; children?: ReactNode; } export class TreeView extends React.PureComponent { static defaultProps = { hideRoot: true, shouldExpandNode: ( keyPath: (string | number)[], value: unknown, layer: number ): boolean => { return layer < 2; }, }; readonly selectLabelRenderer: Selector< StylingFunction, ReturnType, never > = createSelector< [(stylingFunction: StylingFunction) => StylingFunction], ReturnType >(identity, createTreeItemLabelRenderer); readonly selectGetItemString: Selector< StylingFunction, (type: string, data: unknown) => ReactNode, never > = createSelector< [(stylingFunction: StylingFunction) => StylingFunction], (type: string, data: unknown) => ReactNode >( identity, (styling) => (type, data) => getItemString(styling, type, data, DATA_TYPE_KEY, false) ); readonly selectTheme: Selector< Base16Theme, ReturnType, never > = createSelector< [(base16Theme: Base16Theme) => Base16Theme], ReturnType >(identity, getJsonTreeTheme); constructor(props: TreeViewProps) { super(props); } render(): ReactNode { const { data, before, after, children, keyPath, shouldExpandNode, hideRoot, } = this.props; return ( {({ styling, invertTheme, base16Theme }) => { return (
{before} {after} {children}
); }}
); } }