fun animatedReloadStatusBrush()

in hot-reload-devtools/src/main/kotlin/org/jetbrains/compose/devtools/widgets/DtStatusColor.kt [90:136]


fun animatedReloadStatusBrush(
    okColor: Color = DtColors.statusColorOk,
    errorColor: Color = DtColors.statusColorError,
    idleColor: Color = Color.LightGray,
    resetErrorState: Boolean = false,
): Brush {
    val state = ReloadUIState.composeValue()
    var isIdle by remember { mutableStateOf(true) }

    LaunchedEffect(state) {
        if (state is ReloadUIState.Ok || state is ReloadUIState.Failed) {
            delay(1.seconds)
            isIdle = true
        } else {
            isIdle = false
        }
    }

    val movingColorA by animateColorAsState(
        when (state) {
            is ReloadUIState.Ok -> if (isIdle) idleColor else okColor
            is ReloadUIState.Failed -> if (isIdle && resetErrorState) idleColor else errorColor
            is ReloadUIState.Reloading -> DtColors.statusColorOrange1
        }
    )

    val movingColorB by animateColorAsState(
        when (state) {
            is ReloadUIState.Ok -> if (isIdle) idleColor else okColor
            is ReloadUIState.Failed -> if (isIdle && resetErrorState) idleColor else errorColor
            is ReloadUIState.Reloading -> DtColors.statusColorOrange2
        }
    )

    val movingTransition = rememberInfiniteTransition()
    val movingGradientShift by movingTransition.animateFloat(
        initialValue = 0f,
        targetValue = 800f,
        animationSpec = infiniteRepeatable(tween(1000, easing = LinearEasing))
    )
    return Brush.linearGradient(
        colors = listOf(movingColorA, movingColorB),
        start = Offset(0f, movingGradientShift),
        end = Offset(0f, movingGradientShift + 400),
        tileMode = TileMode.Mirror,
    )
}