33package dev.johnoreilly.common.countrylist
44
55import androidx.compose.foundation.Image
6+ import androidx.compose.foundation.background
67import androidx.compose.foundation.clickable
78import androidx.compose.foundation.layout.*
89import androidx.compose.foundation.lazy.LazyColumn
910import androidx.compose.foundation.lazy.items
11+ import androidx.compose.foundation.shape.RoundedCornerShape
12+ import androidx.compose.material3.Card
13+ import androidx.compose.material3.CardDefaults
1014import androidx.compose.material3.ExperimentalMaterial3Api
1115import androidx.compose.material3.MaterialTheme
1216import androidx.compose.material3.Scaffold
1317import androidx.compose.material3.Text
1418import androidx.compose.material3.TopAppBar
19+ import androidx.compose.material3.TopAppBarDefaults
1520import androidx.compose.runtime.*
1621import androidx.compose.ui.Alignment
1722import androidx.compose.ui.Modifier
23+ import androidx.compose.ui.draw.clip
24+ import androidx.compose.ui.text.font.FontWeight
1825import androidx.compose.ui.unit.dp
1926import bikeshare.common.generated.resources.Res
2027import bikeshare.common.generated.resources.allDrawableResources
@@ -29,8 +36,24 @@ import software.amazon.lastmile.kotlin.inject.anvil.AppScope
2936@CircuitInject(CountryListScreen ::class , AppScope ::class )
3037@Composable
3138fun CountryListUi (state : CountryListScreen .State , modifier : Modifier = Modifier ) {
32- Scaffold (modifier = modifier, topBar = { TopAppBar (title = { Text (" Countries" ) }) }) { innerPadding ->
33- LazyColumn (modifier = Modifier .padding(innerPadding)) {
39+ Scaffold (
40+ modifier = modifier,
41+ topBar = {
42+ TopAppBar (
43+ title = { Text (" Choose a Country" , style = MaterialTheme .typography.titleLarge) },
44+ colors = TopAppBarDefaults .topAppBarColors(
45+ containerColor = MaterialTheme .colorScheme.primary,
46+ titleContentColor = MaterialTheme .colorScheme.onPrimary
47+ )
48+ )
49+ }
50+ ) { innerPadding ->
51+ LazyColumn (
52+ modifier = Modifier
53+ .padding(innerPadding)
54+ .padding(horizontal = 12 .dp, vertical = 8 .dp),
55+ verticalArrangement = Arrangement .spacedBy(8 .dp)
56+ ) {
3457 items(state.countryList) { country ->
3558 CountryView (country) {
3659 state.eventSink(CountryListScreen .Event .CountryClicked (country.code))
@@ -44,23 +67,45 @@ fun CountryListUi(state: CountryListScreen.State, modifier: Modifier = Modifier)
4467@OptIn(ExperimentalResourceApi ::class )
4568@Composable
4669fun CountryView (country : Country , countrySelected : (country: Country ) -> Unit ) {
47- Row (
70+ Card (
4871 modifier = Modifier
4972 .fillMaxWidth()
50- .clickable(onClick = { countrySelected(country) })
51- .padding(start = 16 .dp, top = 8 .dp, end = 16 .dp, bottom = 8 .dp),
52- verticalAlignment = Alignment .CenterVertically
73+ .clickable(onClick = { countrySelected(country) }),
74+ shape = RoundedCornerShape (8 .dp),
75+ elevation = CardDefaults .cardElevation(defaultElevation = 2 .dp),
76+ colors = CardDefaults .cardColors(
77+ containerColor = MaterialTheme .colorScheme.surface
78+ )
5379 ) {
54- val flagDrawable = Res .allDrawableResources[" flag_${country.code.lowercase()} " ]
55- if (flagDrawable != null ) {
56- Image (
57- painterResource(flagDrawable),
58- modifier = Modifier .size(32 .dp),
59- contentDescription = country.displayName
80+ Row (
81+ modifier = Modifier
82+ .fillMaxWidth()
83+ .padding(16 .dp),
84+ verticalAlignment = Alignment .CenterVertically
85+ ) {
86+ val flagDrawable = Res .allDrawableResources[" flag_${country.code.lowercase()} " ]
87+ if (flagDrawable != null ) {
88+ Box (
89+ modifier = Modifier
90+ .size(48 .dp)
91+ .clip(RoundedCornerShape (4 .dp))
92+ .background(MaterialTheme .colorScheme.surfaceVariant)
93+ .padding(4 .dp)
94+ ) {
95+ Image (
96+ painterResource(flagDrawable),
97+ modifier = Modifier .size(40 .dp),
98+ contentDescription = country.displayName
99+ )
100+ }
101+ }
102+
103+ Spacer (modifier = Modifier .width(16 .dp))
104+ Text (
105+ text = country.displayName,
106+ style = MaterialTheme .typography.bodyLarge,
107+ fontWeight = FontWeight .Medium
60108 )
61109 }
62-
63- Spacer (modifier = Modifier .size(16 .dp))
64- Text (text = country.displayName, style = MaterialTheme .typography.bodyLarge)
65110 }
66111}
0 commit comments