@@ -18,9 +18,12 @@ import androidx.compose.material3.TopAppBar
1818import androidx.compose.runtime.Composable
1919import androidx.compose.runtime.collectAsState
2020import androidx.compose.runtime.getValue
21+ import androidx.compose.runtime.mutableStateOf
2122import androidx.compose.runtime.remember
2223import androidx.compose.runtime.rememberCoroutineScope
24+ import androidx.compose.runtime.setValue
2325import androidx.compose.ui.Modifier
26+ import androidx.compose.ui.geometry.Offset
2427import androidx.compose.ui.platform.LocalContext
2528import androidx.compose.ui.res.stringResource
2629import androidx.compose.ui.unit.dp
@@ -31,12 +34,16 @@ import com.paulcoding.hviewer.ui.component.HBackIcon
3134import com.paulcoding.hviewer.ui.component.HEmpty
3235import com.paulcoding.hviewer.ui.page.AppViewModel
3336import com.paulcoding.hviewer.ui.page.posts.FavoriteCard
37+ import com.paulcoding.hviewer.ui.page.posts.TabsIcon
38+ import com.paulcoding.hviewer.ui.page.tabs.AddToCartAnimation
3439import kotlinx.coroutines.launch
3540
3641@OptIn(ExperimentalMaterial3Api ::class )
3742@Composable
3843fun FavoritePage (
3944 appViewModel : AppViewModel ,
45+ tabs : List <PostItem >,
46+ navToTabs : () -> Unit ,
4047 navToImages : (PostItem ) -> Unit ,
4148 navToCustomTag : (PostItem , Tag ) -> Unit ,
4249 goBack : () -> Boolean
@@ -45,6 +52,10 @@ fun FavoritePage(
4552 val snackbarHostState = remember { SnackbarHostState () }
4653 val scope = rememberCoroutineScope()
4754 val favoritePosts by appViewModel.favoritePosts.collectAsState(initial = emptyList())
55+ var tabsIconPosition by remember { mutableStateOf(Offset .Zero ) }
56+
57+ var startPos by remember { mutableStateOf(Offset .Zero ) }
58+ var isAnimating by remember { mutableStateOf(false ) }
4859
4960 fun onDelete (post : PostItem ) {
5061 appViewModel.deleteFavorite(post)
@@ -72,8 +83,14 @@ fun FavoritePage(
7283 topBar = {
7384 TopAppBar (title = { Text (stringResource(R .string.favorite)) }, navigationIcon = {
7485 HBackIcon { goBack() }
86+ }, actions = {
87+ TabsIcon (
88+ onClick = navToTabs,
89+ size = tabs.size,
90+ onGloballyPositioned = { tabsIconPosition = it })
7591 })
76- }) { paddings ->
92+ },
93+ ) { paddings ->
7794 Column (
7895 modifier = Modifier
7996 .padding(paddings)
@@ -85,34 +102,33 @@ fun FavoritePage(
85102 verticalArrangement = Arrangement .spacedBy(12 .dp)
86103 ) {
87104 items(items = favoritePosts, key = { it.url }) { item ->
88- FavoriteItem (item, navToImages = { navToImages(item) },
89- onTagClick = { tag -> navToCustomTag(item, tag) },
90- deleteFavorite = {
105+ FavoriteCard (
106+ item,
107+ isFavorite = true ,
108+ setFavorite = {
91109 onDelete(item)
110+ },
111+ onTagClick = { tag -> navToCustomTag(item, tag) },
112+ onAddToTabs = {
113+ startPos = it
114+ isAnimating = true
115+ appViewModel.addTab(item)
116+ },
117+ onClick = {
118+ navToImages(item)
92119 })
93120 }
94121 }
95122 if (favoritePosts.isEmpty())
96123 HEmpty ()
97124 }
98- }
99125
100- }
101-
102- @Composable
103- fun FavoriteItem (
104- post : PostItem ,
105- navToImages : () -> Unit ,
106- onTagClick : (Tag ) -> Unit ,
107- deleteFavorite : () -> Unit
108- ) {
109- FavoriteCard (
110- post, isFavorite = true ,
111- setFavorite = {
112- deleteFavorite()
113- },
114- onTagClick = { onTagClick(it) },
115- ) {
116- navToImages()
126+ AddToCartAnimation (
127+ isAnimating = isAnimating,
128+ startPosition = startPos,
129+ endPosition = tabsIconPosition.copy(y = tabsIconPosition.y - 100 ),
130+ onAnimationEnd = { isAnimating = false },
131+ )
117132 }
118- }
133+
134+ }
0 commit comments