소스 검색

validation completed and loader showing

Khubaib 1 년 전
부모
커밋
63af02b5a5

+ 14 - 1
.idea/deploymentTargetDropDown.xml

@@ -6,7 +6,20 @@
         <State />
       </entry>
       <entry key="app">
-        <State />
+        <State>
+          <runningDeviceTargetSelectedWithDropDown>
+            <Target>
+              <type value="RUNNING_DEVICE_TARGET" />
+              <deviceKey>
+                <Key>
+                  <type value="SERIAL_NUMBER" />
+                  <value value="1C051FDF60048Z" />
+                </Key>
+              </deviceKey>
+            </Target>
+          </runningDeviceTargetSelectedWithDropDown>
+          <timeTargetWasSelectedWithDropDown value="2024-04-23T11:10:54.498355227Z" />
+        </State>
       </entry>
     </value>
   </component>

+ 0 - 6
.idea/other.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ScreenshotViewer">
-    <option name="frameScreenshot" value="true" />
-  </component>
-</project>

+ 41 - 3
app/src/main/java/com/vpn/fastestvpnservice/screens/ForgotPassword.kt

@@ -22,6 +22,7 @@ import androidx.compose.foundation.text.KeyboardActions
 import androidx.compose.foundation.text.KeyboardOptions
 import androidx.compose.material3.Button
 import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.CircularProgressIndicator
 import androidx.compose.material3.Icon
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.MaterialTheme
@@ -30,8 +31,10 @@ import androidx.compose.material3.Text
 import androidx.compose.material3.TextField
 import androidx.compose.material3.TextFieldDefaults
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.mutableFloatStateOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
@@ -59,7 +62,9 @@ import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.beans.isDarkTheme
 import com.vpn.fastestvpnservice.ui.theme.customTypography
 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
 
 @OptIn(ExperimentalComposeUiApi::class)
