@@ -28,20 +28,28 @@ import androidx.compose.foundation.lazy.grid.GridCells
28
28
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
29
29
import androidx.compose.foundation.lazy.grid.items
30
30
import androidx.compose.material3.Card as MaterialCard
31
+ import androidx.compose.material3.CenterAlignedTopAppBar
31
32
import androidx.compose.material3.CircularProgressIndicator
33
+ import androidx.compose.material3.ExperimentalMaterial3Api
34
+ import androidx.compose.material3.Icon
35
+ import androidx.compose.material3.IconButton
32
36
import androidx.compose.material3.MaterialTheme
33
37
import androidx.compose.material3.Scaffold
34
38
import androidx.compose.material3.SnackbarHost
35
39
import androidx.compose.material3.SnackbarHostState
36
40
import androidx.compose.material3.Text
41
+ import androidx.compose.material3.TopAppBarDefaults
42
+ import androidx.compose.material3.rememberTopAppBarState
37
43
import androidx.compose.runtime.Composable
38
44
import androidx.compose.runtime.CompositionLocalProvider
39
45
import androidx.compose.runtime.LaunchedEffect
40
46
import androidx.compose.runtime.getValue
41
47
import androidx.compose.runtime.remember
42
48
import androidx.compose.ui.Modifier
43
49
import androidx.compose.ui.graphics.Color
50
+ import androidx.compose.ui.input.nestedscroll.nestedScroll
44
51
import androidx.compose.ui.res.stringResource
52
+ import androidx.compose.ui.text.style.TextOverflow
45
53
import androidx.compose.ui.tooling.preview.Preview
46
54
import androidx.compose.ui.unit.dp
47
55
import androidx.hilt.navigation.compose.hiltViewModel
@@ -54,8 +62,13 @@ import coil3.test.FakeImage
54
62
import kotlinx.collections.immutable.ImmutableList
55
63
import kotlinx.collections.immutable.persistentListOf
56
64
import kotlinx.collections.immutable.toPersistentList
65
+ import us.kikin.android.ptp.R
57
66
import us.kikin.android.ptp.data.Card
67
+ import us.kikin.android.ptp.icons.PtpIcons
68
+ import us.kikin.android.ptp.icons.rounded.FilterList
69
+ import us.kikin.android.ptp.ui.theme.AppTheme
58
70
71
+ @OptIn(ExperimentalMaterial3Api ::class )
59
72
@Composable
60
73
fun CardsScreen (
61
74
onCardClick : (Card ) -> Unit ,
@@ -64,26 +77,51 @@ fun CardsScreen(
64
77
viewModel : CardsViewModel = hiltViewModel(),
65
78
snackbarHostState : SnackbarHostState = remember { SnackbarHostState () },
66
79
) {
67
- Scaffold (
68
- modifier = modifier.fillMaxSize(),
69
- snackbarHost = { SnackbarHost (snackbarHostState) },
70
- ) { paddingValues ->
71
- val uiState by viewModel.uiState.collectAsStateWithLifecycle()
80
+ val scaffoldBehavior = TopAppBarDefaults .pinnedScrollBehavior(rememberTopAppBarState())
81
+ AppTheme {
82
+ Scaffold (
83
+ modifier = modifier
84
+ .fillMaxSize()
85
+ .nestedScroll(scaffoldBehavior.nestedScrollConnection),
86
+ topBar = {
87
+ CenterAlignedTopAppBar (
88
+ title = {
89
+ Text (
90
+ text = stringResource(id = R .string.app_name),
91
+ style = MaterialTheme .typography.titleLarge,
92
+ maxLines = 1 ,
93
+ overflow = TextOverflow .Ellipsis ,
94
+ )
95
+ },
96
+ actions = {
97
+ IconButton (onClick = { /* TODO*/ }) {
98
+ Icon (
99
+ imageVector = PtpIcons .Rounded .FilterList ,
100
+ contentDescription = stringResource(R .string.card_list_filters),
101
+ )
102
+ }
103
+ },
104
+ )
105
+ },
106
+ snackbarHost = { SnackbarHost (snackbarHostState) },
107
+ ) { paddingValues ->
108
+ val uiState by viewModel.uiState.collectAsStateWithLifecycle()
72
109
73
- CardsContent (
74
- cards = uiState.cards.toPersistentList(),
75
- onCardClick = onCardClick,
76
- isLoading = uiState.isLoading,
77
- userMessage = userMessage,
78
- modifier = Modifier .padding(paddingValues),
79
- )
110
+ CardsContent (
111
+ cards = uiState.cards.toPersistentList(),
112
+ onCardClick = onCardClick,
113
+ isLoading = uiState.isLoading,
114
+ userMessage = userMessage,
115
+ modifier = Modifier .padding(paddingValues),
116
+ )
80
117
81
- // Check for user messages to display on the screen
82
- uiState.userMessage?.let { message ->
83
- val snackbarText = stringResource(message)
84
- LaunchedEffect (snackbarHostState, viewModel, message, snackbarText) {
85
- snackbarHostState.showSnackbar(snackbarText)
86
- viewModel.snackbarMessageShown()
118
+ // Check for user messages to display on the screen
119
+ uiState.userMessage?.let { message ->
120
+ val snackbarText = stringResource(message)
121
+ LaunchedEffect (snackbarHostState, viewModel, message, snackbarText) {
122
+ snackbarHostState.showSnackbar(snackbarText)
123
+ viewModel.snackbarMessageShown()
124
+ }
87
125
}
88
126
}
89
127
}
0 commit comments