package com.suno.android.common_ui.components.animation import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition import androidx.compose.animation.core.updateTransition import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember // thanks claude @Composable fun ExitAwareAnimatedVisibility( visible: Boolean, onFullyExited: () -> Unit, enter: EnterTransition = fadeIn(), exit: ExitTransition = fadeOut(), content: @Composable () -> Unit, ) { val transition = updateTransition(targetState = visible, label = "visibilityTransition") AnimatedVisibility( visible = transition.targetState, enter = enter, exit = exit, label = "contentVisibility", ) { content() } // Run once when we go from visible -> not visible and the exit finishes val hasPendingExit = remember { mutableStateOf(false) } // Track when we start exiting LaunchedEffect(transition.currentState, transition.targetState) { if (transition.currentState && !transition.targetState) { hasPendingExit.value = true } } // Observe transition state to detect when exit fully completes LaunchedEffect(transition.isRunning) { if (!transition.isRunning && hasPendingExit.value && !transition.targetState) { hasPendingExit.value = false onFullyExited() } } }