import React from 'react' import {ActivityIndicator, FlatList, StyleSheet, View} from 'react-native' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {AppBskyActorDefs, moderateProfile} from '@atproto/api' import {TabletOrDesktop, Mobile} from 'view/com/util/layouts/Breakpoints' import {Text} from 'view/com/util/text/Text' import {ViewHeader} from 'view/com/util/ViewHeader' import {TitleColumnLayout} from 'view/com/util/layouts/TitleColumnLayout' import {Button} from 'view/com/util/forms/Button' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {usePalette} from 'lib/hooks/usePalette' import {RecommendedFollowsItem} from './RecommendedFollowsItem' import {useSuggestedFollowsQuery} from '#/state/queries/suggested-follows' import {useGetSuggestedFollowersByActor} from '#/state/queries/suggested-follows' import {useModerationOpts} from '#/state/queries/preferences' import {logger} from '#/logger' import {Trans, msg} from '@lingui/macro' import {useLingui} from '@lingui/react' type Props = { next: () => void } export function RecommendedFollows({next}: Props) { const pal = usePalette('default') const {_} = useLingui() const {isTabletOrMobile} = useWebMediaQueries() const {data: suggestedFollows} = useSuggestedFollowsQuery() const getSuggestedFollowsByActor = useGetSuggestedFollowersByActor() const [additionalSuggestions, setAdditionalSuggestions] = React.useState<{ [did: string]: AppBskyActorDefs.ProfileView[] }>({}) const existingDids = React.useRef([]) const moderationOpts = useModerationOpts() const title = ( <> Follow some Recommended Users Follow some users to get started. We can recommend you more users based on who you find interesting. ) const suggestions = React.useMemo(() => { if (!suggestedFollows) return [] const additional = Object.entries(additionalSuggestions) const items = suggestedFollows.pages.flatMap(page => page.actors) outer: while (additional.length) { const additionalAccount = additional.shift() if (!additionalAccount) break const [followedUser, relatedAccounts] = additionalAccount for (let i = 0; i < items.length; i++) { if (items[i].did === followedUser) { items.splice(i + 1, 0, ...relatedAccounts) continue outer } } } existingDids.current = items.map(i => i.did) return items }, [suggestedFollows, additionalSuggestions]) const onFollowStateChange = React.useCallback( async ({following, did}: {following: boolean; did: string}) => { if (following) { try { const {suggestions: results} = await getSuggestedFollowsByActor(did) if (results.length) { const deduped = results.filter( r => !existingDids.current.find(did => did === r.did), ) setAdditionalSuggestions(s => ({ ...s, [did]: deduped.slice(0, 3), })) } } catch (e) { logger.error('RecommendedFollows: failed to get suggestions', { message: e, }) } } // not handling the unfollow case }, [existingDids, getSuggestedFollowsByActor, setAdditionalSuggestions], ) return ( <> {!suggestedFollows || !moderationOpts ? ( ) : ( ( )} keyExtractor={item => item.did} style={{flex: 1}} /> )} Check out some recommended users. Follow them to see similar users. {!suggestedFollows || !moderationOpts ? ( ) : ( ( )} keyExtractor={item => item.did} style={{flex: 1}} /> )}