Signout - WIP
This commit is contained in:
parent
420bfe9a66
commit
93934d6551
8 changed files with 77 additions and 47 deletions
|
|
@ -7,7 +7,7 @@ import androidx.activity.result.contract.ActivityResultContracts
|
|||
import androidx.activity.viewModels
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import io.element.android.x.ui.screen.login.LoginActivity
|
||||
import io.element.android.x.ui.screen.login.RoomListActivity
|
||||
import io.element.android.x.ui.screen.roomlist.RoomListActivity
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class MainActivity : ComponentActivity() {
|
||||
|
|
|
|||
|
|
@ -1,5 +0,0 @@
|
|||
package io.element.android.x.ui.screen.login
|
||||
|
||||
sealed interface RoomListActions {
|
||||
object LoadMore : RoomListActions
|
||||
}
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
package io.element.android.x.ui.screen.login
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import io.element.android.x.sdk.matrix.MatrixInstance
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
|
||||
class RoomListViewModel : ViewModel() {
|
||||
|
||||
private val matrix = MatrixInstance.getInstance()
|
||||
|
||||
private val _state = MutableStateFlow(RoomListViewState())
|
||||
val state = _state.asStateFlow()
|
||||
|
||||
init {
|
||||
observeState()
|
||||
}
|
||||
|
||||
private fun observeState() {
|
||||
// TODO Update submitEnabled when other state members are updated.
|
||||
}
|
||||
|
||||
fun handle(action: RoomListActions) {
|
||||
when (action) {
|
||||
RoomListActions.LoadMore -> TODO()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
package io.element.android.x.ui.screen.login
|
||||
|
||||
data class RoomListViewState(
|
||||
val list: List<String> = emptyList(),
|
||||
val canLoadMore: Boolean = false,
|
||||
)
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
package io.element.android.x.ui.screen.roomlist
|
||||
|
||||
sealed interface RoomListActions {
|
||||
object Logout : RoomListActions
|
||||
object LoadMore : RoomListActions
|
||||
}
|
||||
|
|
@ -1,28 +1,26 @@
|
|||
package io.element.android.x.ui.screen.login
|
||||
package io.element.android.x.ui.screen.roomlist
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.activity.viewModels
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Surface
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.airbnb.mvrx.compose.mavericksViewModel
|
||||
import io.element.android.x.ui.theme.ElementXTheme
|
||||
|
||||
class RoomListActivity : ComponentActivity() {
|
||||
|
||||
private val viewModel: RoomListViewModel by viewModels()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
setContent {
|
||||
ElementXTheme {
|
||||
val viewModel: RoomListViewModel = mavericksViewModel()
|
||||
// A surface container using the 'background' color from the theme
|
||||
Surface(
|
||||
modifier = Modifier
|
||||
|
|
@ -33,6 +31,7 @@ class RoomListActivity : ComponentActivity() {
|
|||
Column(
|
||||
modifier = Modifier.fillMaxSize()
|
||||
) {
|
||||
OptionMenu(viewModel)
|
||||
/* TODO
|
||||
val state = viewModel.state.collectAsState().value
|
||||
RoomListHeader()
|
||||
|
|
@ -44,4 +43,19 @@ class RoomListActivity : ComponentActivity() {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalMaterial3Api::class)
|
||||
@Composable
|
||||
private fun OptionMenu(viewModel: RoomListViewModel) {
|
||||
TopAppBar(
|
||||
title = { Text("Room List") },
|
||||
actions = {
|
||||
Button(
|
||||
onClick = { viewModel.handle(RoomListActions.Logout) }
|
||||
) {
|
||||
Text(text = "logout")
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
package io.element.android.x.ui.screen.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.sdk.matrix.MatrixClient
|
||||
import io.element.android.x.sdk.matrix.MatrixInstance
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class RoomListViewModel(initialState: RoomListViewState) :
|
||||
MavericksViewModel<RoomListViewState>(initialState) {
|
||||
|
||||
private val matrix = MatrixInstance.getInstance()
|
||||
|
||||
fun handle(action: RoomListActions) {
|
||||
when (action) {
|
||||
RoomListActions.LoadMore -> TODO()
|
||||
RoomListActions.Logout -> handleLogout()
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleLogout() {
|
||||
viewModelScope.launch {
|
||||
setState { copy(logoutAction = Loading()) }
|
||||
try {
|
||||
getClient().logout()
|
||||
setState { copy(logoutAction = Success(Unit)) }
|
||||
} catch (throwable: Throwable) {
|
||||
setState { copy(logoutAction = Fail(throwable)) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private suspend fun getClient(): MatrixClient {
|
||||
return matrix.restoreSession()!!
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package io.element.android.x.ui.screen.roomlist
|
||||
|
||||
import com.airbnb.mvrx.Async
|
||||
import com.airbnb.mvrx.MavericksState
|
||||
import com.airbnb.mvrx.Uninitialized
|
||||
|
||||
data class RoomListViewState(
|
||||
val list: List<String> = emptyList(),
|
||||
val canLoadMore: Boolean = false,
|
||||
val logoutAction: Async<Unit> = Uninitialized,
|
||||
) : MavericksState
|
||||
Loading…
Add table
Add a link
Reference in a new issue