diff --git a/lib/hooks/peer-list-hooks.js b/lib/hooks/peer-list-hooks.js new file mode 100644 --- /dev/null +++ b/lib/hooks/peer-list-hooks.js @@ -0,0 +1,40 @@ +// @flow + +import invariant from 'invariant'; +import * as React from 'react'; + +import { setPeerDeviceListsActionType } from '../actions/aux-user-actions.js'; +import { getRelativeUserIDs } from '../selectors/user-selectors.js'; +import { IdentityClientContext } from '../shared/identity-client-context.js'; +import { convertSignedDeviceListsToRawDeviceLists } from '../utils/device-list-utils.js'; +import { useDispatch, useSelector } from '../utils/redux-utils.js'; + +function useCreateInitialPeerList(): () => Promise<void> { + const dispatch = useDispatch(); + const relativeUserIDs = useSelector(getRelativeUserIDs); + + const identityContext = React.useContext(IdentityClientContext); + invariant(identityContext, 'Identity context should be set'); + + return React.useCallback(async () => { + if (!identityContext) { + return; + } + try { + const userDeviceLists = + await identityContext.identityClient.getDeviceListsForUsers( + relativeUserIDs, + ); + const usersRawDeviceLists = + convertSignedDeviceListsToRawDeviceLists(userDeviceLists); + dispatch({ + type: setPeerDeviceListsActionType, + payload: { deviceLists: usersRawDeviceLists }, + }); + } catch (e) { + console.log(`Error creating initial peer list: ${e.message}`); + } + }, [dispatch, identityContext, relativeUserIDs]); +} + +export { useCreateInitialPeerList }; diff --git a/native/profile/tunnelbroker-menu.react.js b/native/profile/tunnelbroker-menu.react.js --- a/native/profile/tunnelbroker-menu.react.js +++ b/native/profile/tunnelbroker-menu.react.js @@ -5,6 +5,7 @@ import { Text, View } from 'react-native'; import { ScrollView } from 'react-native-gesture-handler'; +import { useCreateInitialPeerList } from 'lib/hooks/peer-list-hooks.js'; import { IdentityClientContext } from 'lib/shared/identity-client-context.js'; import { useTunnelbroker } from 'lib/tunnelbroker/tunnelbroker-context.js'; import { @@ -89,6 +90,8 @@ } }, [identityContext, sendMessage]); + const onCreateInitialPeerList = useCreateInitialPeerList(); + const onSendEncryptedMessage = React.useCallback(async () => { try { if (!currentUserID) { @@ -183,6 +186,15 @@ Create session with own devices </Text> </Button> + <Button + onPress={onCreateInitialPeerList} + style={styles.row} + iosFormat="highlight" + iosHighlightUnderlayColor={colors.panelIosHighlightUnderlay} + iosActiveOpacity={0.85} + > + <Text style={styles.submenuText}>Create initial peer list</Text> + </Button> <Button onPress={onSendEncryptedMessage} style={styles.row} diff --git a/web/settings/account-settings.react.js b/web/settings/account-settings.react.js --- a/web/settings/account-settings.react.js +++ b/web/settings/account-settings.react.js @@ -2,12 +2,11 @@ import * as React from 'react'; -import { setPeerDeviceListsActionType } from 'lib/actions/aux-user-actions.js'; import { useLogOut, logOutActionTypes } from 'lib/actions/user-actions.js'; import { useModalContext } from 'lib/components/modal-provider.react.js'; import SWMansionIcon from 'lib/components/swmansion-icon.react.js'; import { useStringForUser } from 'lib/hooks/ens-cache.js'; -import { getRelativeUserIDs } from 'lib/selectors/user-selectors.js'; +import { useCreateInitialPeerList } from 'lib/hooks/peer-list-hooks.js'; import { accountHasPassword } from 'lib/shared/account-utils.js'; import { IdentityClientContext } from 'lib/shared/identity-client-context.js'; import { useTunnelbroker } from 'lib/tunnelbroker/tunnelbroker-context.js'; @@ -15,9 +14,7 @@ createOlmSessionsWithOwnDevices, getContentSigningKey, } from 'lib/utils/crypto-utils.js'; -import { convertSignedDeviceListsToRawDeviceLists } from 'lib/utils/device-list-utils.js'; import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js'; -import { useDispatch } from 'lib/utils/redux-utils.js'; import css from './account-settings.css'; import AppearanceChangeModal from './appearance-change-modal.react.js'; @@ -113,29 +110,7 @@ } }, [identityContext, sendMessage]); - const dispatch = useDispatch(); - const relativeUserIDs = useSelector(getRelativeUserIDs); - - const onCreateInitialPeerList = React.useCallback(async () => { - if (!identityContext) { - return; - } - - try { - const userDeviceLists = - await identityContext.identityClient.getDeviceListsForUsers( - relativeUserIDs, - ); - const usersRawDeviceLists = - convertSignedDeviceListsToRawDeviceLists(userDeviceLists); - dispatch({ - type: setPeerDeviceListsActionType, - payload: { deviceLists: usersRawDeviceLists }, - }); - } catch (e) { - console.log(`Error creating initial peer list: ${e.message}`); - } - }, [dispatch, identityContext, relativeUserIDs]); + const onCreateInitialPeerList = useCreateInitialPeerList(); const openBackupTestRestoreModal = React.useCallback( () => pushModal(<BackupTestRestoreModal onClose={popModal} />),