import React from 'react' import {Pressable, ScrollView, StyleSheet, View} from 'react-native' import {AppBskyActorDefs, moderateProfile} from '@atproto/api' import { FontAwesomeIcon, FontAwesomeIconStyle, } from '@fortawesome/react-native-fontawesome' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useProfileShadow} from '#/state/cache/profile-shadow' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useProfileFollowMutationQueue} from '#/state/queries/profile' import {useSuggestedFollowsByActorQuery} from '#/state/queries/suggested-follows' import {useAnalytics} from 'lib/analytics/analytics' import {usePalette} from 'lib/hooks/usePalette' import {makeProfileLink} from 'lib/routes/links' import {sanitizeDisplayName} from 'lib/strings/display-names' import {sanitizeHandle} from 'lib/strings/handles' import {isWeb} from 'platform/detection' import {Button} from 'view/com/util/forms/Button' import {Link} from 'view/com/util/Link' import {Text} from 'view/com/util/text/Text' import {PreviewableUserAvatar} from 'view/com/util/UserAvatar' import * as Toast from '../util/Toast' const OUTER_PADDING = 10 const INNER_PADDING = 14 const TOTAL_HEIGHT = 250 export function ProfileHeaderSuggestedFollows({ actorDid, requestDismiss, }: { actorDid: string requestDismiss: () => void }) { const pal = usePalette('default') const {isLoading, data} = useSuggestedFollowsByActorQuery({ did: actorDid, }) return ( Suggested for you {isLoading ? ( <> ) : data ? ( data.suggestions .filter(s => (s.associated?.labeler ? false : true)) .map(profile => ( )) ) : ( )} ) } function SuggestedFollowSkeleton() { const pal = usePalette('default') return ( ) } function SuggestedFollow({ profile: profileUnshadowed, }: { profile: AppBskyActorDefs.ProfileView }) { const {track} = useAnalytics() const pal = usePalette('default') const {_} = useLingui() const moderationOpts = useModerationOpts() const profile = useProfileShadow(profileUnshadowed) const [queueFollow, queueUnfollow] = useProfileFollowMutationQueue( profile, 'ProfileHeaderSuggestedFollows', ) const onPressFollow = React.useCallback(async () => { try { track('ProfileHeader:SuggestedFollowFollowed') await queueFollow() } catch (e: any) { if (e?.name !== 'AbortError') { Toast.show(_(msg`An issue occurred, please try again.`)) } } }, [queueFollow, track, _]) const onPressUnfollow = React.useCallback(async () => { try { await queueUnfollow() } catch (e: any) { if (e?.name !== 'AbortError') { Toast.show(_(msg`An issue occurred, please try again.`)) } } }, [queueUnfollow, _]) if (!moderationOpts) { return null } const moderation = moderateProfile(profile, moderationOpts) const following = profile.viewer?.following return ( {sanitizeDisplayName( profile.displayName || sanitizeHandle(profile.handle), moderation.ui('displayName'), )} {sanitizeHandle(profile.handle, '@')}