diff --git a/app/src/main/java/agzam/vyatsu/ui/schedule/ScheduleScreen.kt b/app/src/main/java/agzam/vyatsu/ui/schedule/ScheduleScreen.kt index 8382a72..7d9145b 100644 --- a/app/src/main/java/agzam/vyatsu/ui/schedule/ScheduleScreen.kt +++ b/app/src/main/java/agzam/vyatsu/ui/schedule/ScheduleScreen.kt @@ -323,34 +323,38 @@ private fun DayChips( LaunchedEffect(pagerState, days) { snapshotFlow { - pagerState.settledPage + pagerState.currentPage }.collectLatest { targetPage -> if (targetPage in days.indices) { val layoutInfo = listState.layoutInfo - var visibleItems = layoutInfo.visibleItemsInfo - var targetItem = visibleItems.firstOrNull { it.index == targetPage } - if (targetItem == null) { - listState.scrollToItem(index = targetPage) - val updatedLayout = listState.layoutInfo - visibleItems = updatedLayout.visibleItemsInfo - targetItem = visibleItems.firstOrNull { it.index == targetPage } - } + val visibleItems = layoutInfo.visibleItemsInfo + val targetItem = visibleItems.firstOrNull { it.index == targetPage } + if (targetItem != null) { val visiblePercentage = getVisiblePercentage(targetItem, layoutInfo) - val minVisibleThreshold = 0.75f + val minVisibleThreshold = 0.9f + if (visiblePercentage < minVisibleThreshold) { val viewPortWidth = layoutInfo.viewportEndOffset - layoutInfo.viewportStartOffset val halfViewport = viewPortWidth / 2f val centerOffset = (halfViewport - (targetItem.size / 2f) - paddingPx).toInt() + listState.animateScrollToItem(index = targetPage, scrollOffset = -centerOffset) } + } else { + val viewPortWidth = layoutInfo.viewportEndOffset - layoutInfo.viewportStartOffset + val halfViewport = viewPortWidth / 2f + + val averageSize = visibleItems.map { it.size }.average().toInt().coerceAtLeast(150) + val centerOffset = (halfViewport - (averageSize / 2f) - paddingPx).toInt() + + listState.animateScrollToItem(index = targetPage, scrollOffset = -centerOffset) } } } } - LazyRow(state = listState, horizontalArrangement = Arrangement.spacedBy(6.dp), contentPadding = PaddingValues(horizontal = hPadding, vertical = 2.dp),) { items(days, key = { it.date.toEpochDay() }) { day -> val selected = selectedDate == day.date