yuriy.stetsyk
04/25/2023, 7:02 PMFlow<T>.collectAsSnackBarStateWithLifecycle(...): State<AppSnackBarData?>AppSnackBarDatanullnullyuriy.stetsyk
04/25/2023, 7:06 PMFlow<T>.collectAsStateWithLifecycle(...): State<T>@Composable
fun <T> Flow<T>.collectAsSnackBarStateWithLifecycle(
    snackbarDuration: SnackbarDuration = SnackbarDuration.Short,
    accessibilityManager: AccessibilityManager? = LocalAccessibilityManager.current,
    lifecycleOwner: LifecycleOwner = LocalLifecycleOwner.current,
    minActiveState: Lifecycle.State = Lifecycle.State.STARTED,
    context: CoroutineContext = EmptyCoroutineContext,
    mapToSnackbarData: (T) -> AppSnackbarData?,
): State<AppSnackbarData?> = collectAsSnackBarStateWithLifecycle(
    snackbarDuration = snackbarDuration,
    accessibilityManager = accessibilityManager,
    lifecycle = lifecycleOwner.lifecycle,
    minActiveState = minActiveState,
    context = context,
    mapToSnackbarData = mapToSnackbarData,
)
@Composable
fun <T> Flow<T>.collectAsSnackBarStateWithLifecycle(
    snackbarDuration: SnackbarDuration,
    accessibilityManager: AccessibilityManager?,
    lifecycle: Lifecycle,
    minActiveState: Lifecycle.State = Lifecycle.State.STARTED,
    context: CoroutineContext = EmptyCoroutineContext,
    mapToSnackbarData: (T) -> AppSnackbarData?,
): State<AppSnackbarData?> {
    return produceState<AppSnackbarData?>(
        null,
        this,
        snackbarDuration,
        accessibilityManager,
        lifecycle,
        minActiveState,
        context,
        mapToSnackbarData,
    ) {
        suspend fun transformAndEmit(t: T) {
            val data = mapToSnackbarData(t)
            this@produceState.value = data
            if (data != null && data.style !is AppSnackbarStyle.Progress) {
                delay(snackbarDuration.toMillis(accessibilityManager))
                this@produceState.value = null
            }
        }
        lifecycle.repeatOnLifecycle(minActiveState) {
            if (context == EmptyCoroutineContext) {
                this@collectAsSnackBarStateWithLifecycle.collectLatest { // Using collectLatest to cancel delay in transformAndEmit
                    transformAndEmit(it)
                }
            } else withContext(context) {
                this@collectAsSnackBarStateWithLifecycle.collectLatest {
                    transformAndEmit(it)
                }
            }
        }
    }
}val snackBarData by alerts.collectAsSnackBarStateWithLifecycle { alert -> alert.asSnackBarData() }mapToSnackbarDatacollectAsSnackBarStateWithLifecycleproduceStatecollectLatest