@@ -71,6 +76,7 @@ fun ForgotPassword(navHostController: NavHostController) {
     val snackBarState = remember { SnackbarHostState() }
     val snackBarStateRed = remember { SnackbarHostState() }
     val coroutineScope = rememberCoroutineScope()
+    var isShowLoader by remember { mutableStateOf(false) }
 
     Box(
         modifier = Modifier
@@ -96,6 +102,29 @@ fun ForgotPassword(navHostController: NavHostController) {
         ShowCustomSnackBar(snackBarState, R.color.switch_green, R.color.white)
         ShowCustomSnackBar(snackBarStateRed, R.color.Red, R.color.white)
 
+        if (isShowLoader) {
+            var progress by remember { mutableFloatStateOf(0.1F) }
+
+            LaunchedEffect(key1 = Unit) {
+                while (true) {
+                    for (i in 1..100) {
+                        progress = i.toFloat()/100F
+                        delay(150)
+                    }
+                    progress = 0.1F
+                }
+            }
+
+            CircularProgressIndicator(
+                progress = { progress },
+                modifier = Modifier
+                    .size(50.dp)
+                    .align(Alignment.Center),
+                color = colorResource(id = R.color.yellow_text),
+                strokeWidth = 5.dp,
+            )
+        }
+
         Column (
             modifier = Modifier
                 .fillMaxHeight()
@@ -223,11 +252,20 @@ fun ForgotPassword(navHostController: NavHostController) {
 
             Spacer(modifier = Modifier.height(30.dp))
 
+            val customValidation = CustomValidation()
+            val isEmailValid = customValidation.isValidText(textChanged, "Email")
 //            val email = basePreferenceHelper.getUser()?.userinfo?.email ?: "test_123"
             Button(
                 onClick = {
-                    Log.d("test_button", "onClick Send Code")
-                    loginViewModel.forgotPassword(textChanged)
+                    Log.d("test_button", "onClick Send Code $isEmailValid")
+                    if (isEmailValid) {
+                        isShowLoader = true
+                        loginViewModel.forgotPassword(textChanged)
+                    } else {
+                        coroutineScope.launch {
+                            snackBarStateRed.showSnackbar("The email field is required.")
+                        }
+                    }
                 },
                 modifier = Modifier
                     .padding(start = 16.dp, end = 16.dp, bottom = 0.dp)
@@ -250,7 +288,7 @@ fun ForgotPassword(navHostController: NavHostController) {
                 val forgotPasswordResponse = loginViewModel.liveDataForgotPassword.observeAsState()
                 forgotPasswordResponse.value?.let { data ->
                     Log.d("forgotPassword: ","forgotPassword Screen: ${data.status} ${data.message}")
-
+                    isShowLoader = false
                     if (data.status) {
                         coroutineScope.launch {
                             data.message?.let { snackBarState.showSnackbar(it) }

+ 62 - 6
app/src/main/java/com/vpn/fastestvpnservice/screens/accountScreensAll/ChangePasswordScreen.kt

@@ -31,13 +31,16 @@ import androidx.compose.material.icons.outlined.Visibility
 import androidx.compose.material3.AlertDialog
 import androidx.compose.material3.Button
 import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.CircularProgressIndicator
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.SnackbarHostState
 import androidx.compose.material3.TextField
 import androidx.compose.material3.TextFieldDefaults
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.mutableFloatStateOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
@@ -70,7 +73,9 @@ import com.vpn.fastestvpnservice.beans.subscriptionPackageList
 import com.vpn.fastestvpnservice.customItems.getSelectedPosition
 import com.vpn.fastestvpnservice.ui.theme.customTypography2
 import com.vpn.fastestvpnservice.viewmodels.AccountViewModel
+import com.vpn.fastestvpnservice.views.CustomValidation
 import com.vpn.fastestvpnservice.views.ShowCustomSnackBar
+import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 
 @Composable
@@ -81,10 +86,10 @@ fun ChangePassword(navHostController: NavHostController) {
     val snackBarState = remember { SnackbarHostState() }
     val snackBarStateRed = remember { SnackbarHostState() }
     val coroutineScope = rememberCoroutineScope()
-
     var currentPassword by remember { mutableStateOf("") }
     var newPassword by remember { mutableStateOf("") }
     var confirmPassword by remember { mutableStateOf("") }
+    var isShowLoader by remember { mutableStateOf(false) }
 
     Box(
         modifier = Modifier
@@ -100,6 +105,31 @@ fun ChangePassword(navHostController: NavHostController) {
         ShowCustomSnackBar(snackBarState, R.color.switch_green, R.color.white)
         ShowCustomSnackBar(snackBarStateRed, R.color.Red, R.color.white)
 
+        if (isShowLoader) {
+            Log.d("ChangePassword: ","isShowLoader = $isShowLoader")
+            var progress by remember { mutableFloatStateOf(0.1F) }
+
+            LaunchedEffect(key1 = Unit) {
+                while (true) {
+                    for (i in 1..100) {
+                        progress = i.toFloat()/100F
+                        delay(150)
+                    }
+                    progress = 0.1F
+                }
+            }
+
+            CircularProgressIndicator(
+                progress = { progress },
+                modifier = Modifier
+                    .padding(top = 150.dp)
+                    .size(50.dp)
+                    .align(Alignment.Center),
+                color = colorResource(id = R.color.yellow_text),
+                strokeWidth = 5.dp,
+            )
+        }
+
         HeaderRowCP(navHostController = navHostController)
 
         Column(
@@ -122,15 +152,41 @@ fun ChangePassword(navHostController: NavHostController) {
             TextFieldReWriteNewPass() {
                 confirmPassword = it
             }
+            val customValidation = CustomValidation()
+            val isCurrentPassword = customValidation.isValidText(currentPassword, "Password")
+            val isNewPassword = customValidation.isValidText(newPassword, "Password")
+            val isConfirmPassword = customValidation.isValidText(confirmPassword, "Password")
 
             Button(
                 onClick = {
                     Log.d("test_button", "onClick")
-                    Log.d("ChangePassword: ","TextFieldCurrPass = $currentPassword $newPassword $confirmPassword")
+                    Log.d("ChangePassword: ","TextFieldCurrPass = $isCurrentPassword $isNewPassword $isConfirmPassword")
+
+                    if (isCurrentPassword && isNewPassword && isConfirmPassword)
+                    {
+                        Log.d("ChangePassword: ","TextFieldCurrPass = true inside API")
+                        isShowLoader = true
+                        accountViewModel.changePassword(
+                            currentPassword, newPassword, confirmPassword
+                        )
+                    }
+                    else {
+                        Log.d("ChangePassword: ","TextFieldCurrPass = else")
+                        if (!isCurrentPassword) {
+                            coroutineScope.launch {
+                                snackBarStateRed.showSnackbar("The current password field is required.")
+                            }
+                        } else if (!isNewPassword) {
+                            coroutineScope.launch {
+                                snackBarStateRed.showSnackbar("The new password field is required.")
+                            }
+                        } else if (!isConfirmPassword) {
+                            coroutineScope.launch {
+                                snackBarStateRed.showSnackbar("The confirm password field is required.")
+                            }
+                        }
+                    }
 
-                    accountViewModel.changePassword(
-                        currentPassword, newPassword, confirmPassword
-                    )
                 },
                 modifier = Modifier
                     .padding(
@@ -161,7 +217,7 @@ fun ChangePassword(navHostController: NavHostController) {
                 val changePasswordResponse = accountViewModel.liveDataChangePassword.observeAsState()
                 changePasswordResponse.value?.let { data ->
                     Log.d("ChangePassword: ","ChangePassword Response F_API: ${data.status} ${data.message}")
-
+                    isShowLoader = false
                     if (data.status) {
                         coroutineScope.launch {
                             data.message?.let { it1 -> snackBarState.showSnackbar(it1) }

+ 47 - 4
app/src/main/java/com/vpn/fastestvpnservice/screens/helpScreensAll/EmailUsScreen.kt

@@ -20,13 +20,16 @@ import androidx.compose.material.Icon
 import androidx.compose.material.IconButton
 import androidx.compose.material.Surface
 import androidx.compose.material.Text
+import androidx.compose.material3.CircularProgressIndicator
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.SnackbarHostState
 import androidx.compose.material3.TextField
 import androidx.compose.material3.TextFieldDefaults
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.livedata.observeAsState
+import androidx.compose.runtime.mutableFloatStateOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.runtime.rememberCoroutineScope
@@ -48,7 +51,9 @@ import androidx.navigation.compose.rememberNavController
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.ui.theme.customTypography
 import com.vpn.fastestvpnservice.viewmodels.HelpViewModel
+import com.vpn.fastestvpnservice.views.CustomValidation
 import com.vpn.fastestvpnservice.views.ShowCustomSnackBar
+import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 
 @Composable
@@ -58,6 +63,7 @@ fun EmailUsScreen(navHostController: NavHostController) {
     val focusManager = LocalFocusManager.current
     val snackBarState = remember { SnackbarHostState() }
     val snackBarStateRed = remember { SnackbarHostState() }
+    var isShowLoader by remember { mutableStateOf(false) }
 
     Box(
         modifier = Modifier
@@ -67,6 +73,29 @@ fun EmailUsScreen(navHostController: NavHostController) {
         ShowCustomSnackBar(snackBarState, R.color.switch_green, R.color.white)
         ShowCustomSnackBar(snackBarStateRed, R.color.Red, R.color.white)
 
+        if (isShowLoader) {
+            var progress by remember { mutableFloatStateOf(0.1F) }
+
+            LaunchedEffect(key1 = Unit) {
+                while (true) {
+                    for (i in 1..100) {
+                        progress = i.toFloat()/100F
+                        delay(150)
+                    }
+                    progress = 0.1F
+                }
+            }
+
+            CircularProgressIndicator(
+                progress = { progress },
+                modifier = Modifier
+                    .size(50.dp)
+                    .align(Alignment.Center),
+                color = colorResource(id = R.color.yellow_text),
+                strokeWidth = 5.dp,
+            )
+        }
+
         Column(
             modifier = Modifier
                 .fillMaxSize()
@@ -80,7 +109,10 @@ fun EmailUsScreen(navHostController: NavHostController) {
                 navHostController = navHostController,
                 textChanged,
                 snackBarState,
-                snackBarStateRed
+                snackBarStateRed,
+                isShowLoader = {
+                    isShowLoader = it
+                }
             ) {
                 textChanged = it
             }
@@ -142,7 +174,8 @@ fun ColumnScope.ShowHeaderEU(
     message: String,
     snackBarState: SnackbarHostState,
     snackBarStateRed: SnackbarHostState,
-    textChanged: (String) -> Unit
+    isShowLoader: (Boolean) -> Unit,
+    textChanged: (String) -> Unit,
 ) {
     Log.d("emailUs: ","EU :: message = $message")
     val helpViewModel: HelpViewModel = viewModel()
@@ -183,9 +216,19 @@ fun ColumnScope.ShowHeaderEU(
                 modifier = Modifier.fillMaxHeight()
             )
         }
+        val customValidation = CustomValidation()
+        val isMessageValid = customValidation.isValidText(message, "Message")
+
         IconButton(
             onClick = {
-                helpViewModel.emailUs(message)
+                if (isMessageValid) {
+                    isShowLoader(true)
+                    helpViewModel.emailUs(message)
+                } else {
+                    coroutineScope.launch {
+                        snackBarStateRed.showSnackbar("The message field is required.")
+                    }
+                }
             },
             modifier = Modifier
                 .padding(top = 10.dp)
@@ -202,7 +245,7 @@ fun ColumnScope.ShowHeaderEU(
             val emailUsResponse = helpViewModel.liveDataEmailUs.observeAsState()
             emailUsResponse.value?.let { data ->
                 Log.d("emailUs: ","emailUs Screen: ${data.status} ${data.message}")
-
+                isShowLoader(false)
                 if (data.status) {
                     coroutineScope.launch {
                         data.message?.let { snackBarState.showSnackbar(it) }