fun PagerProgressIndicator()

in android/source/src/main/kotlin/com/gu/source/components/pager/PagerProgressIndicator.kt [65:118]


fun PagerProgressIndicator(
    pagerState: PagerState,
    selectedIndicatorColour: Color,
    unSelectedIndicatorColour: Color,
    modifier: Modifier = Modifier,
    maxIndicatorCount: Int = DefaultIndicatorCount,
    indicatorSpacing: Dp = DefaultItemSpacing,
    indicatorShape: Shape = CircleShape,
    selectedItemSize: Dp = DefaultSelectedItemSize,
    unselectedItemScaleFactor: Float = DefaultUnselectedItemScaling,
    numberOfItemsToScale: Int = DefaultNumberOfItemsToScale,
    itemsVerticalAlignment: Alignment.Vertical = Alignment.CenterVertically,
) {
    val listState = rememberLazyListState()

    val adjustedMaxItems = maxIndicatorCount
        .coerceAtMost(pagerState.pageCount)
        .toOddUnder()

    val rowWidth = selectedItemSize * adjustedMaxItems +
        indicatorSpacing * (adjustedMaxItems - 1)

    val itemWidthInPx = with(LocalDensity.current) { selectedItemSize.toPx() }
    val rowWidthInPx = with(LocalDensity.current) { rowWidth.toPx() }
    LaunchedEffect(pagerState.currentPage) {
        listState.animateScrollToItem(
            index = pagerState.currentPage,
            scrollOffset = (itemWidthInPx / 2 - rowWidthInPx / 2).toInt(),
        )
    }

    val numberOfScaledItems = numberOfItemsToScale.coerceAtMost(adjustedMaxItems).toOddUnder()

    LazyRow(
        state = listState,
        modifier = modifier.width(rowWidth),
        horizontalArrangement = Arrangement.spacedBy(indicatorSpacing),
        verticalAlignment = itemsVerticalAlignment,
        userScrollEnabled = false,
    ) {
        items(pagerState.pageCount) { pageIndex ->
            PagerProgressItem(
                itemIndex = pageIndex,
                selectedItemIndex = pagerState.currentPage,
                selectedItemSize = selectedItemSize,
                selectedColour = selectedIndicatorColour,
                unSelectedColour = unSelectedIndicatorColour,
                unselectedItemScaleFactor = unselectedItemScaleFactor,
                itemShape = indicatorShape,
                numberOfItemsToScale = numberOfScaledItems,
            )
        }
    }
}