Skip to content

Commit a27d276

Browse files
authored
Merge pull request #3224 from element-hq/feature/fga/compose_reaction_stability
Compose : add immutability to some Reaction classes
2 parents 5eef7c1 + 2f0e9eb commit a27d276

File tree

6 files changed

+18
-16
lines changed

6 files changed

+18
-16
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryPresenter.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class ReactionSummaryPresenter @Inject constructor(
4747
fun handleEvents(event: ReactionSummaryEvents) {
4848
when (event) {
4949
is ReactionSummaryEvents.ShowReactionSummary -> target.value = ReactionSummaryState.Summary(
50-
reactions = event.reactions,
50+
reactions = event.reactions.toImmutableList(),
5151
selectedKey = event.selectedKey,
5252
selectedEventId = event.eventId
5353
)
@@ -73,8 +73,8 @@ class ReactionSummaryPresenter @Inject constructor(
7373
avatarUrl = member?.avatarUrl
7474
)
7575
sender.copy(user = user)
76-
})
77-
})
76+
}.toImmutableList())
77+
}.toImmutableList())
7878
}
7979
}
8080
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/reactionsummary/ReactionSummaryState.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@ package io.element.android.features.messages.impl.timeline.components.reactionsu
1818

1919
import io.element.android.features.messages.impl.timeline.model.AggregatedReaction
2020
import io.element.android.libraries.matrix.api.core.EventId
21+
import kotlinx.collections.immutable.ImmutableList
2122

2223
data class ReactionSummaryState(
2324
val target: Summary?,
2425
val eventSink: (ReactionSummaryEvents) -> Unit
2526
) {
2627
data class Summary(
27-
val reactions: List<AggregatedReaction>,
28+
val reactions: ImmutableList<AggregatedReaction>,
2829
val selectedKey: String,
2930
val selectedEventId: EventId
3031
)

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemEventFactory.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ class TimelineItemEventFactory @Inject constructor(
117117
sentTime = timeFormatter.format(date),
118118
)
119119
}
120+
.toImmutableList()
120121
)
121122
}
122123
// Sort aggregated reactions by count and then timestamp ascending, using
@@ -127,7 +128,9 @@ class TimelineItemEventFactory @Inject constructor(
127128
compareByDescending<AggregatedReaction> { it.count }
128129
.thenBy { it.senders[0].timestamp }
129130
)
130-
return TimelineItemReactions(aggregatedReactions.toImmutableList())
131+
return TimelineItemReactions(
132+
reactions = aggregatedReactions.toImmutableList()
133+
)
131134
}
132135

133136
private fun MatrixTimelineItem.Event.computeReadReceiptState(

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/AggregatedReaction.kt

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package io.element.android.features.messages.impl.timeline.model
1818

1919
import io.element.android.libraries.core.extensions.ellipsize
2020
import io.element.android.libraries.matrix.api.core.UserId
21+
import kotlinx.collections.immutable.ImmutableList
2122

2223
/**
2324
* Length at which we ellipsize a reaction key for display
@@ -35,28 +36,22 @@ private const val MAX_DISPLAY_CHARS = 16
3536
data class AggregatedReaction(
3637
val currentUserId: UserId,
3738
val key: String,
38-
val senders: List<AggregatedReactionSender>
39+
val senders: ImmutableList<AggregatedReactionSender>
3940
) {
4041
/**
4142
* The key to be displayed on screen.
4243
*
4344
* See [MAX_DISPLAY_CHARS].
4445
*/
45-
val displayKey: String by lazy {
46-
key.ellipsize(MAX_DISPLAY_CHARS)
47-
}
46+
val displayKey: String = key.ellipsize(MAX_DISPLAY_CHARS)
4847

4948
/**
5049
* The number of users who reacted with this key.
5150
*/
52-
val count: Int by lazy {
53-
senders.count()
54-
}
51+
val count: Int = senders.count()
5552

5653
/**
5754
* True if the reaction has (also) been sent by the current user.
5855
*/
59-
val isHighlighted: Boolean by lazy {
60-
senders.any { it.senderId.value == currentUserId.value }
61-
}
56+
val isHighlighted: Boolean = senders.any { it.senderId == currentUserId }
6257
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/AggregatedReactionProvider.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package io.element.android.features.messages.impl.timeline.model
1818

1919
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
2020
import io.element.android.libraries.matrix.api.core.UserId
21+
import kotlinx.collections.immutable.toImmutableList
2122
import java.text.DateFormat
2223
import java.util.Date
2324

@@ -53,6 +54,6 @@ fun anAggregatedReaction(
5354
return AggregatedReaction(
5455
currentUserId = userId,
5556
key = key,
56-
senders = senders
57+
senders = senders.toImmutableList()
5758
)
5859
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/AggregatedReactionSender.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616

1717
package io.element.android.features.messages.impl.timeline.model
1818

19+
import androidx.compose.runtime.Immutable
1920
import io.element.android.libraries.matrix.api.core.UserId
2021
import io.element.android.libraries.matrix.api.user.MatrixUser
2122
import java.util.Date
2223

24+
@Immutable
2325
data class AggregatedReactionSender(
2426
val senderId: UserId,
2527
val timestamp: Date,

0 commit comments

Comments
 (0)