Use EventSink lambda in state instead of Flow in Presenter
This commit is contained in:
parent
56e54bb172
commit
1a0c9df1da
43 changed files with 277 additions and 490 deletions
|
|
@ -30,18 +30,6 @@ class RoomListNode @AssistedInject constructor(
|
|||
|
||||
private val connector = presenterConnector(presenter)
|
||||
|
||||
private fun updateFilter(filter: String) {
|
||||
connector.emitEvent(RoomListEvents.UpdateFilter(filter))
|
||||
}
|
||||
|
||||
private fun updateVisibleRange(range: IntRange) {
|
||||
connector.emitEvent((RoomListEvents.UpdateVisibleRange(range)))
|
||||
}
|
||||
|
||||
private fun logout() {
|
||||
connector.emitEvent(RoomListEvents.Logout)
|
||||
}
|
||||
|
||||
private fun onRoomClicked(roomId: RoomId) {
|
||||
plugins<Callback>().forEach { it.onRoomClicked(roomId) }
|
||||
}
|
||||
|
|
@ -56,8 +44,6 @@ class RoomListNode @AssistedInject constructor(
|
|||
RoomListView(
|
||||
state = state,
|
||||
onRoomClicked = this::onRoomClicked,
|
||||
onFilterChanged = this::updateFilter,
|
||||
onScrollOver = this::updateVisibleRange,
|
||||
onOpenSettings = this::onOpenSettings
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,8 +7,10 @@ import androidx.compose.runtime.collectAsState
|
|||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.runtime.setValue
|
||||
import io.element.android.x.architecture.Presenter
|
||||
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
|
||||
|
|
@ -19,13 +21,12 @@ 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
|
||||
import io.element.android.x.architecture.Presenter
|
||||
import io.element.android.x.matrix.ui.model.MatrixUser
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
import kotlinx.collections.immutable.toImmutableList
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
import javax.inject.Inject
|
||||
|
||||
private const val extendedRangeSize = 40
|
||||
|
|
@ -33,10 +34,10 @@ private const val extendedRangeSize = 40
|
|||
class RoomListPresenter @Inject constructor(
|
||||
private val client: MatrixClient,
|
||||
private val lastMessageFormatter: LastMessageFormatter,
|
||||
) : Presenter<RoomListState, RoomListEvents> {
|
||||
) : Presenter<RoomListState> {
|
||||
|
||||
@Composable
|
||||
override fun present(events: Flow<RoomListEvents>): RoomListState {
|
||||
override fun present(): RoomListState {
|
||||
val matrixUser: MutableState<MatrixUser?> = remember {
|
||||
mutableStateOf(null)
|
||||
}
|
||||
|
|
@ -52,14 +53,15 @@ class RoomListPresenter @Inject constructor(
|
|||
}
|
||||
LaunchedEffect(Unit) {
|
||||
initialLoad(matrixUser)
|
||||
events.collect { event ->
|
||||
when (event) {
|
||||
RoomListEvents.Logout -> logout(isLoginOut)
|
||||
is RoomListEvents.UpdateFilter -> filter = event.newFilter
|
||||
is RoomListEvents.UpdateVisibleRange -> updateVisibleRange(event.range)
|
||||
}
|
||||
}
|
||||
|
||||
fun handleEvents(event: RoomListEvents) {
|
||||
when (event) {
|
||||
is RoomListEvents.UpdateFilter -> filter = event.newFilter
|
||||
is RoomListEvents.UpdateVisibleRange -> updateVisibleRange(event.range)
|
||||
}
|
||||
}
|
||||
|
||||
LaunchedEffect(roomSummaries, filter) {
|
||||
filteredRoomSummaries.value = updateFilteredRoomSummaries(roomSummaries, filter)
|
||||
}
|
||||
|
|
@ -67,7 +69,8 @@ class RoomListPresenter @Inject constructor(
|
|||
matrixUser = matrixUser.value,
|
||||
roomList = filteredRoomSummaries.value,
|
||||
filter = filter,
|
||||
isLoginOut = isLoginOut.value
|
||||
isLoginOut = isLoginOut.value,
|
||||
eventSink = ::handleEvents
|
||||
)
|
||||
}
|
||||
|
||||
|
|
@ -83,7 +86,7 @@ class RoomListPresenter @Inject constructor(
|
|||
}.toImmutableList()
|
||||
}
|
||||
|
||||
private suspend fun initialLoad(matrixUser: MutableState<MatrixUser?>) {
|
||||
private fun CoroutineScope.initialLoad(matrixUser: MutableState<MatrixUser?>) = launch {
|
||||
val userAvatarUrl = client.loadUserAvatarURLString().getOrNull()
|
||||
val userDisplayName = client.loadUserDisplayName().getOrNull()
|
||||
val avatarData =
|
||||
|
|
@ -100,13 +103,6 @@ class RoomListPresenter @Inject constructor(
|
|||
)
|
||||
}
|
||||
|
||||
private suspend fun logout(isLoginOut: MutableState<Boolean>) {
|
||||
isLoginOut.value = true
|
||||
delay(2000)
|
||||
client.logout()
|
||||
isLoginOut.value = false
|
||||
}
|
||||
|
||||
private fun updateVisibleRange(range: IntRange) {
|
||||
if (range.isEmpty()) return
|
||||
val midExtendedRangeSize = extendedRangeSize / 2
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ import io.element.android.x.designsystem.ElementXTheme
|
|||
import io.element.android.x.designsystem.components.avatar.AvatarData
|
||||
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.RoomListEvents
|
||||
import io.element.android.x.features.roomlist.model.RoomListRoomSummary
|
||||
import io.element.android.x.features.roomlist.model.RoomListState
|
||||
import io.element.android.x.features.roomlist.model.stubbedRoomSummaries
|
||||
|
|
@ -54,19 +55,26 @@ fun RoomListView(
|
|||
state: RoomListState,
|
||||
modifier: Modifier = Modifier,
|
||||
onRoomClicked: (RoomId) -> Unit = {},
|
||||
onFilterChanged: (String) -> Unit = {},
|
||||
onOpenSettings: () -> Unit = {},
|
||||
onScrollOver: (IntRange) -> Unit = {},
|
||||
) {
|
||||
|
||||
fun onFilterChanged(filter: String){
|
||||
state.eventSink(RoomListEvents.UpdateFilter(filter))
|
||||
}
|
||||
|
||||
fun onVisibleRangedChanged(range: IntRange){
|
||||
state.eventSink(RoomListEvents.UpdateVisibleRange(range))
|
||||
}
|
||||
|
||||
RoomListView(
|
||||
roomSummaries = state.roomList,
|
||||
matrixUser = state.matrixUser,
|
||||
filter = state.filter,
|
||||
modifier = modifier,
|
||||
onRoomClicked = onRoomClicked,
|
||||
onFilterChanged = onFilterChanged,
|
||||
onFilterChanged = ::onFilterChanged,
|
||||
onOpenSettings = onOpenSettings,
|
||||
onScrollOver = onScrollOver,
|
||||
onScrollOver = ::onVisibleRangedChanged,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,4 +10,5 @@ data class RoomListState(
|
|||
val roomList: ImmutableList<RoomListRoomSummary>,
|
||||
val filter: String,
|
||||
val isLoginOut: Boolean,
|
||||
val eventSink: (RoomListEvents) -> Unit = {}
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue