diff --git a/cmp-navigation/build.gradle.kts b/cmp-navigation/build.gradle.kts index b8730d7ea03..24924f6c212 100644 --- a/cmp-navigation/build.gradle.kts +++ b/cmp-navigation/build.gradle.kts @@ -11,6 +11,7 @@ plugins { alias(libs.plugins.mifos.kmp.library) alias(libs.plugins.mifos.cmp.feature) alias(libs.plugins.mifos.kmp.koin) + alias(libs.plugins.kotlin.serialization) } android { @@ -20,6 +21,8 @@ android { kotlin { sourceSets { commonMain.dependencies{ + implementation(libs.kotlinx.serialization.json) + implementation(projects.core.domain) implementation(projects.core.common) implementation(projects.core.data) @@ -29,7 +32,7 @@ kotlin { // implementation(projects.feature.about) // implementation(projects.feature.activate) -// implementation(projects.feature.auth) + implementation(projects.feature.auth) // implementation(projects.feature.center) // implementation(projects.feature.checkerInboxTask) // implementation(projects.feature.client) diff --git a/cmp-navigation/src/commonMain/kotlin/cmp/navigation/di/KoinModules.kt b/cmp-navigation/src/commonMain/kotlin/cmp/navigation/di/KoinModules.kt index 65d83cbecd2..15b17ee6a32 100644 --- a/cmp-navigation/src/commonMain/kotlin/cmp/navigation/di/KoinModules.kt +++ b/cmp-navigation/src/commonMain/kotlin/cmp/navigation/di/KoinModules.kt @@ -15,6 +15,7 @@ import com.mifos.core.datastore.di.PreferencesModule import com.mifos.core.domain.di.UseCaseModule import com.mifos.core.network.di.DataManagerModule import com.mifos.core.network.di.NetworkModule +import com.mifos.feature.auth.di.AuthModule import com.mifos.room.di.DaoModule import com.mifos.room.di.HelperModule import com.mifos.room.di.PlatformSpecificDatabaseModule @@ -45,7 +46,7 @@ object KoinModules { includes( // AboutModule, // ActivateModule, -// AuthModule, + AuthModule, // CenterModule, // CheckerInboxTaskModule, // ClientModule, diff --git a/cmp-navigation/src/commonMain/kotlin/cmp/navigation/navigation/RootNavGraph.kt b/cmp-navigation/src/commonMain/kotlin/cmp/navigation/navigation/RootNavGraph.kt index 4e306be9c47..8cad67e501c 100644 --- a/cmp-navigation/src/commonMain/kotlin/cmp/navigation/navigation/RootNavGraph.kt +++ b/cmp-navigation/src/commonMain/kotlin/cmp/navigation/navigation/RootNavGraph.kt @@ -17,6 +17,8 @@ import androidx.navigation.compose.composable import cmp.navigation.App import cmp.navigation.navigation.NavGraphRoute.MAIN_GRAPH import com.mifos.core.data.util.NetworkMonitor +import com.mifos.feature.auth.navigation.AuthScreens +import com.mifos.feature.auth.navigation.authNavGraph @Composable fun RootNavGraph( @@ -26,10 +28,16 @@ fun RootNavGraph( ) { NavHost( navController = navHostController, - startDestination = MAIN_GRAPH, + startDestination = AuthScreens.LoginScreenRoute.route, route = NavGraphRoute.ROOT_GRAPH, modifier = modifier, ) { + authNavGraph( + navigateHome = { navHostController.navigate(MAIN_GRAPH) }, + navigatePasscode = { }, + updateServerConfig = {}, + ) + composable(MAIN_GRAPH) { App( modifier = modifier, diff --git a/core/database/src/appleMain/kotlin/com/mifos/room/di/DatabaseModule.apple.kt b/core/database/src/appleMain/kotlin/com/mifos/room/di/DatabaseModule.apple.kt index 1cb209e17cc..6c45ea9e880 100644 --- a/core/database/src/appleMain/kotlin/com/mifos/room/di/DatabaseModule.apple.kt +++ b/core/database/src/appleMain/kotlin/com/mifos/room/di/DatabaseModule.apple.kt @@ -9,5 +9,7 @@ */ package com.mifos.room.di -actual val PlatformSpecificDatabaseModule: org.koin.core.annotation.Module +import org.koin.core.module.Module + +actual val PlatformSpecificDatabaseModule: Module get() = TODO("Not yet implemented") diff --git a/core/domain/src/commonMain/kotlin/com/mifos/core/domain/useCases/LoginUseCase.kt b/core/domain/src/commonMain/kotlin/com/mifos/core/domain/useCases/LoginUseCase.kt index c7527fe3c3a..945db530049 100644 --- a/core/domain/src/commonMain/kotlin/com/mifos/core/domain/useCases/LoginUseCase.kt +++ b/core/domain/src/commonMain/kotlin/com/mifos/core/domain/useCases/LoginUseCase.kt @@ -23,7 +23,6 @@ import kotlinx.coroutines.flow.flow class LoginUseCase( private val loginRepository: LoginRepository, ) { - operator fun invoke( username: String, password: String, diff --git a/core/network/src/commonMain/kotlin/com/mifos/core/network/di/DataMangerModule.kt b/core/network/src/commonMain/kotlin/com/mifos/core/network/di/DataMangerModule.kt index 95ce33b6f86..27819a6b2a4 100644 --- a/core/network/src/commonMain/kotlin/com/mifos/core/network/di/DataMangerModule.kt +++ b/core/network/src/commonMain/kotlin/com/mifos/core/network/di/DataMangerModule.kt @@ -9,6 +9,7 @@ */ package com.mifos.core.network.di +import com.mifos.core.network.BaseApiManager import com.mifos.core.network.DataManager import com.mifos.core.network.datamanager.DataManagerAuth import com.mifos.core.network.datamanager.DataManagerCenter @@ -31,7 +32,7 @@ import org.koin.dsl.module val DataManagerModule = module { single { DataManager() } - single { DataManagerAuth(get()) } + single { DataManagerAuth(get()) } single { DataManagerCenter(get(), get(), get(), get()) } single { DataManagerCharge(get(), get(), get()) } single { DataManagerCheckerInbox(get()) } diff --git a/core/network/src/commonMain/kotlin/com/mifos/core/network/di/NetworkModule.kt b/core/network/src/commonMain/kotlin/com/mifos/core/network/di/NetworkModule.kt index f46b4dfca63..dfd76774a06 100644 --- a/core/network/src/commonMain/kotlin/com/mifos/core/network/di/NetworkModule.kt +++ b/core/network/src/commonMain/kotlin/com/mifos/core/network/di/NetworkModule.kt @@ -10,33 +10,34 @@ package com.mifos.core.network.di import coil3.ImageLoader -import com.mifos.core.common.network.MifosDispatchers import com.mifos.core.common.utils.getInstanceUrl import com.mifos.core.datastore.UserPreferencesRepository -import com.mifos.core.datastore.UserPreferencesRepositoryImpl import com.mifos.core.network.BaseApiManager import com.mifos.core.network.BaseUrl +import com.mifos.core.network.KtorHttpClient import com.mifos.core.network.KtorfitClient +import com.mifos.core.network.MifosInterceptor import com.mifos.core.network.utils.ImageLoaderUtils +import de.jensklingenberg.ktorfit.Ktorfit +import io.ktor.client.HttpClient +import io.ktor.client.plugins.auth.Auth import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch -import org.koin.core.qualifier.named import org.koin.dsl.module val NetworkModule = module { - single { - UserPreferencesRepositoryImpl( - get(), - get( - named( - MifosDispatchers.IO.name, - ), - ), - get(named(MifosDispatchers.Unconfined)), - ) + single(MifosClient) { + val preferencesRepository = get() + + KtorHttpClient.config { + install(Auth) + install(MifosInterceptor) { + repository = preferencesRepository + } + } } single(MifosClient) { @@ -50,6 +51,13 @@ val NetworkModule = module { single { BaseApiManager(get(), get()) } + single { + Ktorfit.Builder() + .baseUrl(BaseUrl().url) + .httpClient(get(MifosClient)) + .build() + } + single { val prefManager: UserPreferencesRepository = get() val baseManager = com.mifos.core.network.apimanager.BaseApiManager.getInstance() diff --git a/feature/auth/build.gradle.kts b/feature/auth/build.gradle.kts index 6e6060142cc..eb21a637344 100644 --- a/feature/auth/build.gradle.kts +++ b/feature/auth/build.gradle.kts @@ -21,10 +21,8 @@ kotlin { implementation(compose.material3) implementation(compose.components.resources) implementation(compose.ui) - implementation(libs.kermit.simple) - implementation(libs.kermit.logging) - api(projects.core.data) - api(projects.core.domain) + implementation(projects.core.data) + implementation(projects.core.domain) } } } diff --git a/feature/auth/src/commonMain/kotlin/com/mifos/feature/auth/login/LoginViewModel.kt b/feature/auth/src/commonMain/kotlin/com/mifos/feature/auth/login/LoginViewModel.kt index d32b1f51281..27bb84acec9 100644 --- a/feature/auth/src/commonMain/kotlin/com/mifos/feature/auth/login/LoginViewModel.kt +++ b/feature/auth/src/commonMain/kotlin/com/mifos/feature/auth/login/LoginViewModel.kt @@ -23,8 +23,6 @@ import com.mifos.core.domain.useCases.PasswordValidationUseCase import com.mifos.core.domain.useCases.UsernameValidationUseCase import com.mifos.core.model.objects.users.User import com.mifos.core.network.model.PostAuthenticationResponse -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.IO import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -39,7 +37,6 @@ import kotlinx.coroutines.launch class LoginViewModel( private val prefManager: UserPreferencesRepository, -// private val context: Context, private val usernameValidationUseCase: UsernameValidationUseCase, private val passwordValidationUseCase: PasswordValidationUseCase, private val loginUseCase: LoginUseCase, @@ -71,43 +68,12 @@ class LoginViewModel( return } viewModelScope.launch { - setupPrefManger(username, password) + login(username, password) } } - private fun setupPrefManger(username: String, password: String) { + private fun login(username: String, password: String) { viewModelScope.launch { - _loginUiState.value = LoginUiState.ShowProgress - - loginUseCase(username, password).collect { result -> - when (result) { - is DataState.Error -> { - _loginUiState.value = - LoginUiState.ShowError(Res.string.feature_auth_error_login_failed) - Logger.e("Login Error", result.exception) - } - - is DataState.Loading -> { - _loginUiState.value = LoginUiState.ShowProgress - } - - is DataState.Success -> { - result.data.let { user -> - if (user.userId != null && user.authenticated == true) { - onLoginSuccessful(user, username, password) - } else { - _loginUiState.value = - LoginUiState.ShowError(Res.string.feature_auth_error_login_failed) - } - } - } - } - } - } - } - - fun login(username: String, password: String) { - viewModelScope.launch(Dispatchers.IO) { loginUseCase(username, password).collect { result -> when (result) { is DataState.Error -> { @@ -121,10 +87,13 @@ class LoginViewModel( } is DataState.Success -> { - result.data.let { - if (it.userId != null && it.authenticated == true) { - onLoginSuccessful(it, username, password) - } + if (result.data.authenticated == true) { + onLoginSuccessful(result.data, username, password) + } else { + _loginUiState.value = + LoginUiState.ShowError(Res.string.feature_auth_error_login_failed) + + Logger.d("@@@", Throwable("login: ${result.data}")) } } } @@ -156,7 +125,7 @@ class LoginViewModel( if (passcode.value != null) { _loginUiState.value = LoginUiState.HomeActivityIntent } else { - _loginUiState.value = LoginUiState.PassCodeActivityIntent + _loginUiState.value = LoginUiState.HomeActivityIntent } } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 7ac78cc7453..7614a1869a4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -47,7 +47,7 @@ include(":core:ui") ////include(":feature:about") //include(":feature:activate") -//include(":feature:auth") +include(":feature:auth") //include(":feature:center") //include(":feature:checker-inbox-task") //include(":feature:client")