From ab755c3d2e4f599aa32de1e2b350649af1fd8351 Mon Sep 17 00:00:00 2001 From: DongJun Huh Date: Wed, 11 Mar 2026 22:58:46 +0900 Subject: [PATCH 1/2] [QA] Prevent reset password email field error flicker --- .../screen/account/ResetPasswordScreen.kt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/account/ResetPasswordScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/account/ResetPasswordScreen.kt index 35bc2c24..952e5c17 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/account/ResetPasswordScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/account/ResetPasswordScreen.kt @@ -592,6 +592,14 @@ fun EmailInputLayout( requestEmailCertification: (String) -> Unit = {}, ) { val lastErrorMessage = remember { mutableStateOf("") } + val isEmailError = when { + email.isBlank() -> null + emailCertification == EmailCertificationState.INVALID_FORMAT || + emailCertification == EmailCertificationState.NOT_EXIST_EMAIL || + emailCertification == EmailCertificationState.OAUTH_EMAIL -> true + + else -> false + } LaunchedEffect(emailCertification) { lastErrorMessage.value = when (emailCertification) { @@ -612,9 +620,13 @@ fun EmailInputLayout( val formatValid = android.util.Patterns.EMAIL_ADDRESS.matcher(it).matches() setNextButtonEnabled(formatValid) setIsNextButtonClickable(formatValid) - if (!formatValid) { + if (it.isBlank()) { + setEmailCertification(EmailCertificationState.BEFORE_CERTIFICATION) + lastErrorMessage.value = "" + } else if (!formatValid) { setEmailCertification(EmailCertificationState.INVALID_FORMAT) } else { + setEmailCertification(EmailCertificationState.BEFORE_CERTIFICATION) lastErrorMessage.value = "" // INVALID FORMAT 에러 메시지가 다음 에러 메시지가 표시될 떄 남아 있지 않도록 value Clear } @@ -624,7 +636,7 @@ fun EmailInputLayout( trailingIconId = if (email.isNotBlank()) R.drawable.ic_trailing_check else null, errorTrailingIconId = R.drawable.ic_trailing_error, errorMessage = lastErrorMessage.value, - isError = if (email.isBlank()) null else !isNextButtonEnabled, + isError = isEmailError, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email), ) } From db7fb4ec409871372e58808e4e37f4c44915eac9 Mon Sep 17 00:00:00 2001 From: DongJun Huh Date: Wed, 11 Mar 2026 23:05:41 +0900 Subject: [PATCH 2/2] [QA] Show TextField label only when input is not empty --- .../dayo/presentation/screen/account/ResetPasswordScreen.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/account/ResetPasswordScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/account/ResetPasswordScreen.kt index 952e5c17..cc18e109 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/account/ResetPasswordScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/account/ResetPasswordScreen.kt @@ -631,7 +631,11 @@ fun EmailInputLayout( // INVALID FORMAT 에러 메시지가 다음 에러 메시지가 표시될 떄 남아 있지 않도록 value Clear } }, - label = stringResource(R.string.email), + label = if (email.isNotEmpty()) { + stringResource(R.string.email) + } else { + " " + }, placeholder = stringResource(R.string.reset_password_email_placeholder), trailingIconId = if (email.isNotBlank()) R.drawable.ic_trailing_check else null, errorTrailingIconId = R.drawable.ic_trailing_error,