Signout - WIP
This commit is contained in:
parent
fba10a0340
commit
2d402c6847
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.activity.viewModels
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import io.element.android.x.ui.screen.login.LoginActivity
|
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
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
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 android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.viewModels
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.material3.Surface
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.collectAsState
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
import com.airbnb.mvrx.compose.mavericksViewModel
|
||||||
import io.element.android.x.ui.theme.ElementXTheme
|
import io.element.android.x.ui.theme.ElementXTheme
|
||||||
|
|
||||||
class RoomListActivity : ComponentActivity() {
|
class RoomListActivity : ComponentActivity() {
|
||||||
|
|
||||||
private val viewModel: RoomListViewModel by viewModels()
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
setContent {
|
setContent {
|
||||||
ElementXTheme {
|
ElementXTheme {
|
||||||
|
val viewModel: RoomListViewModel = mavericksViewModel()
|
||||||
// A surface container using the 'background' color from the theme
|
// A surface container using the 'background' color from the theme
|
||||||
Surface(
|
Surface(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
|
@ -33,6 +31,7 @@ class RoomListActivity : ComponentActivity() {
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier.fillMaxSize()
|
modifier = Modifier.fillMaxSize()
|
||||||
) {
|
) {
|
||||||
|
OptionMenu(viewModel)
|
||||||
/* TODO
|
/* TODO
|
||||||
val state = viewModel.state.collectAsState().value
|
val state = viewModel.state.collectAsState().value
|
||||||
RoomListHeader()
|
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