149 lines
3.1 KiB
Swift
149 lines
3.1 KiB
Swift
//
|
|
// Copyright 2025 Element Creations Ltd.
|
|
// Copyright 2022-2025 New Vector Ltd.
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
|
// Please see LICENSE files in the repository root for full details.
|
|
//
|
|
|
|
import Foundation
|
|
import MatrixRustSDK
|
|
import UserNotifications
|
|
|
|
struct NotificationItemProxy: NotificationItemProxyProtocol {
|
|
let notificationItem: NotificationItem
|
|
let eventID: String
|
|
let receiverID: String
|
|
let roomID: String
|
|
|
|
var event: NotificationEvent? {
|
|
notificationItem.event
|
|
}
|
|
|
|
var senderDisplayName: String? {
|
|
notificationItem.senderInfo.displayName
|
|
}
|
|
|
|
var senderID: String {
|
|
switch notificationItem.event {
|
|
case .timeline(let event):
|
|
return event.senderId()
|
|
case .invite(let senderID):
|
|
return senderID
|
|
}
|
|
}
|
|
|
|
var roomDisplayName: String {
|
|
notificationItem.roomInfo.displayName
|
|
}
|
|
|
|
var isRoomSpace: Bool {
|
|
notificationItem.roomInfo.isSpace
|
|
}
|
|
|
|
var isRoomDirect: Bool {
|
|
notificationItem.roomInfo.isDirect
|
|
}
|
|
|
|
var isRoomPrivate: Bool {
|
|
switch notificationItem.roomInfo.joinRule {
|
|
case .invite, .knock, .restricted, .knockRestricted:
|
|
true
|
|
default:
|
|
false
|
|
}
|
|
}
|
|
|
|
var roomJoinedMembers: Int {
|
|
Int(notificationItem.roomInfo.joinedMembersCount)
|
|
}
|
|
|
|
var isNoisy: Bool {
|
|
notificationItem.isNoisy ?? false
|
|
}
|
|
|
|
var hasMention: Bool {
|
|
notificationItem.hasMention ?? false
|
|
}
|
|
|
|
var senderAvatarMediaSource: MediaSourceProxy? {
|
|
if let senderAvatarURLString = notificationItem.senderInfo.avatarUrl,
|
|
let senderAvatarURL = URL(string: senderAvatarURLString) {
|
|
return try? MediaSourceProxy(url: senderAvatarURL, mimeType: nil)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var roomAvatarMediaSource: MediaSourceProxy? {
|
|
if let roomAvatarURLString = notificationItem.roomInfo.avatarUrl,
|
|
let roomAvatarURL = URL(string: roomAvatarURLString) {
|
|
return try? MediaSourceProxy(url: roomAvatarURL, mimeType: nil)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var threadRootEventID: String? {
|
|
notificationItem.threadId
|
|
}
|
|
}
|
|
|
|
struct EmptyNotificationItemProxy: NotificationItemProxyProtocol {
|
|
let eventID: String
|
|
|
|
var event: NotificationEvent? {
|
|
nil
|
|
}
|
|
|
|
let roomID: String
|
|
|
|
let receiverID: String
|
|
|
|
var senderID: String {
|
|
""
|
|
}
|
|
|
|
var senderDisplayName: String? {
|
|
nil
|
|
}
|
|
|
|
var roomDisplayName: String {
|
|
""
|
|
}
|
|
|
|
var isNoisy: Bool {
|
|
false
|
|
}
|
|
|
|
var isRoomSpace: Bool {
|
|
false
|
|
}
|
|
|
|
var isRoomDirect: Bool {
|
|
false
|
|
}
|
|
|
|
var isRoomPrivate: Bool {
|
|
false
|
|
}
|
|
|
|
var senderAvatarMediaSource: MediaSourceProxy? {
|
|
nil
|
|
}
|
|
|
|
var roomAvatarMediaSource: MediaSourceProxy? {
|
|
nil
|
|
}
|
|
|
|
var roomJoinedMembers: Int {
|
|
0
|
|
}
|
|
|
|
var hasMention: Bool {
|
|
false
|
|
}
|
|
|
|
var threadRootEventID: String? {
|
|
nil
|
|
}
|
|
}
|