From d88f1aa974218652c81ee18d088db238440880b5 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Mon, 30 Jun 2025 12:25:26 +0300 Subject: [PATCH] filter out subs after unsubscribe --- .../SubscribeProfileDialog.tsx | 64 +++++++++++++------ .../ActivityNotificationSettings.tsx | 4 +- src/state/queries/activity-subscriptions.ts | 4 +- 3 files changed, 49 insertions(+), 23 deletions(-) diff --git a/src/components/activity-notifications/SubscribeProfileDialog.tsx b/src/components/activity-notifications/SubscribeProfileDialog.tsx index 1818735cda..d1ab2842d0 100644 --- a/src/components/activity-notifications/SubscribeProfileDialog.tsx +++ b/src/components/activity-notifications/SubscribeProfileDialog.tsx @@ -2,12 +2,17 @@ import {useMemo, useState} from 'react' import {View} from 'react-native' import { type AppBskyNotificationDefs, + type AppBskyNotificationListActivitySubscriptions, type ModerationOpts, type Un$Typed, } from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {useMutation, useQueryClient} from '@tanstack/react-query' +import { + type InfiniteData, + useMutation, + useQueryClient, +} from '@tanstack/react-query' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {cleanError} from '#/lib/strings/errors' @@ -15,6 +20,7 @@ import {sanitizeHandle} from '#/lib/strings/handles' import {logger} from '#/logger' import {isWeb} from '#/platform/detection' import {updateProfileShadow} from '#/state/cache/profile-shadow' +import {RQKEY_getActivitySubscriptions} from '#/state/queries/activity-subscriptions' import {useAgent} from '#/state/session' import * as Toast from '#/view/com/util/Toast' import {platform, useTheme, web} from '#/alf' @@ -121,34 +127,54 @@ function DialogInner({ }) }, onSuccess: (_data, activitySubscription) => { - control.close(() => + control.close(() => { updateProfileShadow(queryClient, profile.did, { activitySubscription, - }), - ) - if (!activitySubscription.post && !activitySubscription.reply) { - logger.metric('activitySubscription:disable', {}) - Toast.show( - _( - msg`You will no longer receive notifications for ${sanitizeHandle(profile.handle, '@')}`, - ), - 'check', - ) - } else { - logger.metric('activitySubscription:enable', { - setting: activitySubscription.reply ? 'posts_and_replies' : 'posts', }) - if (!initialState.post && !initialState.reply) { + + if (!activitySubscription.post && !activitySubscription.reply) { + logger.metric('activitySubscription:disable', {}) Toast.show( _( - msg`You'll start receiving notifications for ${sanitizeHandle(profile.handle, '@')}!`, + msg`You will no longer receive notifications for ${sanitizeHandle(profile.handle, '@')}`, ), 'check', ) + + // filter out the subscription + queryClient.setQueryData( + RQKEY_getActivitySubscriptions, + ( + old?: InfiniteData, + ) => { + if (!old) return old + return { + ...old, + pages: old.pages.map(page => ({ + ...page, + subscriptions: page.subscriptions.filter( + item => item.did !== profile.did, + ), + })), + } + }, + ) } else { - Toast.show(_(msg`Changes saved`), 'check') + logger.metric('activitySubscription:enable', { + setting: activitySubscription.reply ? 'posts_and_replies' : 'posts', + }) + if (!initialState.post && !initialState.reply) { + Toast.show( + _( + msg`You'll start receiving notifications for ${sanitizeHandle(profile.handle, '@')}!`, + ), + 'check', + ) + } else { + Toast.show(_(msg`Changes saved`), 'check') + } } - } + }) }, onError: err => { logger.error('Could not save activity subscription', {message: err}) diff --git a/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx b/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx index eaf16971ed..c3c5cbc094 100644 --- a/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx +++ b/src/screens/Settings/NotificationSettings/ActivityNotificationSettings.tsx @@ -154,10 +154,10 @@ export function ActivityNotificationSettingsScreen({}: Props) { By default, only accounts you follow can receive alerts from you – this can be changed in{' '} - Settings → Privacy & Security + Settings → Privacy and Security . diff --git a/src/state/queries/activity-subscriptions.ts b/src/state/queries/activity-subscriptions.ts index 7db3df57b1..0af5cd753e 100644 --- a/src/state/queries/activity-subscriptions.ts +++ b/src/state/queries/activity-subscriptions.ts @@ -10,8 +10,8 @@ import { import {useAgent, useSession} from '#/state/session' import * as Toast from '#/view/com/util/Toast' -const RQKEY_getActivitySubscriptions = ['activity-subscriptions'] -const RQKEY_getNotificationDeclaration = ['notification-declaration'] +export const RQKEY_getActivitySubscriptions = ['activity-subscriptions'] +export const RQKEY_getNotificationDeclaration = ['notification-declaration'] export function useActivitySubscriptionsQuery() { const agent = useAgent()