From 085634c95a4dec5097488fdc7eb4246cc6b6c78e Mon Sep 17 00:00:00 2001 From: "Z. Charles Dziura" Date: Sun, 18 Aug 2024 01:29:47 -0400 Subject: [PATCH] Additional logic for the login form --- .../makeshift/debtpirate/MainActivity.kt | 5 +- .../debtpirate/usecases/login/LoginScreen.kt | 78 +++++++++++++++---- .../usecases/login/LoginViewModel.kt | 32 ++++---- app/app/src/main/res/values/strings.xml | 7 +- 4 files changed, 85 insertions(+), 37 deletions(-) diff --git a/app/app/src/main/java/software/makeshift/debtpirate/MainActivity.kt b/app/app/src/main/java/software/makeshift/debtpirate/MainActivity.kt index a28d08c..6d6af29 100644 --- a/app/app/src/main/java/software/makeshift/debtpirate/MainActivity.kt +++ b/app/app/src/main/java/software/makeshift/debtpirate/MainActivity.kt @@ -27,10 +27,7 @@ class MainActivity : ComponentActivity() { NavHost(navController = navController, startDestination = LoginRoute) { composable { val viewModel: LoginScreenViewModel by viewModels() - LoginScreen( - viewModel.loginState, - viewModel::updateLoginUsername - ) + LoginScreen(viewModel) } } } diff --git a/app/app/src/main/java/software/makeshift/debtpirate/usecases/login/LoginScreen.kt b/app/app/src/main/java/software/makeshift/debtpirate/usecases/login/LoginScreen.kt index e5f38f0..a126a3d 100644 --- a/app/app/src/main/java/software/makeshift/debtpirate/usecases/login/LoginScreen.kt +++ b/app/app/src/main/java/software/makeshift/debtpirate/usecases/login/LoginScreen.kt @@ -10,10 +10,13 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold import androidx.compose.material3.SecondaryTabRow import androidx.compose.material3.Tab @@ -23,15 +26,17 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardCapitalization +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp -import kotlinx.coroutines.flow.StateFlow import software.makeshift.debtpirate.R @SuppressLint("UnusedMaterial3ScaffoldPaddingParameter") @Composable fun LoginScreen( - loginState: StateFlow, - updateLoginUsername: (String) -> Unit + viewModel: LoginScreenViewModel ) { Scaffold(modifier = Modifier.fillMaxSize()) { Column { @@ -42,7 +47,9 @@ fun LoginScreen( ) LoginAndSignUpForms( - loginState, + loginState = viewModel.loginState, + onUsernameUpdate = viewModel::updateLoginUsername, + onPasswordUpdate = viewModel::updateLoginPassword, modifier = Modifier .weight(3f) ) @@ -62,7 +69,9 @@ private fun Banner(modifier: Modifier = Modifier) { @Composable private fun LoginAndSignUpForms( - loginTabState: StateFlow, + loginState: LoginState, + onUsernameUpdate: (String) -> Unit, + onPasswordUpdate: (String) -> Unit, modifier: Modifier = Modifier ) { Column(modifier = modifier) { @@ -72,13 +81,12 @@ private fun LoginAndSignUpForms( selectedTabIndex = pagerState.currentPage, modifier = Modifier.height(48.dp) ) { - val tabTextStyle = MaterialTheme.typography.titleLarge Tab( selected = pagerState.currentPage == 0, onClick = { pagerState.requestScrollToPage(0) }, text = { Text( - text = stringResource(id = R.string.loginscreen_logintab_logintitle) + text = stringResource(id = R.string.login_screen__login) ) }, modifier = Modifier.fillMaxHeight() @@ -88,7 +96,7 @@ private fun LoginAndSignUpForms( onClick = { pagerState.requestScrollToPage(1) }, text = { Text( - text = stringResource(id = R.string.loginscreen_logintab_signuptitle), + text = stringResource(id = R.string.login_screen__signup), ) }, modifier = Modifier.fillMaxHeight() @@ -97,11 +105,13 @@ private fun LoginAndSignUpForms( HorizontalPager( state = pagerState, - modifier = Modifier.fillMaxSize() + modifier = Modifier + .fillMaxSize() + .imePadding() ) { page -> when (page) { 0 -> { - Text("Page 1!") + LoginForm(state = loginState, onUsernameUpdate, onPasswordUpdate) } 1 -> { @@ -112,9 +122,43 @@ private fun LoginAndSignUpForms( } } -//@Composable -//private fun LoginForm(state: StateFlow, onUsernameUpdate: (String) -> Unit, onPasswordUpdate: (String) -> Unit) { -// Column { -// OutlinedTextField(value = , onValueChange = ) -// } -//} \ No newline at end of file +@Composable +private fun LoginForm( + state: LoginState, + onUsernameUpdate: (String) -> Unit, + onPasswordUpdate: (String) -> Unit +) { + val (username, password) = state + + Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.fillMaxSize()) { + OutlinedTextField( + value = username, + label = { Text(stringResource(id = R.string.login_screen__username)) }, + placeholder = { Text(stringResource(id = R.string.login_screen__username)) }, + singleLine = true, + keyboardOptions = KeyboardOptions( + capitalization = KeyboardCapitalization.Unspecified, + keyboardType = KeyboardType.Email, + imeAction = ImeAction.Next + ), + onValueChange = onUsernameUpdate + ) + + OutlinedTextField( + value = password, + label = { Text(stringResource(id = R.string.login_screen__password)) }, + placeholder = { Text(stringResource(id = R.string.login_screen__password)) }, + keyboardOptions = KeyboardOptions( + capitalization = KeyboardCapitalization.Unspecified, + keyboardType = KeyboardType.Password, + imeAction = ImeAction.Send + ), + visualTransformation = PasswordVisualTransformation(), + onValueChange = onPasswordUpdate + ) + + Button(onClick = { /*TODO*/ }) { + Text(stringResource(id = R.string.login_screen__login)) + } + } +} \ No newline at end of file diff --git a/app/app/src/main/java/software/makeshift/debtpirate/usecases/login/LoginViewModel.kt b/app/app/src/main/java/software/makeshift/debtpirate/usecases/login/LoginViewModel.kt index 72f020a..f6ec6d4 100644 --- a/app/app/src/main/java/software/makeshift/debtpirate/usecases/login/LoginViewModel.kt +++ b/app/app/src/main/java/software/makeshift/debtpirate/usecases/login/LoginViewModel.kt @@ -1,13 +1,11 @@ package software.makeshift.debtpirate.usecases.login +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.lifecycle.ViewModel -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.update -data class LoginState(val username: String? = null, val password: String? = null) +data class LoginState(val username: String = "", val password: String = "") data class SignUpState( val username: String? = null, @@ -17,16 +15,22 @@ data class SignUpState( ) class LoginScreenViewModel : ViewModel() { - private val _loginState = MutableStateFlow(LoginState()) - val loginState = _loginState.asStateFlow() + var loginState by mutableStateOf(LoginState()) + private set - val loginUsername: Flow - get() = loginState.map { loginState -> loginState.username } + val loginUsername: String + get() = loginState.username fun updateLoginUsername(username: String) { - _loginState.update { state -> - val (_, password) = state - LoginState(username, password) - } + val (_, password) = loginState + loginState = LoginState(username, password) + } + + val loginPassword: String + get() = loginState.password + + fun updateLoginPassword(password: String) { + val (username, _) = loginState + loginState = LoginState(username, password) } } \ No newline at end of file diff --git a/app/app/src/main/res/values/strings.xml b/app/app/src/main/res/values/strings.xml index 0265931..344c8b1 100644 --- a/app/app/src/main/res/values/strings.xml +++ b/app/app/src/main/res/values/strings.xml @@ -2,6 +2,9 @@ Debt Pirate - Login - Sign Up + Login + Sign Up + Username + Password + \ No newline at end of file