Delivery status is displayed only for last message (#1193)

* checkmark only displays for the last message

* delivery status is now displayed only for last message

* changelog
This commit is contained in:
Mauro 2023-06-28 16:28:56 +02:00 committed by GitHub
parent 02f086cfcb
commit 908b368680
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 25 additions and 52 deletions

View File

@ -21,10 +21,10 @@ import SwiftUI
struct TimelineStyler<Content: View>: View {
@Environment(\.timelineStyle) private var style
let timelineItem: EventBasedTimelineItemProtocol
@ViewBuilder let content: () -> Content
var body: some View {
switch style {
case .plain:
@ -40,25 +40,32 @@ struct TimelineItemStyler_Previews: PreviewProvider {
static let base = TextRoomTimelineItem(id: UUID().uuidString, timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "Test"))
static let sent: TextRoomTimelineItem = {
static let sentNonLast: TextRoomTimelineItem = {
var result = base
result.properties.deliveryStatus = .sent
return result
}()
static let sending: TextRoomTimelineItem = {
static let sendingNonLast: TextRoomTimelineItem = {
var result = base
result.properties.deliveryStatus = .sending
return result
}()
static let sendingLast: TextRoomTimelineItem = {
let id = viewModel.state.items.last?.id ?? UUID().uuidString
var result = TextRoomTimelineItem(id: id, timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "Test"))
result.properties.deliveryStatus = .sending
return result
}()
static let failed: TextRoomTimelineItem = {
var result = base
result.properties.deliveryStatus = .sendingFailed
return result
}()
static let last: TextRoomTimelineItem = {
static let sentLast: TextRoomTimelineItem = {
let id = viewModel.state.items.last?.id ?? UUID().uuidString
let result = TextRoomTimelineItem(id: id, timestamp: "Now", isOutgoing: true, isEditable: false, sender: .init(id: UUID().uuidString), content: .init(body: "Test"))
return result
@ -78,10 +85,11 @@ struct TimelineItemStyler_Previews: PreviewProvider {
static var testView: some View {
VStack {
TextRoomTimelineView(timelineItem: sent)
TextRoomTimelineView(timelineItem: sending)
TextRoomTimelineView(timelineItem: base)
TextRoomTimelineView(timelineItem: last)
TextRoomTimelineView(timelineItem: sentNonLast)
TextRoomTimelineView(timelineItem: sentLast)
TextRoomTimelineView(timelineItem: sendingNonLast)
TextRoomTimelineView(timelineItem: sendingLast)
TextRoomTimelineView(timelineItem: failed)
}
}

View File

@ -22,10 +22,8 @@ struct TimelineItemStatusView: View {
@Environment(\.readReceiptsEnabled) private var readReceiptsEnabled
@EnvironmentObject private var context: RoomScreenViewModel.Context
@State private var shouldShowDeliveryStatus = true
private var isLastOutgoingMessage: Bool {
context.viewState.items.last(where: { !$0.isUnsent })?.id == timelineItem.id &&
context.viewState.items.last?.id == timelineItem.id &&
timelineItem.isOutgoing
}
@ -36,18 +34,8 @@ struct TimelineItemStatusView: View {
var body: some View {
if !timelineItem.properties.orderedReadReceipts.isEmpty, readReceiptsEnabled {
readReceipts
} else if shouldShowDeliveryStatus {
} else {
deliveryStatus
.onChange(of: timelineItem.properties.deliveryStatus) { newValue in
if newValue == .sent, !isLast {
Task {
try? await Task.sleep(for: .milliseconds(1500))
withAnimation {
shouldShowDeliveryStatus = false
}
}
}
}
}
}
@ -55,12 +43,13 @@ struct TimelineItemStatusView: View {
var deliveryStatus: some View {
switch timelineItem.properties.deliveryStatus {
case .sending:
TimelineDeliveryStatusView(deliveryStatus: .sending)
case .sent:
TimelineDeliveryStatusView(deliveryStatus: .sent)
case .none:
if isLastOutgoingMessage {
// We always display the sent icon for the latest echoed outgoing message
// We only display the sending icon for the latest outgoing message
TimelineDeliveryStatusView(deliveryStatus: .sending)
}
case .sent, .none:
if isLastOutgoingMessage {
// We only display the sent icon for the latest outgoing message
TimelineDeliveryStatusView(deliveryStatus: .sent)
}
case .sendingFailed:

View File

@ -104,31 +104,6 @@ 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, _),
.location(let item as EventBasedTimelineItemProtocol, _):
return item.properties.deliveryStatus == .sending || item.properties.deliveryStatus == .sendingFailed
case .separator,
.readMarker,
.paginationIndicator,
.timelineStart,
.group:
return false
}
}
/// Whether or not it is possible to send a reaction to this timeline item.
var isReactable: Bool {

1
changelog.d/1101.change Normal file
View File

@ -0,0 +1 @@
Delivery status is now displayed only for the last outgoing message.