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: NavHostController = 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 (
71
+ countryList.value,
72
+ selectedCountry.value,
73
+ isLoadingCountries
74
+ ) { country ->
75
+ navController.navigate(" details/${country.name} /${country.alpha3} " )
76
+ }
77
+ }
78
+ composable(" details/{countryName}/{countryCode}" ,) { backStackEntry ->
79
+
80
+ val countryName = backStackEntry.arguments?.getString(" countryName" ) ? : " "
81
+ val countryCode = backStackEntry.arguments?.getString(" countryCode" ) ? : " "
82
+ val country = Country (countryCode, " " , countryName, " " )
83
+
84
+ val countryEmissionInfo by viewModel.countryEmissionInfo.collectAsState()
85
+ val countryAssetEmissions by viewModel.countryAssetEmissions.collectAsState()
86
+ val isLoadingCountryDetails by viewModel.isLoadingCountryDetails.collectAsState()
87
+
88
+ LaunchedEffect (country) {
89
+ viewModel.fetchCountryDetails(country)
90
+ }
91
+
92
+ CountryInfoDetailedView (
93
+ country,
94
+ viewModel.year,
95
+ countryEmissionInfo,
96
+ countryAssetEmissions,
97
+ isLoadingCountryDetails
98
+ )
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+
105
+ }
0 commit comments