11package com.amrdeveloper.linkhub.ui.home
22
3- import androidx.compose.foundation.clickable
4- import androidx.compose.foundation.layout.Arrangement
53import androidx.compose.foundation.layout.Column
6- import androidx.compose.foundation.layout.Row
74import androidx.compose.foundation.layout.fillMaxSize
85import androidx.compose.foundation.layout.fillMaxWidth
96import androidx.compose.foundation.layout.padding
10- import androidx.compose.foundation.layout.size
11- import androidx.compose.material3.Icon
7+ import androidx.compose.foundation.lazy.grid.GridCells
8+ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
9+ import androidx.compose.foundation.pager.HorizontalPager
10+ import androidx.compose.foundation.pager.rememberPagerState
1211import androidx.compose.material3.MaterialTheme
1312import androidx.compose.material3.Scaffold
1413import androidx.compose.material3.Text
@@ -19,34 +18,40 @@ import androidx.compose.runtime.remember
1918import androidx.compose.runtime.setValue
2019import androidx.compose.ui.Alignment
2120import androidx.compose.ui.Modifier
22- import androidx.compose.ui.graphics.Color
2321import androidx.compose.ui.platform.LocalContext
2422import androidx.compose.ui.res.colorResource
25- import androidx.compose.ui.res.painterResource
26- import androidx.compose.ui.text.font.FontWeight
2723import androidx.compose.ui.unit.dp
2824import androidx.core.os.bundleOf
2925import androidx.lifecycle.compose.collectAsStateWithLifecycle
3026import androidx.lifecycle.viewmodel.compose.viewModel
3127import androidx.navigation.NavController
28+ import androidx.paging.compose.collectAsLazyPagingItems
29+ import androidx.paging.compose.itemKey
3230import com.amrdeveloper.linkhub.R
3331import com.amrdeveloper.linkhub.data.Link
34- import com.amrdeveloper.linkhub.ui.components.FolderList
35- import com.amrdeveloper.linkhub.ui.components.FolderViewKind
32+ import com.amrdeveloper.linkhub.ui.components.FolderItem
3633import com.amrdeveloper.linkhub.ui.components.LinkActionsBottomSheet
3734import com.amrdeveloper.linkhub.ui.components.LinkList
3835import com.amrdeveloper.linkhub.ui.components.LinkhubToolbar
36+ import com.amrdeveloper.linkhub.ui.components.PagerIndicator
3937import com.amrdeveloper.linkhub.util.UiPreferences
4038import com.amrdeveloper.linkhub.util.openLinkIntent
4139
40+ private const val NUMBER_OF_FOLDERS_PER_PAGE = 6
41+
4242@Composable
4343fun HomeScreen (
4444 viewModel : HomeViewModel = viewModel(),
4545 uiPreferences : UiPreferences ,
4646 navController : NavController
4747) {
4848 val context = LocalContext .current
49- val folders = viewModel.mostUsedLimitedFoldersState.collectAsStateWithLifecycle()
49+
50+ val folders = viewModel.mostUsedLimitedFoldersState.collectAsLazyPagingItems()
51+ val totalPages =
52+ (folders.itemCount + NUMBER_OF_FOLDERS_PER_PAGE - 1 ) / NUMBER_OF_FOLDERS_PER_PAGE
53+ val foldersPagerState = rememberPagerState(pageCount = { totalPages })
54+
5055 val links = viewModel.sortedLinksState.collectAsStateWithLifecycle()
5156
5257 var lastClickedLink by remember { mutableStateOf<Link ?>(value = null ) }
@@ -58,9 +63,9 @@ fun HomeScreen(
5863 .fillMaxSize()
5964 .padding(padding)
6065 ) {
61- if (folders.value.data.isNotEmpty() ) {
66+ if (folders.itemCount != 0 ) {
6267 Text (
63- text = " Most used Folders" ,
68+ text = " Folders" ,
6469 modifier = Modifier
6570 .fillMaxWidth()
6671 .padding(8 .dp),
@@ -69,45 +74,50 @@ fun HomeScreen(
6974 color = colorResource(R .color.light_blue_600)
7075 )
7176
72- FolderList (
73- folders = folders.value.data ,
74- viewKind = FolderViewKind . Grid ,
75- onClick = { folder ->
76- viewModel.incrementFolderClickCount(folder)
77- val bundle = bundleOf( " folder " to folder)
78- navController.navigate( R .id.linkListFragment, bundle)
79- },
80- onLongClick = { folder ->
81- val bundle = bundleOf( " folder " to folder)
82- navController.navigate( R .id.folderFragment, bundle)
83- },
84- minimalModeEnabled = uiPreferences.isMinimalModeEnabled()
85- )
77+ HorizontalPager (
78+ state = foldersPagerState ,
79+ key = folders.itemKey { it.id } ,
80+ verticalAlignment = Alignment . Top ,
81+ beyondViewportPageCount = 1 ,
82+ modifier = Modifier .fillMaxWidth(),
83+ pageContent = { pageIndex ->
84+ LazyVerticalGrid (columns = GridCells . Fixed (count = 2 )) {
85+ for (elementIndexInUI in 0 until NUMBER_OF_FOLDERS_PER_PAGE ) {
86+ val itemIndex =
87+ (pageIndex * NUMBER_OF_FOLDERS_PER_PAGE ) + elementIndexInUI
88+ if (itemIndex >= folders.itemCount) {
89+ break
90+ }
8691
87- Row (
88- modifier = Modifier
89- .fillMaxWidth()
90- .padding(4 .dp)
91- .clickable {
92- navController.navigate(R .id.folderListFragment)
93- },
94- horizontalArrangement = Arrangement .End ,
95- verticalAlignment = Alignment .CenterVertically
96- ) {
97- Text (
98- text = " Show all" ,
99- style = MaterialTheme .typography.titleSmall,
100- fontWeight = FontWeight .Bold ,
101- color = colorResource(R .color.light_blue_600)
102- )
92+ folders[itemIndex]?.let { folder ->
93+ item {
94+ FolderItem (
95+ folder = folder,
96+ onClick = { folder ->
97+ viewModel.incrementFolderClickCount(folder)
98+ val bundle = bundleOf(" folder" to folder)
99+ navController.navigate(
100+ R .id.linkListFragment,
101+ bundle
102+ )
103+ },
104+ onLongClick = { folder ->
105+ val bundle = bundleOf(" folder" to folder)
106+ navController.navigate(R .id.folderFragment, bundle)
107+ },
108+ minimalModeEnabled = uiPreferences.isMinimalModeEnabled(),
109+ modifier = Modifier
110+ .fillMaxWidth()
111+ .padding(4 .dp)
112+ )
113+ }
114+ }
115+ }
116+ }
117+ }
118+ )
103119
104- Icon (
105- painter = painterResource(R .drawable.ic_arrow_forward),
106- contentDescription = " Show all" ,
107- tint = Color .Unspecified ,
108- modifier = Modifier .size(18 .dp)
109- )
110- }
120+ PagerIndicator (pagerState = foldersPagerState)
111121 }
112122
113123 if (links.value.data.isNotEmpty()) {
0 commit comments