From da7af491d0748ce4d4c03d2db66335888dd5dd06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20D=E2=80=99Aquino?= Date: Mon, 2 Sep 2024 17:00:28 -0700 Subject: [PATCH] Implement support for reply notification formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit implements support for nicely formatting reply push notifications. Testing ------- PASS Device: iPhone 15 simulator notepush: 11568aa6285142e4c19bb0da30977957a92b7d9b Damus: This commit Settings: Local push notification setup Steps: 1. Create a post from account 1 2. On account 2, make a reply to that post 3. Ensure we get a push notification with: - A title formatted as " replied to your note" - A body with the contents of that reply 4. Click on that push notification. Ensure you are taken to the reply 5. Now make a post from account 2 and mention account 1 in it 6. Ensure push notification says that account 2 mentioned account 1 (i.e. does not talk about a reply) Signed-off-by: Daniel D’Aquino Closes: https://github.com/damus-io/damus/issues/2403 --- DamusNotificationService/NotificationFormatter.swift | 3 +++ damus/ContentView.swift | 2 +- damus/Models/NotificationsManager.swift | 9 +++++++++ damus/Util/LocalNotification.swift | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/DamusNotificationService/NotificationFormatter.swift b/DamusNotificationService/NotificationFormatter.swift index 615eaacc..ec7a40fd 100644 --- a/DamusNotificationService/NotificationFormatter.swift +++ b/DamusNotificationService/NotificationFormatter.swift @@ -70,6 +70,9 @@ struct NotificationFormatter { case .zap, .profile_zap: // not handled here. Try `format_message(displayName: String, notify: LocalNotification, state: HeadlessDamusState) async -> (content: UNMutableNotificationContent, identifier: String)?` return nil + case .reply: + title = String(format: NSLocalizedString("%@ replied to your note", comment: "Heading for local notification indicating a new reply"), displayName) + identifier = "myReplyNotification" } content.title = title content.body = notify.content diff --git a/damus/ContentView.swift b/damus/ContentView.swift index d6605b6a..5907419a 100644 --- a/damus/ContentView.swift +++ b/damus/ContentView.swift @@ -780,7 +780,7 @@ struct ContentView: View { selected_timeline = .dms damus_state.dms.set_active_dm(target.pubkey) navigationCoordinator.push(route: Route.DMChat(dms: damus_state.dms.active_model)) - case .like, .zap, .mention, .repost: + case .like, .zap, .mention, .repost, .reply: open_event(ev: target) case .profile_zap: break diff --git a/damus/Models/NotificationsManager.swift b/damus/Models/NotificationsManager.swift index c32ae753..69014085 100644 --- a/damus/Models/NotificationsManager.swift +++ b/damus/Models/NotificationsManager.swift @@ -68,6 +68,15 @@ func generate_local_notification_object(from ev: NostrEvent, state: HeadlessDamu let content_preview = render_notification_content_preview(ev: ev, profiles: state.profiles, keypair: state.keypair) return LocalNotification(type: .mention, event: ev, target: ev, content: content_preview) } + if ev.referenced_ids.contains(where: { note_id in + guard let note_author: Pubkey = state.ndb.lookup_note(note_id)?.unsafeUnownedValue?.pubkey else { return false } + guard note_author == state.keypair.pubkey else { return false } + return true + }) { + // This is a reply to one of our posts + let content_preview = render_notification_content_preview(ev: ev, profiles: state.profiles, keypair: state.keypair) + return LocalNotification(type: .reply, event: ev, target: ev, content: content_preview) + } } else if type == .boost, state.settings.repost_notification, let inner_ev = ev.get_inner_event() diff --git a/damus/Util/LocalNotification.swift b/damus/Util/LocalNotification.swift index 19da4490..ad0aca98 100644 --- a/damus/Util/LocalNotification.swift +++ b/damus/Util/LocalNotification.swift @@ -63,6 +63,7 @@ enum LocalNotificationType: String { case dm case like case mention + case reply case repost case zap case profile_zap