|
|
@ -4,14 +4,14 @@ import android.app.Activity |
|
|
|
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.compose.foundation.layout.Column |
|
|
|
import androidx.compose.foundation.Image |
|
|
|
import androidx.compose.foundation.layout.fillMaxSize |
|
|
|
import androidx.compose.foundation.layout.* |
|
|
|
import androidx.compose.foundation.layout.padding |
|
|
|
|
|
|
|
import androidx.compose.foundation.text.KeyboardOptions |
|
|
|
import androidx.compose.foundation.text.KeyboardOptions |
|
|
|
import androidx.compose.material3.* |
|
|
|
import androidx.compose.material3.* |
|
|
|
import androidx.compose.runtime.getValue |
|
|
|
import androidx.compose.runtime.getValue |
|
|
|
import androidx.compose.ui.Alignment |
|
|
|
import androidx.compose.ui.Alignment |
|
|
|
import androidx.compose.ui.Modifier |
|
|
|
import androidx.compose.ui.Modifier |
|
|
|
|
|
|
|
import androidx.compose.ui.res.painterResource |
|
|
|
import androidx.compose.ui.text.input.ImeAction |
|
|
|
import androidx.compose.ui.text.input.ImeAction |
|
|
|
import androidx.compose.ui.text.input.KeyboardType |
|
|
|
import androidx.compose.ui.text.input.KeyboardType |
|
|
|
import androidx.compose.ui.unit.dp |
|
|
|
import androidx.compose.ui.unit.dp |
|
|
@ -38,65 +38,83 @@ class LoginActivity : ComponentActivity() { |
|
|
|
.padding(16.dp), |
|
|
|
.padding(16.dp), |
|
|
|
color = MaterialTheme.colorScheme.background |
|
|
|
color = MaterialTheme.colorScheme.background |
|
|
|
) { |
|
|
|
) { |
|
|
|
Column( |
|
|
|
Box(modifier = Modifier.fillMaxSize()) { |
|
|
|
modifier = Modifier.fillMaxSize() |
|
|
|
Column( |
|
|
|
) { |
|
|
|
modifier = Modifier.fillMaxSize(), |
|
|
|
val viewModel: LoginViewModel = mavericksViewModel() |
|
|
|
) { |
|
|
|
val state by viewModel.collectAsState() |
|
|
|
val viewModel: LoginViewModel = mavericksViewModel() |
|
|
|
val isError = state.isLoggedIn is Fail |
|
|
|
val state by viewModel.collectAsState() |
|
|
|
OutlinedTextField( |
|
|
|
val isError = state.isLoggedIn is Fail |
|
|
|
value = state.homeserver, |
|
|
|
Image( |
|
|
|
onValueChange = { |
|
|
|
painterResource(id = R.drawable.element_logo_green), |
|
|
|
viewModel.handle(LoginActions.SetHomeserver(it)) |
|
|
|
contentDescription = null, |
|
|
|
}, |
|
|
|
modifier = Modifier |
|
|
|
keyboardOptions = KeyboardOptions( |
|
|
|
.align(Alignment.CenterHorizontally) |
|
|
|
keyboardType = KeyboardType.Uri, |
|
|
|
.padding(40.dp) |
|
|
|
), |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
OutlinedTextField( |
|
|
|
|
|
|
|
value = state.login, |
|
|
|
|
|
|
|
onValueChange = { |
|
|
|
|
|
|
|
viewModel.handle(LoginActions.SetLogin(it)) |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
keyboardOptions = KeyboardOptions( |
|
|
|
|
|
|
|
keyboardType = KeyboardType.Text, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
OutlinedTextField( |
|
|
|
|
|
|
|
value = state.password, |
|
|
|
|
|
|
|
onValueChange = { |
|
|
|
|
|
|
|
viewModel.handle(LoginActions.SetPassword(it)) |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
isError = isError, |
|
|
|
|
|
|
|
keyboardOptions = KeyboardOptions( |
|
|
|
|
|
|
|
keyboardType = KeyboardType.Password, |
|
|
|
|
|
|
|
imeAction = ImeAction.Send, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
if (isError) { |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
text = (state.isLoggedIn as? Fail)?.toString().orEmpty(), |
|
|
|
|
|
|
|
color = MaterialTheme.colorScheme.error, |
|
|
|
|
|
|
|
style = MaterialTheme.typography.bodySmall, |
|
|
|
|
|
|
|
modifier = Modifier.padding(start = 16.dp) |
|
|
|
|
|
|
|
) |
|
|
|
) |
|
|
|
} |
|
|
|
OutlinedTextField( |
|
|
|
VectorButton( |
|
|
|
value = state.homeserver, |
|
|
|
text = "Submit", |
|
|
|
modifier = Modifier.fillMaxWidth(), |
|
|
|
onClick = { |
|
|
|
onValueChange = { |
|
|
|
viewModel.handle(LoginActions.Submit) |
|
|
|
viewModel.handle(LoginActions.SetHomeserver(it)) |
|
|
|
}, |
|
|
|
}, |
|
|
|
enabled = state.submitEnabled, |
|
|
|
keyboardOptions = KeyboardOptions( |
|
|
|
modifier = Modifier.align(Alignment.End) |
|
|
|
keyboardType = KeyboardType.Uri, |
|
|
|
) |
|
|
|
), |
|
|
|
if (state.isLoggedIn is Loading) { |
|
|
|
|
|
|
|
// FIXME This does not work, we never enter this if block |
|
|
|
|
|
|
|
CircularProgressIndicator( |
|
|
|
|
|
|
|
modifier = Modifier.align(Alignment.CenterHorizontally) |
|
|
|
|
|
|
|
) |
|
|
|
) |
|
|
|
} |
|
|
|
OutlinedTextField( |
|
|
|
if (state.isLoggedIn is Success) { |
|
|
|
value = state.login, |
|
|
|
openRoomList() |
|
|
|
modifier = Modifier |
|
|
|
|
|
|
|
.fillMaxWidth() |
|
|
|
|
|
|
|
.padding(top = 8.dp), |
|
|
|
|
|
|
|
onValueChange = { |
|
|
|
|
|
|
|
viewModel.handle(LoginActions.SetLogin(it)) |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
keyboardOptions = KeyboardOptions( |
|
|
|
|
|
|
|
keyboardType = KeyboardType.Text, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
OutlinedTextField( |
|
|
|
|
|
|
|
value = state.password, |
|
|
|
|
|
|
|
modifier = Modifier |
|
|
|
|
|
|
|
.fillMaxWidth() |
|
|
|
|
|
|
|
.padding(top = 8.dp), |
|
|
|
|
|
|
|
onValueChange = { |
|
|
|
|
|
|
|
viewModel.handle(LoginActions.SetPassword(it)) |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
isError = isError, |
|
|
|
|
|
|
|
keyboardOptions = KeyboardOptions( |
|
|
|
|
|
|
|
keyboardType = KeyboardType.Password, |
|
|
|
|
|
|
|
imeAction = ImeAction.Send, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
if (isError) { |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
text = (state.isLoggedIn as? Fail)?.toString().orEmpty(), |
|
|
|
|
|
|
|
color = MaterialTheme.colorScheme.error, |
|
|
|
|
|
|
|
style = MaterialTheme.typography.bodySmall, |
|
|
|
|
|
|
|
modifier = Modifier.padding(start = 16.dp) |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
VectorButton( |
|
|
|
|
|
|
|
text = "Submit", |
|
|
|
|
|
|
|
onClick = { |
|
|
|
|
|
|
|
viewModel.handle(LoginActions.Submit) |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
enabled = state.submitEnabled, |
|
|
|
|
|
|
|
modifier = Modifier |
|
|
|
|
|
|
|
.align(Alignment.End) |
|
|
|
|
|
|
|
.padding(top = 16.dp) |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
if (state.isLoggedIn is Loading) { |
|
|
|
|
|
|
|
// FIXME This does not work, we never enter this if block |
|
|
|
|
|
|
|
CircularProgressIndicator( |
|
|
|
|
|
|
|
modifier = Modifier.align(Alignment.CenterHorizontally) |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (state.isLoggedIn is Success) { |
|
|
|
|
|
|
|
openRoomList() |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|