Change screen: propagate current homeserver value

This commit is contained in:
Benoit Marty 2022-11-16 10:42:37 +01:00
parent 8fb60f3b86
commit d96a714bd9
7 changed files with 34 additions and 13 deletions

View file

@ -30,7 +30,6 @@ fun OnBoardingScreenNavigation(navigator: DestinationsNavigator) {
@Composable
fun LoginScreenNavigation(navigator: DestinationsNavigator) {
LoginScreen(
homeserver = "matrix.org",
onChangeServer = {
navigator.navigate(ChangeServerScreenNavigationDestination)
},

View file

@ -25,21 +25,21 @@ import com.airbnb.mvrx.Success
import com.airbnb.mvrx.compose.collectAsState
import com.airbnb.mvrx.compose.mavericksViewModel
import io.element.android.x.designsystem.ElementXTheme
import timber.log.Timber
@Composable
fun LoginScreen(
viewModel: LoginViewModel = mavericksViewModel(),
homeserver: String,
onChangeServer: () -> Unit = { },
onLoginWithSuccess: () -> Unit = { },
) {
val state: LoginViewState by viewModel.collectAsState()
LaunchedEffect(key1 = Unit) {
viewModel.homeserver = homeserver
Timber.d("resume")
viewModel.onResume()
}
LoginContent(
state = state,
homeserver = homeserver,
onChangeServer = onChangeServer,
onLoginChanged = viewModel::onSetName,
onPasswordChanged = viewModel::onSetPassword,
@ -53,7 +53,6 @@ fun LoginScreen(
@Composable
fun LoginContent(
state: LoginViewState,
homeserver: String = "",
onChangeServer: () -> Unit = {},
onLoginChanged: (String) -> Unit = {},
onPasswordChanged: (String) -> Unit = {},
@ -92,7 +91,7 @@ fun LoginContent(
modifier = Modifier.fillMaxWidth()
) {
OutlinedTextField(
value = homeserver,
value = state.homeserver,
modifier = Modifier.fillMaxWidth(),
onValueChange = { /* no op */ },
enabled = false,
@ -178,8 +177,9 @@ fun LoginContent(
private fun LoginContentPreview() {
ElementXTheme(darkTheme = false) {
LoginContent(
state = LoginViewState(),
homeserver = "matrix.org",
state = LoginViewState(
homeserver = "matrix.org",
),
)
}
}

View file

@ -9,10 +9,17 @@ import kotlinx.coroutines.launch
class LoginViewModel(initialState: LoginViewState) :
MavericksViewModel<LoginViewState>(initialState) {
lateinit var homeserver: String
private val matrix = MatrixInstance.getInstance()
fun onResume() {
val currentHomeserver = matrix.getHomeserverOrDefault()
setState {
copy(
homeserver = currentHomeserver
)
}
}
fun onSubmit() = withState { state ->
setState {
copy(isLoggedIn = Loading())
@ -20,8 +27,10 @@ class LoginViewModel(initialState: LoginViewState) :
viewModelScope.launch {
suspend {
// Ensure the server is passed to the Rust SDK
matrix.setHomeserver(homeserver)
// Ensure the server is provided to the Rust SDK
if (matrix.getHomeserver() == null) {
matrix.setHomeserver(state.homeserver)
}
matrix.login(state.login, state.password)
matrix.activeClient().startSync()
}.execute {

View file

@ -6,6 +6,7 @@ import com.airbnb.mvrx.MavericksState
import com.airbnb.mvrx.Uninitialized
data class LoginViewState(
val homeserver: String = "",
val login: String = "",
val password: String = "",
val isLoggedIn: Async<Unit> = Uninitialized,

View file

@ -10,6 +10,14 @@ class ChangeServerViewModel(initialState: ChangeServerViewState) :
private val matrix = MatrixInstance.getInstance()
init {
setState {
copy(
homeserver = matrix.getHomeserverOrDefault()
)
}
}
fun setServer(server: String) {
setState {
copy(homeserver = server)

View file

@ -6,7 +6,7 @@ import com.airbnb.mvrx.MavericksState
import com.airbnb.mvrx.Uninitialized
data class ChangeServerViewState(
val homeserver: String = "matrix.org",
val homeserver: String = "",
val changeServerAction: Async<Unit> = Uninitialized,
) : MavericksState {
val submitEnabled = homeserver.isNotEmpty() && changeServerAction !is Loading

View file

@ -70,6 +70,10 @@ class Matrix(
}
}
fun getHomeserver(): String? = authService.homeserverDetails()?.url()
fun getHomeserverOrDefault(): String = getHomeserver() ?: "matrix.org"
suspend fun setHomeserver(homeserver: String) {
withContext(coroutineDispatchers.io) {
authService.configureHomeserver(homeserver)