Use EventSink lambda in state instead of Flow in Presenter

This commit is contained in:
ganfra 2023-01-11 15:53:52 +01:00
parent 56e54bb172
commit 1a0c9df1da
43 changed files with 277 additions and 490 deletions

View file

@ -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
)
}

View file

@ -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

View file

@ -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,
)
}

View file

@ -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
}

View file

@ -10,4 +10,5 @@ data class RoomListState(
val roomList: ImmutableList<RoomListRoomSummary>,
val filter: String,
val isLoginOut: Boolean,
val eventSink: (RoomListEvents) -> Unit = {}
)