Clean RoomListViewModel
This commit is contained in:
parent
a824a68650
commit
089e1da4b7
2 changed files with 51 additions and 64 deletions
|
|
@ -1,5 +0,0 @@
|
||||||
package io.element.android.x.features.roomlist
|
|
||||||
|
|
||||||
sealed interface RoomListActions {
|
|
||||||
object Logout : RoomListActions
|
|
||||||
}
|
|
||||||
|
|
@ -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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue