diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt index debea82cf0..dff12448bf 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt @@ -391,7 +391,7 @@ private fun MessagesViewContent( Box { val scrollBehavior = PinnedMessagesBannerViewDefaults.rememberScrollBehavior( - pinnedMessagesCount = state.pinnedMessagesBannerState.pinnedMessagesCount(), + pinnedMessagesCount = (state.pinnedMessagesBannerState as? PinnedMessagesBannerState.Visible)?.pinnedMessagesCount() ?: 0, ) TimelineView( state = state.timelineState, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerState.kt index ff36ba8999..244ade3a5a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerState.kt @@ -10,14 +10,30 @@ package io.element.android.features.messages.impl.pinned.banner import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.AnnotatedString import io.element.android.libraries.designsystem.text.toAnnotatedString import io.element.android.libraries.ui.strings.CommonStrings @Immutable sealed interface PinnedMessagesBannerState { data object Hidden : PinnedMessagesBannerState - sealed interface Visible : PinnedMessagesBannerState + sealed interface Visible : PinnedMessagesBannerState { + fun pinnedMessagesCount() = when (this) { + is Loading -> expectedPinnedMessagesCount + is Loaded -> loadedPinnedMessagesCount + } + + fun currentPinnedMessageIndex() = when (this) { + is Loading -> expectedPinnedMessagesCount - 1 + is Loaded -> currentPinnedMessageIndex + } + + @Composable + fun formattedMessage() = when (this) { + is Loading -> stringResource(id = CommonStrings.screen_room_pinned_banner_loading_description).toAnnotatedString() + is Loaded -> currentPinnedMessage.formatted + } + } + data class Loading(val expectedPinnedMessagesCount: Int) : Visible data class Loaded( val currentPinnedMessage: PinnedMessagesBannerItem, @@ -25,23 +41,4 @@ sealed interface PinnedMessagesBannerState { val loadedPinnedMessagesCount: Int, val eventSink: (PinnedMessagesBannerEvents) -> Unit ) : Visible - - fun pinnedMessagesCount() = when (this) { - is Hidden -> 0 - is Loading -> expectedPinnedMessagesCount - is Loaded -> loadedPinnedMessagesCount - } - - fun currentPinnedMessageIndex() = when (this) { - is Hidden -> 0 - is Loading -> expectedPinnedMessagesCount - 1 - is Loaded -> currentPinnedMessageIndex - } - - @Composable - fun formattedMessage() = when (this) { - is Hidden -> AnnotatedString("") - is Loading -> stringResource(id = CommonStrings.screen_room_pinned_banner_loading_description).toAnnotatedString() - is Loaded -> currentPinnedMessage.formatted - } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerView.kt index aef0848b1e..194cc433f4 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerView.kt @@ -78,7 +78,7 @@ fun PinnedMessagesBannerView( @Composable private fun PinnedMessagesBannerRow( - state: PinnedMessagesBannerState, + state: PinnedMessagesBannerState.Visible, onClick: (EventId) -> Unit, onViewAllClick: () -> Unit, modifier: Modifier = Modifier, diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt index ecd069585f..f1fcd7e787 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/pinned/banner/PinnedMessagesBannerPresenterTest.kt @@ -62,7 +62,7 @@ class PinnedMessagesBannerPresenterTest { val presenter = createPinnedMessagesBannerPresenter(room = room) presenter.test { skipItems(2) - val loadingState = awaitItem() + val loadingState = awaitItem() as PinnedMessagesBannerState.Loading assertThat(loadingState).isEqualTo(PinnedMessagesBannerState.Loading(1)) assertThat(loadingState.pinnedMessagesCount()).isEqualTo(1) assertThat(loadingState.currentPinnedMessageIndex()).isEqualTo(0) @@ -167,7 +167,8 @@ class PinnedMessagesBannerPresenterTest { val presenter = createPinnedMessagesBannerPresenter(room = room) presenter.test { skipItems(2) - awaitItem().also { loadingState -> + awaitItem().also { state -> + val loadingState = state as PinnedMessagesBannerState.Loading assertThat(loadingState).isEqualTo(PinnedMessagesBannerState.Loading(1)) assertThat(loadingState.pinnedMessagesCount()).isEqualTo(1) assertThat(loadingState.currentPinnedMessageIndex()).isEqualTo(0)