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 @@ -36,6 +36,12 @@ ...store, latestBackupInfo, }; + } else if (action.type === createUserDataBackupActionTypes.started) { + const { ownDevicesWithoutBackup } = action.payload; + return { + ...store, + ownDevicesWithoutBackup, + }; } else if (action.type === createUserDataBackupActionTypes.success) { const { latestBackupInfo, latestDatabaseVersion } = action.payload; return { 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 @@ -80,6 +80,7 @@ export type BackupStore = { +latestBackupInfo: ?LocalLatestBackupInfo, +latestDatabaseVersion?: number, + +ownDevicesWithoutBackup?: $ReadOnlyArray, }; export const restoreUserDataSteps = Object.freeze({ diff --git a/lib/types/redux-types.js b/lib/types/redux-types.js --- a/lib/types/redux-types.js +++ b/lib/types/redux-types.js @@ -1634,7 +1634,7 @@ | { +type: 'CREATE_USER_DATA_BACKUP_STARTED', +loadingInfo?: LoadingInfo, - +payload?: void, + +payload: { +ownDevicesWithoutBackup: $ReadOnlyArray }, } | { +type: 'CREATE_USER_DATA_BACKUP_SUCCESS', diff --git a/native/backup/backup-handler-context-provider.js b/native/backup/backup-handler-context-provider.js --- a/native/backup/backup-handler-context-provider.js +++ b/native/backup/backup-handler-context-provider.js @@ -14,6 +14,7 @@ } from 'lib/hooks/peer-list-hooks.js'; import { usePersistedStateLoaded } from 'lib/selectors/app-state-selectors.js'; import { + getOwnPeerDevices, getOwnRawDeviceList, isLoggedIn, } from 'lib/selectors/user-selectors.js'; @@ -21,6 +22,7 @@ import { useTunnelbroker } from 'lib/tunnelbroker/tunnelbroker-context.js'; import { type LocalLatestBackupInfo } from 'lib/types/backup-types.js'; import { databaseIdentifier } from 'lib/types/database-identifier-types.js'; +import { identityDeviceTypes } from 'lib/types/identity-service-types.js'; import { getConfig } from 'lib/utils/config.js'; import { rawDeviceListFromSignedList } from 'lib/utils/device-list-utils.js'; import { getMessageForException } from 'lib/utils/errors.js'; @@ -97,6 +99,7 @@ [dispatchActionPromise, migrateToNewFlow], ); + const ownDevices = useSelector(getOwnPeerDevices); const performUserKeysUpload = React.useCallback(async () => { const promise = (async () => { const backupID = await createUserKeysBackup(); @@ -109,24 +112,44 @@ await promise; }, [createUserKeysBackup, dispatchActionPromise]); - const performUserDataUpload = React.useCallback(async () => { - const promise: Promise = (async () => { - const { sqliteAPI } = getConfig(); - const databaseVersion = await sqliteAPI.getDatabaseVersion( - databaseIdentifier.MAIN, + const performUserDataUpload = React.useCallback( + async (firstUserDataUpload: boolean, currentDeviceID: string) => { + const ownDevicesWithoutBackup: Array = []; + if (firstUserDataUpload) { + const ownSecondaryDevices = ownDevices + .filter( + ({ deviceID, platformDetails }) => + deviceID !== currentDeviceID && + platformDetails?.deviceType !== identityDeviceTypes.KEYSERVER, + ) + .map(({ deviceID }) => deviceID); + ownDevicesWithoutBackup.push(...ownSecondaryDevices); + } + + const promise: Promise = (async () => { + const { sqliteAPI } = getConfig(); + const databaseVersion = await sqliteAPI.getDatabaseVersion( + databaseIdentifier.MAIN, + ); + const backupID = await createUserDataBackup(); + return { + latestBackupInfo: { + backupID, + timestamp: Date.now(), + }, + latestDatabaseVersion: databaseVersion, + }; + })(); + void dispatchActionPromise( + createUserDataBackupActionTypes, + promise, + undefined, + { ownDevicesWithoutBackup }, ); - const backupID = await createUserDataBackup(); - return { - latestBackupInfo: { - backupID, - timestamp: Date.now(), - }, - latestDatabaseVersion: databaseVersion, - }; - })(); - void dispatchActionPromise(createUserDataBackupActionTypes, promise); - await promise; - }, [createUserDataBackup, dispatchActionPromise]); + await promise; + }, + [createUserDataBackup, dispatchActionPromise, ownDevices], + ); const startBackupHandler = React.useCallback(() => { if (handlerStartedRef.current) { @@ -270,7 +293,7 @@ await performMigrationToNewFlow(currentIdentityUserState); } else if (shouldUploadUserData && fullBackupSupport) { step = 'creating User Data backup'; - await performUserDataUpload(); + await performUserDataUpload(firstUserDataUpload, deviceID); } else if (shouldUploadUserKeys) { step = 'creating User Keys backup'; await performUserKeysUpload();