From b2af9189693d2f989868353b72941397ecdf8083 Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Mon, 9 May 2022 14:18:44 +0100 Subject: [PATCH] using correct copy for the login validation errors - extracts helpers to make the logic more declarative --- .../ftueauth/FtueAuthCombinedLoginFragment.kt | 18 +++++----- .../ftueauth/LoginFieldsValidation.kt | 33 +++++++++++-------- .../ftueauth/LoginValidationResult.kt | 24 ++++++++++++++ 3 files changed, 51 insertions(+), 24 deletions(-) create mode 100644 vector/src/main/java/im/vector/app/features/onboarding/ftueauth/LoginValidationResult.kt diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedLoginFragment.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedLoginFragment.kt index fb34acd9ed..bcdcae7a7e 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedLoginFragment.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/FtueAuthCombinedLoginFragment.kt @@ -25,7 +25,6 @@ import android.view.inputmethod.EditorInfo import androidx.autofill.HintConstants import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope -import com.airbnb.mvrx.withState import im.vector.app.R import im.vector.app.core.extensions.content import im.vector.app.core.extensions.editText @@ -94,15 +93,14 @@ class FtueAuthCombinedLoginFragment @Inject constructor( ) private fun submit() { - withState(viewModel) { state -> - cleanupUi() - val login = views.loginInput.content() - val password = views.loginPasswordInput.content() - val isMatrixOrg = state.selectedHomeserver.userFacingUrl == getString(R.string.matrix_org_server_url) - loginFieldsValidation.validate(login, password, isMatrixOrg).onValid { - viewModel.handle(OnboardingAction.AuthenticateAction.Login(login, password, getString(R.string.login_default_session_public_name))) - } - } + cleanupUi() + loginFieldsValidation.validate(views.loginInput.content(), views.loginPasswordInput.content()) + .onUsernameOrIdError { views.loginInput.error = it } + .onPasswordError { views.loginPasswordInput.error = it } + .onValid { usernameOrId, password -> + val initialDeviceName = getString(R.string.login_default_session_public_name) + viewModel.handle(OnboardingAction.AuthenticateAction.Login(usernameOrId, password, initialDeviceName)) + } } private fun cleanupUi() { diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/LoginFieldsValidation.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/LoginFieldsValidation.kt index 476c82a20c..5a570a4dfe 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/LoginFieldsValidation.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/LoginFieldsValidation.kt @@ -16,43 +16,48 @@ package im.vector.app.features.onboarding.ftueauth -import androidx.core.text.isDigitsOnly import im.vector.app.R import im.vector.app.core.resources.StringProvider import javax.inject.Inject -typealias LoginValidationResult = Pair - class LoginFieldsValidation @Inject constructor( private val stringProvider: StringProvider ) { - fun validate(usernameOrId: String, password: String, isMatrixOrg: Boolean): Pair { - return validateUsernameOrId(usernameOrId, isMatrixOrg) to validatePassword(password) + fun validate(usernameOrId: String, password: String): LoginValidationResult { + return LoginValidationResult(usernameOrId, password, validateUsernameOrId(usernameOrId), validatePassword(password)) } - private fun validateUsernameOrId(usernameOrId: String, isMatrixOrg: Boolean): String? { + private fun validateUsernameOrId(usernameOrId: String): String? { val accountError = when { - usernameOrId.isEmpty() -> stringProvider.getString(R.string.error_empty_field_choose_user_name) - isNumericOnlyUserIdForbidden(isMatrixOrg) && usernameOrId.isDigitsOnly() -> stringProvider.getString(R.string.error_forbidden_digits_only_username) - else -> null + usernameOrId.isEmpty() -> stringProvider.getString(R.string.error_empty_field_enter_user_name) + else -> null } return accountError } - private fun isNumericOnlyUserIdForbidden(isMatrixOrg: Boolean) = isMatrixOrg - private fun validatePassword(password: String): String? { val passwordError = when { - password.isEmpty() -> stringProvider.getString(R.string.error_empty_field_choose_password) + password.isEmpty() -> stringProvider.getString(R.string.error_empty_field_your_password) else -> null } return passwordError } } -fun LoginValidationResult.onValid(action: () -> Unit) { +fun LoginValidationResult.onValid(action: (String, String) -> Unit): LoginValidationResult { when { - first != null && second != null -> action() + usernameOrIdError != null && passwordError != null -> action(usernameOrId, password) } + return this +} + +fun LoginValidationResult.onUsernameOrIdError(action: (String) -> Unit): LoginValidationResult { + usernameOrIdError?.let(action) + return this +} + +fun LoginValidationResult.onPasswordError(action: (String) -> Unit): LoginValidationResult { + passwordError?.let(action) + return this } diff --git a/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/LoginValidationResult.kt b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/LoginValidationResult.kt new file mode 100644 index 0000000000..caf127332a --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/onboarding/ftueauth/LoginValidationResult.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.onboarding.ftueauth + +data class LoginValidationResult( + val usernameOrId: String, + val password: String, + val usernameOrIdError: String?, + val passwordError: String? +)