diff --git a/lib/components/farcaster-data-handler.react.js b/lib/components/farcaster-data-handler.react.js --- a/lib/components/farcaster-data-handler.react.js +++ b/lib/components/farcaster-data-handler.react.js @@ -6,7 +6,6 @@ updateRelationships as serverUpdateRelationships, updateRelationshipsActionTypes, } from '../actions/relationship-actions.js'; -import { FIDContext } from '../components/fid-provider.react.js'; import { NeynarClientContext } from '../components/neynar-client-provider.react.js'; import { cookieSelector } from '../selectors/keyserver-selectors.js'; import { isLoggedIn } from '../selectors/user-selectors.js'; @@ -14,6 +13,7 @@ import { relationshipActions } from '../types/relationship-types.js'; import { useLegacyAshoatKeyserverCall } from '../utils/action-utils.js'; import { authoritativeKeyserverID } from '../utils/authoritative-keyserver.js'; +import { useCurrentUserFID } from '../utils/farcaster-utils.js'; import { useDispatchActionPromise } from '../utils/redux-promise-utils.js'; import { useSelector } from '../utils/redux-utils.js'; import { usingCommServicesAccessToken } from '../utils/services-utils.js'; @@ -47,7 +47,7 @@ const userInfos = useSelector(state => state.userStore.userInfos); - const fid = React.useContext(FIDContext)?.fid; + const fid = useCurrentUserFID(); const prevCanQueryRef = React.useRef(); React.useEffect(() => { diff --git a/lib/utils/farcaster-utils.js b/lib/utils/farcaster-utils.js new file mode 100644 --- /dev/null +++ b/lib/utils/farcaster-utils.js @@ -0,0 +1,15 @@ +// @flow + +import { syncedMetadataNames } from '../types/synced-metadata-types.js'; +import { useSelector } from '../utils/redux-utils.js'; + +function useCurrentUserFID(): ?string { + return useSelector( + state => + state.syncedMetadataStore.syncedMetadata[ + syncedMetadataNames.CURRENT_USER_FID + ] ?? null, + ); +} + +export { useCurrentUserFID }; diff --git a/native/account/registration/registration-server-call.js b/native/account/registration/registration-server-call.js --- a/native/account/registration/registration-server-call.js +++ b/native/account/registration/registration-server-call.js @@ -1,17 +1,17 @@ // @flow -import invariant from 'invariant'; import * as React from 'react'; import { setDataLoadedActionType } from 'lib/actions/client-db-store-actions.js'; +import { setSyncedMetadataEntryActionType } from 'lib/actions/synced-metadata-actions.js'; import { keyserverRegisterActionTypes, keyserverRegister, useIdentityPasswordRegister, identityRegisterActionTypes, } from 'lib/actions/user-actions.js'; -import { FIDContext } from 'lib/components/fid-provider.react.js'; import type { LogInStartingPayload } from 'lib/types/account-types.js'; +import { syncedMetadataNames } from 'lib/types/synced-metadata-types.js'; import { useLegacyAshoatKeyserverCall } from 'lib/utils/action-utils.js'; import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js'; import { useDispatch } from 'lib/utils/redux-utils.js'; @@ -75,10 +75,6 @@ const callKeyserverRegister = useLegacyAshoatKeyserverCall(keyserverRegister); const callIdentityPasswordRegister = useIdentityPasswordRegister(); - const fidContext = React.useContext(FIDContext); - invariant(fidContext, 'FIDContext is missing'); - const { setFID } = fidContext; - const identityRegisterUsernameAccount = React.useCallback( async ( accountSelection: UsernameAccountSelection, @@ -248,7 +244,13 @@ type: setURLPrefix, payload: keyserverURL, }); - setFID(farcasterID); + dispatch({ + type: setSyncedMetadataEntryActionType, + payload: { + name: syncedMetadataNames.CURRENT_USER_FID, + data: farcasterID, + }, + }); setCurrentStep({ step: 'waiting_for_registration_call', avatarData, @@ -267,7 +269,6 @@ legacySiweServerCall, dispatch, identityWalletRegisterCall, - setFID, ], ); diff --git a/native/components/connect-farcaster-alert-handler.react.js b/native/components/connect-farcaster-alert-handler.react.js --- a/native/components/connect-farcaster-alert-handler.react.js +++ b/native/components/connect-farcaster-alert-handler.react.js @@ -4,13 +4,13 @@ import * as React from 'react'; import { recordAlertActionType } from 'lib/actions/alert-actions.js'; -import { FIDContext } from 'lib/components/fid-provider.react.js'; import { cookieSelector } from 'lib/selectors/keyserver-selectors.js'; import { alertTypes, type RecordAlertActionPayload, } from 'lib/types/alert-types.js'; import { authoritativeKeyserverID } from 'lib/utils/authoritative-keyserver.js'; +import { useCurrentUserFID } from 'lib/utils/farcaster-utils.js'; import { shouldSkipConnectFarcasterAlert } from 'lib/utils/push-alerts.js'; import { useDispatch } from 'lib/utils/redux-utils.js'; import sleep from 'lib/utils/sleep.js'; @@ -28,7 +28,7 @@ const hasUserCookie = !!(cookie && cookie.startsWith('user=')); const loggedIn = !!currentUserID && hasUserCookie; - const fid = React.useContext(FIDContext)?.fid; + const fid = useCurrentUserFID(); const connectFarcasterAlertInfo = useSelector( state => state.alertStore.alertInfos[alertTypes.CONNECT_FARCASTER], diff --git a/native/components/connect-farcaster-bottom-sheet.react.js b/native/components/connect-farcaster-bottom-sheet.react.js --- a/native/components/connect-farcaster-bottom-sheet.react.js +++ b/native/components/connect-farcaster-bottom-sheet.react.js @@ -5,8 +5,11 @@ import { View, StyleSheet } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; -import { FIDContext } from 'lib/components/fid-provider.react.js'; +import { setSyncedMetadataEntryActionType } from 'lib/actions/synced-metadata-actions.js'; import { useIsAppForegrounded } from 'lib/shared/lifecycle-utils.js'; +import { syncedMetadataNames } from 'lib/types/synced-metadata-types.js'; +import { useCurrentUserFID } from 'lib/utils/farcaster-utils.js'; +import { useDispatch } from 'lib/utils/redux-utils.js'; import FarcasterPrompt from './farcaster-prompt.react.js'; import FarcasterWebView, { @@ -31,14 +34,27 @@ function ConnectFarcasterBottomSheet(props: Props): React.Node { const { navigation } = props; + const dispatch = useDispatch(); + + const fid = useCurrentUserFID(); + + const onSuccess = React.useCallback( + (newFID: string) => { + dispatch({ + type: setSyncedMetadataEntryActionType, + payload: { + name: syncedMetadataNames.CURRENT_USER_FID, + data: newFID, + }, + }); + }, + [dispatch], + ); + const { goBack } = navigation; const bottomSheetRef = React.useRef(null); - const fidContext = React.useContext(FIDContext); - invariant(fidContext, 'fidContext is missing'); - const { fid, setFID } = fidContext; - const bottomSheetContext = React.useContext(BottomSheetContext); invariant(bottomSheetContext, 'bottomSheetContext should be set'); const { setContentHeight } = bottomSheetContext; @@ -86,10 +102,10 @@ variant={connectButtonVariant} /> - + ), - [connectButtonVariant, goBack, onPressConnect, setFID, webViewState], + [connectButtonVariant, goBack, onPressConnect, onSuccess, webViewState], ); return connectFarcasterBottomSheet; diff --git a/native/profile/farcaster-account-settings.react.js b/native/profile/farcaster-account-settings.react.js --- a/native/profile/farcaster-account-settings.react.js +++ b/native/profile/farcaster-account-settings.react.js @@ -1,10 +1,15 @@ // @flow -import invariant from 'invariant'; import * as React from 'react'; import { View } from 'react-native'; -import { FIDContext } from 'lib/components/fid-provider.react.js'; +import { + setSyncedMetadataEntryActionType, + clearSyncedMetadataEntryActionType, +} from 'lib/actions/synced-metadata-actions.js'; +import { syncedMetadataNames } from 'lib/types/synced-metadata-types.js'; +import { useCurrentUserFID } from 'lib/utils/farcaster-utils.js'; +import { useDispatch } from 'lib/utils/redux-utils.js'; import type { ProfileNavigationProp } from './profile.react.js'; import RegistrationButton from '../account/registration/registration-button.react.js'; @@ -21,16 +26,20 @@ // eslint-disable-next-line no-unused-vars function FarcasterAccountSettings(props: Props): React.Node { - const fidContext = React.useContext(FIDContext); - invariant(fidContext, 'FIDContext is missing'); + const dispatch = useDispatch(); - const { fid, setFID } = fidContext; + const fid = useCurrentUserFID(); const styles = useStyles(unboundStyles); const onPressDisconnect = React.useCallback(() => { - setFID(null); - }, [setFID]); + dispatch({ + type: clearSyncedMetadataEntryActionType, + payload: { + name: syncedMetadataNames.CURRENT_USER_FID, + }, + }); + }, [dispatch]); const [webViewState, setWebViewState] = React.useState('closed'); @@ -38,9 +47,15 @@ const onSuccess = React.useCallback( (newFID: string) => { setWebViewState('closed'); - setFID(newFID); + dispatch({ + type: setSyncedMetadataEntryActionType, + payload: { + name: syncedMetadataNames.CURRENT_USER_FID, + data: newFID, + }, + }); }, - [setFID], + [dispatch], ); const onPressConnectFarcaster = React.useCallback(() => {