forked from shadowfacts/Tusker
61 lines
2.1 KiB
Swift
61 lines
2.1 KiB
Swift
//
|
|
// NotificationGroup.swift
|
|
// Pachyderm
|
|
//
|
|
// Created by Shadowfacts on 9/5/19.
|
|
// Copyright © 2019 Shadowfacts. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
public class NotificationGroup: Identifiable, Hashable {
|
|
public let notifications: [Notification]
|
|
public let id: String
|
|
public let kind: Notification.Kind
|
|
public let statusState: StatusState?
|
|
|
|
init?(notifications: [Notification]) {
|
|
guard !notifications.isEmpty else { return nil }
|
|
self.notifications = notifications
|
|
self.id = notifications.first!.id
|
|
self.kind = notifications.first!.kind
|
|
if kind == .mention {
|
|
self.statusState = .unknown
|
|
} else {
|
|
self.statusState = nil
|
|
}
|
|
}
|
|
|
|
public static func ==(lhs: NotificationGroup, rhs: NotificationGroup) -> Bool {
|
|
return lhs.id == rhs.id
|
|
}
|
|
|
|
public func hash(into hasher: inout Hasher) {
|
|
hasher.combine(id)
|
|
}
|
|
|
|
public static func createGroups(notifications: [Notification], only allowedTypes: [Notification.Kind]) -> [NotificationGroup] {
|
|
var groups = [[Notification]]()
|
|
for notification in notifications {
|
|
if allowedTypes.contains(notification.kind) {
|
|
if let lastGroup = groups.last, let firstNotification = lastGroup.first, firstNotification.kind == notification.kind, firstNotification.status?.id == notification.status?.id {
|
|
groups[groups.count - 1].append(notification)
|
|
continue
|
|
} else if groups.count >= 2 {
|
|
let secondToLastGroup = groups[groups.count - 2]
|
|
if allowedTypes.contains(groups[groups.count - 1][0].kind), let firstNotification = secondToLastGroup.first, firstNotification.kind == notification.kind, firstNotification.status?.id == notification.status?.id {
|
|
groups[groups.count - 2].append(notification)
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
|
|
groups.append([notification])
|
|
}
|
|
return groups.map {
|
|
NotificationGroup(notifications: $0)!
|
|
}
|
|
}
|
|
|
|
}
|