import {useCallback, useMemo} from 'react' import {type ListRenderItemInfo, Text as RNText, View} from 'react-native' import {type ModerationOpts} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import { type AllNavigatorParams, type NativeStackScreenProps, } from '#/lib/routes/types' import {cleanError} from '#/lib/strings/errors' import {logger} from '#/logger' import {useProfileShadow} from '#/state/cache/profile-shadow' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useActivitySubscriptionsQuery} from '#/state/queries/activity-subscriptions' import {useNotificationSettingsQuery} from '#/state/queries/notifications/settings' import {List} from '#/view/com/util/List' import {atoms as a, useTheme} from '#/alf' import {SubscribeProfileDialog} from '#/components/activity-notifications/SubscribeProfileDialog' import * as Admonition from '#/components/Admonition' import {Button, ButtonText} from '#/components/Button' import {useDialogControl} from '#/components/Dialog' import {BellRinging_Filled_Corner0_Rounded as BellRingingFilledIcon} from '#/components/icons/BellRinging' import {BellRinging_Stroke2_Corner0_Rounded as BellRingingIcon} from '#/components/icons/BellRinging' import * as Layout from '#/components/Layout' import {InlineLinkText} from '#/components/Link' import {ListFooter} from '#/components/Lists' import {Loader} from '#/components/Loader' import * as ProfileCard from '#/components/ProfileCard' import {Text} from '#/components/Typography' import type * as bsky from '#/types/bsky' import * as SettingsList from '../components/SettingsList' import {ItemTextWithSubtitle} from './components/ItemTextWithSubtitle' import {PreferenceControls} from './components/PreferenceControls' type Props = NativeStackScreenProps< AllNavigatorParams, 'ActivityNotificationSettings' > export function ActivityNotificationSettingsScreen({}: Props) { const t = useTheme() const {_} = useLingui() const {data: preferences, isError} = useNotificationSettingsQuery() const moderationOpts = useModerationOpts() const { data: subscriptions, isPending, error, isFetchingNextPage, fetchNextPage, hasNextPage, } = useActivitySubscriptionsQuery() const items = useMemo(() => { if (!subscriptions) return [] return subscriptions?.pages.flatMap(page => page.subscriptions) }, [subscriptions]) const renderItem = useCallback( ({item}: ListRenderItemInfo) => { if (!moderationOpts) return null return ( ) }, [moderationOpts], ) const onEndReached = useCallback(async () => { if (isFetchingNextPage || !hasNextPage || isError) return try { await fetchNextPage() } catch (err) { logger.error('Failed to load more likes', {message: err}) } }, [isFetchingNextPage, hasNextPage, isError, fetchNextPage]) return ( Notifications Activity from others} subtitleText={ Get notified about posts and replies from accounts you choose. } /> {isError ? ( Failed to load notification settings. ) : ( )} } data={items} keyExtractor={keyExtractor} renderItem={renderItem} onEndReached={onEndReached} onEndReachedThreshold={4} ListEmptyComponent={ error ? null : ( {!isPending ? ( Enable notifications for an account by visiting their profile and pressing the{' '} bell icon {' '} . If you want to restrict who can receive notifications for your account's activity, you can change this in{' '} Settings → Privacy and Security . ) : ( )} ) } ListFooterComponent={ } windowSize={11} /> ) } function keyExtractor(item: bsky.profile.AnyProfileView) { return item.did } function ActivitySubscriptionCard({ profile: profileUnshadowed, moderationOpts, }: { profile: bsky.profile.AnyProfileView moderationOpts: ModerationOpts }) { const profile = useProfileShadow(profileUnshadowed) const control = useDialogControl() const {_} = useLingui() const t = useTheme() const preview = useMemo(() => { const actSub = profile.viewer?.activitySubscription if (actSub?.post && actSub?.reply) { return _(msg`Posts, Replies`) } else if (actSub?.post) { return _(msg`Posts`) } else if (actSub?.reply) { return _(msg`Replies`) } return _(msg`None`) }, [_, profile.viewer?.activitySubscription]) return ( {preview} ) }