Fix bunch of issues around login/logout and introduces messages feature

This commit is contained in:
ganfra 2022-11-04 14:50:30 +01:00
parent bb88919bb3
commit 823cef8b7c
19 changed files with 314 additions and 89 deletions

View file

@ -14,11 +14,13 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.tooling.preview.Preview
import com.airbnb.mvrx.Loading
import com.airbnb.mvrx.Success
import com.airbnb.mvrx.compose.collectAsState
import com.airbnb.mvrx.compose.mavericksViewModel
import io.element.android.x.core.data.LogCompositions
import io.element.android.x.designsystem.ElementXTheme
import io.element.android.x.designsystem.components.ProgressDialog
import io.element.android.x.designsystem.components.avatar.AvatarData
import io.element.android.x.features.roomlist.components.RoomItem
import io.element.android.x.features.roomlist.components.RoomListTopBar
@ -46,7 +48,8 @@ fun RoomListScreen(
roomSummaries = roomSummaries().orEmpty(),
matrixUser = matrixUser(),
onRoomClicked = onRoomClicked,
onLogoutClicked = viewModel::logout
onLogoutClicked = viewModel::logout,
isLoginOut = logoutAction is Loading
)
}
@ -56,6 +59,7 @@ fun RoomListContent(
matrixUser: MatrixUser?,
onRoomClicked: (RoomId) -> Unit,
onLogoutClicked: () -> Unit,
isLoginOut: Boolean,
) {
val appBarState = rememberTopAppBarState()
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(appBarState)
@ -75,6 +79,9 @@ fun RoomListContent(
}
}
)
if (isLoginOut) {
ProgressDialog("Login out...")
}
}
@ -86,7 +93,8 @@ private fun PreviewableRoomListContent() {
roomSummaries = stubbedRoomSummaries(),
matrixUser = MatrixUser("User#1", avatarData = AvatarData("U")),
onRoomClicked = {},
onLogoutClicked = {}
onLogoutClicked = {},
isLoginOut = false
)
}
}
@ -99,7 +107,8 @@ private fun PreviewableDarkRoomListContent() {
roomSummaries = stubbedRoomSummaries(),
matrixUser = MatrixUser("User#1", avatarData = AvatarData("U")),
onRoomClicked = {},
onLogoutClicked = {}
onLogoutClicked = {},
isLoginOut = true
)
}
}

View file

@ -1,9 +1,6 @@
package io.element.android.x.features.roomlist
import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.Loading
import com.airbnb.mvrx.MavericksViewModel
import com.airbnb.mvrx.Success
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.AvatarSize
@ -14,6 +11,8 @@ import io.element.android.x.matrix.MatrixClient
import io.element.android.x.matrix.MatrixInstance
import io.element.android.x.matrix.room.RoomSummary
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
@ -47,7 +46,12 @@ class RoomListViewModel(initialState: RoomListViewState) :
val userAvatarUrl = client.loadUserAvatarURLString().getOrNull()
val userDisplayName = client.loadUserDisplayName().getOrNull()
val avatarData =
loadAvatarData(client, userDisplayName ?: client.userId().value, userAvatarUrl, AvatarSize.SMALL)
loadAvatarData(
client,
userDisplayName ?: client.userId().value,
userAvatarUrl,
AvatarSize.SMALL
)
MatrixUser(
username = userDisplayName ?: client.userId().value,
avatarUrl = userAvatarUrl,
@ -101,7 +105,11 @@ class RoomListViewModel(initialState: RoomListViewState) :
): AvatarData {
val mediaContent = url?.let {
val mediaSource = mediaSourceFromUrl(it)
client.loadMediaThumbnailForSource(mediaSource, size.value.toLong(), size.value.toLong())
client.loadMediaThumbnailForSource(
mediaSource,
size.value.toLong(),
size.value.toLong()
)
}
return mediaContent?.fold(
{ it },
@ -113,18 +121,17 @@ class RoomListViewModel(initialState: RoomListViewState) :
private fun handleLogout() {
viewModelScope.launch {
setState { copy(logoutAction = Loading()) }
try {
suspend {
delay(2000)
getClient().logout()
setState { copy(logoutAction = Success(Unit)) }
} catch (throwable: Throwable) {
setState { copy(logoutAction = Fail(throwable)) }
}.execute {
copy(logoutAction = it)
}
}
}
private suspend fun getClient(): MatrixClient {
return matrix.restoreSession()!!
return matrix.matrixClient().first().get()
}
override fun onCleared() {