diff --git a/lib/hooks/backup-hooks.js b/lib/hooks/backup-hooks.js --- a/lib/hooks/backup-hooks.js +++ b/lib/hooks/backup-hooks.js @@ -16,16 +16,30 @@ ]; function useIsUserDataReady(): boolean { - const restoreBackupState = useSelector( - state => state.restoreBackupState.status, - ); + const restoreBackupState = useSelector(state => state.restoreBackupState); + const isBackgroundUserKeysUpload = React.useMemo(() => { + return ( + restoreBackupState.status === 'user_keys_backup_started' || + restoreBackupState.status === 'user_keys_backup_failed' || + (restoreBackupState.status === 'user_keys_backup_success' && + restoreBackupState.payload?.source === 'upload') + ); + }, [restoreBackupState.payload?.source, restoreBackupState.status]); + const fullBackupSupport = useFullBackupSupportEnabled(); return React.useMemo(() => { if (!fullBackupSupport) { return true; } - return loggedInStates.includes(restoreBackupState); - }, [fullBackupSupport, restoreBackupState]); + return ( + loggedInStates.includes(restoreBackupState.status) || + isBackgroundUserKeysUpload + ); + }, [ + fullBackupSupport, + isBackgroundUserKeysUpload, + restoreBackupState.status, + ]); } export { useIsUserDataReady }; 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 @@ -137,7 +137,13 @@ store.status === 'no_backup', `Restore protocol dispatched but backup state was '${store.status}'`, ); - return { ...store, status: 'user_keys_backup_success', payload: {} }; + return { + ...store, + status: 'user_keys_backup_success', + payload: { + source: 'auth', + }, + }; } else if (action.type === createUserKeysBackupActionTypes.started) { return { ...store, status: 'user_keys_backup_started', payload: {} }; } else if (action.type === createUserKeysBackupActionTypes.success) { @@ -145,7 +151,13 @@ store.status === 'user_keys_backup_started', 'UserKeys backup success dispatched but no backup was in progress', ); - return { ...store, status: 'user_keys_backup_success', payload: {} }; + return { + ...store, + status: 'user_keys_backup_success', + payload: { + source: 'upload', + }, + }; } else if (action.type === createUserKeysBackupActionTypes.failed) { invariant( store.status === 'user_keys_backup_started', 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 @@ -115,7 +115,9 @@ } | { +status: 'user_keys_backup_success', - +payload: {}, + +payload: { + +source?: 'auth' | 'upload', + }, } | { +status: 'user_keys_backup_failed', 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 @@ -269,10 +269,13 @@ restoreBackupState.status === 'user_data_backup_failed'; // Allow compaction only when UserData restoration is completed, - // or after the previous compaction has finished uploading. + // after the previous compaction has finished uploading, + // or User Key upload is finished. const userDataCompactionPossible = restoreBackupState.status === 'user_data_restore_completed' || - restoreBackupState.status === 'user_data_backup_success'; + restoreBackupState.status === 'user_data_backup_success' || + (restoreBackupState.status === 'user_keys_backup_success' && + restoreBackupState.payload?.source === 'upload'); // Check if another compaction is needed, but only when the // device is in a state where this is possible. @@ -338,7 +341,7 @@ performMigrationToNewFlow, performUserDataUpload, performUserKeysUpload, - restoreBackupState.status, + restoreBackupState, showAlertToStaff, socketState.isAuthorized, startBackupHandler,