Files
damus/damus/Util/LocalNotification.swift
William Casarin 1dbf7101b9 notifications: add support for tagged mentions
These are text notes that have you tagged but do not have inline
mentions or are replies.

Signed-off-by: William Casarin <jb55@jb55.com>
2024-09-05 20:02:07 -07:00

103 lines
2.7 KiB
Swift

//
// LocalNotification.swift
// damus
//
// Created by William Casarin on 2023-04-15.
//
import Foundation
let NDB_NOTE_JSON_USER_INFO_KEY = "ndb_note_json"
struct LossyLocalNotification {
let type: LocalNotificationType
let mention: MentionRef
func to_user_info() -> [AnyHashable: Any] {
return [
"type": self.type.rawValue,
"id": self.mention.bech32
]
}
static func from_user_info(user_info: [AnyHashable: Any]) -> LossyLocalNotification? {
if let encoded_ndb_note = user_info[NDB_NOTE_JSON_USER_INFO_KEY] as? String {
return self.from(json_encoded_ndb_note: encoded_ndb_note)
}
guard let id = user_info["id"] as? String,
let target_id = MentionRef.from_bech32(str: id) else {
return nil
}
let typestr = user_info["type"] as! String
let type = LocalNotificationType(rawValue: typestr)!
return LossyLocalNotification(type: type, mention: target_id)
}
static func from(json_encoded_ndb_note: String) -> LossyLocalNotification? {
guard let ndb_note = NdbNote.owned_from_json(json: json_encoded_ndb_note) else {
return nil
}
return self.from(ndb_note: ndb_note)
}
static func from(ndb_note: NdbNote) -> LossyLocalNotification? {
guard let known_kind = ndb_note.known_kind, let type = LocalNotificationType.from(nostr_kind: known_kind) else { return nil }
let target: MentionRef = .note(ndb_note.id)
return LossyLocalNotification(type: type, mention: target)
}
}
enum NotificationTarget {
case note(NostrEvent)
case note_id(NoteId)
var id: NoteId {
switch self {
case .note(let note):
return note.id
case .note_id(let id):
return id
}
}
}
struct LocalNotification {
let type: LocalNotificationType
let event: NostrEvent
let target: NotificationTarget
let content: String
func to_lossy() -> LossyLocalNotification {
return LossyLocalNotification(type: self.type, mention: .note(self.target.id))
}
}
enum LocalNotificationType: String {
case dm
case like
case mention
case reply
case tagged
case repost
case zap
case profile_zap
static func from(nostr_kind: NostrKind) -> Self? {
switch nostr_kind {
case .text:
return .mention
case .dm:
return .dm
case .like:
return .like
case .longform:
return .mention
case .zap:
return .zap
default:
return nil
}
}
}