diff --git a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/components/AuthPasswordTextField.kt b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/components/AuthPasswordTextField.kt index d81e398..69069c0 100644 --- a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/components/AuthPasswordTextField.kt +++ b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/components/AuthPasswordTextField.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.tooling.preview.Preview import com.stslex.aproselection.core.ui.theme.AppTheme -import com.stslex.aproselection.feature.auth.ui.model.screen.text_field.PasswordTextFieldState +import com.stslex.aproselection.feature.auth.ui.model.screen.text_field.base.PasswordTextFieldState @Composable fun AuthPasswordTextField( diff --git a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/PasswordInputTextFieldState.kt b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/PasswordInputTextFieldState.kt index 4e60dca..9688807 100644 --- a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/PasswordInputTextFieldState.kt +++ b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/PasswordInputTextFieldState.kt @@ -1,16 +1,24 @@ package com.stslex.aproselection.feature.auth.ui.model.screen.text_field import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable import androidx.compose.runtime.remember import androidx.compose.ui.hapticfeedback.HapticFeedback import com.stslex.aproselection.feature.auth.R import com.stslex.aproselection.feature.auth.ui.model.mvi.ScreenAction.InputAction.PasswordInput +import com.stslex.aproselection.feature.auth.ui.model.screen.text_field.base.PasswordTextFieldState +import com.stslex.aproselection.feature.auth.ui.model.screen.text_field.hidden.HiddenState +@Stable data class PasswordInputTextFieldState( private val hapticFeedback: HapticFeedback, private val processAction: (PasswordInput) -> Unit, + private val hiddenState: HiddenState, override val text: String, -) : PasswordTextFieldState(hapticFeedback) { +) : PasswordTextFieldState( + hapticFeedback = hapticFeedback, + hiddenState = hiddenState +) { override val hint: Int = R.string.auth_password_enter_hint_text @@ -25,10 +33,14 @@ fun rememberPasswordInputTextFieldState( hapticFeedback: HapticFeedback, processAction: (PasswordInput) -> Unit, text: String, -) = remember(text) { - PasswordInputTextFieldState( - hapticFeedback = hapticFeedback, - processAction = processAction, - text = text - ) +): PasswordInputTextFieldState { + val hiddenState = remember { HiddenState() } + return remember(text) { + PasswordInputTextFieldState( + hapticFeedback = hapticFeedback, + processAction = processAction, + hiddenState = hiddenState, + text = text + ) + } } \ No newline at end of file diff --git a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/PasswordSubmitTextFieldState.kt b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/PasswordSubmitTextFieldState.kt index 925afab..8aaea8b 100644 --- a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/PasswordSubmitTextFieldState.kt +++ b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/PasswordSubmitTextFieldState.kt @@ -1,16 +1,24 @@ package com.stslex.aproselection.feature.auth.ui.model.screen.text_field import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable import androidx.compose.runtime.remember import androidx.compose.ui.hapticfeedback.HapticFeedback import com.stslex.aproselection.feature.auth.R import com.stslex.aproselection.feature.auth.ui.model.mvi.ScreenAction.InputAction.PasswordSubmitInput +import com.stslex.aproselection.feature.auth.ui.model.screen.text_field.base.PasswordTextFieldState +import com.stslex.aproselection.feature.auth.ui.model.screen.text_field.hidden.HiddenState +@Stable data class PasswordSubmitTextFieldState( private val hapticFeedback: HapticFeedback, private val processAction: (PasswordSubmitInput) -> Unit, + private val hiddenState: HiddenState, override val text: String, -) : PasswordTextFieldState(hapticFeedback) { +) : PasswordTextFieldState( + hapticFeedback = hapticFeedback, + hiddenState = hiddenState +) { override val hint: Int = R.string.auth_password_submit_hint_text @@ -25,10 +33,16 @@ fun rememberPasswordSubmitTextFieldState( hapticFeedback: HapticFeedback, processAction: (PasswordSubmitInput) -> Unit, text: String, -) = remember(text) { - PasswordSubmitTextFieldState( - hapticFeedback = hapticFeedback, - processAction = processAction, - text = text - ) +): PasswordSubmitTextFieldState { + val hiddenState = remember { + HiddenState() + } + return remember(text) { + PasswordSubmitTextFieldState( + hapticFeedback = hapticFeedback, + processAction = processAction, + hiddenState = hiddenState, + text = text + ) + } } \ No newline at end of file diff --git a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/UsernameTextFieldState.kt b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/UsernameTextFieldState.kt index 752a0fc..b5dcc67 100644 --- a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/UsernameTextFieldState.kt +++ b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/UsernameTextFieldState.kt @@ -1,10 +1,13 @@ package com.stslex.aproselection.feature.auth.ui.model.screen.text_field import androidx.compose.runtime.Composable +import androidx.compose.runtime.Stable import androidx.compose.runtime.remember import com.stslex.aproselection.feature.auth.R import com.stslex.aproselection.feature.auth.ui.model.mvi.ScreenAction.InputAction.UsernameInput +import com.stslex.aproselection.feature.auth.ui.model.screen.text_field.base.AuthTextField +@Stable data class UsernameTextFieldState( private val processAction: (UsernameInput) -> Unit, override val text: String, diff --git a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/AuthTextField.kt b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/base/AuthTextField.kt similarity index 65% rename from feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/AuthTextField.kt rename to feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/base/AuthTextField.kt index 03c1502..d45c967 100644 --- a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/AuthTextField.kt +++ b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/base/AuthTextField.kt @@ -1,5 +1,8 @@ -package com.stslex.aproselection.feature.auth.ui.model.screen.text_field +package com.stslex.aproselection.feature.auth.ui.model.screen.text_field.base +import androidx.compose.runtime.Stable + +@Stable abstract class AuthTextField { abstract val text: String @@ -10,8 +13,9 @@ abstract class AuthTextField { get() = "${text.length}/$MAX_SYMBOL_COUNT" fun onTextChange(value: String) { - if (text == value || value.length > MAX_SYMBOL_COUNT) return - sendAction(value) + val currentValue = value.trim() + if (text == currentValue || currentValue.length > MAX_SYMBOL_COUNT) return + sendAction(currentValue) } companion object { diff --git a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/PasswordTextFieldState.kt b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/base/PasswordTextFieldState.kt similarity index 73% rename from feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/PasswordTextFieldState.kt rename to feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/base/PasswordTextFieldState.kt index 71a4519..fd4add6 100644 --- a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/PasswordTextFieldState.kt +++ b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/base/PasswordTextFieldState.kt @@ -1,24 +1,25 @@ -package com.stslex.aproselection.feature.auth.ui.model.screen.text_field +package com.stslex.aproselection.feature.auth.ui.model.screen.text_field.base +import androidx.compose.runtime.Stable import androidx.compose.runtime.derivedStateOf -import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.hapticfeedback.HapticFeedback import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import com.stslex.aproselection.feature.auth.R +import com.stslex.aproselection.feature.auth.ui.model.screen.text_field.hidden.HiddenState +@Stable abstract class PasswordTextFieldState( - private val hapticFeedback: HapticFeedback + private val hapticFeedback: HapticFeedback, + private val hiddenState: HiddenState ) : AuthTextField() { - private val isPasswordHidden = mutableStateOf(true) - override val label: Int = R.string.auth_password_text abstract val hint: Int val visualTransformation = derivedStateOf { - if (isPasswordHidden.value) { + if (hiddenState.isHidden) { PasswordVisualTransformation() } else { VisualTransformation.None @@ -26,7 +27,7 @@ abstract class PasswordTextFieldState( } val trailingIconRes = derivedStateOf { - if (isPasswordHidden.value) { + if (hiddenState.isHidden) { R.drawable.baseline_visibility_off_24 } else { R.drawable.baseline_visibility_24 @@ -35,7 +36,7 @@ abstract class PasswordTextFieldState( fun onPasswordHideClicked() { hapticFeedback.performHapticFeedback(HapticFeedbackType.TextHandleMove) - isPasswordHidden.value = isPasswordHidden.value.not() + hiddenState.isHidden = hiddenState.isHidden.not() } } diff --git a/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/hidden/HiddenState.kt b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/hidden/HiddenState.kt new file mode 100644 index 0000000..d34abb5 --- /dev/null +++ b/feature/auth/src/main/java/com/stslex/aproselection/feature/auth/ui/model/screen/text_field/hidden/HiddenState.kt @@ -0,0 +1,15 @@ +package com.stslex.aproselection.feature.auth.ui.model.screen.text_field.hidden + +import androidx.compose.runtime.Stable +import androidx.compose.runtime.mutableStateOf + +@Stable +class HiddenState { + + private val _isHidden = mutableStateOf(true) + var isHidden: Boolean + get() = _isHidden.value + set(value) { + _isHidden.value = value + } +} \ No newline at end of file