diff --git a/lib/components/qr-auth-provider.react.js b/lib/components/qr-auth-provider.react.js --- a/lib/components/qr-auth-provider.react.js +++ b/lib/components/qr-auth-provider.react.js @@ -64,6 +64,7 @@ const [qrData, setQRData] = React.useState(); const [primaryDeviceID, setPrimaryDeviceID] = React.useState(); + const [qrAuthFinished, setQRAuthFinished] = React.useState(false); const { setUnauthorizedDeviceID, @@ -105,7 +106,12 @@ ); React.useEffect(() => { - if (!qrData || !socketState.isAuthorized || !primaryDeviceID) { + if ( + !qrData || + !socketState.isAuthorized || + !primaryDeviceID || + qrAuthFinished + ) { return; } @@ -119,7 +125,14 @@ payload: JSON.stringify(message), }); })(); - }, [sendMessage, primaryDeviceID, qrData, composeMessage, socketState]); + }, [ + sendMessage, + primaryDeviceID, + qrData, + composeMessage, + socketState, + qrAuthFinished, + ]); const tunnelbrokerMessageListener = React.useCallback( async (message: TunnelbrokerMessage) => { @@ -163,6 +176,7 @@ backupDataKey, backupLogDataKey, }); + setQRAuthFinished(true); return; } @@ -181,17 +195,17 @@ setUnauthorizedDeviceID(null); }, [ - setUnauthorizedDeviceID, identityClient, qrData?.aesKey, performRegistration, - performBackupRestore, + setUnauthorizedDeviceID, processMessage, + performBackupRestore, ], ); React.useEffect(() => { - if (!qrData?.deviceID) { + if (!qrData?.deviceID || qrAuthFinished) { return undefined; } @@ -204,8 +218,15 @@ removeListener, tunnelbrokerMessageListener, qrData?.deviceID, + qrAuthFinished, ]); + React.useEffect(() => { + if (qrAuthFinished) { + removeListener(tunnelbrokerMessageListener); + } + }, [qrAuthFinished, removeListener, tunnelbrokerMessageListener]); + const value = React.useMemo( () => ({ qrData,