Skip to content

Commit 2ea17a0

Browse files
committed
[#102] Remove viewModel from AppNavigation
1 parent f031f35 commit 2ea17a0

File tree

4 files changed

+70
-46
lines changed

4 files changed

+70
-46
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package co.nimblehq.compose.crypto
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.remember
5+
import co.nimblehq.compose.crypto.domain.usecase.IsNetworkConnectedUseCase
6+
import co.nimblehq.compose.crypto.util.DispatchersProvider
7+
import kotlinx.coroutines.CoroutineScope
8+
import kotlinx.coroutines.flow.*
9+
10+
@Composable
11+
fun rememberCryptoAppState(
12+
isNetworkConnectedUseCase: IsNetworkConnectedUseCase,
13+
dispatchersProvider: DispatchersProvider,
14+
) = remember(isNetworkConnectedUseCase, dispatchersProvider) {
15+
CryptoAppState(isNetworkConnectedUseCase, dispatchersProvider)
16+
}
17+
18+
class CryptoAppState(
19+
isNetworkConnectedUseCase: IsNetworkConnectedUseCase,
20+
dispatchersProvider: DispatchersProvider,
21+
) {
22+
private val _isNetworkConnected = MutableSharedFlow<Boolean?>()
23+
val isNetworkConnected: SharedFlow<Boolean?>
24+
get() = _isNetworkConnected
25+
26+
private val _isNetworkError = MutableSharedFlow<Throwable?>()
27+
val isNetworkError: SharedFlow<Throwable?>
28+
get() = _isNetworkError
29+
30+
init {
31+
isNetworkConnectedUseCase()
32+
.catch {
33+
_isNetworkError.emit(it)
34+
}
35+
.onEach {
36+
_isNetworkConnected.emit(it)
37+
}
38+
.flowOn(dispatchersProvider.io)
39+
.launchIn(CoroutineScope(dispatchersProvider.io))
40+
}
41+
}

app/src/main/java/co/nimblehq/compose/crypto/ui/navigation/AppNavigation.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
package co.nimblehq.compose.crypto.ui.navigation
22

3+
import android.widget.Toast
34
import androidx.compose.runtime.Composable
5+
import androidx.compose.ui.platform.LocalContext
46
import androidx.compose.ui.res.stringResource
5-
import androidx.hilt.navigation.compose.hiltViewModel
67
import androidx.navigation.*
78
import androidx.navigation.compose.*
9+
import co.nimblehq.compose.crypto.CryptoAppState
810
import co.nimblehq.compose.crypto.R
911
import co.nimblehq.compose.crypto.extension.collectAsEffect
1012
import co.nimblehq.compose.crypto.ui.common.AppDialogPopUp
11-
import co.nimblehq.compose.crypto.ui.screens.MainViewModel
1213
import co.nimblehq.compose.crypto.ui.screens.detail.DetailScreen
1314
import co.nimblehq.compose.crypto.ui.screens.home.HomeScreen
1415

1516
@Composable
1617
fun AppNavigation(
1718
navController: NavHostController = rememberNavController(),
18-
mainViewModel: MainViewModel = hiltViewModel(),
19-
startDestination: String = AppDestination.Home.destination
19+
startDestination: String = AppDestination.Home.destination,
20+
cryptoAppState: CryptoAppState
2021
) {
2122

2223
var onInternetRestore: () -> Unit = {}
24+
val context = LocalContext.current
2325

24-
mainViewModel.isNetworkConnected.collectAsEffect { isNetworkConnected ->
26+
cryptoAppState.isNetworkConnected.collectAsEffect { isNetworkConnected ->
2527
if (isNetworkConnected == false) {
2628
val destination = AppDestination.NoNetwork
2729

@@ -33,6 +35,11 @@ fun AppNavigation(
3335
navController.navigate(destination)
3436
}
3537
}
38+
39+
cryptoAppState.isNetworkError.collectAsEffect { error ->
40+
Toast.makeText(context, error?.message, Toast.LENGTH_SHORT).show()
41+
}
42+
3643
NavHost(
3744
navController = navController,
3845
startDestination = startDestination

app/src/main/java/co/nimblehq/compose/crypto/ui/screens/MainActivity.kt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,35 @@ import android.os.Bundle
44
import androidx.activity.ComponentActivity
55
import androidx.activity.compose.setContent
66
import androidx.core.view.WindowCompat
7+
import co.nimblehq.compose.crypto.domain.usecase.IsNetworkConnectedUseCase
8+
import co.nimblehq.compose.crypto.rememberCryptoAppState
79
import co.nimblehq.compose.crypto.ui.navigation.AppNavigation
810
import co.nimblehq.compose.crypto.ui.theme.ComposeTheme
11+
import co.nimblehq.compose.crypto.util.DispatchersProvider
912
import dagger.hilt.android.AndroidEntryPoint
13+
import javax.inject.Inject
1014

1115
@AndroidEntryPoint
1216
class MainActivity : ComponentActivity() {
1317

18+
@Inject
19+
lateinit var isNetworkConnectedUseCase: IsNetworkConnectedUseCase
20+
21+
@Inject
22+
lateinit var dispatchersProvider: DispatchersProvider
23+
1424
override fun onCreate(savedInstanceState: Bundle?) {
1525
super.onCreate(savedInstanceState)
26+
1627
WindowCompat.setDecorFitsSystemWindows(window, false)
1728
setContent {
1829
ComposeTheme {
19-
AppNavigation()
30+
AppNavigation(
31+
cryptoAppState = rememberCryptoAppState(
32+
isNetworkConnectedUseCase = isNetworkConnectedUseCase,
33+
dispatchersProvider = dispatchersProvider,
34+
)
35+
)
2036
}
2137
}
2238
}

app/src/main/java/co/nimblehq/compose/crypto/ui/screens/MainViewModel.kt

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)