Roomlist: Extract State and Events
This commit is contained in:
parent
9868654c78
commit
a53aae132d
6 changed files with 33 additions and 34 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 = {},
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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,
|
||||||
|
)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue