Bläddra i källkod

Login API integration, base structure

Khubaib 4 månader sedan
förälder
incheckning
73a442d6fb

+ 6 - 0
app/src/main/java/com/fastest/pass/login/data/model/LoginRequest.kt

@@ -0,0 +1,6 @@
+package com.fastest.pass.login.data.model
+
+data class LoginRequest(
+    val email: String,
+    val password: String
+)

+ 7 - 0
app/src/main/java/com/fastest/pass/login/data/model/LoginResponse.kt

@@ -0,0 +1,7 @@
+package com.fastest.pass.login.data.model
+
+data class LoginResponse<T>(
+    val status: Boolean,
+    val message: String,
+    val data: T? = null
+)

+ 6 - 0
app/src/main/java/com/fastest/pass/login/data/model/LoginResult.kt

@@ -0,0 +1,6 @@
+package com.fastest.pass.login.data.model
+
+sealed class LoginResult {
+    data class Success(val loginResponse: Any?) : LoginResult()
+    data class Error(val message: String) : LoginResult()
+}

+ 3 - 1
app/src/main/java/com/fastest/pass/login/data/remote/LoginApiService.kt

@@ -1,5 +1,7 @@
 package com.fastest.pass.login.data.remote
 
+import com.fastest.pass.login.data.model.LoginResponse
+import com.fastest.pass.login.data.model.LoginResult
 import retrofit2.Call
 import retrofit2.http.FormUrlEncoded
 import retrofit2.http.POST
@@ -8,5 +10,5 @@ interface LoginApiService {
 
     @FormUrlEncoded
     @POST("login")
-    suspend fun login(): Call<Any?>
+    suspend fun login(email: String, password: String): LoginResponse<Any>
 }

+ 15 - 2
app/src/main/java/com/fastest/pass/login/data/repository/LoginRepositoryImpl.kt

@@ -1,11 +1,24 @@
 package com.fastest.pass.login.data.repository
 
+import com.fastest.pass.login.data.model.LoginResult
 import com.fastest.pass.login.data.remote.LoginApiService
 import com.fastest.pass.login.domain.repository.LoginRepository
+import javax.inject.Inject
 
