Vote on a poll and end a poll (#1597)

* Fix project file

* Add vote and end poll actions

* Handle redaction

* Fix local echo behavior

* Cleanup

* Fix UI tests

* Add localisation

* Cleanup

* Fix end poll action style
This commit is contained in:
Alfonso Grillo
2023-08-31 12:04:25 +02:00
committed by GitHub
parent d43b578dce
commit f0fad25d09
18 changed files with 151 additions and 32 deletions
@@ -688,6 +688,8 @@ class RoomProxy: RoomProxyProtocol {
}
}
// MARK: - Polls
func createPoll(question: String, answers: [String], pollKind: Poll.Kind) async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
do {
@@ -699,6 +701,28 @@ class RoomProxy: RoomProxyProtocol {
}
}
func sendPollResponse(pollStartID: String, answers: [String]) async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
do {
return try .success(self.room.sendPollResponse(pollStartId: pollStartID, answers: answers, txnId: genTransactionId()))
} catch {
MXLog.error("Failed sending a poll vote: \(error), pollStartID: \(pollStartID)")
return .failure(.failedSendingPollResponse)
}
}
}
func endPoll(pollStartID: String) async -> Result<Void, RoomProxyError> {
await Task.dispatch(on: .global()) {
do {
return try .success(self.room.endPoll(pollStartId: pollStartID, text: .init(), txnId: genTransactionId()))
} catch {
MXLog.error("Failed ending a poll: \(error), pollStartID: \(pollStartID)")
return .failure(.failedEndingPoll)
}
}
}
// MARK: - Private
/// Force the timeline to load member details so it can populate sender profiles whenever we add a timeline listener
@@ -43,6 +43,8 @@ enum RoomProxyError: Error, Equatable {
case failedUploadingAvatar
case failedCheckingPermission
case failedCreatingPoll
case failedSendingPollResponse
case failedEndingPoll
}
// sourcery: AutoMockable
@@ -168,6 +170,10 @@ protocol RoomProxyProtocol {
func canUserRedact(userID: String) async -> Result<Bool, RoomProxyError>
func createPoll(question: String, answers: [String], pollKind: Poll.Kind) async -> Result<Void, RoomProxyError>
func sendPollResponse(pollStartID: String, answers: [String]) async -> Result<Void, RoomProxyError>
func endPoll(pollStartID: String) async -> Result<Void, RoomProxyError>
}
extension RoomProxyProtocol {
@@ -26,7 +26,7 @@ struct TimelineItemIdentifier: Hashable {
/// Only available for EventTimelineItem and only when the item is returned by the server.
var eventID: String?
/// Uniquely identfies the local echo of the timeline item.
/// Uniquely identifies the local echo of the timeline item.
/// Only available for sent EventTimelineItem that have not been returned by the server yet.
var transactionID: String?
}
@@ -46,6 +46,10 @@ extension EventBasedTimelineItemProtocol {
self is LocationRoomTimelineItem
}
var pollIfAvailable: Poll? {
(self as? PollRoomTimelineItem)?.poll
}
var isRedacted: Bool {
self is RedactedRoomTimelineItem
}
@@ -35,6 +35,10 @@ struct Poll: Equatable {
let votes: [String: [String]]
let endDate: Date?
var hasEnded: Bool {
endDate != nil
}
enum Kind: Equatable {
case disclosed
case undisclosed