about summary refs log tree commit diff
diff options
context:
space:
mode:
authorHailey <me@haileyok.com>2024-06-07 15:15:33 -0700
committerGitHub <noreply@github.com>2024-06-07 15:15:33 -0700
commit480a40862f329f98a37772f01fd774d0e6d89a9e (patch)
treead39ad65806cb51694d0a92feee8337c7f454aa4
parentc58aedf050ea96ece27549b4c5a084611473db9d (diff)
downloadvoidsky-480a40862f329f98a37772f01fd774d0e6d89a9e.tar.zst
Use the proper logic on iOS to increment the badge (#4233)
-rw-r--r--modules/BlueskyNSE/NotificationService.swift8
-rw-r--r--modules/expo-background-notification-handler/android/src/main/java/expo/modules/backgroundnotificationhandler/ExpoBackgroundNotificationHandlerModule.kt4
-rw-r--r--modules/expo-background-notification-handler/ios/ExpoBackgroundNotificationHandlerModule.swift7
-rw-r--r--modules/expo-background-notification-handler/src/ExpoBackgroundNotificationHandler.types.ts1
-rw-r--r--modules/expo-background-notification-handler/src/ExpoBackgroundNotificationHandlerModule.web.ts1
-rw-r--r--src/lib/notifications/notifications.ts24
-rw-r--r--src/state/queries/notifications/unread.tsx4
7 files changed, 34 insertions, 15 deletions
diff --git a/modules/BlueskyNSE/NotificationService.swift b/modules/BlueskyNSE/NotificationService.swift
index e6aca99c1..384180d8b 100644
--- a/modules/BlueskyNSE/NotificationService.swift
+++ b/modules/BlueskyNSE/NotificationService.swift
@@ -1,4 +1,5 @@
 import UserNotifications
+import UIKit
 
 let APP_GROUP = "group.app.bsky"
 
@@ -31,7 +32,12 @@ class NotificationService: UNNotificationServiceExtension {
   }
   
   func mutateWithBadge(_ content: UNMutableNotificationContent) {
-    content.badge = 1
+    var count = prefs?.integer(forKey: "badgeCount") ?? 0
+    count += 1
+    
+    // Set the new badge number for the notification, then store that value for using later
+    content.badge = NSNumber(value: count)
+    prefs?.setValue(count, forKey: "badgeCount")
   }
   
   func mutateWithChatMessage(_ content: UNMutableNotificationContent) {
diff --git a/modules/expo-background-notification-handler/android/src/main/java/expo/modules/backgroundnotificationhandler/ExpoBackgroundNotificationHandlerModule.kt b/modules/expo-background-notification-handler/android/src/main/java/expo/modules/backgroundnotificationhandler/ExpoBackgroundNotificationHandlerModule.kt
index 083ff1223..c876f899a 100644
--- a/modules/expo-background-notification-handler/android/src/main/java/expo/modules/backgroundnotificationhandler/ExpoBackgroundNotificationHandlerModule.kt
+++ b/modules/expo-background-notification-handler/android/src/main/java/expo/modules/backgroundnotificationhandler/ExpoBackgroundNotificationHandlerModule.kt
@@ -66,5 +66,9 @@ class ExpoBackgroundNotificationHandlerModule : Module() {
     AsyncFunction("removeManyFromStringArrayAsync") { forKey: String, strings: Array<String> ->
       NotificationPrefs(appContext.reactContext).removeManyFromStringArray(forKey, strings)
     }
+
+    AsyncFunction("setBadgeCountAsync") { _: Int ->
+      // This does nothing on Android
+    }
   }
 }
diff --git a/modules/expo-background-notification-handler/ios/ExpoBackgroundNotificationHandlerModule.swift b/modules/expo-background-notification-handler/ios/ExpoBackgroundNotificationHandlerModule.swift
index 08972a04c..5f8c7fc3b 100644
--- a/modules/expo-background-notification-handler/ios/ExpoBackgroundNotificationHandlerModule.swift
+++ b/modules/expo-background-notification-handler/ios/ExpoBackgroundNotificationHandlerModule.swift
@@ -10,7 +10,8 @@ let DEFAULTS: [String:Any] = [
   "playSoundQuote": false,
   "playSoundReply": false,
   "playSoundRepost": false,
-  "mutedThreads": [:] as! [String:[String]]
+  "mutedThreads": [:] as! [String:[String]],
+  "badgeCount": 0,
 ]
 
 /*
@@ -112,5 +113,9 @@ public class ExpoBackgroundNotificationHandlerModule: Module {
         userDefaults?.setValue(curr, forKey: forKey)
       }
     }
+    
+    AsyncFunction("setBadgeCountAsync") { (count: Int) in
+      userDefaults?.setValue(count, forKey: "badgeCount")
+    }
   }
 }
diff --git a/modules/expo-background-notification-handler/src/ExpoBackgroundNotificationHandler.types.ts b/modules/expo-background-notification-handler/src/ExpoBackgroundNotificationHandler.types.ts
index 5fbd302da..b74148db4 100644
--- a/modules/expo-background-notification-handler/src/ExpoBackgroundNotificationHandler.types.ts
+++ b/modules/expo-background-notification-handler/src/ExpoBackgroundNotificationHandler.types.ts
@@ -31,6 +31,7 @@ export type ExpoBackgroundNotificationHandlerModule = {
     forKey: keyof BackgroundNotificationHandlerPreferences,
     value: string[],
   ) => Promise<void>
+  setBadgeCountAsync: (count: number) => Promise<void>
 }
 
 // TODO there are more preferences in the native code, however they have not been added here yet.
diff --git a/modules/expo-background-notification-handler/src/ExpoBackgroundNotificationHandlerModule.web.ts b/modules/expo-background-notification-handler/src/ExpoBackgroundNotificationHandlerModule.web.ts
index 29e27fd0f..893548e18 100644
--- a/modules/expo-background-notification-handler/src/ExpoBackgroundNotificationHandlerModule.web.ts
+++ b/modules/expo-background-notification-handler/src/ExpoBackgroundNotificationHandlerModule.web.ts
@@ -24,4 +24,5 @@ export const BackgroundNotificationHandler = {
   removeFromStringArrayAsync: async (_: string, __: string) => {},
   addManyToStringArrayAsync: async (_: string, __: string[]) => {},
   removeManyFromStringArrayAsync: async (_: string, __: string[]) => {},
+  setBadgeCountAsync: async (_: number) => {},
 } as ExpoBackgroundNotificationHandlerModule
diff --git a/src/lib/notifications/notifications.ts b/src/lib/notifications/notifications.ts
index 705d90c56..55a7948ef 100644
--- a/src/lib/notifications/notifications.ts
+++ b/src/lib/notifications/notifications.ts
@@ -7,6 +7,7 @@ import {logger} from '#/logger'
 import {SessionAccount, useAgent, useSession} from '#/state/session'
 import {logEvent, useGate} from 'lib/statsig/statsig'
 import {devicePlatform, isNative} from 'platform/detection'
+import BackgroundNotificationHandler from '../../../modules/expo-background-notification-handler'
 
 const SERVICE_DID = (serviceUrl?: string) =>
   serviceUrl?.includes('staging')
@@ -108,19 +109,20 @@ export function useRequestNotificationsPermission() {
   }
 }
 
-export async function decrementBadgeCount(by: number | 'reset' = 1) {
+export async function decrementBadgeCount(by: number) {
   if (!isNative) return
 
-  const currCount = await getBadgeCountAsync()
-
-  if (by === 'reset') {
-    await setBadgeCountAsync(0)
-    return
+  let count = await getBadgeCountAsync()
+  count -= by
+  if (count < 0) {
+    count = 0
   }
 
-  let newCount = currCount - by
-  if (newCount < 0) {
-    newCount = 0
-  }
-  await setBadgeCountAsync(newCount)
+  await BackgroundNotificationHandler.setBadgeCountAsync(count)
+  await setBadgeCountAsync(count)
+}
+
+export async function resetBadgeCount() {
+  await BackgroundNotificationHandler.setBadgeCountAsync(0)
+  await setBadgeCountAsync(0)
 }
diff --git a/src/state/queries/notifications/unread.tsx b/src/state/queries/notifications/unread.tsx
index 5f33cdf74..ffb8d03bc 100644
--- a/src/state/queries/notifications/unread.tsx
+++ b/src/state/queries/notifications/unread.tsx
@@ -11,7 +11,7 @@ import BroadcastChannel from '#/lib/broadcast'
 import {logger} from '#/logger'
 import {useMutedThreads} from '#/state/muted-threads'
 import {useAgent, useSession} from '#/state/session'
-import {decrementBadgeCount} from 'lib/notifications/notifications'
+import {resetBadgeCount} from 'lib/notifications/notifications'
 import {useModerationOpts} from '../../preferences/moderation-opts'
 import {truncateAndInvalidate} from '../util'
 import {RQKEY as RQKEY_NOTIFS} from './feed'
@@ -119,7 +119,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
         // update & broadcast
         setNumUnread('')
         broadcast.postMessage({event: ''})
-        decrementBadgeCount('reset')
+        resetBadgeCount()
       },
 
       async checkUnread({