Clean RoomListViewModel

This commit is contained in:
ganfra 2022-11-10 18:49:09 +01:00
parent a824a68650
commit 089e1da4b7
2 changed files with 51 additions and 64 deletions

View file

@ -1,5 +0,0 @@
package io.element.android.x.features.roomlist
sealed interface RoomListActions {
object Logout : RoomListActions
}

View file

@ -1,6 +1,8 @@
package io.element.android.x.features.roomlist package io.element.android.x.features.roomlist
import com.airbnb.mvrx.MavericksViewModel import com.airbnb.mvrx.MavericksViewModel
import com.airbnb.mvrx.MavericksViewModelFactory
import com.airbnb.mvrx.ViewModelContext
import io.element.android.x.core.data.parallelMap import io.element.android.x.core.data.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
@ -13,41 +15,54 @@ import io.element.android.x.matrix.media.MediaResolver
import io.element.android.x.matrix.room.RoomSummary import io.element.android.x.matrix.room.RoomSummary
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.matrix.rustcomponents.sdk.mediaSourceFromUrl
class RoomListViewModel(initialState: RoomListViewState) : class RoomListViewModel(
private val client: MatrixClient,
initialState: RoomListViewState
) :
MavericksViewModel<RoomListViewState>(initialState) { MavericksViewModel<RoomListViewState>(initialState) {
private val matrix = MatrixInstance.getInstance() companion object : MavericksViewModelFactory<RoomListViewModel, RoomListViewState> {
override fun create(
viewModelContext: ViewModelContext,
state: RoomListViewState
): RoomListViewModel {
val matrix = MatrixInstance.getInstance()
val client = matrix.activeClient()
return RoomListViewModel(
client,
state
)
}
}
private val lastMessageFormatter = LastMessageFormatter() private val lastMessageFormatter = LastMessageFormatter()
init { init {
handleInit() handleInit()
} }
fun handle(action: RoomListActions) {
when (action) {
RoomListActions.Logout -> handleLogout()
}
}
fun logout() { fun logout() {
handleLogout() viewModelScope.launch {
suspend {
delay(2000)
client.logout()
}.execute {
copy(logoutAction = it)
}
}
} }
private fun handleInit() { private fun handleInit() {
viewModelScope.launch {
val client = getClient()
suspend { suspend {
val userAvatarUrl = client.loadUserAvatarURLString().getOrNull() val userAvatarUrl = client.loadUserAvatarURLString().getOrNull()
val userDisplayName = client.loadUserDisplayName().getOrNull() val userDisplayName = client.loadUserDisplayName().getOrNull()
val avatarData = val avatarData =
loadAvatarData( loadAvatarData(
client,
userDisplayName ?: client.userId().value, userDisplayName ?: client.userId().value,
userAvatarUrl, userAvatarUrl,
AvatarSize.SMALL AvatarSize.SMALL
@ -60,19 +75,16 @@ class RoomListViewModel(initialState: RoomListViewState) :
}.execute { }.execute {
copy(user = it) copy(user = it)
} }
client.roomSummaryDataSource().roomSummaries() client.roomSummaryDataSource().roomSummaries()
.map { roomSummaries -> .map(::mapRoomSummaries)
mapRoomSummaries(client, roomSummaries)
}
.flowOn(Dispatchers.Default) .flowOn(Dispatchers.Default)
.execute { .execute {
copy(rooms = it) copy(rooms = it)
} }
} }
}
private suspend fun mapRoomSummaries( private suspend fun mapRoomSummaries(
client: MatrixClient,
roomSummaries: List<RoomSummary> roomSummaries: List<RoomSummary>
): List<RoomListRoomSummary> { ): List<RoomListRoomSummary> {
return roomSummaries.parallelMap { roomSummary -> return roomSummaries.parallelMap { roomSummary ->
@ -80,7 +92,6 @@ class RoomListViewModel(initialState: RoomListViewState) :
is RoomSummary.Empty -> RoomListRoomSummary.placeholder(roomSummary.identifier) is RoomSummary.Empty -> RoomListRoomSummary.placeholder(roomSummary.identifier)
is RoomSummary.Filled -> { is RoomSummary.Filled -> {
val avatarData = loadAvatarData( val avatarData = loadAvatarData(
client,
roomSummary.details.name, roomSummary.details.name,
roomSummary.details.avatarURLString roomSummary.details.avatarURLString
) )
@ -98,7 +109,6 @@ class RoomListViewModel(initialState: RoomListViewState) :
} }
private suspend fun loadAvatarData( private suspend fun loadAvatarData(
client: MatrixClient,
name: String, name: String,
url: String?, url: String?,
size: AvatarSize = AvatarSize.MEDIUM size: AvatarSize = AvatarSize.MEDIUM
@ -108,22 +118,4 @@ class RoomListViewModel(initialState: RoomListViewState) :
return AvatarData(name, model, size) return AvatarData(name, model, size)
} }
private fun handleLogout() {
viewModelScope.launch {
suspend {
delay(2000)
getClient().logout()
}.execute {
copy(logoutAction = it)
}
}
}
private suspend fun getClient(): MatrixClient {
return matrix.client().first().get()
}
override fun onCleared() {
super.onCleared()
}
} }