-class LoginRepositoryImpl(
+class LoginRepositoryImpl @Inject constructor(
     private val loginApiService: LoginApiService
 ) : LoginRepository {
-    override suspend fun loginRepository() {
+    override suspend fun loginRepository(email: String, password: String) : LoginResult {
+        return try {
+            val loginResponse = loginApiService.login(email, password)
+            if (loginResponse.status) {
+                LoginResult.Success(loginResponse)
+            } else {
+                LoginResult.Error(loginResponse.message)
+            }
+        } catch (e: Exception) {
+            LoginResult.Error(e.message ?: "Error")
+        }
     }
+
 }

+ 21 - 0
app/src/main/java/com/fastest/pass/login/di/LoginModule.kt

@@ -1,10 +1,15 @@
 package com.fastest.pass.login.di
 
+import com.fastest.pass.login.data.remote.LoginApiService
+import com.fastest.pass.login.data.repository.LoginRepositoryImpl
+import com.fastest.pass.login.domain.repository.LoginRepository
 import com.fastest.pass.login.utils.LoginNavigation
 import dagger.Module
 import dagger.Provides
 import dagger.hilt.InstallIn
 import dagger.hilt.components.SingletonComponent
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
 import javax.inject.Singleton
 
 @Module
@@ -16,4 +21,20 @@ object LoginModule {
     fun provideNavigation(): LoginNavigation {
         return LoginNavigation()
     }
+
+    @Provides
+    @Singleton
+    fun provideLoginApiService(): LoginApiService {
+        return Retrofit.Builder()
+            .baseUrl("https://api.fastestpass.com/v1/")
+            .addConverterFactory(GsonConverterFactory.create())
+            .build()
+            .create(LoginApiService::class.java)
+    }
+
+    @Provides
+    @Singleton
+    fun provideLoginRepository(loginApiService: LoginApiService) : LoginRepository{
+        return LoginRepositoryImpl(loginApiService)
+    }
 }

+ 5 - 1
app/src/main/java/com/fastest/pass/login/domain/repository/LoginRepository.kt

@@ -1,5 +1,9 @@
 package com.fastest.pass.login.domain.repository
 
+import com.fastest.pass.login.data.model.LoginResult
+
 interface LoginRepository {
-    suspend fun loginRepository()
+    suspend fun loginRepository(
+        email: String, password: String
+    ) : LoginResult
 }

+ 4 - 0
app/src/main/java/com/fastest/pass/login/domain/usecase/LoginUseCase.kt

@@ -1,9 +1,13 @@
 package com.fastest.pass.login.domain.usecase
 
+import com.fastest.pass.login.data.model.LoginResult
 import com.fastest.pass.login.domain.repository.LoginRepository
 import javax.inject.Inject
 
 class LoginUseCase @Inject constructor(
     private val loginRepository: LoginRepository
 ) {
+    suspend operator fun invoke(email: String, password: String) : LoginResult {
+        return loginRepository.loginRepository(email, password)
+    }
 }

+ 3 - 0
app/src/main/java/com/fastest/pass/login/presentation/ui/LoginFragment.kt

@@ -71,6 +71,9 @@ class LoginFragment : BaseFragment() {
                                     ClickType.HOME_SCREEN -> {
                                         viewmodel.navigateTo(LoginRoute.OpenDashBoardScreen)
                                     }
+                                    ClickType.LOGIN_CLICK -> {
+                                        viewmodel.onLoginClicked("eng.asix@gmail.com", "password")
+                                    }
                                 }
                             }
                         }

+ 3 - 2
app/src/main/java/com/fastest/pass/login/presentation/ui/components/LoginScreen.kt

@@ -64,7 +64,8 @@ enum class ClickType {
     FORGOT_PASSWORD_CLICK,
     GO_BACK,
     MASTER_LOGIN,
-    HOME_SCREEN
+    HOME_SCREEN,
+    LOGIN_CLICK
 }
 
 @Composable
@@ -371,7 +372,7 @@ fun ColumnScope.LoginButton(buttonText: Int, clickType: (ClickType) -> Unit) {
             .height(60.dp)
             .clickable() { },
         onClick = {
-            clickType.invoke(ClickType.HOME_SCREEN)
+            clickType.invoke(ClickType.LOGIN_CLICK)
         },
         shape = RoundedCornerShape(15.dp),
 //            border = BorderStroke(25.dp, colorResource(id = R.color.black)),

+ 17 - 1
app/src/main/java/com/fastest/pass/login/presentation/viewmodels/LoginViewModel.kt

@@ -1,10 +1,19 @@
 package com.fastest.pass.login.presentation.viewmodels
 
+import android.util.Log
 import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
+import com.fastest.pass.login.domain.usecase.LoginUseCase
 import com.fastest.pass.login.utils.LoginRoute
+import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.launch
+import javax.inject.Inject
 
-class LoginViewModel : ViewModel() {
+@HiltViewModel
+class LoginViewModel @Inject constructor(
+    private val loginUseCase: LoginUseCase
+) : ViewModel() {
 
     private val _router = MutableStateFlow<LoginRoute>(LoginRoute.OpenNoneScreen)
     val router: MutableStateFlow<LoginRoute> = _router
@@ -12,4 +21,11 @@ class LoginViewModel : ViewModel() {
     fun navigateTo(loginRoute: LoginRoute) {
         _router.value = loginRoute
     }
+
+    fun onLoginClicked(email: String, password: String) {
+        viewModelScope.launch {
+            val loginResult = loginUseCase(email, password)
+            Log.d("loginResult", "loginResult = $loginResult")
+        }
+    }
 }