diff --git a/lib/reducers/backup-reducer.js b/lib/reducers/backup-reducer.js --- a/lib/reducers/backup-reducer.js +++ b/lib/reducers/backup-reducer.js @@ -1,5 +1,7 @@ // @flow +import invariant from 'invariant'; + import { createUserDataBackupActionTypes, createUserKeysBackupActionTypes, @@ -8,8 +10,9 @@ changeIdentityUserPasswordActionTypes, restoreUserActionTypes, } from '../actions/user-actions.js'; -import type { BackupStore } from '../types/backup-types.js'; +import type { BackupStore, RestoreBackupState } from '../types/backup-types.js'; import type { BaseAction } from '../types/redux-types.js'; +import { fullBackupSupport } from '../utils/services-utils.js'; function reduceBackupStore( store: BackupStore, @@ -43,4 +46,51 @@ return store; } -export { reduceBackupStore }; +function reduceRestoreBackupState( + store: RestoreBackupState, + action: BaseAction, +): RestoreBackupState { + if (!fullBackupSupport) { + return store; + } + + if (action.type === restoreUserActionTypes.success) { + invariant( + store.status === 'no_backup', + `Restore protocol dispatched but backup state was '${store.status}'`, + ); + return { ...store, status: 'user_keys_backup_success', payload: {} }; + } else if (action.type === createUserKeysBackupActionTypes.started) { + return { ...store, status: 'user_keys_backup_started', payload: {} }; + } else if (action.type === createUserKeysBackupActionTypes.success) { + invariant( + store.status === 'user_keys_backup_started', + 'UserKeys backup success dispatched but no backup was in progress', + ); + return { ...store, status: 'user_keys_backup_success', payload: {} }; + } else if (action.type === createUserKeysBackupActionTypes.failed) { + invariant( + store.status === 'user_keys_backup_started', + 'UserKeys backup failure dispatched but no backup was in progress', + ); + return { ...store, status: 'user_keys_backup_failed', payload: {} }; + } else if (action.type === createUserDataBackupActionTypes.started) { + return { ...store, status: 'user_data_backup_started', payload: {} }; + } else if (action.type === createUserDataBackupActionTypes.success) { + invariant( + store.status === 'user_data_backup_started', + 'UserData backup success dispatched but no backup was in progress', + ); + return { ...store, status: 'user_data_backup_success' }; + } else if (action.type === createUserDataBackupActionTypes.failed) { + invariant( + store.status === 'user_data_backup_started', + 'UserData backup failure dispatched but no backup was in progress', + ); + return { ...store, status: 'user_data_backup_failed' }; + } + + return store; +} + +export { reduceBackupStore, reduceRestoreBackupState }; diff --git a/lib/reducers/master-reducer.js b/lib/reducers/master-reducer.js --- a/lib/reducers/master-reducer.js +++ b/lib/reducers/master-reducer.js @@ -2,6 +2,7 @@ import { reduceAlertStore } from './alert-reducer.js'; import { reduceAuxUserStore } from './aux-user-reducer.js'; +import { reduceRestoreBackupState } from './backup-reducer.js'; import reduceCalendarFilters from './calendar-filters-reducer.js'; import { reduceCommunityStore } from './community-reducer.js'; import reduceCustomerServer from './custom-server-reducer.js'; @@ -297,6 +298,10 @@ ), queuedDMOperations, holderStore, + restoreBackupState: reduceRestoreBackupState( + state.restoreBackupState, + action, + ), }, storeOperations, }; diff --git a/lib/types/backup-types.js b/lib/types/backup-types.js --- a/lib/types/backup-types.js +++ b/lib/types/backup-types.js @@ -82,7 +82,32 @@ +latestDatabaseVersion?: number, }; -export type RestoreBackupState = { - status: 'no_backup', - payload: {}, -}; +export type RestoreBackupState = + | { + status: 'no_backup', + payload: {}, + } + | { + status: 'user_keys_backup_started', + payload: {}, + } + | { + status: 'user_keys_backup_success', + payload: {}, + } + | { + status: 'user_keys_backup_failed', + payload: {}, + } + | { + status: 'user_data_backup_started', + payload: {}, + } + | { + status: 'user_data_backup_success', + payload: {}, + } + | { + status: 'user_data_backup_failed', + payload: {}, + };