diff --git a/core/ui/src/main/kotlin/com/bff/wespot/util/SideEffectUtil.kt b/core/ui/src/main/kotlin/com/bff/wespot/util/SideEffectUtil.kt new file mode 100644 index 00000000..a16ae5d3 --- /dev/null +++ b/core/ui/src/main/kotlin/com/bff/wespot/util/SideEffectUtil.kt @@ -0,0 +1,30 @@ +package com.bff.wespot.util + +import android.annotation.SuppressLint +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberUpdatedState +import androidx.compose.ui.platform.LocalLifecycleOwner +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.repeatOnLifecycle +import com.bff.wespot.base.BaseViewModel +import com.bff.wespot.model.SideEffect + +@SuppressLint("ComposableNaming") +@Composable +fun BaseViewModel.collectBaseSideEffect( + lifecycleState: Lifecycle.State = androidx.lifecycle.Lifecycle.State.STARTED, + sideEffect: (suspend (sideEffect: SideEffect) -> Unit), +) { + val sideEffectFlow = this.sideEffect + val lifecycleOwner = LocalLifecycleOwner.current + + val callback by rememberUpdatedState(newValue = sideEffect) + + LaunchedEffect(sideEffectFlow, lifecycleOwner) { + lifecycleOwner.lifecycle.repeatOnLifecycle(lifecycleState) { + sideEffectFlow.collect { callback(it) } + } + } +}