Skip to content

Commit b8a2b66

Browse files
committed
Enable Undo removing favorite post
1 parent 16a0018 commit b8a2b66

File tree

2 files changed

+43
-10
lines changed

2 files changed

+43
-10
lines changed

app/src/main/java/com/paulcoding/hviewer/ui/favorite/FavoritePage.kt

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,25 @@ import androidx.compose.foundation.lazy.LazyColumn
66
import androidx.compose.foundation.lazy.items
77
import androidx.compose.material3.ExperimentalMaterial3Api
88
import androidx.compose.material3.Scaffold
9+
import androidx.compose.material3.SnackbarDuration
10+
import androidx.compose.material3.SnackbarHost
11+
import androidx.compose.material3.SnackbarHostState
12+
import androidx.compose.material3.SnackbarResult
913
import androidx.compose.material3.Text
1014
import androidx.compose.material3.TopAppBar
1115
import androidx.compose.runtime.Composable
1216
import androidx.compose.runtime.collectAsState
1317
import androidx.compose.runtime.getValue
18+
import androidx.compose.runtime.remember
19+
import androidx.compose.runtime.rememberCoroutineScope
1420
import androidx.compose.ui.Modifier
1521
import androidx.lifecycle.viewmodel.compose.viewModel
1622
import com.paulcoding.hviewer.model.PostItem
1723
import com.paulcoding.hviewer.ui.component.HBackIcon
1824
import com.paulcoding.hviewer.ui.component.HEmpty
1925
import com.paulcoding.hviewer.ui.page.AppViewModel
2026
import com.paulcoding.hviewer.ui.page.posts.PostCard
27+
import kotlinx.coroutines.launch
2128

2229
@OptIn(ExperimentalMaterial3Api::class)
2330
@Composable
@@ -27,19 +34,42 @@ fun FavoritePage(
2734
goBack: () -> Boolean
2835
) {
2936
val viewModel: AppViewModel = viewModel()
37+
val snackbarHostState = remember { SnackbarHostState() }
38+
val scope = rememberCoroutineScope()
3039
val favoritePosts by viewModel.favoritePosts.collectAsState(initial = emptyList())
3140

41+
fun onDelete(post: PostItem) {
42+
appViewModel.deleteFavorite(post)
43+
44+
scope.launch {
45+
val result = snackbarHostState.showSnackbar(
46+
"${post.name} removed from favorite",
47+
"Undo",
48+
duration = SnackbarDuration.Short
49+
)
50+
when (result) {
51+
SnackbarResult.ActionPerformed -> {
52+
appViewModel.addFavorite(post, true)
53+
}
54+
55+
SnackbarResult.Dismissed -> {
56+
}
57+
}
58+
}
59+
}
60+
3261
Scaffold(
3362
modifier = Modifier.fillMaxSize(),
63+
snackbarHost = { SnackbarHost(snackbarHostState) },
3464
topBar = {
3565
TopAppBar(title = { Text("Favorite") }, navigationIcon = {
3666
HBackIcon { goBack() }
3767
})
3868
}) { paddings ->
3969
LazyColumn(modifier = Modifier.padding(paddings)) {
40-
items(items = favoritePosts.reversed(), key = { it.url }) { item ->
41-
FavoriteItem(item, navToImages = { navToImages(it) }, deleteFavorite = {
42-
appViewModel.deleteFavorite(it)
70+
items(items = favoritePosts, key = { it.url }) { item ->
71+
FavoriteItem(item, navToImages = { navToImages(item) }, deleteFavorite = {
72+
onDelete(item)
4373
})
4474
}
4575
if (favoritePosts.isEmpty())
@@ -52,12 +82,12 @@ fun FavoritePage(
5282
@Composable
5383
fun FavoriteItem(
5484
post: PostItem,
55-
navToImages: (PostItem) -> Unit,
56-
deleteFavorite: (PostItem) -> Unit
85+
navToImages: () -> Unit,
86+
deleteFavorite: () -> Unit
5787
) {
5888
PostCard(post, isFavorite = true, setFavorite = {
59-
deleteFavorite(post)
89+
deleteFavorite()
6090
}) {
61-
navToImages(post)
91+
navToImages()
6292
}
6393
}

app/src/main/java/com/paulcoding/hviewer/ui/page/AppViewModel.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@ class AppViewModel : ViewModel() {
2929
val site: Pair<String, SiteConfig> = "" to SiteConfig(),
3030
)
3131

32-
fun addFavorite(postItem: PostItem) {
32+
fun addFavorite(postItem: PostItem, reAdded: Boolean = false) {
3333
viewModelScope.launch {
34-
val postWithPage = postItem.copy(site = _stateFlow.value.site.first)
35-
DatabaseProvider.getInstance().favoritePostDao().insert(postWithPage)
34+
val item = if (reAdded) postItem else postItem.copy(
35+
site = _stateFlow.value.site.first,
36+
createdAt = System.currentTimeMillis()
37+
)
38+
DatabaseProvider.getInstance().favoritePostDao().insert(item)
3639
}
3740
}
3841

0 commit comments

Comments
 (0)