Render ended poll with winning answers

This commit is contained in:
Florian Renaud 2023-08-21 14:10:21 +02:00
parent 246e9c50e6
commit bb2f5a1330
8 changed files with 122 additions and 31 deletions

View file

@ -21,7 +21,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.PreviewParameter
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemPollContent
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemPollContentProvider
import io.element.android.features.poll.api.ActivePollContentView
import io.element.android.features.poll.api.PollContentView
import io.element.android.libraries.designsystem.preview.DayNightPreviews
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.matrix.api.poll.PollAnswer
@ -33,10 +33,11 @@ fun TimelineItemPollView(
onAnswerSelected: (PollAnswer) -> Unit,
modifier: Modifier = Modifier,
) {
ActivePollContentView(
PollContentView(
question = content.question,
answerItems = content.answerItems.toImmutableList(),
pollKind = content.pollKind,
isPollEnded = content.isEnded,
onAnswerSelected = onAnswerSelected,
modifier = modifier,
)

View file

@ -38,19 +38,23 @@ class TimelineItemContentPollFactory @Inject constructor(
// Todo Move this computation to the matrix rust sdk
val pollVotesCount = content.votes.flatMap { it.value }.size
val userVotes = content.votes.filter { matrixClient.sessionId in it.value }.keys
val isEndedPoll = content.endTime != null
val winnerIds = content.answers.map { it.id }
.groupBy { content.votes[it]?.size ?: 0 } // Group by votes count
.maxBy { it.key } // Keep max voted answers
.takeIf { it.key > 0 } // Ignore if no option has been voted
?.value.orEmpty()
val answerItems = content.answers.map { answer ->
val votesCount = content.votes[answer.id]?.size ?: 0
val isSelected = answer.id in userVotes
val percentage = when {
pollVotesCount == 0 -> 0f
content.kind.isDisclosed -> votesCount.toFloat() / pollVotesCount.toFloat()
isSelected -> 1f
else -> 0f
}
val isWinner = answer.id in winnerIds
val percentage = if (pollVotesCount > 0) votesCount.toFloat() / pollVotesCount.toFloat() else 0f
PollAnswerItem(
answer = answer,
isSelected = isSelected,
isDisclosed = content.kind.isDisclosed,
isEnabled = isEndedPoll,
isWinner = isWinner,
isDisclosed = content.kind.isDisclosed || isEndedPoll,
votesCount = votesCount,
percentage = percentage,
)
@ -61,6 +65,7 @@ class TimelineItemContentPollFactory @Inject constructor(
answerItems = answerItems,
votes = content.votes,
pollKind = content.kind,
isEnded = isEndedPoll,
)
}
}

View file

@ -25,6 +25,7 @@ data class TimelineItemPollContent(
val answerItems: List<PollAnswerItem>,
val votes: Map<String, List<UserId>>,
val pollKind: PollKind,
val isEnded: Boolean,
) : TimelineItemEventContent {
override val type: String = "TimelineItemPollContent"
}

View file

@ -33,6 +33,7 @@ fun aTimelineItemPollContent(): TimelineItemPollContent {
pollKind = PollKind.Disclosed,
question = "What type of food should we have at the party?",
answerItems = aPollAnswerItemList(),
isEnded = false,
votes = emptyMap(),
)
}