diff --git a/native/backup/use-client-backup.js b/native/backup/use-client-backup.js --- a/native/backup/use-client-backup.js +++ b/native/backup/use-client-backup.js @@ -7,10 +7,16 @@ import type { SIWEBackupSecrets } from 'lib/types/siwe-types.js'; import type { CurrentUserInfo } from 'lib/types/user-types'; import { getContentSigningKey } from 'lib/utils/crypto-utils.js'; +import { runMigrations } from 'lib/utils/migration-utils.js'; import { fetchNativeKeychainCredentials } from '../account/native-credentials.js'; import { commCoreModule } from '../native-modules.js'; -import { persistConfig } from '../redux/persist.js'; +import { defaultState } from '../redux/default-state.js'; +import { + legacyMigrations, + migrations, + persistConfig, +} from '../redux/persist.js'; import { useSelector } from '../redux/redux-utils.js'; type SIWEBackupData = { @@ -114,6 +120,24 @@ persistConfig.version.toString(), ); + const backupVersion = await commCoreModule.getSyncedDatabaseVersion(); + const backupVersionNumber = parseInt(backupVersion); + console.info('Running backup migrations...'); + await runMigrations( + legacyMigrations, + migrations, + { + ...defaultState, + _persist: { + version: backupVersionNumber, + rehydrated: true, + }, + }, + backupVersionNumber, + persistConfig.version, + process.env.NODE_ENV !== 'production', + ); + console.info('Backup restored.'); return; }, [ diff --git a/native/redux/persist.js b/native/redux/persist.js --- a/native/redux/persist.js +++ b/native/redux/persist.js @@ -108,6 +108,8 @@ convertMessageStoreThreadsToNewIDSchema, convertThreadStoreThreadInfosToNewIDSchema, createAsyncMigrate, + type LegacyMigrationManifest, + type MigrationManifest, } from 'lib/utils/migration-utils.js'; import { entries } from 'lib/utils/objects.js'; import { @@ -138,11 +140,12 @@ import { unshimClientDB } from './unshim-utils.js'; import { authoritativeKeyserverID } from '../authoritative-keyserver.js'; import { commCoreModule } from '../native-modules.js'; +import type { NavInfo } from '../navigation/default-state.js'; import { defaultDeviceCameraInfo } from '../types/camera.js'; import { isTaskCancelledError } from '../utils/error-handling.js'; import { defaultURLPrefix } from '../utils/url-utils.js'; -const legacyMigrations = { +const legacyMigrations: LegacyMigrationManifest = { [1]: (state: AppState) => ({ ...state, notifPermissionAlertInfo: defaultAlertInfo, @@ -1339,7 +1342,7 @@ { whitelist: ['reportStore'] }, ); -const migrations = { +const migrations: MigrationManifest = { // This migration doesn't change the store but sets a persisted version // in the DB [75]: (state: AppState) => ({ @@ -1387,4 +1390,11 @@ return storedPersistor; } -export { persistConfig, codeVersion, setPersistor, getPersistor }; +export { + persistConfig, + codeVersion, + setPersistor, + getPersistor, + migrations, + legacyMigrations, +};