From 597b1d4d6c6699e3c7401961b2b78bd090b7b7b5 Mon Sep 17 00:00:00 2001 From: Nathan Bierema Date: Sun, 4 Dec 2022 18:15:23 -0500 Subject: [PATCH] Remove UNSAFE method from JSONTree --- packages/react-json-tree/src/index.tsx | 178 ++++++------------------- 1 file changed, 40 insertions(+), 138 deletions(-) diff --git a/packages/react-json-tree/src/index.tsx b/packages/react-json-tree/src/index.tsx index f5013b9f..010c0b45 100644 --- a/packages/react-json-tree/src/index.tsx +++ b/packages/react-json-tree/src/index.tsx @@ -3,17 +3,11 @@ // Dave Vedder http://www.eskimospy.com/ // port by Daniele Zannotti http://www.github.com/dzannotti -import React from 'react'; -import PropTypes from 'prop-types'; +import React, { useMemo } from 'react'; import JSONNode from './JSONNode'; import createStylingFromTheme from './createStylingFromTheme'; import { invertTheme } from 'react-base16-styling'; -import type { - StylingConfig, - StylingFunction, - StylingValue, - Theme, -} from 'react-base16-styling'; +import type { StylingValue, Theme } from 'react-base16-styling'; import { CircularPropsPassedThroughJSONTree } from './types'; interface Props extends CircularPropsPassedThroughJSONTree { @@ -22,10 +16,6 @@ interface Props extends CircularPropsPassedThroughJSONTree { invertTheme: boolean; } -interface State { - styling: StylingFunction; -} - const identity = (value: any) => value; const expandRootNode = ( keyPath: (string | number)[], @@ -47,133 +37,45 @@ const defaultLabelRenderer = ([label]: (string | number)[]) => ( ); const noCustomNode = () => false; -function checkLegacyTheming(theme: Theme | undefined, props: Props) { - const deprecatedStylingMethodsMap = { - getArrowStyle: 'arrow', - getListStyle: 'nestedNodeChildren', - getItemStringStyle: 'nestedNodeItemString', - getLabelStyle: 'label', - getValueStyle: 'valueText', - }; +export function JSONTree({ + data: value, + theme, + invertTheme: shouldInvertTheme, + keyPath = ['root'], + labelRenderer = defaultLabelRenderer, + valueRenderer = identity, + shouldExpandNode = expandRootNode, + hideRoot = false, + getItemString = defaultItemString, + postprocessValue = identity, + isCustomNode = noCustomNode, + collectionLimit = 50, + sortObjectKeys, +}: Props) { + const styling = useMemo( + () => + createStylingFromTheme(shouldInvertTheme ? invertTheme(theme) : theme), + [theme, shouldInvertTheme] + ); - const deprecatedStylingMethods = Object.keys( - deprecatedStylingMethodsMap - ).filter((name) => props[name as keyof Props]); - - if (deprecatedStylingMethods.length > 0) { - if (typeof theme === 'string') { - theme = { - extend: theme, - }; - } else { - theme = { ...theme }; - } - - deprecatedStylingMethods.forEach((name) => { - // eslint-disable-next-line no-console - console.error( - `Styling method "${name}" is deprecated, use "theme" property instead` - ); - - (theme as StylingConfig)[ - deprecatedStylingMethodsMap[ - name as keyof typeof deprecatedStylingMethodsMap - ] - ] = ({ style }, ...args) => ({ - style: { - ...style, - ...props[name as keyof Props](...args), - }, - }); - }); - } - - return theme; -} - -function getStateFromProps(props: Props) { - let theme = checkLegacyTheming(props.theme, props); - if (props.invertTheme) { - theme = invertTheme(theme); - } - - return { - styling: createStylingFromTheme(theme), - }; -} - -export class JSONTree extends React.Component { - static propTypes = { - data: PropTypes.any, - hideRoot: PropTypes.bool, - theme: PropTypes.oneOfType([PropTypes.object, PropTypes.string]), - invertTheme: PropTypes.bool, - keyPath: PropTypes.arrayOf( - PropTypes.oneOfType([PropTypes.string, PropTypes.number]) - ), - postprocessValue: PropTypes.func, - sortObjectKeys: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]), - }; - - static defaultProps = { - shouldExpandNode: expandRootNode, - hideRoot: false, - keyPath: ['root'], - getItemString: defaultItemString, - labelRenderer: defaultLabelRenderer, - valueRenderer: identity, - postprocessValue: identity, - isCustomNode: noCustomNode, - collectionLimit: 50, - invertTheme: true, - }; - - constructor(props: Props) { - super(props); - this.state = getStateFromProps(props); - } - - UNSAFE_componentWillReceiveProps(nextProps: Props) { - if ( - ['theme', 'invertTheme'].find( - (k) => nextProps[k as keyof Props] !== this.props[k as keyof Props] - ) - ) { - this.setState(getStateFromProps(nextProps)); - } - } - - shouldComponentUpdate(nextProps: Props) { - return !!Object.keys(nextProps).find((k) => - k === 'keyPath' - ? nextProps[k].join('/') !== this.props[k].join('/') - : nextProps[k as keyof Props] !== this.props[k as keyof Props] - ); - } - - render() { - const { - data: value, - keyPath, - postprocessValue, - hideRoot, - theme, // eslint-disable-line no-unused-vars - invertTheme: _, // eslint-disable-line no-unused-vars - ...rest - } = this.props; - - const { styling } = this.state; - - return ( -
    - -
- ); - } + return ( +
    + +
+ ); } export { StylingValue };