From 8bd827679116204aa523c3dd0487104d03ab7376 Mon Sep 17 00:00:00 2001 From: "Michael S. Molina" <70410625+michael-s-molina@users.noreply.github.com> Date: Mon, 10 Apr 2023 19:01:34 -0300 Subject: [PATCH] fix: Removes Redux state mutations - iteration 3 (#23637) --- .../src/components/Chart/ChartRenderer.jsx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/superset-frontend/src/components/Chart/ChartRenderer.jsx b/superset-frontend/src/components/Chart/ChartRenderer.jsx index 1b72b4afe1..fa2c0ddc0d 100644 --- a/superset-frontend/src/components/Chart/ChartRenderer.jsx +++ b/superset-frontend/src/components/Chart/ChartRenderer.jsx @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { snakeCase, isEqual } from 'lodash'; +import { snakeCase, isEqual, cloneDeep } from 'lodash'; import PropTypes from 'prop-types'; import React from 'react'; import { @@ -117,6 +117,11 @@ class ChartRenderer extends React.Component { this.props.actions?.updateDataMask(this.props.chartId, dataMask); }, }; + + // TODO: queriesResponse comes from Redux store but it's being edited by + // the plugins, hence we need to clone it to avoid state mutation + // until we change the reducers to use Redux Toolkit with Immer + this.mutableQueriesResponse = cloneDeep(this.props.queriesResponse); } shouldComponentUpdate(nextProps, nextState) { @@ -131,6 +136,11 @@ class ChartRenderer extends React.Component { } this.hasQueryResponseChange = nextProps.queriesResponse !== this.props.queriesResponse; + + if (this.hasQueryResponseChange) { + this.mutableQueriesResponse = cloneDeep(nextProps.queriesResponse); + } + return ( this.hasQueryResponseChange || !isEqual(nextProps.datasource, this.props.datasource) || @@ -246,7 +256,6 @@ class ChartRenderer extends React.Component { chartIsStale, formData, latestQueryFormData, - queriesResponse, postTransformProps, } = this.props; @@ -339,7 +348,7 @@ class ChartRenderer extends React.Component { filterState={filterState} hooks={this.hooks} behaviors={behaviors} - queriesData={queriesResponse} + queriesData={this.mutableQueriesResponse} onRenderSuccess={this.handleRenderSuccess} onRenderFailure={this.handleRenderFailure} noResults={noResultsComponent}