浏览代码

Forgot password API integrated

Khubaib 1 年之前
父节点
当前提交
9f399cfded

+ 6 - 0
app/src/main/java/com/vpn/fastestvpnservice/retrofit/Api.kt

@@ -68,4 +68,10 @@ interface Api {
         @Field("productId") productId: String?
     ): Call<Any>
 
+    @FormUrlEncoded
+    @POST("forgot-password")
+    fun forgotPassword(
+        @Field("email") email: String?
+    ): Call<Any>
+
 }

+ 26 - 19
app/src/main/java/com/vpn/fastestvpnservice/screens/ForgotPassword.kt

@@ -6,11 +6,9 @@ import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
 import androidx.compose.foundation.border
 import androidx.compose.foundation.gestures.detectTapGestures
-import androidx.compose.foundation.isSystemInDarkTheme
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.Row
 import androidx.compose.foundation.layout.Spacer
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.foundation.layout.fillMaxSize
@@ -20,27 +18,23 @@ import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.layout.width
 import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.foundation.text.ClickableText
 import androidx.compose.foundation.text.KeyboardActions
 import androidx.compose.foundation.text.KeyboardOptions
-import androidx.compose.material.icons.Icons
-import androidx.compose.material.icons.filled.ArrowBack
-import androidx.compose.material.icons.filled.Email
-import androidx.compose.material.icons.filled.Lock
-import androidx.compose.material.icons.filled.Visibility
-import androidx.compose.material.icons.filled.VisibilityOff
 import androidx.compose.material3.Button
 import androidx.compose.material3.ButtonDefaults
 import androidx.compose.material3.Icon
 import androidx.compose.material3.IconButton
 import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.SnackbarHostState
 import androidx.compose.material3.Text
 import androidx.compose.material3.TextField
 import androidx.compose.material3.TextFieldDefaults
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.getValue
+import androidx.compose.runtime.livedata.observeAsState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.ExperimentalComposeUiApi
@@ -54,36 +48,35 @@ import androidx.compose.ui.platform.LocalFocusManager
 import androidx.compose.ui.platform.LocalSoftwareKeyboardController
 import androidx.compose.ui.res.colorResource
 import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.font.FontFamily
-import androidx.compose.ui.text.font.FontStyle
-import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.text.input.ImeAction
 import androidx.compose.ui.text.input.KeyboardType
-import androidx.compose.ui.text.input.PasswordVisualTransformation
-import androidx.compose.ui.text.input.VisualTransformation
 import androidx.compose.ui.tooling.preview.Preview
 import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.sp
+import androidx.lifecycle.viewmodel.compose.viewModel
 import androidx.navigation.NavHostController
 import androidx.navigation.compose.rememberNavController
 import com.vpn.fastestvpnservice.R
 import com.vpn.fastestvpnservice.beans.isDarkTheme
-import com.vpn.fastestvpnservice.sealedClass.Screen
 import com.vpn.fastestvpnservice.ui.theme.customTypography
+import com.vpn.fastestvpnservice.viewmodels.LoginViewModel
+import com.vpn.fastestvpnservice.views.ShowCustomSnackBar
+import kotlinx.coroutines.launch
 
 @OptIn(ExperimentalComposeUiApi::class)
 @Composable
 fun ForgotPassword(navHostController: NavHostController) {
     val keyboardController = LocalSoftwareKeyboardController.current
     val focusManager = LocalFocusManager.current
+    val loginViewModel: LoginViewModel = viewModel()
+    val snackBarState = remember { SnackbarHostState() }
+    val coroutineScope = rememberCoroutineScope()
 
     Box(
         modifier = Modifier
             .paint(
                 painter = painterResource(id = if (isDarkTheme.value) R.drawable.bg_app else R.drawable.bg_img3),
-                contentScale = ContentScale.FillBounds)
+                contentScale = ContentScale.FillBounds
+            )
 //            .background(
 //                if (isSystemInDarkTheme()) Color.Black
 //                else Color.Transparent
@@ -99,6 +92,8 @@ fun ForgotPassword(navHostController: NavHostController) {
 //        contentAlignment = Alignment.Center
 
     ) {
+        ShowCustomSnackBar(snackBarState, R.color.yellow_text, R.color.dark_blue_gray_text)
+
         Column (
             modifier = Modifier
                 .fillMaxHeight()
@@ -226,9 +221,11 @@ fun ForgotPassword(navHostController: NavHostController) {
 
             Spacer(modifier = Modifier.height(30.dp))
 
+//            val email = basePreferenceHelper.getUser()?.userinfo?.email ?: "test_123"
             Button(
                 onClick = {
                     Log.d("test_button", "onClick Send Code")
+                    loginViewModel.forgotPassword(textChanged)
                 },
                 modifier = Modifier
                     .padding(start = 16.dp, end = 16.dp, bottom = 100.dp)
@@ -247,6 +244,16 @@ fun ForgotPassword(navHostController: NavHostController) {
                     style = MaterialTheme.typography.titleMedium
                 )
                 Log.d("test_button", "RowScope")
+
+                val forgotPasswordResponse = loginViewModel.liveDataForgotPassword.observeAsState()
+                forgotPasswordResponse.value?.let { data ->
+                    Log.d("forgotPassword: ","forgotPassword Screen: ${data.status} ${data.message}")
+
+                    coroutineScope.launch {
+                        data.message?.let { snackBarState.showSnackbar(it) }
+                    }
+                    loginViewModel.mutableLiveDataForgotPassword.value = null
+                }
             }
         }
 

+ 35 - 0
app/src/main/java/com/vpn/fastestvpnservice/viewmodels/LoginViewModel.kt

@@ -18,6 +18,9 @@ class LoginViewModel: ViewModel() {
     var mutableLiveDataUserResponse = MutableLiveData<DataResponse<UserResponse>>()
     var liveDataUserResponse: LiveData<DataResponse<UserResponse>> = mutableLiveDataUserResponse
 
+    var mutableLiveDataForgotPassword = MutableLiveData<DataResponse<Objects>?>()
+    var liveDataForgotPassword: LiveData<DataResponse<Objects>?> = mutableLiveDataForgotPassword
+
     var mutableLiveDataUserResponseErrorStatus = MutableLiveData<Boolean>()
 
     private var mutableLiveDataLoginStatus = MutableLiveData<Boolean>(false)
@@ -109,5 +112,37 @@ class LoginViewModel: ViewModel() {
             )
     }
 
+    fun forgotPassword(email: String) {
+        Log.d("forgotPassword: ","email = $email")
+        WebServiceFactory.getInstance()
+            .forgotPassword(email).enqueue(
+                RetrofitNetworkHandling<Any>(object :
+                    RetrofitNetworkHandling.ResponseCallback<Any> {
+                    override fun onSuccess(call: Call<Any>?, response: Any?) {
+                        try {
+                            val gson = Gson()
+                            val jsonString = gson.toJson(response)
+                            val type = object : TypeToken<DataResponse<Objects>>() {}.type
+                            val data = gson.fromJson<DataResponse<Objects>>(jsonString, type)
+                            mutableLiveDataForgotPassword.value = data
+
+                            Log.d("forgotPassword: ","forgotPassword Response: ${data.status} ${data.message}")
+
+                        } catch (ex: Exception) {
+                        }
+                    }
+
+                    override fun onFail(call: Call<Any>?, response: Any?) {
+                        mutableLiveDataForgotPassword.value = null
+                    }
+
+                    override fun onError(call: Call<Any>?, response: Any?) {
+                        mutableLiveDataForgotPassword.value = null
+                    }
+
+
+                })
+            )
+    }
 
 }