From c73a62e151e81743e19e27770f6fdb6bdb5e5234 Mon Sep 17 00:00:00 2001 From: abbyhu2000 Date: Fri, 9 Dec 2022 00:46:57 +0000 Subject: [PATCH] add redux store persistence implement persistence without using state container or state sync utils, and it works with both the URL and session storage. Signed-off-by: abbyhu2000 --- .../state_management/redux_persistence.ts | 37 +++++++++++++++++++ .../utils/state_management/store.ts | 13 ++++++- 2 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/plugins/vis_builder/public/application/utils/state_management/redux_persistence.ts diff --git a/src/plugins/vis_builder/public/application/utils/state_management/redux_persistence.ts b/src/plugins/vis_builder/public/application/utils/state_management/redux_persistence.ts new file mode 100644 index 000000000000..5a74f1110919 --- /dev/null +++ b/src/plugins/vis_builder/public/application/utils/state_management/redux_persistence.ts @@ -0,0 +1,37 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { VisBuilderServices } from '../../../types'; +import { getPreloadedState } from './preload'; +import { RootState } from './store'; + +export const loadReduxState = async (services: VisBuilderServices) => { + try { + const serializedState = services.osdUrlStateStorage.get('_a'); + if (serializedState === null) { + return await getPreloadedState(services); + } + return serializedState; + } catch (err) { + return await getPreloadedState(services); + } +}; + +export const saveReduxState = ( + { style, visualization, metadata }, + services: VisBuilderServices +) => { + try { + services.osdUrlStateStorage.set( + '_a', + { style, visualization, metadata }, + { + replace: true, + } + ); + } catch (err) { + return; + } +}; diff --git a/src/plugins/vis_builder/public/application/utils/state_management/store.ts b/src/plugins/vis_builder/public/application/utils/state_management/store.ts index f02fc5e946dd..19f60858b19d 100644 --- a/src/plugins/vis_builder/public/application/utils/state_management/store.ts +++ b/src/plugins/vis_builder/public/application/utils/state_management/store.ts @@ -8,8 +8,8 @@ import { reducer as styleReducer } from './style_slice'; import { reducer as visualizationReducer } from './visualization_slice'; import { reducer as metadataReducer } from './metadata_slice'; import { VisBuilderServices } from '../../..'; -import { getPreloadedState } from './preload'; import { setEditorState } from './metadata_slice'; +import { loadReduxState, saveReduxState } from './redux_persistence'; const rootReducer = combineReducers({ style: styleReducer, @@ -25,7 +25,7 @@ export const configurePreloadedStore = (preloadedState: PreloadedState { - const preloadedState = await getPreloadedState(services); + const preloadedState = await loadReduxState(services); const store = configurePreloadedStore(preloadedState); const { metadata: metadataState, style: styleState, visualization: vizState } = store.getState(); @@ -62,6 +62,15 @@ export const getPreloadedStore = async (services: VisBuilderServices) => { previousStore = currentStore; previousMetadata = currentMetadata; + + saveReduxState( + { + style: store.getState().style, + visualization: store.getState().visualization, + metadata: store.getState().metadata, + }, + services + ); }; // the store subscriber will automatically detect changes and call handleChange function