1
+ import androidx.compose.foundation.layout.padding
2
+ import androidx.compose.material3.CenterAlignedTopAppBar
3
+ import androidx.compose.material3.ExperimentalMaterial3Api
1
4
import androidx.compose.material3.MaterialTheme
5
+ import androidx.compose.material3.Scaffold
6
+ import androidx.compose.material3.Text
2
7
import androidx.compose.runtime.Composable
8
+ import androidx.compose.runtime.LaunchedEffect
9
+ import androidx.compose.runtime.collectAsState
10
+ import androidx.compose.runtime.getValue
11
+ import androidx.compose.ui.Modifier
12
+ import androidx.navigation.NavHostController
13
+ import androidx.navigation.compose.NavHost
14
+ import androidx.navigation.compose.composable
15
+ import androidx.navigation.compose.rememberNavController
3
16
import cafe.adriel.voyager.navigator.Navigator
4
17
import dev.johnoreilly.climatetrace.di.commonModule
18
+ import dev.johnoreilly.climatetrace.remote.Country
5
19
import dev.johnoreilly.climatetrace.ui.ClimateTraceScreen
20
+ import dev.johnoreilly.climatetrace.ui.CountryInfoDetailedView
21
+ import dev.johnoreilly.climatetrace.ui.CountryListView
22
+ import dev.johnoreilly.climatetrace.viewmodel.ClimateTraceViewModel
6
23
import org.jetbrains.compose.ui.tooling.preview.Preview
7
24
import org.koin.compose.KoinApplication
25
+ import org.koin.compose.koinInject
8
26
9
27
10
28
@Preview
11
29
@Composable
12
- fun App () {
30
+ fun AppVoyagerNav () {
13
31
KoinApplication (application = {
14
32
modules(commonModule())
15
33
}) {
16
34
MaterialTheme {
17
35
Navigator (screen = ClimateTraceScreen ())
18
36
}
19
37
}
20
- }
38
+ }
39
+
40
+ @OptIn(ExperimentalMaterial3Api ::class )
41
+ @Composable
42
+ fun AppJetpackBav () {
43
+ KoinApplication (application = {
44
+ modules(commonModule())
45
+ }) {
46
+
47
+ MaterialTheme {
48
+ val navController = rememberNavController()
49
+
50
+ val viewModel = koinInject<ClimateTraceViewModel >()
51
+ val countryList = viewModel.countryList.collectAsState()
52
+ val selectedCountry = viewModel.selectedCountry.collectAsState()
53
+ val isLoadingCountries by viewModel.isLoadingCountries.collectAsState()
54
+
55
+ Scaffold (
56
+ topBar = {
57
+ CenterAlignedTopAppBar (title = {
58
+ Text (" ClimateTraceKMP" )
59
+ })
60
+ }
61
+ ) { innerPadding ->
62
+
63
+ NavHost (
64
+ navController = navController,
65
+ startDestination = " countryList" ,
66
+ modifier = Modifier .padding(innerPadding)
67
+ ) {
68
+
69
+ composable(route = " countryList" ) {
70
+ CountryListView (countryList.value, selectedCountry.value, isLoadingCountries) { country ->
71
+ navController.navigate(" details/${country.name} /${country.alpha3} " )
72
+ }
73
+ }
74
+ composable(" details/{countryName}/{countryCode}" ,) { backStackEntry ->
75
+
76
+ val countryName = backStackEntry.arguments?.getString(" countryName" ) ? : " "
77
+ val countryCode = backStackEntry.arguments?.getString(" countryCode" ) ? : " "
78
+ val country = Country (countryCode, " " , countryName, " " )
79
+
80
+ val countryEmissionInfo by viewModel.countryEmissionInfo.collectAsState()
81
+ val countryAssetEmissions by viewModel.countryAssetEmissions.collectAsState()
82
+ val isLoadingCountryDetails by viewModel.isLoadingCountryDetails.collectAsState()
83
+
84
+ LaunchedEffect (country) {
85
+ viewModel.fetchCountryDetails(country)
86
+ }
87
+
88
+ CountryInfoDetailedView (country, viewModel.year, countryEmissionInfo,
89
+ countryAssetEmissions, isLoadingCountryDetails)
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+
96
+ }
0 commit comments