From 060db7c98b9146ee7c1a3dd84f9e637865ce9cea Mon Sep 17 00:00:00 2001
From: Anton Kulyk <kuliks.anton@gmail.com>
Date: Mon, 4 Apr 2022 15:51:09 +0100
Subject: [PATCH] Reset dashboard state when leaving the page (#21445)

---
 frontend/src/metabase/dashboard/actions.js    |  2 ++
 .../dashboard/containers/DashboardApp.jsx     |  4 ++++
 frontend/src/metabase/dashboard/reducers.js   | 24 ++++++++++++++++---
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/frontend/src/metabase/dashboard/actions.js b/frontend/src/metabase/dashboard/actions.js
index 10496e1d929..070820cb721 100644
--- a/frontend/src/metabase/dashboard/actions.js
+++ b/frontend/src/metabase/dashboard/actions.js
@@ -80,6 +80,7 @@ const dashboard = new schema.Entity("dashboard", {
 // action constants
 
 export const INITIALIZE = "metabase/dashboard/INITIALIZE";
+export const RESET = "metabase/dashboard/RESET";
 
 export const SET_EDITING_DASHBOARD = "metabase/dashboard/SET_EDITING_DASHBOARD";
 
@@ -143,6 +144,7 @@ export const SET_SHOW_LOADING_COMPLETE_FAVICON =
   "metabase/dashboard/SET_SHOW_LOADING_COMPLETE_FAVICON";
 
 export const initialize = createAction(INITIALIZE);
+export const reset = createAction(RESET);
 export const setEditingDashboard = createAction(SET_EDITING_DASHBOARD);
 
 export const setSidebar = createAction(SET_SIDEBAR);
diff --git a/frontend/src/metabase/dashboard/containers/DashboardApp.jsx b/frontend/src/metabase/dashboard/containers/DashboardApp.jsx
index 025fe97bb97..379261c20a3 100644
--- a/frontend/src/metabase/dashboard/containers/DashboardApp.jsx
+++ b/frontend/src/metabase/dashboard/containers/DashboardApp.jsx
@@ -133,6 +133,10 @@ export default class DashboardApp extends Component {
     }
   }
 
+  componentWillUnmount() {
+    this.props.reset();
+  }
+
   render() {
     const { editingOnLoad, addCardOnLoad } = this.state;
 
diff --git a/frontend/src/metabase/dashboard/reducers.js b/frontend/src/metabase/dashboard/reducers.js
index 52c6264325b..c4bb2b563a1 100644
--- a/frontend/src/metabase/dashboard/reducers.js
+++ b/frontend/src/metabase/dashboard/reducers.js
@@ -34,6 +34,7 @@ import {
   SAVE_DASHBOARD_AND_CARDS,
   SET_DASHBOARD_SEEN,
   SET_SHOW_LOADING_COMPLETE_FAVICON,
+  RESET,
 } from "./actions";
 
 import { isVirtualDashCard, syncParametersAndEmbeddingParams } from "./utils";
@@ -44,6 +45,7 @@ const dashboardId = handleActions(
     [FETCH_DASHBOARD]: {
       next: (state, { payload: { dashboardId } }) => dashboardId,
     },
+    [RESET]: { next: state => null },
   },
   null,
 );
@@ -54,6 +56,7 @@ const isEditing = handleActions(
     [SET_EDITING_DASHBOARD]: {
       next: (state, { payload }) => (payload ? payload : null),
     },
+    [RESET]: { next: state => null },
   },
   null,
 );
@@ -65,6 +68,7 @@ const hasSeenLoadedDashboard = handleActions(
     [SET_DASHBOARD_SEEN]: {
       next: state => true,
     },
+    [RESET]: { next: state => false },
   },
   false,
 );
@@ -76,6 +80,7 @@ const showLoadingCompleteFavicon = handleActions(
     [SET_SHOW_LOADING_COMPLETE_FAVICON]: {
       next: (state, { payload }) => payload,
     },
+    [RESET]: { next: state => false },
   },
   false,
 );
@@ -224,6 +229,7 @@ const isAddParameterPopoverOpen = handleActions(
     [SHOW_ADD_PARAMETER_POPOVER]: () => true,
     [HIDE_ADD_PARAMETER_POPOVER]: () => false,
     [INITIALIZE]: () => false,
+    [RESET]: () => false,
   },
   false,
 );
@@ -247,6 +253,7 @@ const dashcardData = handleActions(
           .dissoc(oldDashcardId)
           .value(),
     },
+    [RESET]: { next: state => ({}) },
   },
   {},
 );
@@ -275,6 +282,7 @@ const parameterValues = handleActions(
     [FETCH_DASHBOARD]: {
       next: (state, { payload: { parameterValues } }) => parameterValues,
     },
+    [RESET]: { next: state => ({}) },
   },
   {},
 );
@@ -289,6 +297,7 @@ const parameterValuesSearchCache = handleActions(
       next: (state, { payload }) =>
         payload ? assoc(state, payload.cacheKey, payload.results) : state,
     },
+    [RESET]: { next: state => ({}) },
   },
   {},
 );
@@ -346,6 +355,12 @@ const loadingDashCards = handleActions(
         };
       },
     },
+    [RESET]: {
+      next: state => ({
+        ...state,
+        isLoadingComplete: false,
+      }),
+    },
   },
   {
     dashcardIds: [],
@@ -358,6 +373,9 @@ const loadingDashCards = handleActions(
 const DEFAULT_SIDEBAR = { props: {} };
 const sidebar = handleActions(
   {
+    [INITIALIZE]: {
+      next: () => DEFAULT_SIDEBAR,
+    },
     [SET_SIDEBAR]: {
       next: (state, { payload: { name, props } }) => ({
         name,
@@ -367,9 +385,6 @@ const sidebar = handleActions(
     [CLOSE_SIDEBAR]: {
       next: () => DEFAULT_SIDEBAR,
     },
-    [INITIALIZE]: {
-      next: () => DEFAULT_SIDEBAR,
-    },
     [SET_EDITING_DASHBOARD]: {
       next: (state, { payload: isEditing }) =>
         isEditing ? state : DEFAULT_SIDEBAR,
@@ -377,6 +392,9 @@ const sidebar = handleActions(
     [REMOVE_PARAMETER]: {
       next: () => DEFAULT_SIDEBAR,
     },
+    [RESET]: {
+      next: () => DEFAULT_SIDEBAR,
+    },
   },
   DEFAULT_SIDEBAR,
 );
-- 
GitLab