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 { getCurrentUserFID } 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'; @@ -46,8 +46,11 @@ ); const userInfos = useSelector(state => state.userStore.userInfos); + const syncedMetadata = useSelector( + state => state.syncedMetadataStore.syncedMetadata, + ); - const fid = React.useContext(FIDContext)?.fid; + const fid = getCurrentUserFID(syncedMetadata); 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,12 @@ +// @flow + +import { + type SyncedMetadata, + syncedMetadataNames, +} from '../types/synced-metadata-types.js'; + +function getCurrentUserFID(syncedMetadata: SyncedMetadata): ?string { + return syncedMetadata[syncedMetadataNames.CURRENT_USER_FID] ?? null; +} + +export { getCurrentUserFID }; 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-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 { getCurrentUserFID } from 'lib/utils/farcaster-utils.js'; +import { useDispatch } from 'lib/utils/redux-utils.js'; import FarcasterPrompt from './farcaster-prompt.react.js'; import FarcasterWebView, { @@ -17,6 +20,7 @@ import BottomSheet from '../bottom-sheet/bottom-sheet.react.js'; import type { RootNavigationProp } from '../navigation/root-navigator.react.js'; import type { NavigationRoute } from '../navigation/route-names.js'; +import { useSelector } from '../redux/redux-utils.js'; const bottomSheetPaddingTop = 32; const farcasterPromptHeight = 350; @@ -31,14 +35,31 @@ function ConnectFarcasterBottomSheet(props: Props): React.Node { const { navigation } = props; + const dispatch = useDispatch(); + + const syncedMetadata = useSelector( + state => state.syncedMetadataStore.syncedMetadata, + ); + + const fid = getCurrentUserFID(syncedMetadata); + + 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 +107,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 { getCurrentUserFID } 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'; @@ -12,6 +17,7 @@ import FarcasterWebView from '../components/farcaster-web-view.react.js'; import type { FarcasterWebViewState } from '../components/farcaster-web-view.react.js'; import type { NavigationRoute } from '../navigation/route-names.js'; +import { useSelector } from '../redux/redux-utils.js'; import { useStyles } from '../themes/colors.js'; type Props = { @@ -21,16 +27,24 @@ // 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 syncedMetadata = useSelector( + state => state.syncedMetadataStore.syncedMetadata, + ); + + const fid = getCurrentUserFID(syncedMetadata); 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 +52,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(() => {