import {useCallback, useMemo, useState} from 'react' import {type StyleProp, View, type ViewStyle} from 'react-native' import {type AppBskyActorDefs as ActorDefs} from '@atproto/api' import {Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useFocusEffect} from '@react-navigation/native' import {type NativeStackScreenProps} from '@react-navigation/native-stack' import {type CommonNavigatorParams} from '#/lib/routes/types' import {cleanError} from '#/lib/strings/errors' import {logger} from '#/logger' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useMyMutedAccountsQuery} from '#/state/queries/my-muted-accounts' import {useSetMinimalShellMode} from '#/state/shell' import {ErrorScreen} from '#/view/com/util/error/ErrorScreen' import {List} from '#/view/com/util/List' import {atoms as a, useTheme} from '#/alf' import * as Layout from '#/components/Layout' import {ListFooter} from '#/components/Lists' import * as ProfileCard from '#/components/ProfileCard' import {Text} from '#/components/Typography' type Props = NativeStackScreenProps< CommonNavigatorParams, 'ModerationMutedAccounts' > export function ModerationMutedAccounts({}: Props) { const t = useTheme() const moderationOpts = useModerationOpts() const {_} = useLingui() const setMinimalShellMode = useSetMinimalShellMode() const [isPTRing, setIsPTRing] = useState(false) const { data, isFetching, isError, error, refetch, hasNextPage, fetchNextPage, isFetchingNextPage, } = useMyMutedAccountsQuery() const isEmpty = !isFetching && !data?.pages[0]?.mutes.length const profiles = useMemo(() => { if (data?.pages) { return data.pages.flatMap(page => page.mutes) } return [] }, [data]) useFocusEffect( useCallback(() => { setMinimalShellMode(false) }, [setMinimalShellMode]), ) const onRefresh = useCallback(async () => { setIsPTRing(true) try { await refetch() } catch (err) { logger.error('Failed to refresh my muted accounts', {message: err}) } setIsPTRing(false) }, [refetch, setIsPTRing]) const onEndReached = useCallback(async () => { if (isFetching || !hasNextPage || isError) return try { await fetchNextPage() } catch (err) { logger.error('Failed to load more of my muted accounts', {message: err}) } }, [isFetching, hasNextPage, isError, fetchNextPage]) const renderItem = ({ item, index, }: { item: ActorDefs.ProfileView index: number }) => { if (!moderationOpts) return null return ( ) } return ( Muted Accounts {isEmpty ? ( {isError ? ( ) : ( )} ) : ( item.did} refreshing={isPTRing} onRefresh={onRefresh} onEndReached={onEndReached} renderItem={renderItem} initialNumToRender={15} // FIXME(dan) ListHeaderComponent={Info} ListFooterComponent={ } /> )} ) } function Empty() { const t = useTheme() return ( You have not muted any accounts yet. To mute an account, go to their profile and select "Mute account" from the menu on their account. ) } function Info({style}: {style?: StyleProp}) { const t = useTheme() return ( Muted accounts have their posts removed from your feed and from your notifications. Mutes are completely private. ) }