diff --git a/native/profile/secondary-device-qr-code-scanner.react.js b/native/profile/secondary-device-qr-code-scanner.react.js --- a/native/profile/secondary-device-qr-code-scanner.react.js +++ b/native/profile/secondary-device-qr-code-scanner.react.js @@ -7,7 +7,11 @@ import { View } from 'react-native'; import { parseDataFromDeepLink } from 'lib/facts/links.js'; -import { useBroadcastDeviceListUpdates } from 'lib/hooks/peer-list-hooks.js'; +import { + useBroadcastDeviceListUpdates, + useGetAndUpdateDeviceListsForUsers, +} from 'lib/hooks/peer-list-hooks.js'; +import { getForeignPeerDevices } from 'lib/selectors/user-selectors.js'; import { addDeviceToDeviceList } from 'lib/shared/device-list-utils.js'; import { IdentityClientContext } from 'lib/shared/identity-client-context.js'; import { useTunnelbroker } from 'lib/tunnelbroker/tunnelbroker-context.js'; @@ -36,6 +40,7 @@ composeTunnelbrokerQRAuthMessage, parseTunnelbrokerQRAuthMessage, } from '../qr-code/qr-code-utils.js'; +import { useSelector } from '../redux/redux-utils.js'; import { useStyles } from '../themes/colors.js'; import Alert from '../utils/alert.js'; @@ -61,6 +66,9 @@ const secondaryDeviceID = React.useRef(null); const broadcastDeviceListUpdates = useBroadcastDeviceListUpdates(); + const getAndUpdateDeviceListsForUsers = useGetAndUpdateDeviceListsForUsers(); + + const foreignPeerDevices = useSelector(getForeignPeerDevices); const tunnelbrokerMessageListener = React.useCallback( async (message: TunnelbrokerMessage) => { @@ -100,8 +108,8 @@ invariant(identityContext, 'identity context not set'); const { getAuthMetadata, identityClient } = identityContext; - const { userID } = await getAuthMetadata(); - if (!userID) { + const { userID, deviceID } = await getAuthMetadata(); + if (!userID || !deviceID) { throw new Error('missing auth metadata'); } @@ -112,10 +120,15 @@ const lastSignedDeviceList = deviceLists[deviceLists.length - 1]; const deviceList = rawDeviceListFromSignedList(lastSignedDeviceList); - await broadcastDeviceListUpdates( - deviceList.devices, - lastSignedDeviceList, - ); + const ownOtherDevices = deviceList.devices.filter(it => it !== deviceID); + + await Promise.all([ + broadcastDeviceListUpdates( + [...ownOtherDevices, ...foreignPeerDevices], + lastSignedDeviceList, + ), + getAndUpdateDeviceListsForUsers([userID]), + ]); if (!payload.requestBackupKeys) { Alert.alert('Device added', 'Device registered successfully', [ @@ -148,7 +161,13 @@ { text: 'OK' }, ]); }, - [identityContext, broadcastDeviceListUpdates, tunnelbrokerContext], + [ + identityContext, + broadcastDeviceListUpdates, + foreignPeerDevices, + getAndUpdateDeviceListsForUsers, + tunnelbrokerContext, + ], ); React.useEffect(() => {