From 1cb339e833b229e4ba530391cc1a2f1f568cb77f Mon Sep 17 00:00:00 2001
From: Uladzimir Havenchyk <125459446+uladzimirdev@users.noreply.github.com>
Date: Fri, 24 May 2024 18:20:04 +0300
Subject: [PATCH] [Dashboard] Optimize rendering by reducing the number of
 props passing down to from the very top (#43114)

* Avoid unnecessary re-renderings in dashboard - getEmbeddedParameterVisibility

* Avoid unnecessary re-renderings in dashboard - favicon, page title

* Exclude isLoadingComplete from passing down

* Avoid unnecessary re-renderings in dashboard - metadata

* Drop metadata from Public Dashboard

* Avoid unnecessary re-renderings in dashboard - dashcardData
---
 .../ClickBehaviorSidebar.tsx                  |  5 ---
 .../ClickBehaviorSidebarContent.tsx           | 10 +++---
 .../components/DashCard/DashCard.tsx          |  4 ---
 .../DashCard/DashCardVisualization.tsx        |  6 ++--
 .../DashCard/Dashcard.unit.spec.tsx           |  4 ---
 .../components/Dashboard/Dashboard.tsx        | 20 ------------
 .../dashboard/components/DashboardGrid.tsx    | 15 ++++-----
 .../DashboardHeader/DashboardHeader.tsx       |  7 ++--
 .../components/DashboardSidebars.jsx          |  6 ----
 .../containers/DashboardApp/DashboardApp.tsx  | 32 ++++++-------------
 .../ParameterSidebar/ParameterSidebar.tsx     | 15 ++++-----
 .../ParameterSidebar.unit.spec.tsx            |  1 -
 .../PublicDashboard/PublicDashboard.tsx       |  6 ----
 13 files changed, 37 insertions(+), 94 deletions(-)

diff --git a/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebar.tsx b/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebar.tsx
index a4f3d969087..284ecf9c90b 100644
--- a/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebar.tsx
+++ b/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebar.tsx
@@ -15,9 +15,7 @@ import type {
   Dashboard,
   QuestionDashboardCard,
   DashCardId,
-  CardId,
   ClickBehavior,
-  DatasetData,
   DatasetColumn,
 } from "metabase-types/api";
 
@@ -34,7 +32,6 @@ type VizSettings = Record<string, unknown>;
 interface Props {
   dashboard: Dashboard;
   dashcard: QuestionDashboardCard;
-  dashcardData: Record<DashCardId, Record<CardId, DatasetData>>;
   parameters: UiParameter[];
   hideClickBehaviorSidebar: () => void;
   onUpdateDashCardColumnSettings: (
@@ -55,7 +52,6 @@ interface Props {
 export function ClickBehaviorSidebar({
   dashboard,
   dashcard,
-  dashcardData,
   parameters,
   hideClickBehaviorSidebar,
   onUpdateDashCardColumnSettings,
@@ -213,7 +209,6 @@ export function ClickBehaviorSidebar({
         <ClickBehaviorSidebarContent
           dashboard={dashboard}
           dashcard={dashcard}
-          dashcardData={dashcardData}
           parameters={parameters}
           clickBehavior={clickBehavior}
           isTypeSelectorVisible={isTypeSelectorVisible}
diff --git a/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebarContent.tsx b/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebarContent.tsx
index 5de45679757..80ae052eccb 100644
--- a/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebarContent.tsx
+++ b/frontend/src/metabase/dashboard/components/ClickBehaviorSidebar/ClickBehaviorSidebarContent.tsx
@@ -1,15 +1,14 @@
 import { getIn } from "icepick";
 import { useMemo } from "react";
 
+import { getDashcardData } from "metabase/dashboard/selectors";
 import { isTableDisplay } from "metabase/lib/click-behavior";
+import { useSelector } from "metabase/lib/redux";
 import type { UiParameter } from "metabase-lib/v1/parameters/types";
 import type {
   Dashboard,
   QuestionDashboardCard,
-  DashCardId,
-  CardId,
   ClickBehavior,
-  DatasetData,
   DatasetColumn,
 } from "metabase-types/api";
 
@@ -22,7 +21,6 @@ import { getClickBehaviorForColumn } from "./utils";
 interface Props {
   dashboard: Dashboard;
   dashcard: QuestionDashboardCard;
-  dashcardData: Record<DashCardId, Record<CardId, DatasetData>>;
   parameters: UiParameter[];
   clickBehavior?: ClickBehavior;
   isTypeSelectorVisible: boolean | null;
@@ -35,7 +33,6 @@ interface Props {
 export function ClickBehaviorSidebarContent({
   dashboard,
   dashcard,
-  dashcardData,
   parameters,
   clickBehavior,
   isTypeSelectorVisible,
@@ -51,6 +48,9 @@ export function ClickBehaviorSidebarContent({
     // drill-through menu
     return { type: "actionMenu" };
   }, [clickBehavior]);
+  const dashcardData = useSelector(state =>
+    getDashcardData(state, dashcard.id),
+  );
 
   if (isTableDisplay(dashcard) && !hasSelectedColumn && dashcard.card_id) {
     const columns = getIn(dashcardData, [dashcard.card_id, "data", "cols"]);
diff --git a/frontend/src/metabase/dashboard/components/DashCard/DashCard.tsx b/frontend/src/metabase/dashboard/components/DashCard/DashCard.tsx
index 7968728b7e4..fcbb948baf0 100644
--- a/frontend/src/metabase/dashboard/components/DashCard/DashCard.tsx
+++ b/frontend/src/metabase/dashboard/components/DashCard/DashCard.tsx
@@ -22,7 +22,6 @@ import { PLUGIN_COLLECTIONS } from "metabase/plugins";
 import EmbedFrameS from "metabase/public/components/EmbedFrame/EmbedFrame.module.css";
 import type { Mode } from "metabase/visualizations/click-actions/Mode";
 import { mergeSettings } from "metabase/visualizations/lib/settings";
-import type Metadata from "metabase-lib/v1/metadata/Metadata";
 import type {
   Card,
   CardId,
@@ -53,7 +52,6 @@ export interface DashCardProps {
   gridItemWidth: number;
   totalNumGridCols: number;
   slowCards: Record<CardId, boolean>;
-  metadata: Metadata;
   mode?: Mode;
 
   clickBehaviorSidebarDashcard?: DashboardCard | null;
@@ -89,7 +87,6 @@ function DashCardInner({
   dashcard,
   dashboard,
   slowCards,
-  metadata,
   gridItemWidth,
   totalNumGridCols,
   mode,
@@ -324,7 +321,6 @@ function DashCardInner({
           dashboard={dashboard}
           dashcard={dashcard}
           series={series}
-          metadata={metadata}
           mode={mode}
           gridSize={gridSize}
           gridItemWidth={gridItemWidth}
diff --git a/frontend/src/metabase/dashboard/components/DashCard/DashCardVisualization.tsx b/frontend/src/metabase/dashboard/components/DashCard/DashCardVisualization.tsx
index 12e785a733e..8751312a67a 100644
--- a/frontend/src/metabase/dashboard/components/DashCard/DashCardVisualization.tsx
+++ b/frontend/src/metabase/dashboard/components/DashCard/DashCardVisualization.tsx
@@ -10,12 +10,13 @@ import {
   isQuestionCard,
   isVirtualDashCard,
 } from "metabase/dashboard/utils";
+import { useSelector } from "metabase/lib/redux";
+import { getMetadata } from "metabase/selectors/metadata";
 import type { IconName, IconProps } from "metabase/ui";
 import { getVisualizationRaw } from "metabase/visualizations";
 import type { Mode } from "metabase/visualizations/click-actions/Mode";
 import Visualization from "metabase/visualizations/components/Visualization";
 import Question from "metabase-lib/v1/Question";
-import type Metadata from "metabase-lib/v1/metadata/Metadata";
 import type {
   Dashboard,
   DashCardId,
@@ -43,7 +44,6 @@ interface DashCardVisualizationProps {
   dashboard: Dashboard;
   dashcard: DashboardCard;
   series: Series;
-  metadata: Metadata;
   mode?: Mode;
 
   gridSize: {
@@ -87,7 +87,6 @@ export function DashCardVisualization({
   dashboard,
   series,
   mode,
-  metadata,
   gridSize,
   gridItemWidth,
   totalNumGridCols,
@@ -113,6 +112,7 @@ export function DashCardVisualization({
   onChangeLocation,
   onUpdateVisualizationSettings,
 }: DashCardVisualizationProps) {
+  const metadata = useSelector(getMetadata);
   const question = useMemo(() => {
     return isQuestionCard(dashcard.card)
       ? new Question(dashcard.card, metadata)
diff --git a/frontend/src/metabase/dashboard/components/DashCard/Dashcard.unit.spec.tsx b/frontend/src/metabase/dashboard/components/DashCard/Dashcard.unit.spec.tsx
index 560454135e2..f5d6eb38108 100644
--- a/frontend/src/metabase/dashboard/components/DashCard/Dashcard.unit.spec.tsx
+++ b/frontend/src/metabase/dashboard/components/DashCard/Dashcard.unit.spec.tsx
@@ -1,4 +1,3 @@
-import { createMockMetadata } from "__support__/metadata";
 import { queryIcon, renderWithProviders, screen } from "__support__/ui";
 import registerVisualizations from "metabase/visualizations/register";
 import type { DashCardDataMap } from "metabase-types/api";
@@ -62,8 +61,6 @@ const erroringDashcardData = {
   },
 };
 
-const metadata = createMockMetadata({});
-
 function setup({
   dashboard = testDashboard,
   dashcard = tableDashcard,
@@ -79,7 +76,6 @@ function setup({
       gridItemWidth={4}
       totalNumGridCols={24}
       slowCards={{}}
-      metadata={metadata}
       isEditing={false}
       isEditingParameter={false}
       {...props}
diff --git a/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.tsx b/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.tsx
index f0a3f22ce3f..49788a62540 100644
--- a/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.tsx
+++ b/frontend/src/metabase/dashboard/components/Dashboard/Dashboard.tsx
@@ -24,15 +24,11 @@ import type {
 import Dashboards from "metabase/entities/dashboards";
 import { getMainElement } from "metabase/lib/dom";
 import { useDispatch } from "metabase/lib/redux";
-import type { EmbeddingParameterVisibility } from "metabase/public/lib/types";
-import type Metadata from "metabase-lib/v1/metadata/Metadata";
 import type {
   Dashboard as IDashboard,
   DashboardId,
   DashCardDataMap,
   DashCardId,
-  Database,
-  DatabaseId,
   ParameterId,
   ParameterValueOrArray,
   CardId,
@@ -85,18 +81,12 @@ type DashboardProps = {
   dashboard: IDashboard;
   dashcardData: DashCardDataMap;
   slowCards: Record<DashCardId, boolean>;
-  databases: Record<DatabaseId, Database>;
   parameterValues: Record<ParameterId, ParameterValueOrArray>;
   draftParameterValues: Record<ParameterId, ParameterValueOrArray | null>;
-  metadata: Metadata;
   loadingStartTime: number | null;
   clickBehaviorSidebarDashcard: StoreDashcard | null;
   isAddParameterPopoverOpen: boolean;
   sidebar: State["dashboard"]["sidebar"];
-  pageFavicon: string | null;
-  documentTitle: string | undefined;
-  isRunning: boolean;
-  isLoadingComplete: boolean;
   isHeaderVisible: boolean;
   isAdditionalInfoVisible: boolean;
   selectedTabId: SelectedTabId;
@@ -160,9 +150,6 @@ type DashboardProps = {
     columnKey: string,
     settings?: Record<string, unknown> | null,
   ) => void;
-  getEmbeddedParameterVisibility: (
-    slug: string,
-  ) => EmbeddingParameterVisibility | null;
   updateDashboardAndCards: () => void;
 
   setSidebar: (opts: { name: DashboardSidebarName }) => void;
@@ -397,12 +384,10 @@ function DashboardInner(props: DashboardProps) {
     return (
       <DashboardGridConnected
         clickBehaviorSidebarDashcard={props.clickBehaviorSidebarDashcard}
-        metadata={props.metadata}
         isNightMode={shouldRenderAsNightMode}
         isFullscreen={props.isFullscreen}
         isEditingParameter={props.isEditingParameter}
         isEditing={props.isEditing}
-        dashcardData={props.dashcardData}
         dashboard={props.dashboard}
         slowCards={props.slowCards}
         navigateToNewCardFromDashboard={props.navigateToNewCardFromDashboard}
@@ -477,7 +462,6 @@ function DashboardInner(props: DashboardProps) {
               sidebar={props.sidebar}
               setSidebar={props.setSidebar}
               closeSidebar={props.closeSidebar}
-              databases={props.databases}
               isAddParameterPopoverOpen={props.isAddParameterPopoverOpen}
               showAddParameterPopover={props.showAddParameterPopover}
               hideAddParameterPopover={props.hideAddParameterPopover}
@@ -535,15 +519,11 @@ function DashboardInner(props: DashboardProps) {
                 props.setParameterFilteringParameters
               }
               setParameterRequired={props.setParameterRequired}
-              dashcardData={props.dashcardData}
               isFullscreen={props.isFullscreen}
               params={props.params}
               sidebar={props.sidebar}
               closeSidebar={props.closeSidebar}
               selectedTabId={props.selectedTabId}
-              getEmbeddedParameterVisibility={
-                props.getEmbeddedParameterVisibility
-              }
               setDashboardAttribute={handleSetDashboardAttribute}
               onCancel={() => setSharing(false)}
             />
diff --git a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx
index 15b7ed6ee06..ebe91c05d1e 100644
--- a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx
+++ b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx
@@ -39,16 +39,15 @@ import {
   MOBILE_HEIGHT_BY_DISPLAY_TYPE,
   MOBILE_DEFAULT_CARD_HEIGHT,
 } from "metabase/visualizations/shared/utils/sizes";
-import type Metadata from "metabase-lib/v1/metadata/Metadata";
 import type {
   BaseDashboardCard,
   Card,
-  DashCardDataMap,
   DashCardId,
   Dashboard,
   DashboardTabId,
   DashboardCard,
 } from "metabase-types/api";
+import type { State } from "metabase-types/store";
 
 import type { SetDashCardAttributesOpts } from "../actions";
 import {
@@ -63,6 +62,7 @@ import {
   onUpdateDashCardVisualizationSettings,
   fetchCardData,
 } from "../actions";
+import { getDashcardDataMap } from "../selectors";
 
 import { AddSeriesModal } from "./AddSeriesModal/AddSeriesModal";
 import { DashCard } from "./DashCard/DashCard";
@@ -100,6 +100,10 @@ interface DashboardGridState {
   isAnimationPaused: boolean;
 }
 
+const mapStateToProps = (state: State) => ({
+  dashcardData: getDashcardDataMap(state),
+});
+
 const mapDispatchToProps = {
   addUndo,
   removeCardFromDashboard,
@@ -114,13 +118,12 @@ const mapDispatchToProps = {
   onUpdateDashCardVisualizationSettings,
   fetchCardData,
 };
-const connector = connect(null, mapDispatchToProps);
+const connector = connect(mapStateToProps, mapDispatchToProps);
 
 type DashboardGridReduxProps = ConnectedProps<typeof connector>;
 
 type OwnProps = {
   dashboard: Dashboard;
-  dashcardData: DashCardDataMap;
   selectedTabId: DashboardTabId | null;
   slowCards: Record<DashCardId, boolean>;
   isEditing: boolean;
@@ -131,8 +134,6 @@ type OwnProps = {
   isNightMode: boolean;
   clickBehaviorSidebarDashcard: DashboardCard | null;
   mode?: Mode;
-  // TODO: only passed down, remove it
-  metadata: Metadata;
   // public dashboard passes it explicitly
   width?: number;
   // public dashboard passes it as noop
@@ -510,8 +511,6 @@ class DashboardGrid extends Component<DashboardGridProps, DashboardGridState> {
           this.props.navigateToNewCardFromDashboard
         }
         onChangeLocation={this.props.onChangeLocation}
-        // TODO: get metadata in dashcard
-        metadata={this.props.metadata}
         dashboard={this.props.dashboard}
         showClickBehaviorSidebar={this.props.showClickBehaviorSidebar}
         clickBehaviorSidebarDashcard={this.props.clickBehaviorSidebarDashcard}
diff --git a/frontend/src/metabase/dashboard/components/DashboardHeader/DashboardHeader.tsx b/frontend/src/metabase/dashboard/components/DashboardHeader/DashboardHeader.tsx
index 6eeef87810a..4c24d2069ce 100644
--- a/frontend/src/metabase/dashboard/components/DashboardHeader/DashboardHeader.tsx
+++ b/frontend/src/metabase/dashboard/components/DashboardHeader/DashboardHeader.tsx
@@ -45,6 +45,7 @@ import { fetchPulseFormInput } from "metabase/pulse/actions";
 import { getPulseFormInput } from "metabase/pulse/selectors";
 import { dismissAllUndo } from "metabase/redux/undo";
 import { getIsNavbarOpen } from "metabase/selectors/app";
+import { getMetadata } from "metabase/selectors/metadata";
 import { getSetting } from "metabase/selectors/settings";
 import { Icon, Menu, Tooltip, Loader, Flex } from "metabase/ui";
 import { saveDashboardPdf } from "metabase/visualizations/lib/save-dashboard-pdf";
@@ -80,7 +81,6 @@ interface DashboardHeaderProps {
   dashboardId: DashboardId;
   dashboard: Dashboard;
   dashboardBeforeEditing?: Dashboard | null;
-  databases: Record<DatabaseId, Database>;
   sidebar: DashboardSidebarState;
   location: Location;
   refreshPeriod: number | null;
@@ -153,7 +153,6 @@ export const DashboardHeader = (props: DashboardHeaderProps) => {
     sidebar,
     setSidebar,
     closeSidebar,
-    databases,
     isAddParameterPopoverOpen,
     showAddParameterPopover,
     hideAddParameterPopover,
@@ -172,6 +171,10 @@ export const DashboardHeader = (props: DashboardHeaderProps) => {
 
   const formInput = useSelector(getPulseFormInput);
   const isNavBarOpen = useSelector(getIsNavbarOpen);
+  const databases = useSelector(getMetadata).databases as Record<
+    DatabaseId,
+    Database
+  >;
   const isShowingDashboardInfoSidebar = useSelector(
     getIsShowDashboardInfoSidebar,
   );
diff --git a/frontend/src/metabase/dashboard/components/DashboardSidebars.jsx b/frontend/src/metabase/dashboard/components/DashboardSidebars.jsx
index ffb2cf15da1..921528d6627 100644
--- a/frontend/src/metabase/dashboard/components/DashboardSidebars.jsx
+++ b/frontend/src/metabase/dashboard/components/DashboardSidebars.jsx
@@ -36,7 +36,6 @@ DashboardSidebars.propTypes = {
   setParameterSourceConfig: PropTypes.func.isRequired,
   setParameterFilteringParameters: PropTypes.func.isRequired,
   setParameterRequired: PropTypes.func.isRequired,
-  dashcardData: PropTypes.object,
   isFullscreen: PropTypes.bool.isRequired,
   onCancel: PropTypes.func.isRequired,
   params: PropTypes.object,
@@ -47,7 +46,6 @@ DashboardSidebars.propTypes = {
   closeSidebar: PropTypes.func.isRequired,
   setDashboardAttribute: PropTypes.func,
   selectedTabId: PropTypes.number,
-  getEmbeddedParameterVisibility: PropTypes.func.isRequired,
 };
 
 export function DashboardSidebars({
@@ -68,7 +66,6 @@ export function DashboardSidebars({
   setParameterSourceConfig,
   setParameterFilteringParameters,
   setParameterRequired,
-  dashcardData,
   isFullscreen,
   onCancel,
   params,
@@ -76,7 +73,6 @@ export function DashboardSidebars({
   closeSidebar,
   setDashboardAttribute,
   selectedTabId,
-  getEmbeddedParameterVisibility,
 }) {
   const parameters = useSelector(getParameters);
   const editingParameter = useSelector(getEditingParameter);
@@ -122,7 +118,6 @@ export function DashboardSidebars({
           dashboard={dashboard}
           dashcard={clickBehaviorSidebarDashcard}
           parameters={parameters}
-          dashcardData={dashcardData[clickBehaviorSidebarDashcard.id]}
           onUpdateDashCardVisualizationSettings={
             onUpdateDashCardVisualizationSettings
           }
@@ -141,7 +136,6 @@ export function DashboardSidebars({
       );
       return (
         <ParameterSidebar
-          getEmbeddedParameterVisibility={getEmbeddedParameterVisibility}
           parameter={parameter}
           otherParameters={otherParameters}
           onChangeName={setParameterName}
diff --git a/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx b/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx
index 6d0b03cc5ea..c565639e380 100644
--- a/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx
+++ b/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx
@@ -21,23 +21,17 @@ import { useWebNotification } from "metabase/hooks/use-web-notification";
 import { parseHashOptions } from "metabase/lib/browser";
 import { useDispatch } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
-import type { EmbeddingParameterVisibility } from "metabase/public/lib/types";
 import { closeNavbar, setErrorPage } from "metabase/redux/app";
 import { addUndo, dismissUndo } from "metabase/redux/undo";
 import { getIsNavbarOpen } from "metabase/selectors/app";
-import { getMetadata } from "metabase/selectors/metadata";
 import {
   canManageSubscriptions,
   getUserIsAdmin,
 } from "metabase/selectors/user";
-import type Database from "metabase-lib/v1/metadata/Database";
-import type Metadata from "metabase-lib/v1/metadata/Metadata";
 import type {
   Dashboard as IDashboard,
   DashboardId,
-  DashCardDataMap,
   DashCardId,
-  DatabaseId,
   ParameterId,
   ParameterValueOrArray,
 } from "metabase-types/api";
@@ -46,7 +40,6 @@ import type { SelectedTabId, State, StoreDashcard } from "metabase-types/store";
 import * as dashboardActions from "../../actions";
 import { DASHBOARD_SLOW_TIMEOUT } from "../../constants";
 import {
-  getDashcardDataMap,
   getClickBehaviorSidebarDashcard,
   getDashboardBeforeEditing,
   getDashboardComplete,
@@ -67,7 +60,6 @@ import {
   getSelectedTabId,
   getSidebar,
   getSlowCards,
-  getEmbeddedParameterVisibility,
 } from "../../selectors";
 
 type OwnProps = {
@@ -87,11 +79,8 @@ type StateProps = {
   isEditingParameter: boolean;
   isDirty: boolean;
   dashboard: IDashboard | null;
-  dashcardData: DashCardDataMap;
   slowCards: Record<DashCardId, unknown>;
-  databases: Record<DatabaseId, Database>;
   parameterValues: Record<ParameterId, ParameterValueOrArray>;
-  metadata: Metadata;
   loadingStartTime: number | null;
   clickBehaviorSidebarDashcard: StoreDashcard | null;
   isAddParameterPopoverOpen: boolean;
@@ -104,9 +93,6 @@ type StateProps = {
   isAdditionalInfoVisible: boolean;
   selectedTabId: SelectedTabId;
   isNavigatingBackToDashboard: boolean;
-  getEmbeddedParameterVisibility: (
-    slug: string,
-  ) => EmbeddingParameterVisibility | null;
 };
 
 type DispatchProps = {
@@ -118,7 +104,6 @@ type DispatchProps = {
 type DashboardAppProps = OwnProps & StateProps & DispatchProps;
 
 const mapStateToProps = (state: State): StateProps => {
-  const metadata = getMetadata(state);
   return {
     canManageSubscriptions: canManageSubscriptions(state),
     isAdmin: getUserIsAdmin(state),
@@ -129,12 +114,8 @@ const mapStateToProps = (state: State): StateProps => {
     isEditingParameter: getIsEditingParameter(state),
     isDirty: getIsDirty(state),
     dashboard: getDashboardComplete(state),
-    dashcardData: getDashcardDataMap(state),
     slowCards: getSlowCards(state),
-    databases: metadata.databases,
     parameterValues: getParameterValues(state),
-
-    metadata,
     loadingStartTime: getLoadingStartTime(state),
     clickBehaviorSidebarDashcard: getClickBehaviorSidebarDashcard(state),
     isAddParameterPopoverOpen: getIsAddParameterPopoverOpen(state),
@@ -147,8 +128,6 @@ const mapStateToProps = (state: State): StateProps => {
     isAdditionalInfoVisible: getIsAdditionalInfoVisible(state),
     selectedTabId: getSelectedTabId(state),
     isNavigatingBackToDashboard: getIsNavigatingBackToDashboard(state),
-    getEmbeddedParameterVisibility: (slug: string) =>
-      getEmbeddedParameterVisibility(state, slug),
   };
 };
 
@@ -227,6 +206,15 @@ const DashboardApp = (props: DashboardAppProps) => {
     onTimeout,
   });
 
+  const {
+    documentTitle: _documentTitle,
+    pageFavicon: _pageFavicon,
+    isRunning: _isRunning,
+    isLoadingComplete: _isLoadingComplete,
+    children,
+    ...dashboardProps
+  } = props;
+
   return (
     <div className={cx(CS.shrinkBelowContentSize, CS.fullHeight)}>
       <LeaveConfirmationModal isEnabled={isEditing && isDirty} route={route} />
@@ -235,7 +223,7 @@ const DashboardApp = (props: DashboardAppProps) => {
         dashboardId={getDashboardId(props)}
         editingOnLoad={editingOnLoad}
         addCardOnLoad={addCardOnLoad}
-        {...props}
+        {...dashboardProps}
       />
       {/* For rendering modal urls */}
       {props.children}
diff --git a/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.tsx b/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.tsx
index a045fa17b1a..942e16378f2 100644
--- a/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.tsx
+++ b/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.tsx
@@ -3,8 +3,9 @@ import { usePrevious } from "react-use";
 import { t } from "ttag";
 
 import { Sidebar } from "metabase/dashboard/components/Sidebar";
+import { getEmbeddedParameterVisibility } from "metabase/dashboard/selectors";
 import { slugify } from "metabase/lib/formatting";
-import type { EmbeddingParameterVisibility } from "metabase/public/lib/types";
+import { useSelector } from "metabase/lib/redux";
 import { Tabs, Text } from "metabase/ui";
 import { parameterHasNoDisplayValue } from "metabase-lib/v1/parameters/utils/parameter-values";
 import type {
@@ -54,9 +55,6 @@ export interface ParameterSidebarProps {
   onRemoveParameter: (parameterId: ParameterId) => void;
   onShowAddParameterPopover: () => void;
   onClose: () => void;
-  getEmbeddedParameterVisibility: (
-    slug: string,
-  ) => EmbeddingParameterVisibility | null;
 }
 
 export const ParameterSidebar = ({
@@ -74,7 +72,6 @@ export const ParameterSidebar = ({
   onRemoveParameter,
   onShowAddParameterPopover,
   onClose,
-  getEmbeddedParameterVisibility,
   hasMapping,
 }: ParameterSidebarProps): JSX.Element => {
   const parameterId = parameter.id;
@@ -82,6 +79,10 @@ export const ParameterSidebar = ({
   const [tab, setTab] = useState<"filters" | "settings">(tabs[0].value);
   const prevParameterId = usePrevious(parameterId);
 
+  const embeddedParameterVisibility = useSelector(state =>
+    getEmbeddedParameterVisibility(state, parameter.slug),
+  );
+
   useEffect(() => {
     if (prevParameterId !== parameterId) {
       setTab(tabs[0].value);
@@ -216,9 +217,7 @@ export const ParameterSidebar = ({
         <Tabs.Panel pr="md" pl="md" value="settings" key="settings">
           <ParameterSettings
             parameter={parameter}
-            embeddedParameterVisibility={getEmbeddedParameterVisibility(
-              parameter.slug,
-            )}
+            embeddedParameterVisibility={embeddedParameterVisibility}
             isParameterSlugUsed={isParameterSlugUsed}
             onChangeName={handleNameChange}
             onChangeType={handleTypeChange}
diff --git a/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.unit.spec.tsx b/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.unit.spec.tsx
index b6c8939a52c..3359fb1ca29 100644
--- a/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.unit.spec.tsx
+++ b/frontend/src/metabase/parameters/components/ParameterSidebar/ParameterSidebar.unit.spec.tsx
@@ -59,7 +59,6 @@ const setup = ({
           onShowAddParameterPopover={jest.fn()}
           onClose={jest.fn()}
           onChangeRequired={jest.fn()}
-          getEmbeddedParameterVisibility={() => null}
           hasMapping={hasMapping}
         />
       </div>
diff --git a/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.tsx b/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.tsx
index b7f04210bf7..d25f30a0102 100644
--- a/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.tsx
+++ b/frontend/src/metabase/public/containers/PublicDashboard/PublicDashboard.tsx
@@ -29,7 +29,6 @@ import type {
 } from "metabase/dashboard/hoc/types";
 import {
   getDashboardComplete,
-  getDashcardDataMap,
   getSlowCards,
   getParameters,
   getParameterValues,
@@ -45,7 +44,6 @@ import title from "metabase/hoc/Title";
 import { isWithinIframe } from "metabase/lib/dom";
 import ParametersS from "metabase/parameters/components/ParameterValueWidget.module.css";
 import { setErrorPage } from "metabase/redux/app";
-import { getMetadata } from "metabase/selectors/metadata";
 import {
   setPublicDashboardEndpoints,
   setEmbedDashboardEndpoints,
@@ -65,9 +63,7 @@ const mapStateToProps = (state: State, props: OwnProps) => {
     dashboardId: String(
       props.params.dashboardId || props.params.uuid || props.params.token,
     ),
-    metadata: getMetadata(state),
     dashboard: getDashboardComplete(state),
-    dashcardData: getDashcardDataMap(state),
     slowCards: getSlowCards(state),
     parameters: getParameters(state),
     parameterValues: getParameterValues(state),
@@ -271,9 +267,7 @@ class PublicDashboardInner extends Component<PublicDashboardProps> {
                   dashboard={assoc(dashboard, "dashcards", visibleDashcards)}
                   isPublic
                   mode={PublicMode as unknown as Mode}
-                  metadata={this.props.metadata}
                   navigateToNewCardFromDashboard={() => {}}
-                  dashcardData={this.props.dashcardData}
                   selectedTabId={this.props.selectedTabId}
                   slowCards={this.props.slowCards}
                   isEditing={false}
-- 
GitLab