From f49df12b441a2bd06520df42ddd41fc42f639147 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 24 Nov 2021 17:38:39 -0300 Subject: restore and save session --- .../src/hooks/use-anastasis-reducer.ts | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'packages/anastasis-webui/src/hooks') diff --git a/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts b/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts index 1ef28a168..7b101baa0 100644 --- a/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts +++ b/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts @@ -107,6 +107,8 @@ export interface AnastasisReducerApi { reset: () => void; back: () => Promise; transition(action: string, args: any): Promise; + exportState: () => string; + importState: (s: string) => void; /** * Run multiple reducer steps in a transaction without * affecting the UI-visible transition state in-between. @@ -129,7 +131,7 @@ function storageSet(key: string, value: any): void { } } -function restoreState(): any { +function getStateFromStorage(): any { let state: any; try { const s = storageGet("anastasisReducerState"); @@ -148,7 +150,7 @@ function restoreState(): any { export function useAnastasisReducer(): AnastasisReducerApi { const [anastasisState, setAnastasisStateInternal] = useState( () => ({ - reducerState: restoreState(), + reducerState: getStateFromStorage(), currentError: undefined, }), ); @@ -165,7 +167,7 @@ export function useAnastasisReducer(): AnastasisReducerApi { setAnastasisStateInternal(newState); }; - async function doTransition(action: string, args: any) { + async function doTransition(action: string, args: any): Promise { console.log("reducing with", action, args); let s: ReducerState; if (remoteReducer) { @@ -210,6 +212,18 @@ export function useAnastasisReducer(): AnastasisReducerApi { }); } }, + exportState() { + const state = getStateFromStorage() + return JSON.stringify(state) + }, + importState(s: string) { + try { + const state = JSON.parse(s) + setAnastasisState({ reducerState: state, currentError: undefined }) + } catch (e) { + throw Error('could not restore the state') + } + }, async startRecover() { let s: ReducerState; if (remoteReducer) { @@ -287,7 +301,7 @@ export function useAnastasisReducer(): AnastasisReducerApi { } class ReducerTxImpl implements ReducerTransactionHandle { - constructor(public transactionState: ReducerState) {} + constructor(public transactionState: ReducerState) { } async transition(action: string, args: any): Promise { let s: ReducerState; if (remoteReducer) { -- cgit v1.2.3