diff --git a/android/app/src/main/java/org/uwaterloo/subletr/pages/changepassword/ChangePasswordPageView.kt b/android/app/src/main/java/org/uwaterloo/subletr/pages/changepassword/ChangePasswordPageView.kt index 8279f7bb..c6be92f8 100644 --- a/android/app/src/main/java/org/uwaterloo/subletr/pages/changepassword/ChangePasswordPageView.kt +++ b/android/app/src/main/java/org/uwaterloo/subletr/pages/changepassword/ChangePasswordPageView.kt @@ -24,11 +24,13 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel +import io.reactivex.rxjava3.subjects.BehaviorSubject import org.uwaterloo.subletr.R import org.uwaterloo.subletr.components.button.SecondaryButton import org.uwaterloo.subletr.components.textfield.UnderlinedPasswordTextField import org.uwaterloo.subletr.theme.changePasswordTopBarTitle import org.uwaterloo.subletr.theme.subletrPalette +import kotlin.reflect.jvm.internal.impl.resolve.constants.StringValue @Composable fun ChangePasswordPageView( @@ -92,19 +94,10 @@ fun ChangePasswordPageView( .height(dimensionResource(id = R.dimen.l)), ) - UnderlinedPasswordTextField( - modifier = Modifier.fillMaxWidth(fraction = ELEMENT_WIDTH), - value = uiState.oldPassword, - onValueChange = { - viewModel.oldPasswordStream.onNext(it) - }, - label = { - Text( - modifier = Modifier, - text = stringResource(id = R.string.old_password), - color = MaterialTheme.subletrPalette.secondaryTextColor, - ) - }, + PasswordInputBox( + stringValue = uiState.oldPassword, + viewModelStream = viewModel.oldPasswordStream, + txtID = R.string.old_password, ) Spacer( @@ -112,18 +105,10 @@ fun ChangePasswordPageView( .height(dimensionResource(id = R.dimen.l)), ) - UnderlinedPasswordTextField( - modifier = Modifier.fillMaxWidth(fraction = ELEMENT_WIDTH), - value = uiState.newPassword, - onValueChange = { - viewModel.newPasswordStream.onNext(it) - }, - label = { - Text( - text = stringResource(id = R.string.new_password), - color = MaterialTheme.subletrPalette.secondaryTextColor, - ) - }, + PasswordInputBox( + stringValue = uiState.newPassword, + viewModelStream = viewModel.newPasswordStream, + txtID = R.string.new_password, ) Spacer( @@ -131,18 +116,10 @@ fun ChangePasswordPageView( .height(dimensionResource(id = R.dimen.l)), ) - UnderlinedPasswordTextField( - modifier = Modifier.fillMaxWidth(fraction = ELEMENT_WIDTH), - value = uiState.confirmNewPassword, - onValueChange = { - viewModel.confirmNewPasswordStream.onNext(it) - }, - label = { - Text( - text = stringResource(id = R.string.confirm_new_password), - color = MaterialTheme.subletrPalette.secondaryTextColor, - ) - }, + PasswordInputBox( + stringValue = uiState.confirmNewPassword, + viewModelStream = viewModel.confirmNewPasswordStream, + txtID = R.string.confirm_password, ) Spacer( @@ -175,6 +152,28 @@ fun ChangePasswordPageView( private const val ELEMENT_WIDTH = 0.80f +@Composable +fun PasswordInputBox( + modifier: Modifier = Modifier, + stringValue: String, + viewModelStream: BehaviorSubject, + txtID: Int, +){ + UnderlinedPasswordTextField( + modifier = modifier.fillMaxWidth(fraction = ELEMENT_WIDTH), + value = stringValue, + onValueChange = { + viewModelStream.onNext(it) + }, + label = { + Text( + modifier = Modifier, + text = stringResource(id = txtID), + color = MaterialTheme.subletrPalette.secondaryTextColor, + ) + }, + ) +} @Preview(showBackground = true) @Composable fun ChangePasswordPageViewPreview() { diff --git a/android/app/src/main/java/org/uwaterloo/subletr/pages/createaccount/CreateAccountPageView.kt b/android/app/src/main/java/org/uwaterloo/subletr/pages/createaccount/CreateAccountPageView.kt index f56edcfd..d381958f 100644 --- a/android/app/src/main/java/org/uwaterloo/subletr/pages/createaccount/CreateAccountPageView.kt +++ b/android/app/src/main/java/org/uwaterloo/subletr/pages/createaccount/CreateAccountPageView.kt @@ -11,7 +11,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults @@ -25,10 +24,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.navOptions +import io.reactivex.rxjava3.subjects.BehaviorSubject import org.uwaterloo.subletr.R import org.uwaterloo.subletr.components.button.PrimaryButton import org.uwaterloo.subletr.components.dropdown.RoundedExposedDropdown @@ -100,155 +99,64 @@ fun CreateAccountPageView( ) - RoundedTextField( - modifier = Modifier - .fillMaxWidth(ELEMENT_WIDTH), - label = { - Text( - text = stringResource(id = R.string.first_name), - color = MaterialTheme.subletrPalette.secondaryTextColor, - ) - }, - value = uiState.firstName, - onValueChange = { - viewModel.firstNameStream.onNext(it) - }, - supportingText = { - if (uiState.firstNameInfoTextStringId != null) { - Text( - text = stringResource(id = uiState.firstNameInfoTextStringId), - color = MaterialTheme.subletrPalette.warningColor, - ) - } - }, + TextInputBox( + strValue = uiState.firstName, + viewModelStream = viewModel.firstNameStream, + infoTextToString = uiState.firstNameInfoTextStringId, + txtID = R.string.first_name ) Spacer( modifier = Modifier.height(dimensionResource(id = R.dimen.xs)) ) - RoundedTextField( - modifier = Modifier - .fillMaxWidth(ELEMENT_WIDTH), - label = { - Text( - text = stringResource(id = R.string.last_name), - color = MaterialTheme.subletrPalette.secondaryTextColor, - ) - }, - value = uiState.lastName, - onValueChange = { - viewModel.lastNameStream.onNext(it) - }, - supportingText = { - if (uiState.lastNameInfoTextStringId != null) { - Text( - text = stringResource(id = uiState.lastNameInfoTextStringId), - color = MaterialTheme.subletrPalette.warningColor, - ) - } - }, + TextInputBox( + strValue = uiState.lastName, + viewModelStream = viewModel.lastNameStream, + infoTextToString = uiState.lastNameInfoTextStringId, + txtID = R.string.last_name, ) Spacer( modifier = Modifier.height(dimensionResource(id = R.dimen.xs)) ) - RoundedTextField( - modifier = Modifier - .fillMaxWidth(ELEMENT_WIDTH), - keyboardOptions = KeyboardOptions( - keyboardType = KeyboardType.Email, - autoCorrect = false, - ), - label = { - Text( - text = stringResource(id = R.string.email), - color = MaterialTheme.subletrPalette.secondaryTextColor, - ) - }, - value = uiState.email, - onValueChange = { - viewModel.emailStream.onNext(it) - }, - supportingText = { - if (uiState.emailInfoTextStringId != null) { - Text( - text = stringResource(id = uiState.emailInfoTextStringId), - color = MaterialTheme.subletrPalette.warningColor, - ) - } - }, + TextInputBox( + strValue = uiState.email, + viewModelStream = viewModel.emailStream, + infoTextToString = uiState.emailInfoTextStringId, + txtID = R.string.email, ) Spacer( modifier = Modifier.height(dimensionResource(id = R.dimen.xs)) ) - RoundedPasswordTextField( - modifier = Modifier - .fillMaxWidth(ELEMENT_WIDTH), - label = { - Text( - text = stringResource(id = R.string.password), - color = MaterialTheme.subletrPalette.secondaryTextColor, - ) - }, - value = uiState.password, - onValueChange = { - viewModel.passwordStream.onNext(it) - }, - supportingText = { - if (uiState.passwordInfoTextStringId != null) { - Text( - text = stringResource(id = uiState.passwordInfoTextStringId), - color = MaterialTheme.subletrPalette.warningColor, - ) - } - }, + PasswordInputBox( + strValue = uiState.password, + viewModelStream = viewModel.passwordStream, + infoTextToString = uiState.passwordInfoTextStringId, + txtID = R.string.password, ) Spacer( modifier = Modifier.height(dimensionResource(id = R.dimen.xs)) ) - RoundedPasswordTextField( - modifier = Modifier - .fillMaxWidth(ELEMENT_WIDTH), - label = { - Text( - text = stringResource(id = R.string.confirm_password), - color = MaterialTheme.subletrPalette.secondaryTextColor, - ) - }, - value = uiState.confirmPassword, - onValueChange = { - viewModel.confirmPasswordStream.onNext(it) - }, - supportingText = { - if (uiState.confirmPasswordInfoTextStringId != null) { - Text( - text = stringResource(id = uiState.confirmPasswordInfoTextStringId), - color = MaterialTheme.subletrPalette.warningColor, - ) - } - }, + PasswordInputBox( + strValue = uiState.confirmPassword, + viewModelStream = viewModel.confirmPasswordStream, + infoTextToString = uiState.confirmPasswordInfoTextStringId, + txtID = R.string.confirm_password, ) Spacer( modifier = Modifier.height(dimensionResource(id = R.dimen.xs)) ) - RoundedExposedDropdown( - modifier = Modifier - .fillMaxWidth(ELEMENT_WIDTH), - dropdownItems = Gender.values(), - labelId = R.string.gender, - selectedDropdownItem = uiState.gender, - dropdownItemToString = { stringResource(id = it.stringId)}, - setSelectedDropdownItem = { - viewModel.genderStream.onNext(it) - }, + GenderSelector( + uiState = uiState, + viewModel = viewModel, ) Spacer( @@ -333,6 +241,90 @@ fun CreateAccountPageView( private const val ELEMENT_WIDTH = 1.0f +@Composable +fun TextInputBox( + modifier: Modifier = Modifier, + strValue: String, + viewModelStream: BehaviorSubject, + infoTextToString: Int?, + txtID: Int, +) { + RoundedTextField( + modifier = modifier + .fillMaxWidth(ELEMENT_WIDTH), + label = { + Text( + text = stringResource(id = txtID), + color = MaterialTheme.subletrPalette.secondaryTextColor, + ) + }, + value = strValue, + onValueChange = { + viewModelStream.onNext(it) + }, + supportingText = { + if (infoTextToString != null) { + Text( + text = stringResource(id = infoTextToString), + color = MaterialTheme.subletrPalette.warningColor, + ) + } + }, + ) +} + +@Composable +fun PasswordInputBox( + modifier: Modifier = Modifier, + strValue: String, + viewModelStream: BehaviorSubject, + infoTextToString: Int?, + txtID: Int, + + ) { + RoundedPasswordTextField( + modifier = modifier + .fillMaxWidth(ELEMENT_WIDTH), + label = { + Text( + text = stringResource(id = txtID), + color = MaterialTheme.subletrPalette.secondaryTextColor, + ) + }, + value = strValue, + onValueChange = { + viewModelStream.onNext(it) + }, + supportingText = { + if (infoTextToString != null) { + Text( + text = stringResource(id = infoTextToString), + color = MaterialTheme.subletrPalette.warningColor, + ) + } + }, + ) +} + +@Composable +fun GenderSelector( + modifier: Modifier = Modifier, + uiState: CreateAccountPageUiState.Loaded, + viewModel: CreateAccountPageViewModel, +) { + RoundedExposedDropdown( + modifier = modifier + .fillMaxWidth(ELEMENT_WIDTH), + dropdownItems = Gender.values(), + labelId = R.string.gender, + selectedDropdownItem = uiState.gender, + dropdownItemToString = { stringResource(id = it.stringId)}, + setSelectedDropdownItem = { + viewModel.genderStream.onNext(it) + }, + ) +} + @Preview(showBackground = true) @Composable fun CreateAccountPagePreview() {