Merge pull request #1897 from element-hq/jonny/timeline-poll-edited
Display edited indicator for polls in the timeline
This commit is contained in:
@@ -36,8 +36,7 @@ import androidx.compose.ui.unit.dp
|
||||
import io.element.android.compound.theme.ElementTheme
|
||||
import io.element.android.compound.tokens.generated.CompoundIcons
|
||||
import io.element.android.features.messages.impl.timeline.model.TimelineItem
|
||||
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemTextBasedContent
|
||||
import io.element.android.libraries.core.bool.orFalse
|
||||
import io.element.android.features.messages.impl.timeline.model.event.isEdited
|
||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||
import io.element.android.libraries.designsystem.theme.components.Icon
|
||||
@@ -55,7 +54,7 @@ fun TimelineEventTimestampView(
|
||||
) {
|
||||
val formattedTime = event.sentTime
|
||||
val hasMessageSendingFailed = event.localSendState is LocalEventSendState.SendingFailed
|
||||
val isMessageEdited = (event.content as? TimelineItemTextBasedContent)?.isEdited.orFalse()
|
||||
val isMessageEdited = event.content.isEdited()
|
||||
val tint = if (hasMessageSendingFailed) MaterialTheme.colorScheme.error else null
|
||||
val clickModifier = if (hasMessageSendingFailed) {
|
||||
Modifier.combinedClickable(
|
||||
|
||||
@@ -131,7 +131,8 @@ class InReplyToDetailsProvider : PreviewParameterProvider<InReplyToDetails> {
|
||||
maxSelections = 1u,
|
||||
answers = persistentListOf(),
|
||||
votes = persistentMapOf(),
|
||||
endTime = null
|
||||
endTime = null,
|
||||
isEdited = false,
|
||||
),
|
||||
).map {
|
||||
aInReplyToDetails(
|
||||
|
||||
@@ -76,6 +76,7 @@ class TimelineItemContentPollFactory @Inject constructor(
|
||||
answerItems = answerItems,
|
||||
pollKind = content.kind,
|
||||
isEnded = isEndedPoll,
|
||||
isEdited = content.isEdited,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,3 +63,13 @@ fun TimelineItemEventContent.canReact(): Boolean =
|
||||
is TimelineItemRedactedContent,
|
||||
TimelineItemUnknownContent -> false
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the event content has been edited.
|
||||
*/
|
||||
fun TimelineItemEventContent.isEdited(): Boolean =
|
||||
when (this) {
|
||||
is TimelineItemTextBasedContent -> isEdited
|
||||
is TimelineItemPollContent -> isEdited
|
||||
else -> false
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ data class TimelineItemPollContent(
|
||||
val answerItems: List<PollAnswerItem>,
|
||||
val pollKind: PollKind,
|
||||
val isEnded: Boolean,
|
||||
val isEdited: Boolean
|
||||
) : TimelineItemEventContent {
|
||||
override val type: String = "TimelineItemPollContent"
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ fun aTimelineItemPollContent(
|
||||
question: String = aPollQuestion(),
|
||||
answerItems: List<PollAnswerItem> = aPollAnswerItemList(),
|
||||
isEnded: Boolean = false,
|
||||
isEdited: Boolean = false,
|
||||
): TimelineItemPollContent {
|
||||
return TimelineItemPollContent(
|
||||
eventId = EventId("\$anEventId"),
|
||||
@@ -42,5 +43,6 @@ fun aTimelineItemPollContent(
|
||||
question = question,
|
||||
answerItems = answerItems,
|
||||
isEnded = isEnded,
|
||||
isEdited = isEdited,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -235,6 +235,7 @@ internal class TimelineItemContentPollFactoryTest {
|
||||
answers = persistentListOf(A_POLL_ANSWER_1, A_POLL_ANSWER_2, A_POLL_ANSWER_3, A_POLL_ANSWER_4),
|
||||
votes = votes,
|
||||
endTime = endTime,
|
||||
isEdited = false,
|
||||
)
|
||||
|
||||
private fun aTimelineItemPollContent(
|
||||
@@ -253,6 +254,7 @@ internal class TimelineItemContentPollFactoryTest {
|
||||
answerItems = answerItems,
|
||||
pollKind = pollKind,
|
||||
isEnded = isEnded,
|
||||
isEdited = false,
|
||||
)
|
||||
|
||||
private fun aPollAnswerItem(
|
||||
|
||||
@@ -49,7 +49,8 @@ data class PollContent(
|
||||
val maxSelections: ULong,
|
||||
val answers: ImmutableList<PollAnswer>,
|
||||
val votes: ImmutableMap<String, ImmutableList<UserId>>,
|
||||
val endTime: ULong?
|
||||
val endTime: ULong?,
|
||||
val isEdited: Boolean,
|
||||
) : EventContent
|
||||
|
||||
data class UnableToDecryptContent(
|
||||
|
||||
@@ -113,6 +113,7 @@ class TimelineEventContentMapper(private val eventMessageMapper: EventMessageMap
|
||||
vote.value.map { userId -> UserId(userId) }.toImmutableList()
|
||||
}.toImmutableMap(),
|
||||
endTime = kind.endTime,
|
||||
isEdited = kind.hasBeenEdited,
|
||||
)
|
||||
}
|
||||
is TimelineItemContentKind.UnableToDecrypt -> {
|
||||
|
||||
@@ -191,5 +191,6 @@ fun aPollContent(
|
||||
maxSelections = 1u,
|
||||
answers = answers,
|
||||
votes = persistentMapOf(),
|
||||
endTime = null
|
||||
endTime = null,
|
||||
isEdited = false,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user