about summary refs log tree commit diff
diff options
context:
space:
mode:
authorHailey <me@haileyok.com>2024-05-17 16:05:32 -0700
committerGitHub <noreply@github.com>2024-05-17 16:05:32 -0700
commitd2c81c9d3d6aebae9c73a7567875e0165cfb1f08 (patch)
tree428f283a80530d71603d2cad87e62d85d20d2bf7
parent49314e2d1f20d7471f1d05ce2b118bd030c44aa2 (diff)
downloadvoidsky-d2c81c9d3d6aebae9c73a7567875e0165cfb1f08.tar.zst
Disable badge incrementing for DMs (#4088)
* disable badge increments for dms

* revert decrementing in js for dms

* reset badge on read notifications

* remove some other code

* prevent duplicate notification events
-rw-r--r--modules/BlueskyNSE/NotificationService.swift7
-rw-r--r--modules/expo-background-notification-handler/android/src/main/java/expo/modules/backgroundnotificationhandler/BackgroundNotificationHandler.kt3
-rw-r--r--src/lib/hooks/useNotificationHandler.ts15
-rw-r--r--src/lib/notifications/notifications.ts8
-rw-r--r--src/state/queries/messages/list-converations.ts17
-rw-r--r--src/state/queries/notifications/unread.tsx2
6 files changed, 24 insertions, 28 deletions
diff --git a/modules/BlueskyNSE/NotificationService.swift b/modules/BlueskyNSE/NotificationService.swift
index c6f391e00..e6aca99c1 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 344508523..0a8737b88 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 3f1cd439d..f3c4da7f6 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 6f28608f4..f9fbdb8bf 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 3939ab8e3..8319fdefe 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 9d35ee19f..acc68c360 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({