@@ -7,11 +7,9 @@ import androidx.compose.foundation.layout.fillMaxSize
77import androidx.compose.foundation.layout.padding
88import androidx.compose.foundation.layout.width
99import androidx.compose.foundation.pager.HorizontalPager
10- import androidx.compose.foundation.pager.PagerState
1110import androidx.compose.foundation.pager.rememberPagerState
1211import androidx.compose.material.icons.Icons
13- import androidx.compose.material.icons.outlined.ChevronLeft
14- import androidx.compose.material.icons.outlined.ChevronRight
12+ import androidx.compose.material.icons.outlined.Close
1513import androidx.compose.material.icons.outlined.Info
1614import androidx.compose.material3.Text
1715import androidx.compose.runtime.Composable
@@ -28,7 +26,6 @@ import androidx.compose.ui.unit.dp
2826import com.paulcoding.hviewer.model.PostItem
2927import com.paulcoding.hviewer.model.Tag
3028import com.paulcoding.hviewer.ui.LocalHostsMap
31- import com.paulcoding.hviewer.ui.component.HEmpty
3229import com.paulcoding.hviewer.ui.component.HFavoriteIcon
3330import com.paulcoding.hviewer.ui.component.HIcon
3431import com.paulcoding.hviewer.ui.page.AppViewModel
@@ -47,7 +44,7 @@ fun TabsPage(
4744 val tabs by appViewModel.tabs.collectAsState(initial = listOf ())
4845 val reversedTabs by remember { derivedStateOf { tabs.reversed() } }
4946 val pagerState = rememberPagerState { reversedTabs.size }
50- val currentPost by remember { derivedStateOf { reversedTabs[pagerState.currentPage] } }
47+
5148 val scope = rememberCoroutineScope()
5249 var infoSheetVisible by remember { mutableStateOf(false ) }
5350
@@ -64,42 +61,45 @@ fun TabsPage(
6461 }
6562
6663 Box (modifier = Modifier .fillMaxSize()) {
67- if (reversedTabs.isEmpty()) {
68- HEmpty ()
69- } else {
70- HorizontalPager (
71- state = pagerState,
72- modifier = Modifier .fillMaxSize(),
73- beyondViewportPageCount = 2 ,
74- key = { reversedTabs[it].url }
75- ) { pageIndex ->
76- val tab = reversedTabs[pageIndex]
77- val siteConfig = tab.getSiteConfig(hostsMap)
64+ HorizontalPager (
65+ state = pagerState,
66+ modifier = Modifier .fillMaxSize(),
67+ beyondViewportPageCount = 2 ,
68+ key = { reversedTabs[it].url }
69+ ) { pageIndex ->
70+ val tab = reversedTabs[pageIndex]
71+ val siteConfig = tab.getSiteConfig(hostsMap)
7872
79- if (siteConfig != null ) {
80- ImageList (
81- tab,
82- siteConfig = siteConfig,
83- goBack = goBack,
84- bottomRowActions = {
85- BottomRowActions (
86- tab,
87- appViewModel,
88- pageIndex,
89- scope,
90- pagerState,
91- toggleBottomSheet = {
92- infoSheetVisible = ! infoSheetVisible
93- })
94- }
95- )
96- } else
97- Text (
98- " Site config not found for ${tab.url} " ,
99- modifier = Modifier .padding(16 .dp),
100- color = Color .Red
101- )
102- }
73+ if (siteConfig != null ) {
74+ ImageList (
75+ tab,
76+ siteConfig = siteConfig,
77+ goBack = goBack,
78+ bottomRowActions = {
79+ BottomRowActions (
80+ tab,
81+ appViewModel,
82+ pageIndex,
83+ scope,
84+ removeTab = {
85+ appViewModel.removeTab(tab)
86+ if (pagerState.pageCount == 1 ) {
87+ goBack()
88+ }
89+ },
90+ toggleBottomSheet = {
91+ infoSheetVisible = ! infoSheetVisible
92+ })
93+ }
94+ )
95+ } else
96+ Text (
97+ " Site config not found for ${tab.url} " ,
98+ modifier = Modifier .padding(16 .dp),
99+ color = Color .Red
100+ )
101+ }
102+ reversedTabs.getOrNull(pagerState.currentPage)?.let { currentPost ->
103103 InfoBottomSheet (
104104 visible = infoSheetVisible,
105105 postItem = currentPost,
@@ -119,41 +119,13 @@ fun TabsPage(
119119internal fun BottomRowActions (
120120 postItem : PostItem ,
121121 appViewModel : AppViewModel ,
122- pageIndex : Int ,
122+ totalPage : Int ,
123123 scope : CoroutineScope ,
124- pagerState : PagerState ,
124+ removeTab : () -> Unit ,
125125 toggleBottomSheet : () -> Unit ,
126126) {
127127 val favorite by appViewModel.postFavorite(postItem.url).collectAsState(false )
128128
129- HIcon (
130- Icons .Outlined .ChevronLeft ,
131- size = 32 ,
132- rounded = true ,
133- enabled = pageIndex > 0
134- ) {
135- scope.launch {
136- pagerState.animateScrollToPage(
137- pageIndex.dec()
138- )
139- }
140- }
141- Spacer (modifier = Modifier .width(16 .dp))
142- HIcon (
143- Icons .Outlined .ChevronRight ,
144- size = 32 ,
145- rounded = true ,
146- enabled = pageIndex < pagerState.pageCount - 1
147- ) {
148- scope.launch {
149- pagerState.animateScrollToPage(
150- pageIndex.inc()
151- )
152- }
153- }
154-
155- Spacer (modifier = Modifier .width(16 .dp))
156-
157129 HIcon (
158130 Icons .Outlined .Info ,
159131 size = 32 ,
@@ -172,5 +144,14 @@ internal fun BottomRowActions(
172144 appViewModel.deleteFavorite(postItem)
173145 }
174146 }
147+
148+ Spacer (modifier = Modifier .width(16 .dp))
149+
150+ HIcon (
151+ Icons .Outlined .Close ,
152+ size = 32 ,
153+ rounded = true ,
154+ onClick = removeTab
155+ )
175156}
176157
0 commit comments