import {Keyboard, View} from 'react-native' import { type AppBskyActorDefs, type AppBskyFeedDefs, moderateFeedGenerator, moderateProfile, type ModerationOpts, type ModerationUI, } from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {DISCOVER_FEED_URI, STARTER_PACK_MAX_SIZE} from '#/lib/constants' import {sanitizeDisplayName} from '#/lib/strings/display-names' import {sanitizeHandle} from '#/lib/strings/handles' import {useSession} from '#/state/session' import {UserAvatar} from '#/view/com/util/UserAvatar' import { type WizardAction, type WizardState, } from '#/screens/StarterPack/Wizard/State' import {atoms as a, useTheme} from '#/alf' import {Button, ButtonText} from '#/components/Button' import * as Toggle from '#/components/forms/Toggle' import {Checkbox} from '#/components/forms/Toggle' import {Text} from '#/components/Typography' import type * as bsky from '#/types/bsky' function WizardListCard({ type, btnType, displayName, subtitle, onPress, avatar, included, disabled, moderationUi, }: { type: 'user' | 'algo' btnType: 'checkbox' | 'remove' profile?: AppBskyActorDefs.ProfileViewBasic feed?: AppBskyFeedDefs.GeneratorView displayName: string subtitle: string onPress: () => void avatar?: string included?: boolean disabled?: boolean moderationUi: ModerationUI }) { const t = useTheme() const {_} = useLingui() return ( {displayName} {subtitle} {btnType === 'checkbox' ? ( ) : !disabled ? ( ) : null} ) } export function WizardProfileCard({ btnType, state, dispatch, profile, moderationOpts, }: { btnType: 'checkbox' | 'remove' state: WizardState dispatch: (action: WizardAction) => void profile: bsky.profile.AnyProfileView moderationOpts: ModerationOpts }) { const {currentAccount} = useSession() const isMe = profile.did === currentAccount?.did const included = isMe || state.profiles.some(p => p.did === profile.did) const disabled = isMe || (!included && state.profiles.length >= STARTER_PACK_MAX_SIZE - 1) const moderationUi = moderateProfile(profile, moderationOpts).ui('avatar') const displayName = profile.displayName ? sanitizeDisplayName(profile.displayName) : `@${sanitizeHandle(profile.handle)}` const onPress = () => { if (disabled) return Keyboard.dismiss() if (profile.did === currentAccount?.did) return if (!included) { dispatch({type: 'AddProfile', profile}) } else { dispatch({type: 'RemoveProfile', profileDid: profile.did}) } } return ( ) } export function WizardFeedCard({ btnType, generator, state, dispatch, moderationOpts, }: { btnType: 'checkbox' | 'remove' generator: AppBskyFeedDefs.GeneratorView state: WizardState dispatch: (action: WizardAction) => void moderationOpts: ModerationOpts }) { const isDiscover = generator.uri === DISCOVER_FEED_URI const included = isDiscover || state.feeds.some(f => f.uri === generator.uri) const disabled = isDiscover || (!included && state.feeds.length >= 3) const moderationUi = moderateFeedGenerator(generator, moderationOpts).ui( 'avatar', ) const onPress = () => { if (disabled) return Keyboard.dismiss() if (included) { dispatch({type: 'RemoveFeed', feedUri: generator.uri}) } else { dispatch({type: 'AddFeed', feed: generator}) } } return ( ) }