diff --git a/native/root.react.js b/native/root.react.js --- a/native/root.react.js +++ b/native/root.react.js @@ -24,6 +24,8 @@ import { ENSCacheProvider } from 'lib/components/ens-cache-provider.react.js'; import IntegrityHandler from 'lib/components/integrity-handler.react.js'; import { MediaCacheProvider } from 'lib/components/media-cache-provider.react.js'; +import { createTunnelbrokerSocket } from 'lib/shared/socket-utils.js'; +import { TunnelbrokerProvider } from 'lib/tunnelbroker/tunnelbroker-context.js'; import { actionLogger } from 'lib/utils/action-logger.js'; import { RegistrationContextProvider } from './account/registration/registration-context-provider.react.js'; @@ -64,6 +66,7 @@ import { DarkTheme, LightTheme } from './themes/navigation.js'; import ThemeHandler from './themes/theme-handler.react.js'; import { provider } from './utils/ethers-utils.js'; +import { useTunnelbrokerInitMessage } from './utils/tunnelbroker-utils.js'; // Add custom items to expo-dev-menu import './dev-menu.js'; @@ -236,6 +239,8 @@ return undefined; })(); + const tunnelbrokerInitMessage = useTunnelbrokerInitMessage(); + const gated: React.Node = ( <> @@ -273,51 +278,58 @@ return ( - - - - - - - - - - - - - - - - - - - {gated} - - - - - {navigation} - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + {gated} + + + + + {navigation} + + + + + + + + + + + + + + + + ); @@ -338,4 +350,5 @@ ); } + export default AppRoot; diff --git a/native/utils/tunnelbroker-utils.js b/native/utils/tunnelbroker-utils.js new file mode 100644 --- /dev/null +++ b/native/utils/tunnelbroker-utils.js @@ -0,0 +1,37 @@ +// @flow + +import React from 'react'; + +import type { ConnectionInitializationMessage } from 'lib/types/tunnelbroker/session-types.js'; +import { tunnelbrokerMessageTypes } from 'lib/types/tunnelbroker-messages.js'; + +import { getContentSigningKey } from './crypto-utils.js'; +import { useSelector } from '../redux/redux-utils.js'; + +function useTunnelbrokerInitMessage(): ?ConnectionInitializationMessage { + const [deviceID, setDeviceID] = React.useState(); + const userID = useSelector(state => state.currentUserInfo?.id); + const accessToken = useSelector(state => state.commServicesAccessToken); + + React.useEffect(() => { + (async () => { + const contentSigningKey = await getContentSigningKey(); + setDeviceID(contentSigningKey); + })(); + }, []); + + return React.useMemo(() => { + if (!deviceID || !accessToken || !userID) { + return null; + } + return ({ + type: tunnelbrokerMessageTypes.CONNECTION_INITIALIZATION_MESSAGE, + deviceID, + accessToken, + userID, + deviceType: 'mobile', + }: ConnectionInitializationMessage); + }, [accessToken, deviceID, userID]); +} + +export { useTunnelbrokerInitMessage };