Fix bunch of issues around login/logout and introduces messages feature
This commit is contained in:
parent
bb88919bb3
commit
823cef8b7c
19 changed files with 314 additions and 89 deletions
|
|
@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue