Delivery Status Redesign (#931)

This commit is contained in:
Mauro
2023-05-22 15:17:06 +02:00
committed by GitHub
parent 9afc0c0747
commit 8ed8cf6f0c
35 changed files with 233 additions and 101 deletions
@@ -22,6 +22,6 @@ struct RoomTimelineItemProperties: Hashable {
var isEdited = false
/// The aggregated reactions that have been sent for this item.
var reactions: [AggregatedReaction] = []
/// The delivery status for this item.
/// The delivery status for this item. If a sent message is echoed the value is nil.
var deliveryStatus: TimelineItemDeliveryStatus?
}
@@ -37,7 +37,7 @@ enum TimelineItemProxy {
/// The delivery status for the item.
enum TimelineItemDeliveryStatus: Hashable {
case sending
case sent(elapsedTime: TimeInterval)
case sent
case sendingFailed
}
@@ -54,7 +54,9 @@ struct EventTimelineItemProxy {
}
var deliveryStatus: TimelineItemDeliveryStatus? {
guard let localSendState = item.localSendState() else { return nil }
guard let localSendState = item.localSendState() else {
return nil
}
switch localSendState {
case .notSentYet:
@@ -62,7 +64,7 @@ struct EventTimelineItemProxy {
case .sendingFailed:
return .sendingFailed
case .sent:
return .sent(elapsedTime: Date().timeIntervalSince1970 - timestamp.timeIntervalSince1970)
return .sent
}
}
@@ -109,6 +111,10 @@ struct EventTimelineItemProxy {
let debugInfo = item.debugInfo()
return TimelineItemDebugInfo(model: debugInfo.model, originalJSON: debugInfo.originalJson, latestEditJSON: debugInfo.latestEditJson)
}
var readReceipts: [String: Receipt] {
item.readReceipts()
}
}
extension TimelineItemContentKind {
@@ -162,3 +168,12 @@ struct TimelineItemDebugInfo: Identifiable, CustomStringConvertible {
return String(data: jsonData, encoding: .utf8)
}
}
extension Receipt {
var dateTimestamp: Date? {
guard let timestamp else {
return nil
}
return Date(timeIntervalSince1970: TimeInterval(timestamp / 1000))
}
}
@@ -77,7 +77,7 @@ enum RoomTimelineViewProvider: Identifiable, Hashable {
fatalError("Unknown timeline item")
}
}
var id: String {
switch self {
case .text(let item as RoomTimelineItemProtocol, _),
@@ -100,6 +100,26 @@ enum RoomTimelineViewProvider: Identifiable, Hashable {
return item.id
}
}
var isUnsent: Bool {
switch self {
case .text(let item as EventBasedTimelineItemProtocol, _),
.image(let item as EventBasedTimelineItemProtocol, _),
.video(let item as EventBasedTimelineItemProtocol, _),
.audio(let item as EventBasedTimelineItemProtocol, _),
.file(let item as EventBasedTimelineItemProtocol, _),
.emote(let item as EventBasedTimelineItemProtocol, _),
.notice(let item as EventBasedTimelineItemProtocol, _),
.redacted(let item as EventBasedTimelineItemProtocol, _),
.encrypted(let item as EventBasedTimelineItemProtocol, _),
.sticker(let item as EventBasedTimelineItemProtocol, _),
.unsupported(let item as EventBasedTimelineItemProtocol, _),
.state(let item as EventBasedTimelineItemProtocol, _):
return item.properties.deliveryStatus == .sending || item.properties.deliveryStatus == .sendingFailed
default:
return false
}
}
/// Whether or not it is possible to send a reaction to this timeline item.
var isReactable: Bool {