Roomlist: Extract State and Events

This commit is contained in:
ganfra
2023-01-04 11:36:32 +01:00
parent 9868654c78
commit a53aae132d
6 changed files with 33 additions and 34 deletions

View File

@@ -6,7 +6,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import io.element.android.x.features.roomlist.model.RoomListScreen
import io.element.android.x.features.roomlist.model.RoomListEvents
import io.element.android.x.matrix.core.RoomId
class RoomListNode(
@@ -18,15 +18,15 @@ class RoomListNode(
private val connector = presenterConnector(presenter)
private fun updateFilter(filter: String) {
connector.emitEvent(RoomListScreen.Event.UpdateFilter(filter))
connector.emitEvent(RoomListEvents.UpdateFilter(filter))
}
private fun updateVisibleRange(range: IntRange) {
connector.emitEvent((RoomListScreen.Event.UpdateVisibleRange(range)))
connector.emitEvent((RoomListEvents.UpdateVisibleRange(range)))
}
private fun logout() {
connector.emitEvent(RoomListScreen.Event.Logout)
connector.emitEvent(RoomListEvents.Logout)
}
@Composable

View File

@@ -14,9 +14,10 @@ import io.element.android.x.core.coroutine.parallelMap
import io.element.android.x.designsystem.components.avatar.AvatarData
import io.element.android.x.designsystem.components.avatar.AvatarSize
import io.element.android.x.features.roomlist.model.MatrixUser
import io.element.android.x.features.roomlist.model.RoomListEvents
import io.element.android.x.features.roomlist.model.RoomListRoomSummary
import io.element.android.x.features.roomlist.model.RoomListRoomSummaryPlaceholders
import io.element.android.x.features.roomlist.model.RoomListScreen
import io.element.android.x.features.roomlist.model.RoomListState
import io.element.android.x.matrix.MatrixClient
import io.element.android.x.matrix.media.MediaResolver
import io.element.android.x.matrix.room.RoomSummary
@@ -32,10 +33,10 @@ private const val extendedRangeSize = 40
class RoomListPresenter @Inject constructor(
private val client: MatrixClient,
private val lastMessageFormatter: LastMessageFormatter = LastMessageFormatter(),
) : Presenter<RoomListScreen.State, RoomListScreen.Event> {
) : Presenter<RoomListState, RoomListEvents> {
@Composable
override fun present(events: Flow<RoomListScreen.Event>): RoomListScreen.State {
override fun present(events: Flow<RoomListEvents>): RoomListState {
val matrixUser: MutableState<MatrixUser?> = remember {
mutableStateOf(null)
}
@@ -53,16 +54,16 @@ class RoomListPresenter @Inject constructor(
initialLoad(matrixUser)
events.collect { event ->
when (event) {
RoomListScreen.Event.Logout -> logout(isLoginOut)
is RoomListScreen.Event.UpdateFilter -> filter = event.newFilter
is RoomListScreen.Event.UpdateVisibleRange -> updateVisibleRange(event.range)
RoomListEvents.Logout -> logout(isLoginOut)
is RoomListEvents.UpdateFilter -> filter = event.newFilter
is RoomListEvents.UpdateVisibleRange -> updateVisibleRange(event.range)
}
}
}
LaunchedEffect(roomSummaries, filter) {
filteredRoomSummaries.value = updateFilteredRoomSummaries(roomSummaries, filter)
}
return RoomListScreen.State(
return RoomListState(
matrixUser = matrixUser.value,
roomList = filteredRoomSummaries.value,
filter = filter,

View File

@@ -28,14 +28,14 @@ import io.element.android.x.features.roomlist.components.RoomListTopBar
import io.element.android.x.features.roomlist.components.RoomSummaryRow
import io.element.android.x.features.roomlist.model.MatrixUser
import io.element.android.x.features.roomlist.model.RoomListRoomSummary
import io.element.android.x.features.roomlist.model.RoomListScreen
import io.element.android.x.features.roomlist.model.RoomListState
import io.element.android.x.features.roomlist.model.stubbedRoomSummaries
import io.element.android.x.matrix.core.RoomId
import kotlinx.collections.immutable.ImmutableList
@Composable
fun RoomListView(
state: RoomListScreen.State,
state: RoomListState,
modifier: Modifier = Modifier,
onRoomClicked: (RoomId) -> Unit = {},
onFilterChanged: (String) -> Unit = {},

View File

@@ -0,0 +1,7 @@
package io.element.android.x.features.roomlist.model
sealed interface RoomListEvents {
object Logout : RoomListEvents
data class UpdateFilter(val newFilter: String) : RoomListEvents
data class UpdateVisibleRange(val range: IntRange): RoomListEvents
}

View File

@@ -1,21 +0,0 @@
package io.element.android.x.features.roomlist.model
import androidx.compose.runtime.Stable
import kotlinx.collections.immutable.ImmutableList
object RoomListScreen {
@Stable
data class State(
val matrixUser: MatrixUser?,
val roomList: ImmutableList<RoomListRoomSummary>,
val filter: String,
val isLoginOut: Boolean,
)
sealed interface Event {
object Logout : Event
data class UpdateFilter(val newFilter: String) : Event
data class UpdateVisibleRange(val range: IntRange): Event
}
}

View File

@@ -0,0 +1,12 @@
package io.element.android.x.features.roomlist.model
import androidx.compose.runtime.Stable
import kotlinx.collections.immutable.ImmutableList
@Stable
data class RoomListState(
val matrixUser: MatrixUser?,
val roomList: ImmutableList<RoomListRoomSummary>,
val filter: String,
val isLoginOut: Boolean,
)