diff --git a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineStyler.swift b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineStyler.swift index bcba7585f..41f782295 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineStyler.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Style/TimelineStyler.swift @@ -21,10 +21,10 @@ import SwiftUI struct TimelineStyler: 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) } } diff --git a/ElementX/Sources/Screens/RoomScreen/View/Supplementary/TimelineItemStatusView.swift b/ElementX/Sources/Screens/RoomScreen/View/Supplementary/TimelineItemStatusView.swift index f4f8068b7..df86f01c6 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/Supplementary/TimelineItemStatusView.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/Supplementary/TimelineItemStatusView.swift @@ -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: diff --git a/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineViewProvider.swift b/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineViewProvider.swift index cbb3812ad..7f0130b82 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineViewProvider.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItems/RoomTimelineViewProvider.swift @@ -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 { diff --git a/changelog.d/1101.change b/changelog.d/1101.change new file mode 100644 index 000000000..85b6ea397 --- /dev/null +++ b/changelog.d/1101.change @@ -0,0 +1 @@ +Delivery status is now displayed only for the last outgoing message. \ No newline at end of file