diff --git a/lib/backup/use-user-data-restore.js b/lib/backup/use-user-data-restore.js --- a/lib/backup/use-user-data-restore.js +++ b/lib/backup/use-user-data-restore.js @@ -76,8 +76,8 @@ } function useUserDataRestore(): ( - backupData: QRAuthBackupData, - identityAuthResult: IdentityAuthResult, + backupData: ?QRAuthBackupData, + identityAuthResult: ?IdentityAuthResult, ) => Promise { const dispatch = useDispatch(); const dispatchActionPromise = useDispatchActionPromise(); @@ -86,8 +86,8 @@ return React.useCallback( async ( - backupData: QRAuthBackupData, - identityAuthResult: IdentityAuthResult, + backupData: ?QRAuthBackupData, + identityAuthResult: ?IdentityAuthResult, ) => { const { sqliteAPI } = getConfig(); @@ -125,6 +125,10 @@ // 1. Download database and apply all logs if (startStepIndex === 0) { + invariant( + backupData && identityAuthResult, + 'backupData and identityAuthResult should exists when starting from scratch', + ); const restoreUserDataPromise = sqliteAPI.restoreUserData( backupData, identityAuthResult, @@ -280,7 +284,7 @@ // 6. Populate store const clientDBStore = await sqliteAPI.getClientDBStore( databaseIdentifier.MAIN, - identityAuthResult.userID, + identityAuthResult?.userID, ); dispatch({ @@ -292,4 +296,4 @@ ); } -export { useUserDataRestore }; +export { useUserDataRestore, getStoreAndDatabaseVersions }; diff --git a/lib/handlers/restore-backup-handler.react.js b/lib/handlers/restore-backup-handler.react.js new file mode 100644 --- /dev/null +++ b/lib/handlers/restore-backup-handler.react.js @@ -0,0 +1,35 @@ +// @flow + +import * as React from 'react'; + +import { useUserDataRestore } from '../backup/use-user-data-restore.js'; +import { usePersistedStateLoaded } from '../selectors/app-state-selectors.js'; +import { useSelector } from '../utils/redux-utils.js'; +import { fullBackupSupport } from '../utils/services-utils.js'; + +function RestoreBackupHandler(): React.Node { + const persistedStateLoaded = usePersistedStateLoaded(); + // We want this handler to be executed only once + const executed = React.useRef(false); + const restoreBackupState = useSelector(state => state.restoreBackupState); + const userDataRestore = useUserDataRestore(); + + React.useEffect(() => { + if (!fullBackupSupport || !persistedStateLoaded || executed.current) { + return; + } + if ( + restoreBackupState.status !== 'user_data_restore_step_completed' && + restoreBackupState.status !== 'user_data_restore_failed' + ) { + return; + } + + void userDataRestore(); + executed.current = true; + }, [persistedStateLoaded, restoreBackupState.status, userDataRestore]); + + return null; +} + +export { RestoreBackupHandler }; diff --git a/native/root.react.js b/native/root.react.js --- a/native/root.react.js +++ b/native/root.react.js @@ -42,6 +42,7 @@ import { DBOpsHandler } from 'lib/handlers/db-ops-handler.react.js'; import { HoldersHandler } from 'lib/handlers/holders-handler.react.js'; import { InitialStateSharingHandler } from 'lib/handlers/initial-state-sharing-handler.react.js'; +import { RestoreBackupHandler } from 'lib/handlers/restore-backup-handler.react.js'; import { SyncCurrentUserInfoHandler } from 'lib/handlers/sync-current-user-info-handler.react.js'; import { SyncStoreVersionHandler } from 'lib/handlers/sync-store-version-handler.react.js'; import { TunnelbrokerDeviceTokenHandler } from 'lib/handlers/tunnelbroker-device-token-handler.react.js'; @@ -303,6 +304,7 @@ + ); diff --git a/web/app.react.js b/web/app.react.js --- a/web/app.react.js +++ b/web/app.react.js @@ -29,6 +29,7 @@ import SyncCommunityStoreHandler from 'lib/components/sync-community-store-handler.react.js'; import { DBOpsHandler } from 'lib/handlers/db-ops-handler.react.js'; import { HoldersHandler } from 'lib/handlers/holders-handler.react.js'; +import { RestoreBackupHandler } from 'lib/handlers/restore-backup-handler.react.js'; import { SyncCurrentUserInfoHandler } from 'lib/handlers/sync-current-user-info-handler.react.js'; import { SyncStoreVersionHandler } from 'lib/handlers/sync-store-version-handler.react.js'; import { TunnelbrokerDeviceTokenHandler } from 'lib/handlers/tunnelbroker-device-token-handler.react.js'; @@ -267,6 +268,7 @@ +