diff --git a/lib/backup/use-user-data-restore.js b/lib/backup/use-user-data-restore.js new file mode 100644 --- /dev/null +++ b/lib/backup/use-user-data-restore.js @@ -0,0 +1,42 @@ +// @flow + +import * as React from 'react'; + +import { setClientDBStoreActionType } from '../actions/client-db-store-actions.js'; +import { databaseIdentifier } from '../types/database-identifier-types.js'; +import type { IdentityAuthResult } from '../types/identity-service-types.js'; +import type { QRAuthBackupData } from '../types/tunnelbroker/qr-code-auth-message-types.js'; +import { getConfig } from '../utils/config.js'; +import { useDispatch } from '../utils/redux-utils.js'; + +function useUserDataRestore(): ( + backupData: QRAuthBackupData, + identityAuthResult: IdentityAuthResult, +) => Promise { + const dispatch = useDispatch(); + + return React.useCallback( + async ( + backupData: QRAuthBackupData, + identityAuthResult: IdentityAuthResult, + ) => { + const { sqliteAPI } = getConfig(); + + await sqliteAPI.restoreUserData(backupData, identityAuthResult); + await sqliteAPI.migrateBackupSchema(); + await sqliteAPI.copyContentFromBackupDatabase(); + const clientDBStore = await sqliteAPI.getClientDBStore( + databaseIdentifier.MAIN, + identityAuthResult.userID, + ); + + dispatch({ + type: setClientDBStoreActionType, + payload: clientDBStore, + }); + }, + [dispatch], + ); +} + +export { useUserDataRestore }; diff --git a/lib/components/secondary-device-qr-auth-context-provider.react.js b/lib/components/secondary-device-qr-auth-context-provider.react.js --- a/lib/components/secondary-device-qr-auth-context-provider.react.js +++ b/lib/components/secondary-device-qr-auth-context-provider.react.js @@ -4,14 +4,13 @@ import * as React from 'react'; import { useDebugLogs } from './debug-logs-context.js'; -import { setClientDBStoreActionType } from '../actions/client-db-store-actions.js'; +import { useUserDataRestore } from '../backup/use-user-data-restore.js'; import { qrCodeLinkURL } from '../facts/links.js'; import { useSecondaryDeviceLogIn } from '../hooks/login-hooks.js'; import { uintArrayToHexString } from '../media/data-utils.js'; import { isLoggedIn } from '../selectors/user-selectors.js'; import { IdentityClientContext } from '../shared/identity-client-context.js'; import { useTunnelbroker } from '../tunnelbroker/tunnelbroker-context.js'; -import { databaseIdentifier } from '../types/database-identifier-types.js'; import { platformToIdentityDeviceType } from '../types/identity-service-types.js'; import type { IdentityAuthResult } from '../types/identity-service-types.js'; import { @@ -31,7 +30,7 @@ import { getConfig } from '../utils/config.js'; import { getContentSigningKey } from '../utils/crypto-utils.js'; import { getMessageForException } from '../utils/errors.js'; -import { useDispatch, useSelector } from '../utils/redux-utils.js'; +import { useSelector } from '../utils/redux-utils.js'; import { fullBackupSupport } from '../utils/services-utils.js'; import { waitUntilDatabaseDeleted } from '../utils/wait-until-db-deleted.js'; @@ -182,8 +181,8 @@ qrAuthFinished, ]); - const dispatch = useDispatch(); const { addLog } = useDebugLogs(); + const userDataRestore = useUserDataRestore(); const restoreUserData = React.useCallback( async ( backupData: ?QRAuthBackupData, @@ -193,24 +192,13 @@ return; } try { - const { sqliteAPI } = getConfig(); if (!identityAuthResult) { throw new Error('Missing identityAuthResult'); } if (!backupData) { throw new Error('Missing backupData'); } - await sqliteAPI.restoreUserData(backupData, identityAuthResult); - await sqliteAPI.migrateBackupSchema(); - await sqliteAPI.copyContentFromBackupDatabase(); - const clientDBStore = await sqliteAPI.getClientDBStore( - databaseIdentifier.MAIN, - identityAuthResult.userID, - ); - dispatch({ - type: setClientDBStoreActionType, - payload: clientDBStore, - }); + await userDataRestore(backupData, identityAuthResult); } catch (e) { addLog( 'Error when restoring User Data', @@ -218,7 +206,7 @@ ); } }, - [addLog, dispatch], + [addLog, userDataRestore], ); const tunnelbrokerMessageListener = React.useCallback( diff --git a/native/account/restore.js b/native/account/restore.js --- a/native/account/restore.js +++ b/native/account/restore.js @@ -3,11 +3,11 @@ import invariant from 'invariant'; import * as React from 'react'; -import { setClientDBStoreActionType } from 'lib/actions/client-db-store-actions.js'; import { restoreUserActionTypes, type RestoreUserResult, } from 'lib/actions/user-actions.js'; +import { useUserDataRestore } from 'lib/backup/use-user-data-restore.js'; import { useDebugLogs } from 'lib/components/debug-logs-context.js'; import { useLogIn, @@ -15,7 +15,6 @@ useWalletLogIn, } from 'lib/hooks/login-hooks.js'; import { IdentityClientContext } from 'lib/shared/identity-client-context.js'; -import { databaseIdentifier } from 'lib/types/database-identifier-types.js'; import { type IdentityAuthResult, type SignedDeviceList, @@ -26,7 +25,7 @@ import { composeRawDeviceList } from 'lib/utils/device-list-utils.js'; import { getMessageForException } from 'lib/utils/errors.js'; import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js'; -import { useDispatch, useSelector } from 'lib/utils/redux-utils.js'; +import { useSelector } from 'lib/utils/redux-utils.js'; import { fullBackupSupport } from 'lib/utils/services-utils.js'; import { setNativeCredentials } from './native-credentials.js'; @@ -198,31 +197,19 @@ [dispatchActionPromise, restoreProtocol], ); - const dispatch = useDispatch(); const { addLog } = useDebugLogs(); + const userDataRestore = useUserDataRestore(); const restoreUserData = React.useCallback( async (identityAuthResult: ?IdentityAuthResult) => { if (!fullBackupSupport) { return; } try { - const { sqliteAPI } = getConfig(); if (!identityAuthResult) { throw new Error('Missing identityAuthResult'); } const backupData = await commCoreModule.getQRAuthBackupData(); - await sqliteAPI.restoreUserData(backupData, identityAuthResult); - await sqliteAPI.migrateBackupSchema(); - await sqliteAPI.copyContentFromBackupDatabase(); - - const clientDBStore = await sqliteAPI.getClientDBStore( - databaseIdentifier.MAIN, - identityAuthResult.userID, - ); - dispatch({ - type: setClientDBStoreActionType, - payload: clientDBStore, - }); + await userDataRestore(backupData, identityAuthResult); } catch (e) { addLog( 'Error when restoring User Data', @@ -230,7 +217,7 @@ ); } }, - [addLog, dispatch], + [addLog, userDataRestore], ); const logIn = useLogIn('restore');