import Foundation
/// Contains a list of all notifications for the logged in user and the numbers of unread notifications.
public struct NotificationFeed: Hashable, Sendable {
public enum Category: String, CaseIterable, Sendable {
case all = ""
case upvotes = "upvotes"
case mentions = "mentions"
case comments = "comments"
case subscriptions = "subs"
}
/// The time when the notifications were last checked.
public let lastChecked: Date
/// The list of all notifications for the logged in user.
public let notifications: [Notification]
/// The numbers of unread notifications.
public let unreadNumbers: UnreadNumbers
/// Infos about the user name and avatar for each user id.
public let userInfos: [UserInfo]
public init(lastChecked: Date, notifications: [Notification], unreadNumbers: NotificationFeed.UnreadNumbers, userInfos: [UserInfo]) {
self.lastChecked = lastChecked
self.notifications = notifications
self.unreadNumbers = unreadNumbers
self.userInfos = userInfos
}
}
extension NotificationFeed {
struct CodingData: Decodable {
struct Container: Decodable {
let data: NotificationFeed.CodingData
}
let check_time: Int
let items: [Notification.CodingData]
let unread: UnreadNumbers.CodingData
let username_map: [String: NotificationFeed.UserInfo.UsernameMapEntryCodingData]
}
}
extension NotificationFeed.CodingData {
var decoded: NotificationFeed {
.init(
lastChecked: Date(timeIntervalSince1970: TimeInterval(check_time)),
notifications: items.map(\.decoded),
unreadNumbers: unread.decoded,
userInfos: username_map.map { (key, value) in
.init(avatar: value.avatar.decoded, username: value.name, userId: Int(key) ?? 0)
}
)
}
}