diff --git a/presentation/src/androidTest/AndroidManifest.xml b/presentation/src/androidTest/AndroidManifest.xml new file mode 100644 index 00000000..53a7bb10 --- /dev/null +++ b/presentation/src/androidTest/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/presentation/src/androidTest/java/daily/dayo/presentation/screen/account/AuthPasswordFieldUsageTest.kt b/presentation/src/androidTest/java/daily/dayo/presentation/screen/account/AuthPasswordFieldUsageTest.kt new file mode 100644 index 00000000..1862d3a3 --- /dev/null +++ b/presentation/src/androidTest/java/daily/dayo/presentation/screen/account/AuthPasswordFieldUsageTest.kt @@ -0,0 +1,91 @@ +package daily.dayo.presentation.screen.account + +import androidx.activity.ComponentActivity +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.compose.ui.test.assertCountEquals +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onAllNodesWithContentDescription +import androidx.test.ext.junit.runners.AndroidJUnit4 +import daily.dayo.presentation.theme.DayoTheme +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class AuthPasswordFieldUsageTest { + + @get:Rule + val composeRule = createAndroidComposeRule() + + private fun assertContentDescriptionCount(contentDescription: String, expectedCount: Int) { + composeRule.onAllNodesWithContentDescription(contentDescription) + .assertCountEquals(expectedCount) + } + + @Test + fun signInEmailInputLayout_showsClearAndVisibilityOnEditablePasswordField() { + var email by mutableStateOf("") + var password by mutableStateOf("password") + + composeRule.setContent { + DayoTheme { + SignInEmailInputLayout( + emailValue = email, + onEmailChange = { email = it }, + passwordValue = password, + onPasswordChange = { password = it } + ) + } + } + + assertContentDescriptionCount("Clear password", 1) + assertContentDescriptionCount("Show password", 1) + } + + @Test + fun signUpPasswordConfirmLayout_hidesClearOnDisabledReferenceField() { + var password by mutableStateOf("password") + var passwordConfirmation by mutableStateOf("confirm") + + composeRule.setContent { + DayoTheme { + SetPasswordView( + passwordInputViewCondition = false, + passwordConfirmationViewCondition = true, + password = password, + setPassword = { password = it }, + isPasswordFormatValid = true, + passwordConfirmation = passwordConfirmation, + setPasswordConfirmation = { passwordConfirmation = it } + ) + } + } + + assertContentDescriptionCount("Clear password", 1) + assertContentDescriptionCount("Show password", 2) + } + + @Test + fun resetPasswordConfirmLayout_hidesClearOnDisabledReferenceField() { + var password by mutableStateOf("password") + var passwordConfirmation by mutableStateOf("confirm") + + composeRule.setContent { + DayoTheme { + NewPasswordLayout( + resetPasswordStep = ResetPasswordStep.NEW_PASSWORD_CONFIRM, + password = password, + setPassword = { password = it }, + isPasswordFormatValid = true, + passwordConfirmation = passwordConfirmation, + setPasswordConfirmation = { passwordConfirmation = it } + ) + } + } + + assertContentDescriptionCount("Clear password", 1) + assertContentDescriptionCount("Show password", 2) + } +} diff --git a/presentation/src/androidTest/java/daily/dayo/presentation/view/DayoPasswordTextFieldTest.kt b/presentation/src/androidTest/java/daily/dayo/presentation/view/DayoPasswordTextFieldTest.kt new file mode 100644 index 00000000..04bfe2c1 --- /dev/null +++ b/presentation/src/androidTest/java/daily/dayo/presentation/view/DayoPasswordTextFieldTest.kt @@ -0,0 +1,163 @@ +package daily.dayo.presentation.view + +import androidx.activity.ComponentActivity +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.compose.ui.test.assertCountEquals +import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.onAllNodesWithContentDescription +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.performClick +import androidx.test.ext.junit.runners.AndroidJUnit4 +import daily.dayo.presentation.theme.DayoTheme +import org.junit.Assert.assertEquals +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class DayoPasswordTextFieldTest { + + @get:Rule + val composeRule = createAndroidComposeRule() + + private fun assertContentDescriptionCount(contentDescription: String, expectedCount: Int) { + composeRule.onAllNodesWithContentDescription(contentDescription) + .assertCountEquals(expectedCount) + } + + @Test + fun givenTextAndDefaultFlags_whenRendered_thenClearAndEyeIconsAreBothShown() { + var passwordValue by mutableStateOf("password") + + composeRule.setContent { + DayoTheme { + DayoPasswordTextField( + value = passwordValue, + onValueChange = { passwordValue = it } + ) + } + } + + assertContentDescriptionCount("Clear password", 1) + assertContentDescriptionCount("Show password", 1) + } + + @Test + fun givenText_whenClearIconTapped_thenFieldIsEmptied() { + var passwordValue by mutableStateOf("password") + + composeRule.setContent { + DayoTheme { + DayoPasswordTextField( + value = passwordValue, + onValueChange = { passwordValue = it } + ) + } + } + + composeRule.onNodeWithContentDescription("Clear password").performClick() + + composeRule.runOnIdle { + assertEquals("", passwordValue) + } + assertContentDescriptionCount("Clear password", 0) + assertContentDescriptionCount("Show password", 1) + } + + @Test + fun givenDefaultVisibilityIcon_whenTapped_thenContentDescriptionChangesToHidePassword() { + var passwordValue by mutableStateOf("password") + + composeRule.setContent { + DayoTheme { + DayoPasswordTextField( + value = passwordValue, + onValueChange = { passwordValue = it } + ) + } + } + + composeRule.onNodeWithContentDescription("Show password").performClick() + + assertContentDescriptionCount("Hide password", 1) + } + + @Test + fun givenErrorState_whenRendered_thenOnlyErrorIconIsShown() { + var passwordValue by mutableStateOf("password") + + composeRule.setContent { + DayoTheme { + DayoPasswordTextField( + value = passwordValue, + onValueChange = { passwordValue = it }, + isError = true, + errorMessage = "error" + ) + } + } + + assertContentDescriptionCount("error icon", 1) + assertContentDescriptionCount("Clear password", 0) + assertContentDescriptionCount("Show password", 0) + } + + @Test + fun givenVisibilityIconHiddenAndTextExists_whenRendered_thenOnlyClearIconIsShown() { + var passwordValue by mutableStateOf("password") + + composeRule.setContent { + DayoTheme { + DayoPasswordTextField( + value = passwordValue, + onValueChange = { passwordValue = it }, + showVisibilityIcon = false + ) + } + } + + assertContentDescriptionCount("Clear password", 1) + assertContentDescriptionCount("Show password", 0) + assertContentDescriptionCount("Hide password", 0) + } + + @Test + fun givenVisibilityIconHiddenAndTextBlank_whenRendered_thenNoTrailingIconsAreShown() { + var passwordValue by mutableStateOf("") + + composeRule.setContent { + DayoTheme { + DayoPasswordTextField( + value = passwordValue, + onValueChange = { passwordValue = it }, + showVisibilityIcon = false + ) + } + } + + assertContentDescriptionCount("Clear password", 0) + assertContentDescriptionCount("Show password", 0) + assertContentDescriptionCount("Hide password", 0) + assertContentDescriptionCount("error icon", 0) + } + + @Test + fun givenDisabledFieldWithText_whenRendered_thenClearIsHiddenAndEyeRemains() { + var passwordValue by mutableStateOf("password") + + composeRule.setContent { + DayoTheme { + DayoPasswordTextField( + value = passwordValue, + onValueChange = { passwordValue = it }, + isEnabled = false + ) + } + } + + assertContentDescriptionCount("Clear password", 0) + assertContentDescriptionCount("Show password", 1) + } +} 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..d117a727 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 @@ -53,6 +53,7 @@ import daily.dayo.presentation.screen.account.model.EmailExistenceStatus import daily.dayo.presentation.theme.Dark import daily.dayo.presentation.theme.DayoTheme import daily.dayo.presentation.theme.Gray2_767B83 +import daily.dayo.presentation.theme.Gray3_9FA5AE import daily.dayo.presentation.theme.White_FFFFFF import daily.dayo.presentation.view.DayoPasswordTextField import daily.dayo.presentation.view.DayoTextButton @@ -354,19 +355,21 @@ fun ResetPasswordScreen( AnimatedVisibility( visible = (resetPasswordStep.stepNum in 1..2), ) { - Spacer( - modifier = Modifier - .fillMaxWidth() - .height(4.dp) - ) - Text( - text = if (resetPasswordStep == ResetPasswordStep.EMAIL_INPUT) - stringResource(R.string.reset_password_email_sub_title) - else if (resetPasswordStep == ResetPasswordStep.EMAIL_VERIFICATION) - stringResource(R.string.reset_password_new_password_sub_title) - else "", - style = DayoTheme.typography.b6.copy(color = Gray2_767B83), - ) + Column { + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(4.dp) + ) + Text( + text = if (resetPasswordStep == ResetPasswordStep.EMAIL_INPUT) + stringResource(R.string.reset_password_email_sub_title) + else if (resetPasswordStep == ResetPasswordStep.EMAIL_VERIFICATION) + stringResource(R.string.reset_password_new_password_sub_title) + else "", + style = DayoTheme.typography.b6.copy(color = Gray2_767B83), + ) + } } // Contents 영역 @@ -647,6 +650,9 @@ private fun EmailCertificationLayout( requestEmailCertification: (String) -> Unit = {}, ) { val certificateEmailAuthCodeFormat = Regex("^\\d{6}$") + val isServerCertificationCodeReady = + certificationCode != EMAIL_CERTIFICATE_AUTH_CODE_INITIAL.toString() && + certificationCode != RESET_PASSWORD_EMAIL_CERTIFICATE_AUTH_CODE_FAIL.toString() var tryCount by remember { mutableStateOf(1) } val isPaused = remember { mutableStateOf(false) } @@ -657,10 +663,12 @@ private fun EmailCertificationLayout( remember { mutableStateOf((R.string.reset_password_email_certification_fail_wrong)) } setNextButtonEnabled( - certificateEmailAuthCodeFormat.matches(certificationInputCode) + certificateEmailAuthCodeFormat.matches(certificationInputCode) && + isServerCertificationCodeReady ) setIsNextButtonClickable( - certificateEmailAuthCodeFormat.matches(certificationInputCode) + certificateEmailAuthCodeFormat.matches(certificationInputCode) && + isServerCertificationCodeReady ) key(tryCount) { @@ -678,6 +686,7 @@ private fun EmailCertificationLayout( isError = isEmailCertificateError ?: false, errorMessage = stringResource(timerErrorMessageRedId.value), timeOutErrorMessage = stringResource(R.string.reset_password_email_certification_fail_time_out), + labelColor = Gray3_9FA5AE, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal), ) } @@ -712,6 +721,10 @@ private fun EmailCertificationLayout( text = stringResource(R.string.reset_password_email_certification_resend_button), onClick = { tryCount++ + setCertificationInputCode("") + timerErrorMessageRedId.value = + R.string.reset_password_email_certification_fail_wrong + setIsEmailCertificateError(false) requestEmailCertification(email) }, underline = true, @@ -725,7 +738,7 @@ private fun EmailCertificationLayout( @Composable @Preview -private fun NewPasswordLayout( +internal fun NewPasswordLayout( resetPasswordStep: ResetPasswordStep = ResetPasswordStep.NEW_PASSWORD_INPUT, isNextButtonEnabled: Boolean = false, setNextButtonEnabled: (Boolean) -> Unit = {}, @@ -808,4 +821,4 @@ enum class ResetPasswordStep(val stepNum: Int) { EMAIL_VERIFICATION(2), // 인증번호 입력 NEW_PASSWORD_INPUT(3), // 비밀번호 입력 NEW_PASSWORD_CONFIRM(4), // 비밀번호 재입력 -} \ No newline at end of file +} diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/account/SetEmailCertificationView.kt b/presentation/src/main/java/daily/dayo/presentation/screen/account/SetEmailCertificationView.kt index a66b5bbc..be0a2fe6 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/account/SetEmailCertificationView.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/account/SetEmailCertificationView.kt @@ -25,6 +25,7 @@ import daily.dayo.presentation.screen.account.model.EmailCertificationState import daily.dayo.presentation.screen.account.model.SignUpStep import daily.dayo.presentation.theme.DayoTheme import daily.dayo.presentation.theme.Gray2_767B83 +import daily.dayo.presentation.theme.Gray3_9FA5AE import daily.dayo.presentation.view.DayoTextButton import daily.dayo.presentation.view.DayoTimerTextField import daily.dayo.presentation.viewmodel.AccountViewModel @@ -48,6 +49,9 @@ fun SetEmailCertificationView( requestEmailCertification: (String) -> Unit = {}, ) { val certificateEmailAuthCodeFormat = Regex("^\\d{6}$") + val isServerCertificationCodeReady = + certificationCode != AccountViewModel.EMAIL_CERTIFICATE_AUTH_CODE_INITIAL.toString() && + certificationCode != AccountViewModel.SIGN_UP_EMAIL_CERTIFICATE_AUTH_CODE_FAIL.toString() var tryCount by remember { mutableStateOf(1) } val isPaused = remember { mutableStateOf(false) } @@ -57,10 +61,14 @@ fun SetEmailCertificationView( val isTimeOut = remember { mutableStateOf(false) } setNextButtonEnabled( - certificateEmailAuthCodeFormat.matches(certificationInputCode) && !isTimeOut.value + certificateEmailAuthCodeFormat.matches(certificationInputCode) && + isServerCertificationCodeReady && + !isTimeOut.value ) setIsNextButtonClickable( - certificateEmailAuthCodeFormat.matches(certificationInputCode) && !isTimeOut.value + certificateEmailAuthCodeFormat.matches(certificationInputCode) && + isServerCertificationCodeReady && + !isTimeOut.value ) key(tryCount) { @@ -78,6 +86,7 @@ fun SetEmailCertificationView( isError = isEmailCertificateError ?: false, errorMessage = stringResource(timerErrorMessageRedId.value), timeOutErrorMessage = stringResource(R.string.sign_up_email_set_address_certification_fail_time_out), + labelColor = Gray3_9FA5AE, onTimeOut = { isTimeOut.value = true setNextButtonEnabled(false) @@ -117,7 +126,11 @@ fun SetEmailCertificationView( text = stringResource(R.string.sign_up_email_set_address_resend_button), onClick = { tryCount++ + setCertificationInputCode("") isTimeOut.value = false + timerErrorMessageRedId.value = + R.string.sign_up_email_set_address_certification_fail_wrong + setIsEmailCertificateError(false) requestEmailCertification(email) }, underline = true, @@ -125,4 +138,4 @@ fun SetEmailCertificationView( ) } } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/account/SetEmailView.kt b/presentation/src/main/java/daily/dayo/presentation/screen/account/SetEmailView.kt index 1c22c471..28b35e10 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/account/SetEmailView.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/account/SetEmailView.kt @@ -54,7 +54,11 @@ fun SetEmailView( requestEmailCertification(it) } }, - label = stringResource(R.string.email), + label = if (email.isNotEmpty()) { + stringResource(R.string.email) + } else { + " " + }, placeholder = stringResource(R.string.sign_up_email_set_address_placeholder), trailingIconId = if (email.isNotBlank()) R.drawable.ic_trailing_check else null, errorTrailingIconId = R.drawable.ic_trailing_error, diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/account/SignUpEmailScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/account/SignUpEmailScreen.kt index c42bbbed..8cef0fa6 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/account/SignUpEmailScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/account/SignUpEmailScreen.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -262,15 +263,17 @@ fun SignUpEmailTitleLayout( // SubTitle 영역 AnimatedVisibility(visible = subTitle.isNotBlank()) { - Spacer( - modifier = Modifier - .fillMaxWidth() - .height(4.dp) - ) - Text( - text = subTitle, - style = DayoTheme.typography.b6.copy(color = Gray2_767B83), - ) + Column { + Spacer( + modifier = Modifier + .fillMaxWidth() + .height(4.dp) + ) + Text( + text = subTitle, + style = DayoTheme.typography.b6.copy(color = Gray2_767B83), + ) + } } } @@ -592,6 +595,7 @@ fun SignUpEmailScaffold( ) } }, + windowInsets = WindowInsets(0, 0, 0, 0), ) } ) { innerPadding -> @@ -683,4 +687,4 @@ fun SignUpEmailNextButton( enabled = isSignUpButtonEnabled, ) } -} \ No newline at end of file +} diff --git a/presentation/src/main/java/daily/dayo/presentation/view/TextField.kt b/presentation/src/main/java/daily/dayo/presentation/view/TextField.kt index c3fbfd17..3356c721 100644 --- a/presentation/src/main/java/daily/dayo/presentation/view/TextField.kt +++ b/presentation/src/main/java/daily/dayo/presentation/view/TextField.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.calculateEndPadding import androidx.compose.foundation.layout.calculateStartPadding import androidx.compose.foundation.layout.fillMaxWidth @@ -198,6 +199,8 @@ fun DayoPasswordTextField( textAlign: TextAlign = TextAlign.Left, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, onErrorIconClick: (() -> Unit) = { }, + showClearIcon: Boolean = true, + showVisibilityIcon: Boolean = true, keyboardOptions: KeyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password), keyboardActions: KeyboardActions = KeyboardActions.Default, isEnabled: Boolean = true, @@ -207,6 +210,15 @@ fun DayoPasswordTextField( verticalArrangement = Arrangement.spacedBy(4.dp) ) { var passwordHidden by remember { mutableStateOf(true) } + val showError = isError == true + val shouldShowClear = showClearIcon && isEnabled && value.isNotBlank() && !showError + val shouldShowVisibility = showVisibilityIcon && !showError + val trailingContentWidth = when { + showError -> 20.dp + shouldShowClear && shouldShowVisibility -> 48.dp + shouldShowClear || shouldShowVisibility -> 20.dp + else -> 0.dp + } if (label.isNotEmpty()) { Text( @@ -254,7 +266,7 @@ fun DayoPasswordTextField( contentPadding = PaddingValues( start = contentPadding.calculateStartPadding(LayoutDirection.Ltr), top = contentPadding.calculateTopPadding(), - end = contentPadding.calculateEndPadding(LayoutDirection.Ltr) + 20.dp, + end = contentPadding.calculateEndPadding(LayoutDirection.Ltr) + trailingContentWidth, bottom = contentPadding.calculateBottomPadding() ), colors = TextFieldDefaults.colors( @@ -279,22 +291,42 @@ fun DayoPasswordTextField( Box( modifier = Modifier.align(alignment = Alignment.CenterEnd) ) { - if (isError != null && isError == true) { + if (showError) { NoRippleIconButton( onClick = onErrorIconClick, iconContentDescription = "error icon", iconPainter = painterResource(id = errorTrailingIconId), iconButtonModifier = Modifier.size(20.dp) ) - } else { - val trailingIconId = if (passwordHidden) R.drawable.ic_trailing_invisible else R.drawable.ic_trailing_visible - val description = if (passwordHidden) "Show password" else "Hide password" - NoRippleIconButton( - onClick = { passwordHidden = passwordHidden.not() }, - iconContentDescription = description, - iconPainter = painterResource(id = trailingIconId), - iconButtonModifier = Modifier.size(20.dp) - ) + } else if (shouldShowClear || shouldShowVisibility) { + Row( + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + if (shouldShowClear) { + NoRippleIconButton( + onClick = { onValueChange("") }, + iconContentDescription = "Clear password", + iconPainter = painterResource(id = R.drawable.ic_trailing_delete), + iconButtonModifier = Modifier.size(20.dp) + ) + } + + if (shouldShowVisibility) { + val trailingIconId = if (passwordHidden) { + R.drawable.ic_trailing_invisible + } else { + R.drawable.ic_trailing_visible + } + val description = if (passwordHidden) "Show password" else "Hide password" + NoRippleIconButton( + onClick = { passwordHidden = passwordHidden.not() }, + iconContentDescription = description, + iconPainter = painterResource(id = trailingIconId), + iconButtonModifier = Modifier.size(20.dp) + ) + } + } } } } @@ -323,6 +355,7 @@ fun DayoTimerTextField( isError: Boolean = false, errorMessage: String = "", timeOutErrorMessage: String = stringResource(id = R.string.email_address_certificate_alert_message_time_fail), + labelColor: Color = Gray4_C5CAD2, onTimeOut: (() -> Unit) = { }, textAlign: TextAlign = TextAlign.Left, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, @@ -351,7 +384,7 @@ fun DayoTimerTextField( Text( text = label, style = DayoTheme.typography.caption3.copy( - color = Gray4_C5CAD2, + color = labelColor, fontWeight = FontWeight.SemiBold ) ) @@ -528,4 +561,4 @@ private fun PreviewOutlinedTextField() { placeholder = stringResource(id = R.string.report_post_reason_other_hint), maxLength = 5 ) -} \ No newline at end of file +} diff --git a/presentation/src/main/java/daily/dayo/presentation/view/TopNavigation.kt b/presentation/src/main/java/daily/dayo/presentation/view/TopNavigation.kt index 00b4c24d..1e5c56ac 100644 --- a/presentation/src/main/java/daily/dayo/presentation/view/TopNavigation.kt +++ b/presentation/src/main/java/daily/dayo/presentation/view/TopNavigation.kt @@ -1,6 +1,7 @@ package daily.dayo.presentation.view import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.CenterAlignedTopAppBar @@ -25,7 +26,8 @@ fun TopNavigation( title: String = "", leftIcon: @Composable () -> Unit = {}, rightIcon: @Composable () -> Unit = {}, - titleAlignment: TopNavigationAlign = TopNavigationAlign.LEFT + titleAlignment: TopNavigationAlign = TopNavigationAlign.LEFT, + windowInsets: WindowInsets = TopAppBarDefaults.windowInsets ) { when (titleAlignment) { TopNavigationAlign.LEFT -> { @@ -34,6 +36,7 @@ fun TopNavigation( containerColor = White_FFFFFF, titleContentColor = Dark, ), + windowInsets = windowInsets, navigationIcon = leftIcon, actions = { rightIcon() }, title = { @@ -48,6 +51,7 @@ fun TopNavigation( containerColor = White_FFFFFF, titleContentColor = Dark, ), + windowInsets = windowInsets, navigationIcon = leftIcon, actions = { rightIcon() }, title = { @@ -93,4 +97,4 @@ fun PreviewTopNavigation() { titleAlignment = TopNavigationAlign.CENTER ) } -} \ No newline at end of file +}