import React from 'react' import {View} from 'react-native' import {AppBskyActorDefs} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useAnalytics} from '#/lib/analytics/analytics' import {logEvent} from '#/lib/statsig/statsig' import {capitalize} from '#/lib/strings/capitalize' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useProfilesQuery} from '#/state/queries/profile' import { DescriptionText, OnboardingControls, TitleText, } from '#/screens/Onboarding/Layout' import {Context} from '#/screens/Onboarding/state' import { SuggestedAccountCard, SuggestedAccountCardPlaceholder, } from '#/screens/Onboarding/StepSuggestedAccounts/SuggestedAccountCard' import {aggregateInterestItems} from '#/screens/Onboarding/util' import {atoms as a, useBreakpoints} from '#/alf' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import * as Toggle from '#/components/forms/Toggle' import {IconCircle} from '#/components/IconCircle' import {At_Stroke2_Corner0_Rounded as At} from '#/components/icons/At' import {PlusLarge_Stroke2_Corner0_Rounded as Plus} from '#/components/icons/Plus' import {Loader} from '#/components/Loader' import {Text} from '#/components/Typography' export function Inner({ profiles, onSelect, moderationOpts, }: { profiles: AppBskyActorDefs.ProfileViewDetailed[] onSelect: (dids: string[]) => void moderationOpts: ReturnType }) { const {_} = useLingui() const [dids, setDids] = React.useState(profiles.map(p => p.did)) React.useEffect(() => { onSelect(dids) }, [dids, onSelect]) return ( {profiles.map(profile => ( ))} ) } export function StepSuggestedAccounts() { const {_} = useLingui() const {gtMobile} = useBreakpoints() const {track} = useAnalytics() const {state, dispatch, interestsDisplayNames} = React.useContext(Context) const suggestedDids = React.useMemo(() => { return aggregateInterestItems( state.interestsStepResults.selectedInterests, state.interestsStepResults.apiResponse.suggestedAccountDids, state.interestsStepResults.apiResponse.suggestedAccountDids.default || [], ) }, [state.interestsStepResults]) const moderationOpts = useModerationOpts() const { isLoading: isProfilesLoading, isError, data, error, } = useProfilesQuery({ handles: suggestedDids, }) const [dids, setDids] = React.useState([]) const [saving, setSaving] = React.useState(false) const interestsText = React.useMemo(() => { const i = state.interestsStepResults.selectedInterests.map( i => interestsDisplayNames[i] || capitalize(i), ) return i.join(', ') }, [state.interestsStepResults.selectedInterests, interestsDisplayNames]) const handleContinue = React.useCallback(async () => { setSaving(true) if (dids.length) { dispatch({type: 'setSuggestedAccountsStepResults', accountDids: dids}) } setSaving(false) dispatch({type: 'next'}) track('OnboardingV2:StepSuggestedAccounts:End', { selectedAccountsLength: dids.length, }) logEvent('onboarding:suggestedAccounts:nextPressed', { selectedAccountsLength: dids.length, skipped: false, }) }, [dids, setSaving, dispatch, track]) const handleSkip = React.useCallback(() => { // if a user comes back and clicks skip, erase follows dispatch({type: 'setSuggestedAccountsStepResults', accountDids: []}) dispatch({type: 'next'}) logEvent('onboarding:suggestedAccounts:nextPressed', { selectedAccountsLength: 0, skipped: true, }) }, [dispatch]) const isLoading = isProfilesLoading && moderationOpts React.useEffect(() => { track('OnboardingV2:StepSuggestedAccounts:Start') }, [track]) return ( Here are some accounts for you to follow {state.interestsStepResults.selectedInterests.length ? ( Based on your interest in {interestsText} ) : ( These are popular accounts you might like: )} {isLoading ? ( {Array(10) .fill(0) .map((_, i) => ( ))} ) : isError || !data ? ( {error?.toString()} ) : ( )} ) }