feat: hide/show password in login

Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
Infi 2024-10-27 02:07:48 +01:00
parent 44c3bb536e
commit 2d89df1b6a
3 changed files with 60 additions and 6 deletions

View File

@ -13,19 +13,27 @@ import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawingPadding import androidx.compose.foundation.layout.safeDrawingPadding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.text.input.TextObfuscationMode
import androidx.compose.foundation.text.input.rememberTextFieldState
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SecureTextField
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.testTag import androidx.compose.ui.platform.testTag
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
@ -48,6 +56,7 @@ import chat.revolt.components.generic.AnyLink
import chat.revolt.components.generic.FormTextField import chat.revolt.components.generic.FormTextField
import chat.revolt.components.generic.Weblink import chat.revolt.components.generic.Weblink
import chat.revolt.persistence.KVStorage import chat.revolt.persistence.KVStorage
import chat.revolt.ui.theme.FragmentMono
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@ -142,6 +151,12 @@ class LoginViewModel @Inject constructor(
@Composable @Composable
fun LoginScreen(navController: NavController, viewModel: LoginViewModel = hiltViewModel()) { fun LoginScreen(navController: NavController, viewModel: LoginViewModel = hiltViewModel()) {
val passwordTextFieldState = rememberTextFieldState()
LaunchedEffect(passwordTextFieldState.text) {
viewModel.setPassword(passwordTextFieldState.text.toString())
}
val showPassword = remember { mutableStateOf(false) }
val context = LocalContext.current val context = LocalContext.current
LaunchedEffect(viewModel.navigateTo) { LaunchedEffect(viewModel.navigateTo) {
@ -214,11 +229,38 @@ fun LoginScreen(navController: NavController, viewModel: LoginViewModel = hiltVi
onChange = viewModel::setEmail, onChange = viewModel::setEmail,
modifier = Modifier.padding(vertical = 25.dp) modifier = Modifier.padding(vertical = 25.dp)
) )
FormTextField( SecureTextField(
value = viewModel.password, passwordTextFieldState,
label = stringResource(R.string.password), label = { Text(stringResource(R.string.password)) },
type = KeyboardType.Password, textObfuscationMode = if (showPassword.value) {
onChange = viewModel::setPassword TextObfuscationMode.Visible
} else {
TextObfuscationMode.RevealLastTyped
},
textStyle = if (showPassword.value) LocalTextStyle.current else LocalTextStyle.current.copy(
fontFamily = FragmentMono
),
trailingIcon = {
IconButton(onClick = {
showPassword.value = !showPassword.value
}) {
when {
showPassword.value -> {
Icon(
painter = painterResource(R.drawable.ic_eye_off_24dp),
contentDescription = stringResource(R.string.hide_password)
)
}
else -> {
Icon(
painter = painterResource(R.drawable.ic_eye_24dp),
contentDescription = stringResource(R.string.show_password)
)
}
}
}
},
) )
AnyLink( AnyLink(

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#ffffff"
android:pathData="M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17M12,4.5C7,4.5 2.73,7.61 1,12C2.73,16.39 7,19.5 12,19.5C17,19.5 21.27,16.39 23,12C21.27,7.61 17,4.5 12,4.5Z" />
</vector>

View File

@ -20,6 +20,9 @@
<string name="email">Email</string> <string name="email">Email</string>
<string name="password">Password</string> <string name="password">Password</string>
<string name="hide_password">Hide password</string>
<string name="show_password">Show password</string>
<string name="login">Log In</string> <string name="login">Log In</string>
<string name="signup">Sign Up</string> <string name="signup">Sign Up</string>
<string name="resend">Resend</string> <string name="resend">Resend</string>