Skip to content

Commit e596618

Browse files
feat(feature:auth): Migrated to CMP (#2772)
1 parent a8b1b24 commit e596618

File tree

25 files changed

+408
-300
lines changed

25 files changed

+408
-300
lines changed

cmp-android/dependencies/demoDebugRuntimeClasspath.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ org.jetbrains.compose.ui:ui-util:1.7.0-rc01
302302
org.jetbrains.compose.ui:ui:1.7.0-rc01
303303
org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0
304304
org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0
305+
org.jetbrains.kotlin:kotlin-reflect:2.1.0
305306
org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0
306307
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20
307308
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20

cmp-android/dependencies/demoReleaseRuntimeClasspath.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ org.jetbrains.compose.ui:ui-util:1.7.0-rc01
298298
org.jetbrains.compose.ui:ui:1.7.0-rc01
299299
org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0
300300
org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0
301+
org.jetbrains.kotlin:kotlin-reflect:2.1.0
301302
org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0
302303
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20
303304
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20

cmp-android/dependencies/prodDebugRuntimeClasspath.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ org.jetbrains.compose.ui:ui-util:1.7.0-rc01
302302
org.jetbrains.compose.ui:ui:1.7.0-rc01
303303
org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0
304304
org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0
305+
org.jetbrains.kotlin:kotlin-reflect:2.1.0
305306
org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0
306307
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20
307308
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20

cmp-android/dependencies/prodReleaseRuntimeClasspath.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ org.jetbrains.compose.ui:ui-util:1.7.0-rc01
298298
org.jetbrains.compose.ui:ui:1.7.0-rc01
299299
org.jetbrains.kotlin:kotlin-android-extensions-runtime:2.1.0
300300
org.jetbrains.kotlin:kotlin-parcelize-runtime:2.1.0
301+
org.jetbrains.kotlin:kotlin-reflect:2.1.0
301302
org.jetbrains.kotlin:kotlin-stdlib-common:2.1.0
302303
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.20
303304
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.20

cmp-desktop/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ kotlin {
3333
implementation(libs.kotlin.reflect)
3434

3535
implementation(libs.koin.core)
36+
37+
implementation(compose.components.resources)
3638
}
3739
}
3840
}

cmp-desktop/src/jvmMain/kotlin/main.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import androidx.compose.ui.window.Window
1212
import androidx.compose.ui.window.application
1313
import androidx.compose.ui.window.rememberWindowState
1414
import cmp.shared.SharedApp
15+
import cmp.shared.generated.resources.Res
16+
import cmp.shared.generated.resources.application_title
1517
import cmp.shared.utils.initKoin
18+
import org.jetbrains.compose.resources.stringResource
1619

1720
/**
1821
* Main function.
@@ -40,7 +43,7 @@ fun main() {
4043
Window(
4144
onCloseRequest = ::exitApplication,
4245
state = windowState,
43-
title = "DesktopApp",
46+
title = stringResource(Res.string.application_title),
4447
) {
4548
// Sets the content of the window.
4649
SharedApp()

cmp-navigation/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ plugins {
1717
kotlin {
1818
sourceSets {
1919
commonMain.dependencies {
20+
21+
implementation(projects.feature.auth)
22+
2023
// Core Modules
2124
implementation(projects.core.data)
2225
implementation(projects.core.common)

cmp-navigation/src/commonMain/kotlin/cmp/navigation/ComposeApp.kt

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,54 @@
99
*/
1010
package cmp.navigation
1111

12+
import androidx.compose.foundation.layout.fillMaxSize
1213
import androidx.compose.runtime.Composable
14+
import androidx.compose.runtime.getValue
1315
import androidx.compose.ui.Modifier
16+
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1417
import androidx.navigation.compose.rememberNavController
18+
import cmp.navigation.navigation.NavGraphRoute.AUTH_GRAPH
19+
import cmp.navigation.navigation.NavGraphRoute.PASSCODE_GRAPH
1520
import cmp.navigation.navigation.RootNavGraph
1621
import org.koin.compose.koinInject
22+
import org.koin.compose.viewmodel.koinViewModel
1723
import org.mifos.mobile.core.data.util.NetworkMonitor
1824
import org.mifos.mobile.core.designsystem.theme.MifosMobileTheme
1925

