diff --git a/native/backup/backup-handler.js b/native/backup/backup-handler.js --- a/native/backup/backup-handler.js +++ b/native/backup/backup-handler.js @@ -2,10 +2,13 @@ import * as React from 'react'; +import { createUserKeysBackupActionTypes } from 'lib/actions/backup-actions.js'; import { useCheckIfPrimaryDevice } from 'lib/hooks/primary-device-hooks.js'; import { isLoggedIn } from 'lib/selectors/user-selectors.js'; import { getMessageForException } from 'lib/utils/errors.js'; +import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js'; +import { useClientBackup } from './use-client-backup.js'; import { commCoreModule } from '../native-modules.js'; import { useSelector } from '../redux/redux-utils.js'; import Alert from '../utils/alert.js'; @@ -19,6 +22,13 @@ ); const canPerformBackupOperation = loggedIn && !isBackground; const checkIfPrimaryDevice = useCheckIfPrimaryDevice(); + const latestBackupInfo = useSelector( + state => state.backupStore.latestBackupInfo, + ); + const dispatchActionPromise = useDispatchActionPromise(); + const { createUserKeysBackup } = useClientBackup(); + const backupUploadInProgress = React.useRef(false); + const [handlerStarted, setHandlerStarted] = React.useState(false); React.useEffect(() => { if (!staffCanSee) { @@ -31,17 +41,22 @@ return; } - if (canPerformBackupOperation) { + if (!handlerStarted && canPerformBackupOperation) { try { commCoreModule.startBackupHandler(); + setHandlerStarted(true); } catch (err) { const message = getMessageForException(err) ?? 'unknown error'; Alert.alert('Error starting backup handler', message); console.log('Error starting backup handler:', message); } - } else { + } + + if (handlerStarted && !canPerformBackupOperation) { try { + console.log('stopping'); commCoreModule.stopBackupHandler(); + setHandlerStarted(false); } catch (err) { const message = getMessageForException(err) ?? 'unknown error'; Alert.alert('Error stopping backup handler', message); @@ -55,6 +70,47 @@ isBackground, checkIfPrimaryDevice, canPerformBackupOperation, + handlerStarted, + ]); + + React.useEffect(() => { + if ( + !staffCanSee || + !canPerformBackupOperation || + !handlerStarted || + backupUploadInProgress.current || + !!latestBackupInfo + ) { + return; + } + + void (async () => { + backupUploadInProgress.current = true; + const isPrimaryDevice = await checkIfPrimaryDevice(); + if (!isPrimaryDevice) { + backupUploadInProgress.current = false; + return; + } + + try { + const promise = createUserKeysBackup(); + void dispatchActionPromise(createUserKeysBackupActionTypes, promise); + await promise; + } catch (err) { + const message = getMessageForException(err) ?? 'unknown error'; + Alert.alert('Error creating User Keys backup', message); + console.log('Error creating User Keys backup:', message); + } + backupUploadInProgress.current = false; + })(); + }, [ + canPerformBackupOperation, + checkIfPrimaryDevice, + createUserKeysBackup, + dispatchActionPromise, + handlerStarted, + latestBackupInfo, + staffCanSee, ]); return null;