From d51be0cd90614cd8e54c81c2b5fc14ab4c14d46e Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Tue, 1 Jul 2025 08:07:11 +0300 Subject: [PATCH] shadow activity subs list --- .../ActivityNotificationSettings.tsx | 4 ++- src/state/cache/profile-shadow.ts | 6 ++-- src/state/queries/activity-subscriptions.ts | 31 ++++++++++++++++- src/state/queries/list-members.ts | 33 ++++++++----------- 4 files changed, 51 insertions(+), 23 deletions(-) diff --git a/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx b/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx index 7720efde0f..a68e5bf3cb 100644 --- a/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx +++ b/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx @@ -11,6 +11,7 @@ import { } 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' @@ -193,12 +194,13 @@ function keyExtractor(item: bsky.profile.AnyProfileView) { } function ActivitySubscriptionCard({ - profile, + profile: profileUnshadowed, moderationOpts, }: { profile: bsky.profile.AnyProfileView moderationOpts: ModerationOpts }) { + const profile = useProfileShadow(profileUnshadowed) const control = useDialogControl() const {_} = useLingui() const t = useTheme() diff --git a/src/state/cache/profile-shadow.ts b/src/state/cache/profile-shadow.ts index 77c7aea62c..1489e65fd9 100644 --- a/src/state/cache/profile-shadow.ts +++ b/src/state/cache/profile-shadow.ts @@ -4,6 +4,7 @@ import {type QueryClient} from '@tanstack/react-query' import EventEmitter from 'eventemitter3' import {batchedUpdates} from '#/lib/batchedUpdates' +import {findAllProfilesInQueryData as findAllProfilesInActivitySubscriptionsQueryData} from '#/state/queries/activity-subscriptions' import {findAllProfilesInQueryData as findAllProfilesInActorSearchQueryData} from '#/state/queries/actor-search' import {findAllProfilesInQueryData as findAllProfilesInExploreFeedPreviewsQueryData} from '#/state/queries/explore-feed-previews' import {findAllProfilesInQueryData as findAllProfilesInKnownFollowersQueryData} from '#/state/queries/known-followers' @@ -115,8 +116,8 @@ export function updateProfileShadow( value: Partial, ) { const cachedProfiles = findProfilesInCache(queryClient, did) - for (let post of cachedProfiles) { - shadows.set(post, {...shadows.get(post), ...value}) + for (let profile of cachedProfiles) { + shadows.set(profile, {...shadows.get(profile), ...value}) } batchedUpdates(() => { emitter.emit(did, value) @@ -176,4 +177,5 @@ function* findProfilesInCache( yield* findAllProfilesInPostThreadV2QueryData(queryClient, did) yield* findAllProfilesInKnownFollowersQueryData(queryClient, did) yield* findAllProfilesInExploreFeedPreviewsQueryData(queryClient, did) + yield* findAllProfilesInActivitySubscriptionsQueryData(queryClient, did) } diff --git a/src/state/queries/activity-subscriptions.ts b/src/state/queries/activity-subscriptions.ts index 0af5cd753e..a81a672265 100644 --- a/src/state/queries/activity-subscriptions.ts +++ b/src/state/queries/activity-subscriptions.ts @@ -1,6 +1,12 @@ -import {type AppBskyNotificationDeclaration} from '@atproto/api' +import { + type AppBskyActorDefs, + type AppBskyNotificationDeclaration, + type AppBskyNotificationListActivitySubscriptions, +} from '@atproto/api' import {t} from '@lingui/macro' import { + type InfiniteData, + type QueryClient, useInfiniteQuery, useMutation, useQuery, @@ -99,3 +105,26 @@ export function useNotificationDeclarationMutation() { }, }) } + +export function* findAllProfilesInQueryData( + queryClient: QueryClient, + did: string, +): Generator { + const queryDatas = queryClient.getQueriesData< + InfiniteData + >({ + queryKey: RQKEY_getActivitySubscriptions, + }) + for (const [_queryKey, queryData] of queryDatas) { + if (!queryData?.pages) { + continue + } + for (const page of queryData.pages) { + for (const subscription of page.subscriptions) { + if (subscription.did === did) { + yield subscription + } + } + } + } +} diff --git a/src/state/queries/list-members.ts b/src/state/queries/list-members.ts index 82c3955187..152c7a5be8 100644 --- a/src/state/queries/list-members.ts +++ b/src/state/queries/list-members.ts @@ -1,13 +1,13 @@ import { - AppBskyActorDefs, - AppBskyGraphDefs, - AppBskyGraphGetList, - BskyAgent, + type AppBskyActorDefs, + type AppBskyGraphDefs, + type AppBskyGraphGetList, + type BskyAgent, } from '@atproto/api' import { - InfiniteData, - QueryClient, - QueryKey, + type InfiniteData, + type QueryClient, + type QueryKey, useInfiniteQuery, useQuery, } from '@tanstack/react-query' @@ -100,21 +100,16 @@ export function* findAllProfilesInQueryData( queryKey: [RQKEY_ROOT], }) for (const [_queryKey, queryData] of queryDatas) { - if (!queryData) { + if (!queryData?.pages) { continue } - for (const [_queryKey, queryData] of queryDatas) { - if (!queryData?.pages) { - continue + for (const page of queryData?.pages) { + if (page.list.creator.did === did) { + yield page.list.creator } - for (const page of queryData?.pages) { - if (page.list.creator.did === did) { - yield page.list.creator - } - for (const item of page.items) { - if (item.subject.did === did) { - yield item.subject - } + for (const item of page.items) { + if (item.subject.did === did) { + yield item.subject } } }