|
@@ -30,11 +30,14 @@ import androidx.compose.foundation.layout.height
|
|
|
import androidx.compose.foundation.layout.padding
|
|
|
import androidx.compose.foundation.layout.size
|
|
|
import androidx.compose.foundation.layout.width
|
|
|
+import androidx.compose.foundation.rememberScrollState
|
|
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
|
import androidx.compose.foundation.text.ClickableText
|
|
|
import androidx.compose.foundation.text.KeyboardActionScope
|
|
|
import androidx.compose.foundation.text.KeyboardActions
|
|
|
import androidx.compose.foundation.text.KeyboardOptions
|
|
|
+import androidx.compose.material.Snackbar
|
|
|
+import androidx.compose.material.SnackbarDuration
|
|
|
import androidx.compose.material.icons.Icons
|
|
|
import androidx.compose.material.icons.filled.AddAlert
|
|
|
import androidx.compose.material.icons.filled.Email
|
|
@@ -44,6 +47,7 @@ import androidx.compose.material.icons.filled.Visibility
|
|
|
import androidx.compose.material.icons.filled.VisibilityOff
|
|
|
import androidx.compose.material.icons.filled.Warning
|
|
|
import androidx.compose.material.icons.outlined.Visibility
|
|
|
+import androidx.compose.material.rememberScaffoldState
|
|
|
import androidx.compose.material3.Button
|
|
|
import androidx.compose.material3.ButtonColors
|
|
|
import androidx.compose.material3.ButtonDefaults
|
|
@@ -54,8 +58,11 @@ import androidx.compose.material3.Icon
|
|
|
import androidx.compose.material3.IconButton
|
|
|
import androidx.compose.material3.MaterialTheme
|
|
|
import androidx.compose.material3.OutlinedTextField
|
|
|
+import androidx.compose.material3.Scaffold
|
|
|
import androidx.compose.material3.Shapes
|
|
|
import androidx.compose.material3.SnackbarDefaults
|
|
|
+import androidx.compose.material3.SnackbarHost
|
|
|
+import androidx.compose.material3.SnackbarHostState
|
|
|
import androidx.compose.material3.Text
|
|
|
import androidx.compose.material3.TextField
|
|
|
import androidx.compose.material3.TextFieldColors
|
|
@@ -69,6 +76,7 @@ import androidx.compose.runtime.mutableFloatStateOf
|
|
|
import androidx.compose.runtime.mutableStateOf
|
|
|
import androidx.compose.runtime.remember
|
|
|
import androidx.compose.runtime.rememberCompositionContext
|
|
|
+import androidx.compose.runtime.rememberCoroutineScope
|
|
|
import androidx.compose.ui.Alignment
|
|
|
import androidx.compose.ui.ExperimentalComposeUiApi
|
|
|
import androidx.compose.ui.Modifier
|
|
@@ -109,352 +117,355 @@ import com.vpn.fastestvpnservice.sealedClass.Screen
|
|
|
import com.vpn.fastestvpnservice.ui.theme.outfitFontFamily
|
|
|
import com.vpn.fastestvpnservice.viewmodels.LoginViewModel
|
|
|
import com.vpn.fastestvpnservice.views.CustomValidation
|
|
|
+import com.vpn.fastestvpnservice.views.ShowCustomSnackBar
|
|
|
import kotlinx.coroutines.delay
|
|
|
+import kotlinx.coroutines.launch
|
|
|
import kotlin.coroutines.coroutineContext
|
|
|
import kotlin.random.Random
|
|
|
|
|
|
@OptIn(ExperimentalComposeUiApi::class)
|
|
|
@Composable
|
|
|
fun Login(navHostController: NavHostController) {
|
|
|
+
|
|
|
val keyboardController = LocalSoftwareKeyboardController.current
|
|
|
val focusManager = LocalFocusManager.current
|
|
|
val random = Random.nextInt(1,999)
|
|
|
-
|
|
|
val loginViewModel: LoginViewModel = viewModel()
|
|
|
val readOnly = loginViewModel.liveDataLoginStatus.observeAsState().value
|
|
|
-
|
|
|
var textChanged by remember { mutableStateOf("") }
|
|
|
var passwordChanged by remember { mutableStateOf("") }
|
|
|
var passwordVisible by remember { mutableStateOf(false) }
|
|
|
var showErrorEmail by remember { mutableStateOf(false) }
|
|
|
var showErrorPass1 by remember { mutableStateOf(false) }
|
|
|
var showErrorPass2 by remember { mutableStateOf(false) }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
val context = LocalContext.current
|
|
|
- var basePreferenceHelper = BasePreferenceHelper(context)
|
|
|
+ val basePreferenceHelper = BasePreferenceHelper(context)
|
|
|
+ val snackBarState = remember { SnackbarHostState() }
|
|
|
|
|
|
- Box(
|
|
|
- modifier = Modifier
|
|
|
- .fillMaxSize()
|
|
|
- .paint(
|
|
|
- painter = painterResource(id = R.drawable.bg_img3),
|
|
|
- contentScale = ContentScale.FillBounds
|
|
|
- )
|
|
|
- .alpha(if (readOnly == true) 0.6F else 1F)
|
|
|
+ Scaffold(
|
|
|
+ content = { padding ->
|
|
|
+ Box(
|
|
|
+ modifier = Modifier
|
|
|
+ .fillMaxSize()
|
|
|
+ .paint(
|
|
|
+ painter = painterResource(id = R.drawable.bg_img3),
|
|
|
+ contentScale = ContentScale.FillBounds
|
|
|
+ )
|
|
|
+ .alpha(if (readOnly == true) 0.6F else 1F)
|
|
|
// .background(
|
|
|
// if (isSystemInDarkTheme()) Color.Black
|
|
|
// else Color.Transparent
|
|
|
// )
|
|
|
- .pointerInput(Unit) {
|
|
|
- detectTapGestures {
|
|
|
- focusManager.clearFocus()
|
|
|
- keyboardController?.hide()
|
|
|
- }
|
|
|
- }
|
|
|
- ,
|
|
|
-// contentAlignment = Alignment.Center
|
|
|
-
|
|
|
- ) {
|
|
|
- Column (
|
|
|
- modifier = Modifier
|
|
|
- .fillMaxHeight()
|
|
|
- .fillMaxWidth()
|
|
|
- ,
|
|
|
- verticalArrangement = Arrangement.Top,
|
|
|
- horizontalAlignment = Alignment.CenterHorizontally
|
|
|
- ) {
|
|
|
- Spacer(modifier = Modifier.height(132.dp))
|
|
|
- Image(
|
|
|
- painter = painterResource(
|
|
|
- id = R.drawable.fastestapp_logo3x),
|
|
|
- contentDescription = "FastestVPN",
|
|
|
- modifier = Modifier
|
|
|
- .size(width = 75.dp, height = 102.dp)
|
|
|
- .background(Color.Transparent)
|
|
|
- .padding(top = 0.dp)
|
|
|
- ,
|
|
|
- )
|
|
|
- Spacer(modifier = Modifier.height(50.dp))
|
|
|
-
|
|
|
- TextMsg(
|
|
|
- text = "Welcome Back! $showErrorPass2",
|
|
|
- color = Color.White,
|
|
|
- style = MaterialTheme.typography.displayLarge
|
|
|
- )
|
|
|
- Spacer(modifier = Modifier.height(8.dp))
|
|
|
- TextMsg(
|
|
|
- text = "Please login to your account.",
|
|
|
- color = colorResource(id = R.color.light_grey),
|
|
|
- style = TextStyle(
|
|
|
- fontFamily = outfitFontFamily,
|
|
|
- fontWeight = FontWeight.Normal,
|
|
|
- fontSize = 14.sp,
|
|
|
- lineHeight = 30.sp,
|
|
|
- )
|
|
|
- )
|
|
|
+ .pointerInput(Unit) {
|
|
|
+ detectTapGestures {
|
|
|
+ focusManager.clearFocus()
|
|
|
+ keyboardController?.hide()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ ) {
|
|
|
+ ShowCustomSnackBar(snackBarState)
|
|
|
+
|
|
|
+ Column (
|
|
|
+ modifier = Modifier
|
|
|
+ .fillMaxHeight()
|
|
|
+ .fillMaxWidth()
|
|
|
+ ,
|
|
|
+ verticalArrangement = Arrangement.Top,
|
|
|
+ horizontalAlignment = Alignment.CenterHorizontally
|
|
|
+ ) {
|
|
|
+ Spacer(modifier = Modifier.height(132.dp))
|
|
|
+ Image(
|
|
|
+ painter = painterResource(
|
|
|
+ id = R.drawable.fastestapp_logo3x),
|
|
|
+ contentDescription = "FastestVPN",
|
|
|
+ modifier = Modifier
|
|
|
+ .size(width = 75.dp, height = 102.dp)
|
|
|
+ .background(Color.Transparent)
|
|
|
+ .padding(top = 0.dp)
|
|
|
+ ,
|
|
|
+ )
|
|
|
+ Spacer(modifier = Modifier.height(50.dp))
|
|
|
|
|
|
- Spacer(modifier = Modifier.height(20.dp))
|
|
|
-
|
|
|
-
|
|
|
- TextField(
|
|
|
- value = textChanged,
|
|
|
- onValueChange = {
|
|
|
- textChanged = it
|
|
|
- },
|
|
|
- readOnly = readOnly!!,
|
|
|
- textStyle = TextStyle(
|
|
|
- color = colorResource(id = R.color.white),
|
|
|
- fontFamily = outfitFontFamily,
|
|
|
- fontWeight = FontWeight.Normal,
|
|
|
- fontSize = 14.sp,
|
|
|
- lineHeight = 22.sp,
|
|
|
- letterSpacing = 0.21.sp
|
|
|
- ),
|
|
|
- modifier = Modifier
|
|
|
- .padding(start = 15.dp, end = 15.dp)
|
|
|
- .align(Alignment.Start)
|
|
|
- .fillMaxWidth()
|
|
|
- .height(60.dp)
|
|
|
- .border(
|
|
|
- 1.dp,
|
|
|
- color = if (showErrorEmail) colorResource(id = R.color.red)
|
|
|
- else colorResource(id = R.color.white),
|
|
|
- shape = RoundedCornerShape(16.dp)
|
|
|
+ TextMsg(
|
|
|
+ text = "Welcome Back!",
|
|
|
+ color = Color.White,
|
|
|
+ style = MaterialTheme.typography.displayLarge
|
|
|
)
|
|
|
- .clickable() { },
|
|
|
+ Spacer(modifier = Modifier.height(8.dp))
|
|
|
+ TextMsg(
|
|
|
+ text = "Please login to your account.",
|
|
|
+ color = colorResource(id = R.color.light_grey),
|
|
|
+ style = TextStyle(
|
|
|
+ fontFamily = outfitFontFamily,
|
|
|
+ fontWeight = FontWeight.Normal,
|
|
|
+ fontSize = 14.sp,
|
|
|
+ lineHeight = 30.sp,
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ Spacer(modifier = Modifier.height(20.dp))
|
|
|
+
|
|
|
+
|
|
|
+ TextField(
|
|
|
+ value = textChanged,
|
|
|
+ onValueChange = {
|
|
|
+ textChanged = it
|
|
|
+ },
|
|
|
+ readOnly = readOnly!!,
|
|
|
+ textStyle = TextStyle(
|
|
|
+ color = colorResource(id = R.color.white),
|
|
|
+ fontFamily = outfitFontFamily,
|
|
|
+ fontWeight = FontWeight.Normal,
|
|
|
+ fontSize = 14.sp,
|
|
|
+ lineHeight = 22.sp,
|
|
|
+ letterSpacing = 0.21.sp
|
|
|
+ ),
|
|
|
+ modifier = Modifier
|
|
|
+ .padding(start = 15.dp, end = 15.dp)
|
|
|
+ .align(Alignment.Start)
|
|
|
+ .fillMaxWidth()
|
|
|
+ .height(60.dp)
|
|
|
+ .border(
|
|
|
+ 1.dp,
|
|
|
+ color = if (showErrorEmail) colorResource(id = R.color.red)
|
|
|
+ else colorResource(id = R.color.white),
|
|
|
+ shape = RoundedCornerShape(16.dp)
|
|
|
+ )
|
|
|
+ .clickable() { },
|
|
|
|
|
|
// placeholder = {
|
|
|
// Text(text = "Enter email address",
|
|
|
// color = colorResource(id = R.color.white))
|
|
|
// },
|
|
|
- label = {
|
|
|
- Text(text = "Email",
|
|
|
- style = TextStyle(
|
|
|
- colorResource(id = R.color.white)),
|
|
|
- fontFamily = outfitFontFamily,
|
|
|
- fontWeight = FontWeight.Medium,
|
|
|
- fontSize = 12.sp,
|
|
|
- )
|
|
|
- },
|
|
|
- leadingIcon = {
|
|
|
- Icon(
|
|
|
- painter = painterResource(id = R.drawable.sms3x),
|
|
|
- contentDescription = "Email Logo",
|
|
|
- tint = colorResource(id = R.color.white),
|
|
|
- modifier = Modifier
|
|
|
- .size(24.dp, 24.dp)
|
|
|
- )
|
|
|
- },
|
|
|
- maxLines = 1,
|
|
|
- colors = TextFieldDefaults.colors(
|
|
|
- focusedLabelColor = Color.Blue,
|
|
|
- unfocusedContainerColor = colorResource(id = R.color.transparent),
|
|
|
- focusedContainerColor = colorResource(id = R.color.transparent),
|
|
|
- focusedIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
- disabledIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
- unfocusedIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
- cursorColor = colorResource(id = R.color.white)
|
|
|
- ),
|
|
|
- keyboardOptions = KeyboardOptions(
|
|
|
- keyboardType = KeyboardType.Email,
|
|
|
- imeAction = ImeAction.Done
|
|
|
- ),
|
|
|
- keyboardActions = KeyboardActions(
|
|
|
- onDone = {
|
|
|
- focusManager.clearFocus()
|
|
|
- keyboardController?.hide()
|
|
|
- }
|
|
|
- ),
|
|
|
+ label = {
|
|
|
+ Text(text = "Email",
|
|
|
+ style = TextStyle(
|
|
|
+ colorResource(id = R.color.white)),
|
|
|
+ fontFamily = outfitFontFamily,
|
|
|
+ fontWeight = FontWeight.Medium,
|
|
|
+ fontSize = 12.sp,
|
|
|
+ )
|
|
|
+ },
|
|
|
+ leadingIcon = {
|
|
|
+ Icon(
|
|
|
+ painter = painterResource(id = R.drawable.sms3x),
|
|
|
+ contentDescription = "Email Logo",
|
|
|
+ tint = colorResource(id = R.color.white),
|
|
|
+ modifier = Modifier
|
|
|
+ .size(24.dp, 24.dp)
|
|
|
+ )
|
|
|
+ },
|
|
|
+ maxLines = 1,
|
|
|
+ colors = TextFieldDefaults.colors(
|
|
|
+ focusedLabelColor = Color.Blue,
|
|
|
+ unfocusedContainerColor = colorResource(id = R.color.transparent),
|
|
|
+ focusedContainerColor = colorResource(id = R.color.transparent),
|
|
|
+ focusedIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
+ disabledIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
+ unfocusedIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
+ cursorColor = colorResource(id = R.color.white)
|
|
|
+ ),
|
|
|
+ keyboardOptions = KeyboardOptions(
|
|
|
+ keyboardType = KeyboardType.Email,
|
|
|
+ imeAction = ImeAction.Done
|
|
|
+ ),
|
|
|
+ keyboardActions = KeyboardActions(
|
|
|
+ onDone = {
|
|
|
+ focusManager.clearFocus()
|
|
|
+ keyboardController?.hide()
|
|
|
+ }
|
|
|
+ ),
|
|
|
|
|
|
- )
|
|
|
+ )
|
|
|
|
|
|
- if (showErrorEmail) {
|
|
|
- ShowErrorRow(errorText = "Email is Empty")
|
|
|
+ if (showErrorEmail) {
|
|
|
+ ShowErrorRow(errorText = "Email is Empty")
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- Spacer(modifier = Modifier.height(20.dp))
|
|
|
+ Spacer(modifier = Modifier.height(20.dp))
|
|
|
|
|
|
- val color = if (showErrorPass1) {
|
|
|
- colorResource(id = R.color.red)
|
|
|
- }
|
|
|
- else if (showErrorPass2) {
|
|
|
- colorResource(id = R.color.red)
|
|
|
- }
|
|
|
- else {
|
|
|
- colorResource(id = R.color.grey_password_field)
|
|
|
- }
|
|
|
+ val color = if (showErrorPass1) {
|
|
|
+ colorResource(id = R.color.red)
|
|
|
+ }
|
|
|
+ else if (showErrorPass2) {
|
|
|
+ colorResource(id = R.color.red)
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ colorResource(id = R.color.grey_password_field)
|
|
|
+ }
|
|
|
|
|
|
- TextField(
|
|
|
- value = passwordChanged,
|
|
|
- onValueChange = {
|
|
|
- Log.d("onClick_test", "onValueChange -> ")
|
|
|
- passwordChanged = it
|
|
|
- },
|
|
|
- readOnly = readOnly,
|
|
|
-
|
|
|
- textStyle = TextStyle(
|
|
|
- color = colorResource(id = R.color.white),
|
|
|
- fontFamily = outfitFontFamily,
|
|
|
- fontWeight = FontWeight.Normal,
|
|
|
- fontSize = 14.sp,
|
|
|
- lineHeight = 22.sp,
|
|
|
- letterSpacing = 0.21.sp
|
|
|
- ),
|
|
|
- modifier = Modifier
|
|
|
- .padding(start = 15.dp, end = 15.dp)
|
|
|
- .align(Alignment.Start)
|
|
|
- .fillMaxWidth()
|
|
|
- .height(60.dp)
|
|
|
- .border(
|
|
|
- 1.dp,
|
|
|
- color = color,
|
|
|
- shape = RoundedCornerShape(16.dp)
|
|
|
- )
|
|
|
- .background(color = colorResource(id = R.color.transparent))
|
|
|
- .clickable() {},
|
|
|
+ TextField(
|
|
|
+ value = passwordChanged,
|
|
|
+ onValueChange = {
|
|
|
+// Log.d("onClick_test", "onValueChange -> ")
|
|
|
+ passwordChanged = it
|
|
|
+ },
|
|
|
+ readOnly = readOnly,
|
|
|
+
|
|
|
+ textStyle = TextStyle(
|
|
|
+ color = colorResource(id = R.color.white),
|
|
|
+ fontFamily = outfitFontFamily,
|
|
|
+ fontWeight = FontWeight.Normal,
|
|
|
+ fontSize = 14.sp,
|
|
|
+ lineHeight = 22.sp,
|
|
|
+ letterSpacing = 0.21.sp
|
|
|
+ ),
|
|
|
+ modifier = Modifier
|
|
|
+ .padding(start = 15.dp, end = 15.dp)
|
|
|
+ .align(Alignment.Start)
|
|
|
+ .fillMaxWidth()
|
|
|
+ .height(60.dp)
|
|
|
+ .border(
|
|
|
+ 1.dp,
|
|
|
+ color = color,
|
|
|
+ shape = RoundedCornerShape(16.dp)
|
|
|
+ )
|
|
|
+ .background(color = colorResource(id = R.color.transparent))
|
|
|
+ .clickable() {},
|
|
|
|
|
|
- shape = RoundedCornerShape(15.dp),
|
|
|
+ shape = RoundedCornerShape(15.dp),
|
|
|
// placeholder = {
|
|
|
// Text(text = "Enter password",
|
|
|
// color = colorResource(id = R.color.white))
|
|
|
// },
|
|
|
- label = {
|
|
|
- Text(text = "Password",
|
|
|
- style = TextStyle(
|
|
|
- colorResource(id = R.color.white)),
|
|
|
- fontFamily = outfitFontFamily,
|
|
|
- fontWeight = FontWeight.Normal,
|
|
|
- fontSize = 16.sp,
|
|
|
- )
|
|
|
- },
|
|
|
- leadingIcon = {
|
|
|
- Icon(
|
|
|
- painter = painterResource(id = R.drawable.lock3x),
|
|
|
- contentDescription = "Password Logo",
|
|
|
- tint = colorResource(id = R.color.white),
|
|
|
- modifier = Modifier
|
|
|
- .size(24.dp, 24.dp)
|
|
|
- )
|
|
|
- },
|
|
|
- maxLines = 1,
|
|
|
- colors = TextFieldDefaults.colors(
|
|
|
- focusedLabelColor = Color.Blue,
|
|
|
- unfocusedContainerColor = colorResource(id = R.color.grey_password_field),
|
|
|
- focusedContainerColor = colorResource(id = R.color.grey_password_field),
|
|
|
- focusedIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
- disabledIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
- unfocusedIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
- cursorColor = colorResource(id = R.color.white)
|
|
|
- ),
|
|
|
- keyboardOptions = KeyboardOptions(
|
|
|
- keyboardType = KeyboardType.Password,
|
|
|
- imeAction = ImeAction.Done
|
|
|
- ),
|
|
|
- keyboardActions = KeyboardActions(
|
|
|
- onDone = {
|
|
|
- focusManager.clearFocus()
|
|
|
- keyboardController?.hide()
|
|
|
- }
|
|
|
- ),
|
|
|
- visualTransformation =
|
|
|
- if (passwordVisible) VisualTransformation.Companion.None
|
|
|
+ label = {
|
|
|
+ Text(text = "Password",
|
|
|
+ style = TextStyle(
|
|
|
+ colorResource(id = R.color.white)),
|
|
|
+ fontFamily = outfitFontFamily,
|
|
|
+ fontWeight = FontWeight.Normal,
|
|
|
+ fontSize = 16.sp,
|
|
|
+ )
|
|
|
+ },
|
|
|
+ leadingIcon = {
|
|
|
+ Icon(
|
|
|
+ painter = painterResource(id = R.drawable.lock3x),
|
|
|
+ contentDescription = "Password Logo",
|
|
|
+ tint = colorResource(id = R.color.white),
|
|
|
+ modifier = Modifier
|
|
|
+ .size(24.dp, 24.dp)
|
|
|
+ )
|
|
|
+ },
|
|
|
+ maxLines = 1,
|
|
|
+ colors = TextFieldDefaults.colors(
|
|
|
+ focusedLabelColor = Color.Blue,
|
|
|
+ unfocusedContainerColor = colorResource(id = R.color.grey_password_field),
|
|
|
+ focusedContainerColor = colorResource(id = R.color.grey_password_field),
|
|
|
+ focusedIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
+ disabledIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
+ unfocusedIndicatorColor = colorResource(id = R.color.transparent),
|
|
|
+ cursorColor = colorResource(id = R.color.white)
|
|
|
+ ),
|
|
|
+ keyboardOptions = KeyboardOptions(
|
|
|
+ keyboardType = KeyboardType.Password,
|
|
|
+ imeAction = ImeAction.Done
|
|
|
+ ),
|
|
|
+ keyboardActions = KeyboardActions(
|
|
|
+ onDone = {
|
|
|
+ focusManager.clearFocus()
|
|
|
+ keyboardController?.hide()
|
|
|
+ }
|
|
|
+ ),
|
|
|
+ visualTransformation =
|
|
|
+ if (passwordVisible) VisualTransformation.Companion.None
|
|
|
else PasswordVisualTransformation(),
|
|
|
|
|
|
- trailingIcon = {
|
|
|
+ trailingIcon = {
|
|
|
// val image
|
|
|
// = if (passwordVisible) Icons.Filled.Visibility
|
|
|
// else Icons.Filled.VisibilityOff
|
|
|
|
|
|
- val description = if (passwordVisible) "Hide Password"
|
|
|
- else "Show Password"
|
|
|
-
|
|
|
- IconButton(onClick = {
|
|
|
- if (!readOnly) {
|
|
|
- passwordVisible = !passwordVisible
|
|
|
+ val description = if (passwordVisible) "Hide Password"
|
|
|
+ else "Show Password"
|
|
|
+
|
|
|
+ IconButton(onClick = {
|
|
|
+ if (!readOnly) {
|
|
|
+ passwordVisible = !passwordVisible
|
|
|
+ }
|
|
|
+ })
|
|
|
+ {
|
|
|
+ if (passwordVisible) {
|
|
|
+ Icon(
|
|
|
+ imageVector = Icons.Outlined.Visibility,
|
|
|
+ contentDescription = description,
|
|
|
+ tint = colorResource(id = R.color.white),
|
|
|
+ modifier = Modifier.size(24.dp)
|
|
|
+ )
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ Icon(
|
|
|
+ painter = painterResource(id = R.drawable.eye_slash3x),
|
|
|
+ contentDescription = description,
|
|
|
+ tint = colorResource(id = R.color.white),
|
|
|
+ modifier = Modifier.size(24.dp)
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- })
|
|
|
- {
|
|
|
- if (passwordVisible) {
|
|
|
- Icon(
|
|
|
- imageVector = Icons.Outlined.Visibility,
|
|
|
- contentDescription = description,
|
|
|
- tint = colorResource(id = R.color.white),
|
|
|
- modifier = Modifier.size(24.dp)
|
|
|
- )
|
|
|
- }
|
|
|
- else {
|
|
|
- Icon(
|
|
|
- painter = painterResource(id = R.drawable.eye_slash3x),
|
|
|
- contentDescription = description,
|
|
|
- tint = colorResource(id = R.color.white),
|
|
|
- modifier = Modifier.size(24.dp)
|
|
|
- )
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- )
|
|
|
+ )
|
|
|
|
|
|
- if (showErrorPass1) {
|
|
|
- ShowErrorRow(errorText = "Password is Empty")
|
|
|
- }
|
|
|
- else if (showErrorPass2) {
|
|
|
- ShowErrorRow(errorText = "Should be 3 or more!")
|
|
|
- }
|
|
|
+ if (showErrorPass1) {
|
|
|
+ ShowErrorRow(errorText = "Password is Empty")
|
|
|
+ }
|
|
|
+ else if (showErrorPass2) {
|
|
|
+ ShowErrorRow(errorText = "Should be 3 or more!")
|
|
|
+ }
|
|
|
|
|
|
|
|
|
- Spacer(modifier = Modifier.height(20.dp))
|
|
|
- ClickableText(
|
|
|
- onClick = {
|
|
|
- if (!readOnly) {
|
|
|
- Log.d("onClick_test", "Forgot Password Clicked")
|
|
|
- navHostController.navigate(Screen.ForgotPassword.route)
|
|
|
- }
|
|
|
- },
|
|
|
- modifier = Modifier
|
|
|
- .padding(end = 15.dp)
|
|
|
- .align(Alignment.End),
|
|
|
- style = TextStyle(
|
|
|
- fontSize = 16.sp,
|
|
|
- fontFamily = outfitFontFamily,
|
|
|
- fontWeight = FontWeight.Normal,
|
|
|
- textAlign = TextAlign.Right,
|
|
|
- color = colorResource(id = R.color.yellow_text),
|
|
|
- ),
|
|
|
- text = AnnotatedString("Forgot Password"),
|
|
|
- )
|
|
|
+ Spacer(modifier = Modifier.height(20.dp))
|
|
|
+ ClickableText(
|
|
|
+ onClick = {
|
|
|
+ if (!readOnly) {
|
|
|
+// Log.d("onClick_test", "Forgot Password Clicked")
|
|
|
+ navHostController.navigate(Screen.ForgotPassword.route)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ modifier = Modifier
|
|
|
+ .padding(end = 15.dp)
|
|
|
+ .align(Alignment.End),
|
|
|
+ style = TextStyle(
|
|
|
+ fontSize = 16.sp,
|
|
|
+ fontFamily = outfitFontFamily,
|
|
|
+ fontWeight = FontWeight.Normal,
|
|
|
+ textAlign = TextAlign.Right,
|
|
|
+ color = colorResource(id = R.color.yellow_text),
|
|
|
+ ),
|
|
|
+ text = AnnotatedString("Forgot Password"),
|
|
|
+ )
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- SignInButton(
|
|
|
- navHostController = navHostController,
|
|
|
- textChanged,
|
|
|
- passwordChanged,
|
|
|
- loginViewModel = loginViewModel,
|
|
|
- basePreferenceHelper,
|
|
|
- showErrorEmail = {
|
|
|
- showErrorEmail = it
|
|
|
- },
|
|
|
- showErrorEmail,
|
|
|
- showErrorPass = {
|
|
|
- showErrorPass1 = it
|
|
|
- },
|
|
|
- showErrorPass1,
|
|
|
- showErrorPass2 = {
|
|
|
- showErrorPass2 = it
|
|
|
- },
|
|
|
- showErrorPass2
|
|
|
- )
|
|
|
- Row (
|
|
|
- modifier = Modifier
|
|
|
- .align(Alignment.BottomCenter)
|
|
|
- .padding(57.dp),
|
|
|
- ){
|
|
|
- TextMsgSignUp(navHostController = navHostController, loginViewModel, readOnly!!)
|
|
|
+ SignInButton(
|
|
|
+ navHostController = navHostController,
|
|
|
+ textChanged,
|
|
|
+ passwordChanged,
|
|
|
+ loginViewModel = loginViewModel,
|
|
|
+ basePreferenceHelper,
|
|
|
+ showErrorEmail = {
|
|
|
+ showErrorEmail = it
|
|
|
+ },
|
|
|
+ showErrorEmail,
|
|
|
+ showErrorPass = {
|
|
|
+ showErrorPass1 = it
|
|
|
+ },
|
|
|
+ showErrorPass1,
|
|
|
+ showErrorPass2 = {
|
|
|
+ showErrorPass2 = it
|
|
|
+ },
|
|
|
+ showErrorPass2,
|
|
|
+ snackBarState
|
|
|
+ )
|
|
|
+ Row (
|
|
|
+ modifier = Modifier
|
|
|
+ .align(Alignment.BottomCenter)
|
|
|
+ .padding(57.dp),
|
|
|
+ ){
|
|
|
+ TextMsgSignUp(navHostController = navHostController, loginViewModel, readOnly!!)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
+ )
|
|
|
}
|
|
|
|
|
|
|
|
@@ -491,7 +502,7 @@ fun RowScope.TextMsgSignUp(
|
|
|
loginViewModel: LoginViewModel,
|
|
|
isEnabled: Boolean
|
|
|
) {
|
|
|
- Text(
|
|
|
+ Text(
|
|
|
modifier = Modifier
|
|
|
.padding(0.dp),
|
|
|
text = "Don't have an account? ",
|
|
@@ -525,6 +536,7 @@ fun RowScope.TextMsgSignUp(
|
|
|
|
|
|
}
|
|
|
|
|
|
+
|
|
|
@Composable
|
|
|
fun BoxScope.SignInButton(
|
|
|
navHostController: NavHostController,
|
|
@@ -537,10 +549,12 @@ fun BoxScope.SignInButton(
|
|
|
showErrorPass: (Boolean) -> Unit,
|
|
|
isErrorPass: Boolean,
|
|
|
showErrorPass2: (Boolean) -> Unit,
|
|
|
- isErrorPass2: Boolean
|
|
|
+ isErrorPass2: Boolean,
|
|
|
+ snackBarState: SnackbarHostState
|
|
|
) {
|
|
|
-// var showLoader by remember { mutableStateOf(false) }
|
|
|
-// Log.d("test_login_text", "$email $password")
|
|
|
+ val scaffoldState = rememberScaffoldState()
|
|
|
+ val coroutineScope = rememberCoroutineScope()
|
|
|
+
|
|
|
if (loginViewModel.liveDataLoginStatus.value == true) {
|
|
|
var progress by remember { mutableFloatStateOf(0.1F) }
|
|
|
|
|
@@ -598,7 +612,7 @@ fun BoxScope.SignInButton(
|
|
|
.height(60.dp)
|
|
|
.clickable() { },
|
|
|
onClick = {
|
|
|
- Log.d("test_api_response live", "Login Clicked:")
|
|
|
+// Log.d("test_api_response live", "Login Clicked:")
|
|
|
|
|
|
val isErrors = customValidation.isValidText(email, "Email")
|
|
|
showErrorEmail(!isErrors)
|
|
@@ -613,12 +627,12 @@ fun BoxScope.SignInButton(
|
|
|
|
|
|
// showLoader = true
|
|
|
if (loginViewModel.liveDataLoginStatus.value == false) {
|
|
|
- Log.d("test_api_response live", "SignIn: $email $password")
|
|
|
+// Log.d("test_api_response live", "SignIn: $email $password")
|
|
|
|
|
|
if (customValidation.isValidText(email, "Email") &&
|
|
|
customValidation.isValidText(password, "Password") &&
|
|
|
customValidation.isValidPassword(password)) {
|
|
|
- Log.d("test_login_text", "true")
|
|
|
+// Log.d("test_login_text", "true")
|
|
|
|
|
|
if (email.isNotEmpty() && password.isNotEmpty()) {
|
|
|
loginViewModel.setLoginStatus(true)
|
|
@@ -642,6 +656,7 @@ fun BoxScope.SignInButton(
|
|
|
),
|
|
|
)
|
|
|
{
|
|
|
+
|
|
|
Text(text = "Sign In",
|
|
|
style = MaterialTheme.typography.titleMedium,
|
|
|
textAlign = TextAlign.Center
|
|
@@ -649,7 +664,7 @@ fun BoxScope.SignInButton(
|
|
|
|
|
|
val loginData by loginViewModel.liveDataUserResponse.observeAsState()
|
|
|
loginData?.let { response ->
|
|
|
- Log.d("test_api_response live", "live: ${loginData?.status} ${loginData?.message}")
|
|
|
+// Log.d("test_api_response live", "live: ${loginData?.status} ${loginData?.message}")
|
|
|
loginViewModel.setLoginStatus(false)
|
|
|
// showLoader = false
|
|
|
if (response.status) {
|
|
@@ -660,7 +675,7 @@ fun BoxScope.SignInButton(
|
|
|
prefHelper.saveUser(it)
|
|
|
it.wireguard?.let { wg ->
|
|
|
prefHelper.saveWireGuard(wg)
|
|
|
- Log.d("test_wg_data", "Login:: ${wg.ip} ${wg.key}")
|
|
|
+// Log.d("test_wg_data", "Login:: ${wg.ip} ${wg.key}")
|
|
|
}
|
|
|
it.product?.let { it1 -> prefHelper.saveProduct(it1) }
|
|
|
prefHelper.saveEnabledProtocols(it.enabled_protocols)
|
|
@@ -672,20 +687,27 @@ fun BoxScope.SignInButton(
|
|
|
prefHelper.saveServerData(it)
|
|
|
}
|
|
|
|
|
|
- Log.d("bearer_token", it.token.toString())
|
|
|
+// Log.d("bearer_token", it.token.toString())
|
|
|
|
|
|
// upgradePriceViewModel.getProducts()
|
|
|
|
|
|
prefHelper.getFcmToken().let {
|
|
|
loginViewModel.sendFcmToken(it)
|
|
|
- Log.d("Refreshed token: ", "Login: $it")
|
|
|
+// Log.d("Refreshed token: ", "Login: $it")
|
|
|
}
|
|
|
|
|
|
|
|
|
navHostController.popBackStack()
|
|
|
navHostController.navigate(Screen.BottomBarMainScreen.route)
|
|
|
}
|
|
|
-
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ response.message?.let {
|
|
|
+// Log.d("test_login_msg", "${response.message}")
|
|
|
+ coroutineScope.launch {
|
|
|
+ snackBarState.showSnackbar(it)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
loginViewModel.mutableLiveDataUserResponse.value = null
|
|
|
}
|