diff --git a/lib/components/secondary-device-qr-auth-context-provider.react.js b/lib/components/secondary-device-qr-auth-context-provider.react.js --- a/lib/components/secondary-device-qr-auth-context-provider.react.js +++ b/lib/components/secondary-device-qr-auth-context-provider.react.js @@ -3,25 +3,28 @@ import invariant from 'invariant'; import * as React from 'react'; +import { qrCodeLinkURL } from '../facts/links.js'; import { useSecondaryDeviceLogIn } from '../hooks/login-hooks.js'; import { uintArrayToHexString } from '../media/data-utils.js'; import { isLoggedIn } from '../selectors/user-selectors.js'; import { IdentityClientContext } from '../shared/identity-client-context.js'; import { useTunnelbroker } from '../tunnelbroker/tunnelbroker-context.js'; +import { platformToIdentityDeviceType } from '../types/identity-service-types.js'; import { - tunnelbrokerToDeviceMessageTypes, type TunnelbrokerToDeviceMessage, + tunnelbrokerToDeviceMessageTypes, } from '../types/tunnelbroker/messages.js'; import { - type QRCodeAuthMessage, peerToPeerMessageTypes, peerToPeerMessageValidator, + type QRCodeAuthMessage, } from '../types/tunnelbroker/peer-to-peer-message-types.js'; import { - qrCodeAuthMessageTypes, - type QRCodeAuthMessagePayload, type QRAuthBackupData, + type QRCodeAuthMessagePayload, + qrCodeAuthMessageTypes, } from '../types/tunnelbroker/qr-code-auth-message-types.js'; +import { getConfig } from '../utils/config.js'; import { getContentSigningKey } from '../utils/crypto-utils.js'; import { getMessageForException } from '../utils/errors.js'; import { useSelector } from '../utils/redux-utils.js'; @@ -255,7 +258,37 @@ return context; } +function useSecondaryDeviceQRAuthURL(): ?string { + const { qrData, openSecondaryQRAuth, closeSecondaryQRAuth } = + useSecondaryDeviceQRAuthContext(); + + React.useEffect(() => { + void openSecondaryQRAuth(); + return closeSecondaryQRAuth; + }, [closeSecondaryQRAuth, openSecondaryQRAuth]); + + const { platform } = getConfig().platformDetails; + const qrCodeURL = React.useMemo(() => { + if (!qrData) { + return undefined; + } + + const identityDeviceType = platformToIdentityDeviceType[platform]; + + return qrCodeLinkURL(qrData.aesKey, qrData.deviceID, identityDeviceType); + }, [platform, qrData]); + + React.useEffect(() => { + if (qrCodeURL) { + console.log(`QR Code URL: ${qrCodeURL}`); + } + }, [qrCodeURL]); + + return qrCodeURL; +} + export { SecondaryDeviceQRAuthContextProvider, useSecondaryDeviceQRAuthContext, + useSecondaryDeviceQRAuthURL, }; diff --git a/web/account/log-in-form.react.js b/web/account/log-in-form.react.js --- a/web/account/log-in-form.react.js +++ b/web/account/log-in-form.react.js @@ -8,11 +8,8 @@ import ModalOverlay from 'lib/components/modal-overlay.react.js'; import { useModalContext } from 'lib/components/modal-provider.react.js'; -import { useSecondaryDeviceQRAuthContext } from 'lib/components/secondary-device-qr-auth-context-provider.react.js'; -import { qrCodeLinkURL } from 'lib/facts/links.js'; +import { useSecondaryDeviceQRAuthURL } from 'lib/components/secondary-device-qr-auth-context-provider.react.js'; import stores from 'lib/facts/stores.js'; -import { platformToIdentityDeviceType } from 'lib/types/identity-service-types.js'; -import { getConfig } from 'lib/utils/config.js'; import { useDispatch } from 'lib/utils/redux-utils.js'; import { useIsRestoreFlowEnabled } from 'lib/utils/services-utils.js'; @@ -86,30 +83,7 @@ } function LoginForm() { - const { qrData, openSecondaryQRAuth, closeSecondaryQRAuth } = - useSecondaryDeviceQRAuthContext(); - - React.useEffect(() => { - void openSecondaryQRAuth(); - return closeSecondaryQRAuth; - }, [closeSecondaryQRAuth, openSecondaryQRAuth]); - - const { platform } = getConfig().platformDetails; - const qrCodeURL = React.useMemo(() => { - if (!qrData) { - return undefined; - } - - const identityDeviceType = platformToIdentityDeviceType[platform]; - - return qrCodeLinkURL(qrData.aesKey, qrData.deviceID, identityDeviceType); - }, [platform, qrData]); - - React.useEffect(() => { - if (qrCodeURL) { - console.log(`QR Code URL: ${qrCodeURL}`); - } - }, [qrCodeURL]); + const qrCodeURL = useSecondaryDeviceQRAuthURL(); const { pushModal, clearModals, popModal } = useModalContext(); diff --git a/web/account/qr-code-login.react.js b/web/account/qr-code-login.react.js --- a/web/account/qr-code-login.react.js +++ b/web/account/qr-code-login.react.js @@ -3,33 +3,13 @@ import { QRCodeSVG } from 'qrcode.react'; import * as React from 'react'; -import { useSecondaryDeviceQRAuthContext } from 'lib/components/secondary-device-qr-auth-context-provider.react.js'; -import { qrCodeLinkURL } from 'lib/facts/links.js'; -import { platformToIdentityDeviceType } from 'lib/types/identity-service-types.js'; -import { getConfig } from 'lib/utils/config.js'; +import { useSecondaryDeviceQRAuthURL } from 'lib/components/secondary-device-qr-auth-context-provider.react.js'; import css from './qr-code-login.css'; import LoadingIndicator from '../loading-indicator.react.js'; function QRCodeLogin(): React.Node { - const { qrData, openSecondaryQRAuth, closeSecondaryQRAuth } = - useSecondaryDeviceQRAuthContext(); - - React.useEffect(() => { - void openSecondaryQRAuth(); - return closeSecondaryQRAuth; - }, [closeSecondaryQRAuth, openSecondaryQRAuth]); - - const { platform } = getConfig().platformDetails; - const qrCodeURL = React.useMemo(() => { - if (!qrData) { - return undefined; - } - - const identityDeviceType = platformToIdentityDeviceType[platform]; - - return qrCodeLinkURL(qrData.aesKey, qrData.deviceID, identityDeviceType); - }, [platform, qrData]); + const qrCodeURL = useSecondaryDeviceQRAuthURL(); const qrCodeComponent = React.useMemo(() => { if (qrCodeURL) {