diff --git a/modules/BlueskyNSE/NotificationService.swift b/modules/BlueskyNSE/NotificationService.swift index c6f391e007..e6aca99c1c 100644 --- a/modules/BlueskyNSE/NotificationService.swift +++ b/modules/BlueskyNSE/NotificationService.swift @@ -6,7 +6,7 @@ class NotificationService: UNNotificationServiceExtension { var prefs = UserDefaults(suiteName: APP_GROUP) override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { - guard var bestAttempt = createCopy(request.content), + guard let bestAttempt = createCopy(request.content), let reason = request.content.userInfo["reason"] as? String else { contentHandler(request.content) @@ -15,11 +15,10 @@ class NotificationService: UNNotificationServiceExtension { if reason == "chat-message" { mutateWithChatMessage(bestAttempt) + } else { + mutateWithBadge(bestAttempt) } - // The badge should always be incremented when in the background - mutateWithBadge(bestAttempt) - contentHandler(bestAttempt) } diff --git a/modules/expo-background-notification-handler/android/src/main/java/expo/modules/backgroundnotificationhandler/BackgroundNotificationHandler.kt b/modules/expo-background-notification-handler/android/src/main/java/expo/modules/backgroundnotificationhandler/BackgroundNotificationHandler.kt index 344508523d..0a8737b88f 100644 --- a/modules/expo-background-notification-handler/android/src/main/java/expo/modules/backgroundnotificationhandler/BackgroundNotificationHandler.kt +++ b/modules/expo-background-notification-handler/android/src/main/java/expo/modules/backgroundnotificationhandler/BackgroundNotificationHandler.kt @@ -35,5 +35,8 @@ class BackgroundNotificationHandler( remoteMessage.data["sound"] = null } } + + // TODO - Remove this once we have more backend capability + remoteMessage.data["badge"] = null } } diff --git a/src/lib/hooks/useNotificationHandler.ts b/src/lib/hooks/useNotificationHandler.ts index 3f1cd439d7..f3c4da7f63 100644 --- a/src/lib/hooks/useNotificationHandler.ts +++ b/src/lib/hooks/useNotificationHandler.ts @@ -46,8 +46,9 @@ const DEFAULT_HANDLER_OPTIONS = { shouldSetBadge: true, } -// This needs to stay outside the hook to persist between account switches +// These need to stay outside the hook to persist between account switches let storedPayload: NotificationPayload | undefined +let prevDate = 0 export function useNotificationsHandler() { const queryClient = useQueryClient() @@ -58,9 +59,6 @@ export function useNotificationsHandler() { const {setShowLoggedOut} = useLoggedOutViewControls() const closeAllActiveElements = useCloseAllActiveElements() - // Safety to prevent double handling of the same notification - const prevDate = React.useRef(0) - React.useEffect(() => { if (!isAndroid) return @@ -169,11 +167,10 @@ export function useNotificationsHandler() { payload.reason === 'chat-message' && payload.recipientDid === currentAccount?.did ) { - const isCurrentConvo = payload.convoId === currentConvoId return { - shouldShowAlert: !isCurrentConvo, + shouldShowAlert: payload.convoId !== currentConvoId, shouldPlaySound: false, - shouldSetBadge: !isCurrentConvo, + shouldSetBadge: false, } } @@ -185,10 +182,10 @@ export function useNotificationsHandler() { const responseReceivedListener = Notifications.addNotificationResponseReceivedListener(e => { - if (e.notification.date === prevDate.current) { + if (e.notification.date === prevDate) { return } - prevDate.current = e.notification.date + prevDate = e.notification.date logger.debug( 'Notifications: response received', diff --git a/src/lib/notifications/notifications.ts b/src/lib/notifications/notifications.ts index 6f28608f44..f9fbdb8bfa 100644 --- a/src/lib/notifications/notifications.ts +++ b/src/lib/notifications/notifications.ts @@ -113,10 +113,16 @@ export function useRequestNotificationsPermission() { ) } -export async function decrementBadgeCount(by = 1) { +export async function decrementBadgeCount(by: number | 'reset' = 1) { if (!isNative) return const currCount = await getBadgeCountAsync() + + if (by === 'reset') { + await setBadgeCountAsync(0) + return + } + let newCount = currCount - by if (newCount < 0) { newCount = 0 diff --git a/src/state/queries/messages/list-converations.ts b/src/state/queries/messages/list-converations.ts index 3939ab8e39..8319fdefee 100644 --- a/src/state/queries/messages/list-converations.ts +++ b/src/state/queries/messages/list-converations.ts @@ -15,7 +15,6 @@ import {useCurrentConvoId} from '#/state/messages/current-convo-id' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {DM_SERVICE_HEADERS} from '#/state/queries/messages/const' import {useAgent, useSession} from '#/state/session' -import {decrementBadgeCount} from 'lib/notifications/notifications' export const RQKEY = ['convo-list'] type RQPageParam = string | undefined @@ -135,18 +134,10 @@ export function useOnMarkAsRead() { return useCallback( (chatId: string) => { queryClient.setQueryData(RQKEY, (old: ConvoListQueryData) => { - return optimisticUpdate(chatId, old, convo => { - // We only want to decrement the badge by one no matter the unread count, since we only increment once per - // sender regardless of message count - if (convo.unreadCount > 0) { - decrementBadgeCount(1) - } - - return { - ...convo, - unreadCount: 0, - } - }) + return optimisticUpdate(chatId, old, convo => ({ + ...convo, + unreadCount: 0, + })) }) }, [queryClient], diff --git a/src/state/queries/notifications/unread.tsx b/src/state/queries/notifications/unread.tsx index 9d35ee19fb..acc68c360e 100644 --- a/src/state/queries/notifications/unread.tsx +++ b/src/state/queries/notifications/unread.tsx @@ -119,7 +119,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) { // update & broadcast setNumUnread('') broadcast.postMessage({event: ''}) - decrementBadgeCount(Math.min(cacheRef.current.unreadCount, 30)) + decrementBadgeCount('reset') }, async checkUnread({