@@ -23,12 +23,15 @@ import androidx.compose.material3.Icon
23
23
import androidx.compose.material3.MaterialTheme
24
24
import androidx.compose.material3.Scaffold
25
25
import androidx.compose.material3.SmallFloatingActionButton
26
+ import androidx.compose.material3.SnackbarHost
27
+ import androidx.compose.material3.SnackbarHostState
26
28
import androidx.compose.material3.Text
27
29
import androidx.compose.material3.TopAppBar
28
30
import androidx.compose.material3.TopAppBarDefaults
29
31
import androidx.compose.material3.TopAppBarScrollBehavior
30
32
import androidx.compose.material3.rememberModalBottomSheetState
31
33
import androidx.compose.runtime.Composable
34
+ import androidx.compose.runtime.LaunchedEffect
32
35
import androidx.compose.runtime.derivedStateOf
33
36
import androidx.compose.runtime.getValue
34
37
import androidx.compose.runtime.remember
@@ -46,7 +49,6 @@ import dev.shorthouse.coinwatch.R
46
49
import dev.shorthouse.coinwatch.data.datastore.CoinSort
47
50
import dev.shorthouse.coinwatch.data.datastore.Currency
48
51
import dev.shorthouse.coinwatch.data.source.local.model.CachedCoin
49
- import dev.shorthouse.coinwatch.ui.component.ErrorState
50
52
import dev.shorthouse.coinwatch.ui.component.pullrefresh.PullRefreshIndicator
51
53
import dev.shorthouse.coinwatch.ui.component.pullrefresh.pullRefresh
52
54
import dev.shorthouse.coinwatch.ui.component.pullrefresh.rememberPullRefreshState
@@ -89,6 +91,9 @@ fun MarketScreen(
89
91
},
90
92
onRefresh = {
91
93
viewModel.pullRefreshCachedCoins()
94
+ },
95
+ onErrorDismiss = { errorMessageId ->
96
+ viewModel.onErrorDismiss(errorMessageId)
92
97
}
93
98
)
94
99
}
@@ -103,13 +108,15 @@ fun MarketScreen(
103
108
onUpdateCurrency : (Currency ) -> Unit ,
104
109
onUpdateShowCurrencyBottomSheet : (Boolean ) -> Unit ,
105
110
onRefresh : () -> Unit ,
111
+ onErrorDismiss : (Int ) -> Unit ,
106
112
modifier : Modifier = Modifier
107
113
) {
108
114
val scope = rememberCoroutineScope()
109
115
val scrollBehavior = TopAppBarDefaults .pinnedScrollBehavior()
110
116
val lazyListState = rememberLazyListState()
111
117
val coinSortSheetState = rememberModalBottomSheetState()
112
118
val currencySheetState = rememberModalBottomSheetState()
119
+ val snackbarHostState = remember { SnackbarHostState () }
113
120
val pullRefreshState = rememberPullRefreshState(
114
121
refreshing = uiState.isRefreshing,
115
122
onRefresh = onRefresh
@@ -127,6 +134,7 @@ fun MarketScreen(
127
134
scrollBehavior = scrollBehavior
128
135
)
129
136
},
137
+ snackbarHost = { SnackbarHost (hostState = snackbarHostState) },
130
138
content = { scaffoldPadding ->
131
139
Box (
132
140
contentAlignment = Alignment .TopCenter ,
@@ -137,14 +145,6 @@ fun MarketScreen(
137
145
MarketSkeletonLoader (modifier = Modifier .padding(scaffoldPadding))
138
146
}
139
147
140
- uiState.errorMessage != null -> {
141
- ErrorState (
142
- message = uiState.errorMessage,
143
- onRetry = onRefresh,
144
- modifier = Modifier .padding(scaffoldPadding)
145
- )
146
- }
147
-
148
148
else -> {
149
149
MarketContent (
150
150
coins = uiState.coins,
@@ -203,6 +203,18 @@ fun MarketScreen(
203
203
backgroundColor = MaterialTheme .colorScheme.primaryContainer,
204
204
modifier = Modifier .padding(scaffoldPadding)
205
205
)
206
+
207
+ if (uiState.errorMessageIds.isNotEmpty()) {
208
+ val errorMessage = stringResource(uiState.errorMessageIds.first())
209
+
210
+ LaunchedEffect (errorMessage, snackbarHostState) {
211
+ snackbarHostState.showSnackbar(
212
+ message = errorMessage
213
+ )
214
+
215
+ onErrorDismiss(uiState.errorMessageIds.first())
216
+ }
217
+ }
206
218
}
207
219
},
208
220
floatingActionButton = {
@@ -352,9 +364,10 @@ private fun MarketScreenPreview(
352
364
onCoinClick = {},
353
365
onUpdateCoinSort = {},
354
366
onUpdateShowCoinSortBottomSheet = {},
355
- onRefresh = {},
356
367
onUpdateCurrency = {},
357
- onUpdateShowCurrencyBottomSheet = {}
368
+ onUpdateShowCurrencyBottomSheet = {},
369
+ onRefresh = {},
370
+ onErrorDismiss = {}
358
371
)
359
372
}
360
373
}
0 commit comments