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 androidx.compose.ui.Modifier
import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node 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 import io.element.android.x.matrix.core.RoomId
class RoomListNode( class RoomListNode(
@ -18,15 +18,15 @@ class RoomListNode(
private val connector = presenterConnector(presenter) private val connector = presenterConnector(presenter)
private fun updateFilter(filter: String) { private fun updateFilter(filter: String) {
connector.emitEvent(RoomListScreen.Event.UpdateFilter(filter)) connector.emitEvent(RoomListEvents.UpdateFilter(filter))
} }
private fun updateVisibleRange(range: IntRange) { private fun updateVisibleRange(range: IntRange) {
connector.emitEvent((RoomListScreen.Event.UpdateVisibleRange(range))) connector.emitEvent((RoomListEvents.UpdateVisibleRange(range)))
} }
private fun logout() { private fun logout() {
connector.emitEvent(RoomListScreen.Event.Logout) connector.emitEvent(RoomListEvents.Logout)
} }
@Composable @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.AvatarData
import io.element.android.x.designsystem.components.avatar.AvatarSize 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.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.RoomListRoomSummary
import io.element.android.x.features.roomlist.model.RoomListRoomSummaryPlaceholders 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.MatrixClient
import io.element.android.x.matrix.media.MediaResolver import io.element.android.x.matrix.media.MediaResolver
import io.element.android.x.matrix.room.RoomSummary import io.element.android.x.matrix.room.RoomSummary
@ -32,10 +33,10 @@ private const val extendedRangeSize = 40
class RoomListPresenter @Inject constructor( class RoomListPresenter @Inject constructor(
private val client: MatrixClient, private val client: MatrixClient,
private val lastMessageFormatter: LastMessageFormatter = LastMessageFormatter(), private val lastMessageFormatter: LastMessageFormatter = LastMessageFormatter(),
) : Presenter<RoomListScreen.State, RoomListScreen.Event> { ) : Presenter<RoomListState, RoomListEvents> {
@Composable @Composable
override fun present(events: Flow<RoomListScreen.Event>): RoomListScreen.State { override fun present(events: Flow<RoomListEvents>): RoomListState {
val matrixUser: MutableState<MatrixUser?> = remember { val matrixUser: MutableState<MatrixUser?> = remember {
mutableStateOf(null) mutableStateOf(null)
} }
@ -53,16 +54,16 @@ class RoomListPresenter @Inject constructor(
initialLoad(matrixUser) initialLoad(matrixUser)
events.collect { event -> events.collect { event ->
when (event) { when (event) {
RoomListScreen.Event.Logout -> logout(isLoginOut) RoomListEvents.Logout -> logout(isLoginOut)
is RoomListScreen.Event.UpdateFilter -> filter = event.newFilter is RoomListEvents.UpdateFilter -> filter = event.newFilter
is RoomListScreen.Event.UpdateVisibleRange -> updateVisibleRange(event.range) is RoomListEvents.UpdateVisibleRange -> updateVisibleRange(event.range)
} }
} }
} }
LaunchedEffect(roomSummaries, filter) { LaunchedEffect(roomSummaries, filter) {
filteredRoomSummaries.value = updateFilteredRoomSummaries(roomSummaries, filter) filteredRoomSummaries.value = updateFilteredRoomSummaries(roomSummaries, filter)
} }
return RoomListScreen.State( return RoomListState(
matrixUser = matrixUser.value, matrixUser = matrixUser.value,
roomList = filteredRoomSummaries.value, roomList = filteredRoomSummaries.value,
filter = filter, 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.components.RoomSummaryRow
import io.element.android.x.features.roomlist.model.MatrixUser 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.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.features.roomlist.model.stubbedRoomSummaries
import io.element.android.x.matrix.core.RoomId import io.element.android.x.matrix.core.RoomId
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
@Composable @Composable
fun RoomListView( fun RoomListView(
state: RoomListScreen.State, state: RoomListState,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onRoomClicked: (RoomId) -> Unit = {}, onRoomClicked: (RoomId) -> Unit = {},
onFilterChanged: (String) -> 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,
)