diff --git a/native/account/registration/registration-context-provider.react.js b/native/account/registration/registration-context-provider.react.js --- a/native/account/registration/registration-context-provider.react.js +++ b/native/account/registration/registration-context-provider.react.js @@ -1,10 +1,16 @@ // @flow +import _isEmpty from 'lodash/fp/isEmpty.js'; import * as React from 'react'; +import { isLoggedIn } from 'lib/selectors/user-selectors.js'; + import { RegistrationContext } from './registration-context.js'; import { useRegistrationServerCall } from './registration-server-call.js'; import type { CachedUserSelections } from './registration-types.js'; +import { commCoreModule } from '../../native-modules.js'; +import { useSelector } from '../../redux/redux-utils.js'; +import Alert from '../../utils/alert.js'; const emptyObj: CachedUserSelections = Object.freeze({}); @@ -38,6 +44,40 @@ ], ); + const loggedIn = useSelector(isLoggedIn); + const clearCachedSelectionsPromise = React.useRef>(null); + + React.useEffect(() => { + if (clearCachedSelectionsPromise.current) { + return; + } + + if (_isEmpty(cachedSelections) || !loggedIn) { + return; + } + + clearCachedSelectionsPromise.current = (async () => { + try { + if (cachedSelections.siweBackupSecrets) { + await commCoreModule.setSIWEBackupSecrets( + cachedSelections.siweBackupSecrets, + ); + } + } catch (e) { + console.log(e); + if (__DEV__) { + Alert.alert( + 'Failed to persist SIWE backup secrets to SQLite.', + e.message, + ); + } + } finally { + setCachedSelections({}); + clearCachedSelectionsPromise.current = null; + } + })(); + }, [cachedSelections, loggedIn]); + return ( {props.children} diff --git a/native/account/registration/registration-types.js b/native/account/registration/registration-types.js --- a/native/account/registration/registration-types.js +++ b/native/account/registration/registration-types.js @@ -5,7 +5,7 @@ ClientAvatar, } from 'lib/types/avatar-types.js'; import type { NativeMediaSelection } from 'lib/types/media-types.js'; -import type { SIWEResult } from 'lib/types/siwe-types.js'; +import type { SIWEResult, SIWEBackupSecrets } from 'lib/types/siwe-types.js'; export type CoolOrNerdMode = 'cool' | 'nerd'; @@ -53,6 +53,7 @@ +avatarData?: ?AvatarData, +ethereumAccount?: EthereumAccountSelection, +farcasterID?: string, + +siweBackupSecrets?: ?SIWEBackupSecrets, }; export const ensAvatarSelection: AvatarData = { diff --git a/native/account/registration/siwe-backup-message-creation.react.js b/native/account/registration/siwe-backup-message-creation.react.js --- a/native/account/registration/siwe-backup-message-creation.react.js +++ b/native/account/registration/siwe-backup-message-creation.react.js @@ -1,6 +1,7 @@ // @flow import Icon from '@expo/vector-icons/MaterialIcons.js'; +import invariant from 'invariant'; import * as React from 'react'; import { View, Text } from 'react-native'; @@ -10,6 +11,7 @@ import RegistrationButton from './registration-button.react.js'; import RegistrationContainer from './registration-container.react.js'; import RegistrationContentContainer from './registration-content-container.react.js'; +import { RegistrationContext } from './registration-context.js'; import { type RegistrationNavigationProp } from './registration-navigator.react.js'; import type { CoolOrNerdMode, @@ -69,15 +71,23 @@ [panelState], ); + const registrationContext = React.useContext(RegistrationContext); + invariant(registrationContext, 'registrationContext should be set'); + const { setCachedSelections } = registrationContext; + const onSuccessfulWalletSignature = React.useCallback( (result: SIWEResult) => { - console.log(result); + const { message, signature } = result; + setCachedSelections(oldUserSelections => ({ + ...oldUserSelections, + siweBackupSecrets: { message, signature }, + })); navigate<'RegistrationTerms'>({ name: RegistrationTermsRouteName, params, }); }, - [navigate, params], + [navigate, params, setCachedSelections], ); let siwePanel;