2026
@Composable
2127
fun ComposeApp(
2228
modifier: Modifier = Modifier,
2329
networkMonitor: NetworkMonitor = koinInject(),
30+
viewModel: ComposeAppViewModel = koinViewModel(),
2431
) {
32+
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
33+
val navController = rememberNavController()
34+
35+
val navDestination = when (uiState) {
36+
is MainUiState.Loading -> AUTH_GRAPH
37+
is MainUiState.Success -> if ((uiState as MainUiState.Success).userData.isAuthenticated) {
38+
PASSCODE_GRAPH
39+
} else {
40+
AUTH_GRAPH
41+
}
42+
43+
else -> AUTH_GRAPH
44+
}
45+
2546
MifosMobileTheme {
2647
RootNavGraph(
48+
modifier = modifier.fillMaxSize(),
2749
networkMonitor = networkMonitor,
28-
navHostController = rememberNavController(),
29-
modifier = modifier,
50+
navHostController = navController,
51+
startDestination = navDestination,
52+
// onClickLogout = {
53+
// viewModel.logOut()
54+
// navController.navigate(AUTH_GRAPH) {
55+
// popUpTo(navController.graph.id) {
56+
// inclusive = true
57+
// }
58+
// }
59+
// },
3060
)
3161
}
3262
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright 2025 Mifos Initiative
3+
*
4+
* This Source Code Form is subject to the terms of the Mozilla Public
5+
* License, v. 2.0. If a copy of the MPL was not distributed with this
6+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
7+
*
8+
* See https://github.com/openMF/mobile-mobile/blob/master/LICENSE.md
9+
*/
10+
package cmp.navigation
11+
12+
import androidx.lifecycle.ViewModel
13+
import androidx.lifecycle.viewModelScope
14+
import kotlinx.coroutines.flow.SharingStarted
15+
import kotlinx.coroutines.flow.StateFlow
16+
import kotlinx.coroutines.flow.map
17+
import kotlinx.coroutines.flow.stateIn
18+
import kotlinx.coroutines.launch
19+
import org.mifos.mobile.core.common.DataState
20+
import org.mifos.mobile.core.data.repository.UserDataRepository
21+
import org.mifos.mobile.core.model.UserData
22+
23+
class ComposeAppViewModel(
24+
private val userDataRepository: UserDataRepository,
25+
// private val passcodeManager: PasscodeManager,
26+
) : ViewModel() {
27+
28+
val uiState: StateFlow<MainUiState> = userDataRepository.userData.map { dataState ->
29+
when (dataState) {
30+
is DataState.Success -> MainUiState.Success(dataState.data)
31+
is DataState.Error -> MainUiState.Error(dataState.exception.message ?: "Unknown error")
32+
DataState.Loading -> MainUiState.Loading
33+
}
34+
}.stateIn(
35+
scope = viewModelScope,
36+
initialValue = MainUiState.Loading,
37+
started = SharingStarted.WhileSubscribed(5_000),
38+
)
39+
40+
fun logOut() {
41+
viewModelScope.launch {
42+
userDataRepository.logOut()
43+
// passcodeManager.clearPasscode()
44+
}
45+
}
46+
}
47+
48+
sealed interface MainUiState {
49+
data object Loading : MainUiState
50+
data class Error(val error: String) : MainUiState
51+
data class Success(val userData: UserData) : MainUiState
52+
}

cmp-navigation/src/commonMain/kotlin/cmp/navigation/di/KoinModules.kt

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,14 @@
99
*/
1010
package cmp.navigation.di
1111

12+
import cmp.navigation.ComposeAppViewModel
13+
import org.koin.core.module.dsl.viewModelOf
1214
import org.koin.dsl.module
1315
import org.mifos.mobile.core.common.di.DispatchersModule
1416
import org.mifos.mobile.core.data.di.RepositoryModule
1517
import org.mifos.mobile.core.datastore.di.PreferencesModule
1618
import org.mifos.mobile.core.network.di.NetworkModule
19+
import org.mifos.mobile.feature.auth.di.AuthModule
1720

1821
object KoinModules {
1922
private val commonModules = module {
@@ -28,14 +31,14 @@ object KoinModules {
2831
private val networkModules = module {
2932
includes(NetworkModule)
3033
}
31-
// private val sharedModule = module {
32-
// viewModelOf(::MifosMobileViewModel)
33-
// }
34-
// private val featureModules = module {
35-
// includes(
36-
// AuthModule,
37-
// )
38-
// }
34+
private val sharedModule = module {
35+
viewModelOf(::ComposeAppViewModel)
36+
}
37+
private val featureModules = module {
38+
includes(
39+
AuthModule,
40+
)
41+
}
3942
// private val LibraryModule = module {
4043
// includes(PasscodeModule)
4144
// }
@@ -45,7 +48,7 @@ object KoinModules {
4548
dataModules,
4649
coreDataStoreModules,
4750
networkModules,
48-
// featureModules,
49-
// sharedModule,
51+
featureModules,
52+
sharedModule,
5053
)
5154
}

0 commit comments

Comments
 (0)