Merge pull request #7231 from vector-im/alfogrillo/render_poll_end_event

Render poll ended event in the timeline (PSG-196)
This commit is contained in:
Alfonso Grillo
2023-01-10 14:49:13 +01:00
committed by GitHub
21 changed files with 91 additions and 17 deletions
@@ -21,7 +21,7 @@ import SwiftUI
struct TimelinePollCoordinatorParameters {
let session: MXSession
let room: MXRoom
let pollStartEvent: MXEvent
let pollEvent: MXEvent
}
final class TimelinePollCoordinator: Coordinator, Presentable, PollAggregatorDelegate {
@@ -46,7 +46,7 @@ final class TimelinePollCoordinator: Coordinator, Presentable, PollAggregatorDel
init(parameters: TimelinePollCoordinatorParameters) throws {
self.parameters = parameters
try pollAggregator = PollAggregator(session: parameters.session, room: parameters.room, pollStartEventId: parameters.pollStartEvent.eventId)
try pollAggregator = PollAggregator(session: parameters.session, room: parameters.room, pollEvent: parameters.pollEvent)
pollAggregator.delegate = self
viewModel = TimelinePollViewModel(timelinePollDetails: buildTimelinePollFrom(pollAggregator.poll))
@@ -65,7 +65,7 @@ final class TimelinePollCoordinator: Coordinator, Presentable, PollAggregatorDel
.sink { [weak self] identifiers in
guard let self = self else { return }
self.parameters.room.sendPollResponse(for: parameters.pollStartEvent,
self.parameters.room.sendPollResponse(for: parameters.pollEvent,
withAnswerIdentifiers: identifiers,
threadId: nil,
localEcho: nil, success: nil) { [weak self] error in
@@ -96,7 +96,7 @@ final class TimelinePollCoordinator: Coordinator, Presentable, PollAggregatorDel
}
func endPoll() {
parameters.room.sendPollEnd(for: parameters.pollStartEvent, threadId: nil, localEcho: nil, success: nil) { [weak self] _ in
parameters.room.sendPollEnd(for: parameters.pollEvent, threadId: nil, localEcho: nil, success: nil) { [weak self] _ in
self?.viewModel.showClosingFailure()
}
}
@@ -131,6 +131,7 @@ final class TimelinePollCoordinator: Coordinator, Presentable, PollAggregatorDel
closed: poll.isClosed,
totalAnswerCount: poll.totalAnswerCount,
type: pollKindToTimelinePollType(poll.kind),
eventType: parameters.pollEvent.eventType == .pollStart ? .started : .ended,
maxAllowedSelections: poll.maxAllowedSelections,
hasBeenEdited: poll.hasBeenEdited,
hasDecryptionError: poll.hasDecryptionError)
@@ -43,7 +43,7 @@ class TimelinePollProvider: NSObject {
return coordinator.toPresentable()
}
let parameters = TimelinePollCoordinatorParameters(session: session, room: room, pollStartEvent: event)
let parameters = TimelinePollCoordinatorParameters(session: session, room: room, pollEvent: event)
guard let coordinator = try? TimelinePollCoordinator(parameters: parameters) else {
return nil
}
@@ -34,6 +34,7 @@ class TimelinePollViewModelTests: XCTestCase {
closed: false,
totalAnswerCount: 3,
type: .disclosed,
eventType: .started,
maxAllowedSelections: 1,
hasBeenEdited: false,
hasDecryptionError: false)
@@ -32,6 +32,11 @@ enum TimelinePollType {
case undisclosed
}
enum TimelinePollEventType {
case started
case ended
}
struct TimelinePollAnswerOption: Identifiable {
var id: String
var text: String
@@ -62,6 +67,7 @@ struct TimelinePollDetails {
var closed: Bool
var totalAnswerCount: UInt
var type: TimelinePollType
var eventType: TimelinePollEventType
var maxAllowedSelections: UInt
var hasBeenEdited = true
var hasDecryptionError: Bool
@@ -70,6 +76,7 @@ struct TimelinePollDetails {
closed: Bool,
totalAnswerCount: UInt,
type: TimelinePollType,
eventType: TimelinePollEventType,
maxAllowedSelections: UInt,
hasBeenEdited: Bool,
hasDecryptionError: Bool) {
@@ -78,6 +85,7 @@ struct TimelinePollDetails {
self.closed = closed
self.totalAnswerCount = totalAnswerCount
self.type = type
self.eventType = eventType
self.maxAllowedSelections = maxAllowedSelections
self.hasBeenEdited = hasBeenEdited
self.hasDecryptionError = hasDecryptionError
@@ -94,6 +102,10 @@ struct TimelinePollDetails {
return type == .disclosed && totalAnswerCount > 0 && hasCurrentUserVoted
}
}
var representsPollEndedEvent: Bool {
eventType == .ended
}
}
struct TimelinePollViewState: BindableState {
@@ -22,6 +22,7 @@ enum MockTimelinePollScreenState: MockScreenState, CaseIterable {
case closedDisclosed
case openUndisclosed
case closedUndisclosed
case closedPollEnded
var screenType: Any.Type {
TimelinePollDetails.self
@@ -37,6 +38,7 @@ enum MockTimelinePollScreenState: MockScreenState, CaseIterable {
closed: self == .closedDisclosed || self == .closedUndisclosed ? true : false,
totalAnswerCount: 20,
type: self == .closedDisclosed || self == .openDisclosed ? .disclosed : .undisclosed,
eventType: self == .closedPollEnded ? .ended : .started,
maxAllowedSelections: 1,
hasBeenEdited: false,
hasDecryptionError: false)
@@ -151,6 +151,7 @@ struct TimelinePollAnswerOptionButton_Previews: PreviewProvider {
closed: closed,
totalAnswerCount: 100,
type: type,
eventType: .started,
maxAllowedSelections: 1,
hasBeenEdited: false,
hasDecryptionError: false)
@@ -31,6 +31,12 @@ struct TimelinePollView: View {
let poll = viewModel.viewState.poll
VStack(alignment: .leading, spacing: 16.0) {
if poll.representsPollEndedEvent {
Text(VectorL10n.pollTimelineEndedText)
.font(theme.fonts.footnote)
.foregroundColor(theme.colors.tertiaryContent)
}
Text(poll.question)
.font(theme.fonts.bodySB)
.foregroundColor(theme.colors.primaryContent) +