@@ -309,7 +309,7 @@ fun ChannelScreen(
309309 gridState = liveGridState,
310310 items = uiState.liveTab.itemList,
311311 isLoading = uiState.common.isLoading,
312- hasMore = uiState.liveTab.nextPageUrl != null ,
312+ nextPageUrl = uiState.liveTab.nextPageUrl,
313313 onLoadMore = { viewModel.loadLiveTabMoreItems(serviceId) },
314314 getUrl = { it.url },
315315 onItemClick = { item ->
@@ -328,7 +328,7 @@ fun ChannelScreen(
328328 gridState = shortsGridState,
329329 items = uiState.shortsTab.itemList,
330330 isLoading = uiState.common.isLoading,
331- hasMore = uiState.shortsTab.nextPageUrl != null ,
331+ nextPageUrl = uiState.shortsTab.nextPageUrl,
332332 onLoadMore = { viewModel.loadShortsTabMoreItems(serviceId) },
333333 getUrl = { it.url },
334334 onItemClick = { item ->
@@ -347,7 +347,7 @@ fun ChannelScreen(
347347 gridState = videoGridState,
348348 items = uiState.videoTab.itemList,
349349 isLoading = uiState.common.isLoading,
350- hasMore = uiState.videoTab.nextPageUrl != null ,
350+ nextPageUrl = uiState.videoTab.nextPageUrl,
351351 onLoadMore = { viewModel.loadMainTabMoreItems(serviceId) },
352352 getUrl = { it.url },
353353 onItemClick = { item ->
@@ -366,7 +366,7 @@ fun ChannelScreen(
366366 gridState = remember { LazyGridState () },
367367 items = uiState.playlistTab.itemList,
368368 isLoading = uiState.common.isLoading,
369- hasMore = uiState.playlistTab.nextPageUrl != null ,
369+ nextPageUrl = uiState.playlistTab.nextPageUrl,
370370 onLoadMore = { viewModel.loadPlaylistTabMoreItems(serviceId) },
371371 getUrl = { it.url },
372372 onItemClick = { item -> navController.navigate(
@@ -383,7 +383,7 @@ fun ChannelScreen(
383383 gridState = remember { LazyGridState () },
384384 items = uiState.albumTab.itemList,
385385 isLoading = uiState.common.isLoading,
386- hasMore = uiState.albumTab.nextPageUrl != null ,
386+ nextPageUrl = uiState.albumTab.nextPageUrl,
387387 onLoadMore = { viewModel.loadAlbumTabMoreItems(serviceId) },
388388 getUrl = { it.url },
389389 onItemClick = { item -> navController.navigate(
@@ -541,7 +541,7 @@ private fun <T: Info> TabContent(
541541 gridState : LazyGridState ,
542542 items : List <T >,
543543 isLoading : Boolean ,
544- hasMore : Boolean ,
544+ nextPageUrl : String? ,
545545 onLoadMore : () -> Unit ,
546546 getUrl : (T ) -> String ,
547547 onItemClick : (T ) -> Unit ,
@@ -552,32 +552,32 @@ private fun <T: Info> TabContent(
552552 val uniqueItems = remember(items) { items.distinctBy { getUrl(it) } }
553553 val loadMoreInvoker = rememberUpdatedState(onLoadMore)
554554
555- LaunchedEffect (listState, gridState, hasMore, isLoading, uniqueItems) {
555+ LaunchedEffect (listState, gridState, nextPageUrl, uniqueItems) {
556556 if (isGridEnabled) {
557557 snapshotFlow {
558- val layoutInfo = gridState.layoutInfo
559- val lastVisibleIndex = layoutInfo.visibleItemsInfo.lastOrNull()?.index ? : - 1
560- val totalItemsCount = layoutInfo.totalItemsCount
561- lastVisibleIndex to totalItemsCount
558+ val actualItems = gridState.layoutInfo.visibleItemsInfo.filter { it.key is String? }.map { it.key }
559+ val lastVisible = actualItems.lastOrNull()
560+ lastVisible to uniqueItems.lastOrNull()
562561 }
563562 .distinctUntilChanged()
564- .collect { (lastVisibleIndex, totalItemsCount) ->
565- val isAtBottom = totalItemsCount > 0 && lastVisibleIndex == totalItemsCount - 1
566- if (isAtBottom && hasMore && ! isLoading) {
563+ .collect { (lastVisible, lastItem) ->
564+ val lastItemUrl = lastItem?.let { getUrl(it) }
565+ val isAtBottom = lastVisible == lastItemUrl
566+ if (isAtBottom && nextPageUrl != null && ! isLoading) {
567567 loadMoreInvoker.value.invoke()
568568 }
569569 }
570570 } else {
571571 snapshotFlow {
572- val layoutInfo = listState.layoutInfo
573- val lastVisibleIndex = layoutInfo.visibleItemsInfo.lastOrNull()?.index ? : - 1
574- val totalItemsCount = layoutInfo.totalItemsCount
575- lastVisibleIndex to totalItemsCount
572+ val actualItems = listState.layoutInfo.visibleItemsInfo.filter { it.key is String? }.map { it.key }
573+ val lastVisible = actualItems.lastOrNull()
574+ lastVisible to uniqueItems.lastOrNull()
576575 }
577576 .distinctUntilChanged()
578- .collect { (lastVisibleIndex, totalItemsCount) ->
579- val isAtBottom = totalItemsCount > 0 && lastVisibleIndex == totalItemsCount - 1
580- if (isAtBottom && hasMore && ! isLoading) {
577+ .collect { (lastVisible, lastItem) ->
578+ val lastItemUrl = lastItem?.let { getUrl(it) }
579+ val isAtBottom = lastVisible == lastItemUrl
580+ if (isAtBottom && nextPageUrl != null && ! isLoading) {
581581 loadMoreInvoker.value.invoke()
582582 }
583583 }
0 commit comments