diff --git a/native/components/community-joiner-modal.react.js b/native/components/community-joiner-modal.react.js new file mode 100644 --- /dev/null +++ b/native/components/community-joiner-modal.react.js @@ -0,0 +1,134 @@ +// @flow + +import invariant from 'invariant'; +import * as React from 'react'; +import { View, Text } from 'react-native'; + +import { + fetchAllCommunityInfosWithNames, + fetchAllCommunityInfosWithNamesActionTypes, +} from 'lib/actions/community-actions.js'; +import { useLegacyAshoatKeyserverCall } from 'lib/keyserver-conn/legacy-keyserver-call.js'; +import { useThreadSearchIndex } from 'lib/selectors/nav-selectors.js'; +import { threadInfoFromRawThreadInfo } from 'lib/shared/thread-utils.js'; +import type { ClientCommunityInfoWithCommunityName } from 'lib/types/community-types.js'; +import { useDispatchActionPromise } from 'lib/utils/redux-promise-utils.js'; + +import Modal from './modal.react.js'; +import ThreadList from '../components/thread-list.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'; +import { useStyles } from '../themes/colors.js'; +import Alert from '../utils/alert.js'; + +type Props = { + +navigation: RootNavigationProp<'CommunityJoinerModal'>, + +route: NavigationRoute<'CommunityJoinerModal'>, +}; + +// eslint-disable-next-line no-unused-vars +function CommunityJoinerModal(props: Props): React.Node { + const dispatchActionPromise = useDispatchActionPromise(); + const [communities, setCommunities] = React.useState< + Set, + >(() => new Set()); + const viewerID = useSelector( + state => state.currentUserInfo && state.currentUserInfo.id, + ); + const userInfos = useSelector(state => state.userStore.userInfos); + const fetchPromise = useLegacyAshoatKeyserverCall( + fetchAllCommunityInfosWithNames, + ); + const styles = useStyles(unboundStyles); + + React.useEffect(() => { + const fetchCommunityThreads = async () => { + void dispatchActionPromise( + fetchAllCommunityInfosWithNamesActionTypes, + fetchPromise(), + ); + const response = await fetchPromise(); + const communityInfos = new Set(response.allCommunityInfosWithNames); + setCommunities(communityInfos); + }; + + void fetchCommunityThreads(); + }, [dispatchActionPromise, viewerID, userInfos, fetchPromise]); + + const threadPicked = React.useCallback( + (threadID: string) => { + const selectedCommunity = [...communities].find( + community => + community.threadInfo && community.threadInfo.id === threadID, + ); + invariant(selectedCommunity, 'selectedCommunity should be set'); + + Alert.alert( + 'Community Selected', + `Community Name: ${ + selectedCommunity.communityName + }\nFarcaster Channel ID: ${ + selectedCommunity.farcasterChannelID ?? 'N/A' + }`, + ); + }, + [communities], + ); + + const threadInfos = React.useMemo( + () => + [...communities] + .map(community => + community.threadInfo + ? threadInfoFromRawThreadInfo( + community.threadInfo, + viewerID, + userInfos, + ) + : null, + ) + .filter(Boolean), + [communities, viewerID, userInfos], + ); + + const index = useThreadSearchIndex(threadInfos); + + return ( + + + + It looks like you're not part of many communities right now. + Explore some of the popular communities on Comm below! + + + + + ); +} + +const unboundStyles = { + headerContainer: { + padding: 10, + paddingBottom: 0, + marginBottom: 16, + }, + headerText: { + color: 'modalForegroundLabel', + fontSize: 16, + marginBottom: 8, + textAlign: 'center', + }, + threadListItem: { + paddingLeft: 10, + paddingRight: 10, + paddingVertical: 2, + }, +}; + +export default CommunityJoinerModal; diff --git a/native/navigation/root-navigator.react.js b/native/navigation/root-navigator.react.js --- a/native/navigation/root-navigator.react.js +++ b/native/navigation/root-navigator.react.js @@ -57,6 +57,7 @@ CreateMissingSIWEBackupMessageRouteName, RestoreSIWEBackupRouteName, LinkedDevicesBottomSheetRouteName, + CommunityJoinerModalRouteName, } from './route-names.js'; import LoggedOutModal from '../account/logged-out-modal.react.js'; import CreateMissingSIWEBackupMessage from '../account/registration/missing-registration-data/missing-siwe-backup-message.react.js'; @@ -73,6 +74,7 @@ import SubchannelsListModal from '../chat/subchannels-list-modal.react.js'; import CommunityCreationNavigator from '../community-creation/community-creation-navigator.react.js'; import TagFarcasterChannelNavigator from '../community-settings/tag-farcaster-channel/tag-farcaster-channel-navigator.react.js'; +import CommunityJoinerModal from '../components/community-joiner-modal.react.js'; import ConnectFarcasterBottomSheet from '../components/connect-farcaster-bottom-sheet.react.js'; import InviteLinksNavigator from '../invite-links/invite-links-navigator.react.js'; import CustomServerModal from '../profile/custom-server-modal.react.js'; @@ -304,6 +306,11 @@ component={ConnectFarcasterBottomSheet} options={modalOverlayScreenOptions} /> +