Skip to content

Commit c609a7d

Browse files
committed
Pinned events : use correct ordering logic
1 parent d7edc7e commit c609a7d

File tree

4 files changed

+26
-30
lines changed

4 files changed

+26
-30
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenter.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ class PinnedMessagesBannerPresenter @Inject constructor(
5353
override fun present(): PinnedMessagesBannerState {
5454
val isFeatureEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.PinnedEvents).collectAsState(initial = false)
5555
var hasTimelineFailedToLoad by rememberSaveable { mutableStateOf(false) }
56-
var currentPinnedMessageIndex by rememberSaveable { mutableIntStateOf(0) }
56+
var currentPinnedMessageIndex by rememberSaveable { mutableIntStateOf(-1) }
5757
val knownPinnedMessagesCount by remember {
5858
room.roomInfoFlow.map { roomInfo -> roomInfo.pinnedEventIds.size }
59-
}.collectAsState(initial = null)
59+
}.collectAsState(initial = 0)
6060

6161
var pinnedItems by remember {
6262
mutableStateOf<ImmutableList<PinnedMessagesBannerItem>>(persistentListOf())
@@ -66,8 +66,8 @@ class PinnedMessagesBannerPresenter @Inject constructor(
6666
isFeatureEnabled = isFeatureEnabled,
6767
onItemsChange = { newItems ->
6868
val pinnedMessageCount = newItems.size
69-
if (currentPinnedMessageIndex >= pinnedMessageCount) {
70-
currentPinnedMessageIndex = 0
69+
if (currentPinnedMessageIndex >= pinnedMessageCount || currentPinnedMessageIndex < 0) {
70+
currentPinnedMessageIndex = pinnedMessageCount - 1
7171
}
7272
pinnedItems = newItems
7373
},
@@ -102,7 +102,7 @@ class PinnedMessagesBannerPresenter @Inject constructor(
102102
private fun pinnedMessagesBannerState(
103103
isFeatureEnabled: Boolean,
104104
hasTimelineFailed: Boolean,
105-
realPinnedMessagesCount: Int?,
105+
realPinnedMessagesCount: Int,
106106
pinnedItems: ImmutableList<PinnedMessagesBannerItem>,
107107
currentPinnedMessageIndex: Int,
108108
eventSink: (PinnedMessagesBannerEvents) -> Unit
@@ -111,7 +111,7 @@ class PinnedMessagesBannerPresenter @Inject constructor(
111111
return when {
112112
!isFeatureEnabled -> PinnedMessagesBannerState.Hidden
113113
hasTimelineFailed -> PinnedMessagesBannerState.Hidden
114-
realPinnedMessagesCount == null || realPinnedMessagesCount == 0 -> PinnedMessagesBannerState.Hidden
114+
realPinnedMessagesCount == 0 -> PinnedMessagesBannerState.Hidden
115115
currentPinnedMessage == null -> PinnedMessagesBannerState.Loading(realPinnedMessagesCount = realPinnedMessagesCount)
116116
else -> {
117117
PinnedMessagesBannerState.Loaded(

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerState.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,14 @@ import io.element.android.libraries.ui.strings.CommonStrings
2626
@Immutable
2727
sealed interface PinnedMessagesBannerState {
2828
data object Hidden : PinnedMessagesBannerState
29-
data class Loading(val realPinnedMessagesCount: Int) : PinnedMessagesBannerState
29+
sealed interface Visible : PinnedMessagesBannerState
30+
data class Loading(val realPinnedMessagesCount: Int) : Visible
3031
data class Loaded(
3132
val currentPinnedMessage: PinnedMessagesBannerItem,
3233
val currentPinnedMessageIndex: Int,
3334
val knownPinnedMessagesCount: Int,
3435
val eventSink: (PinnedMessagesBannerEvents) -> Unit
35-
) : PinnedMessagesBannerState
36+
) : Visible
3637

3738
fun pinnedMessagesCount() = when (this) {
3839
is Hidden -> 0
@@ -42,7 +43,7 @@ sealed interface PinnedMessagesBannerState {
4243

4344
fun currentPinnedMessageIndex() = when (this) {
4445
is Hidden -> 0
45-
is Loading -> 0
46+
is Loading -> realPinnedMessagesCount - 1
4647
is Loaded -> currentPinnedMessageIndex
4748
}
4849

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerView.kt

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -74,22 +74,11 @@ fun PinnedMessagesBannerView(
7474
Box(modifier = modifier) {
7575
when (state) {
7676
PinnedMessagesBannerState.Hidden -> Unit
77-
is PinnedMessagesBannerState.Loading -> {
77+
is PinnedMessagesBannerState.Visible -> {
7878
PinnedMessagesBannerRow(
7979
state = state,
80+
onClick = onClick,
8081
onViewAllClick = onViewAllClick,
81-
modifier = Modifier.clickable(onClick = { }),
82-
)
83-
}
84-
is PinnedMessagesBannerState.Loaded -> {
85-
PinnedMessagesBannerRow(
86-
state = state,
87-
onViewAllClick = onViewAllClick,
88-
modifier = Modifier.clickable(
89-
onClick = {
90-
onClick(state.currentPinnedMessage.eventId)
91-
state.eventSink(PinnedMessagesBannerEvents.MoveToNextPinned)
92-
}),
9382
)
9483
}
9584
}
@@ -99,6 +88,7 @@ fun PinnedMessagesBannerView(
9988
@Composable
10089
fun PinnedMessagesBannerRow(
10190
state: PinnedMessagesBannerState,
91+
onClick: (EventId) -> Unit,
10292
onViewAllClick: () -> Unit,
10393
modifier: Modifier = Modifier,
10494
) {
@@ -108,7 +98,13 @@ fun PinnedMessagesBannerRow(
10898
.background(color = ElementTheme.colors.bgCanvasDefault)
10999
.fillMaxWidth()
110100
.drawBorder(borderColor)
111-
.heightIn(min = 64.dp),
101+
.heightIn(min = 64.dp)
102+
.clickable {
103+
if (state is PinnedMessagesBannerState.Loaded) {
104+
onClick(state.currentPinnedMessage.eventId)
105+
state.eventSink(PinnedMessagesBannerEvents.MoveToNextPinned)
106+
}
107+
},
112108
verticalAlignment = Alignment.CenterVertically,
113109
horizontalArrangement = spacedBy(10.dp)
114110
) {
@@ -202,7 +198,6 @@ private fun PinIndicators(
202198
state = lazyListState,
203199
verticalArrangement = spacedBy(2.dp),
204200
userScrollEnabled = false,
205-
reverseLayout = true
206201
) {
207202
items(pinsCount) { index ->
208203
Box(

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -140,25 +140,25 @@ class PinnedMessagesBannerPresenterTest {
140140
skipItems(2)
141141
awaitItem().also { loadedState ->
142142
loadedState as PinnedMessagesBannerState.Loaded
143-
assertThat(loadedState.currentPinnedMessageIndex).isEqualTo(0)
143+
assertThat(loadedState.currentPinnedMessageIndex).isEqualTo(1)
144144
assertThat(loadedState.knownPinnedMessagesCount).isEqualTo(2)
145-
assertThat(loadedState.currentPinnedMessage.formatted.text).isEqualTo(messageContent1.toString())
145+
assertThat(loadedState.currentPinnedMessage.formatted.text).isEqualTo(messageContent2.toString())
146146
loadedState.eventSink(PinnedMessagesBannerEvents.MoveToNextPinned)
147147
}
148148

149149
awaitItem().also { loadedState ->
150150
loadedState as PinnedMessagesBannerState.Loaded
151-
assertThat(loadedState.currentPinnedMessageIndex).isEqualTo(1)
151+
assertThat(loadedState.currentPinnedMessageIndex).isEqualTo(0)
152152
assertThat(loadedState.knownPinnedMessagesCount).isEqualTo(2)
153-
assertThat(loadedState.currentPinnedMessage.formatted.text).isEqualTo(messageContent2.toString())
153+
assertThat(loadedState.currentPinnedMessage.formatted.text).isEqualTo(messageContent1.toString())
154154
loadedState.eventSink(PinnedMessagesBannerEvents.MoveToNextPinned)
155155
}
156156

157157
awaitItem().also { loadedState ->
158158
loadedState as PinnedMessagesBannerState.Loaded
159-
assertThat(loadedState.currentPinnedMessageIndex).isEqualTo(0)
159+
assertThat(loadedState.currentPinnedMessageIndex).isEqualTo(1)
160160
assertThat(loadedState.knownPinnedMessagesCount).isEqualTo(2)
161-
assertThat(loadedState.currentPinnedMessage.formatted.text).isEqualTo(messageContent1.toString())
161+
assertThat(loadedState.currentPinnedMessage.formatted.text).isEqualTo(messageContent2.toString())
162162
}
163163
}
164164
}

0 commit comments

Comments
 (0)