package com.craigvg.lichun_android.ui.components import androidx.compose.animation.* import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import com.craigvg.lichun_android.managers.ToastData import com.craigvg.lichun_android.managers.ToastType import com.craigvg.lichun_android.ui.theme.AppSpacing import com.craigvg.lichun_android.ui.theme.AppTypography import com.craigvg.lichun_android.viewmodel.GameStateViewModel import kotlinx.coroutines.delay import androidx.lifecycle.compose.collectAsStateWithLifecycle @Composable fun ToastHost(gameStateViewModel: GameStateViewModel) { val toast by gameStateViewModel.currentToast.collectAsStateWithLifecycle() AnimatedVisibility( visible = toast != null, enter = slideInVertically(initialOffsetY = { -it }) + fadeIn(), exit = slideOutVertically(targetOffsetY = { -it }) + fadeOut() ) { toast?.let { data -> LaunchedEffect(data.id) { delay(data.duration) gameStateViewModel.dismissToast() } val backgroundColor = when (data.type) { ToastType.SUCCESS -> Color(0xFF4CAF50) ToastType.ERROR -> Color(0xFFE53935) ToastType.WARNING -> Color(0xFFFFA726) ToastType.INFO -> Color(0xFF42A5F5) } Box( modifier = Modifier .fillMaxWidth() .padding(horizontal = AppSpacing.md, vertical = AppSpacing.xs) .background(backgroundColor, RoundedCornerShape(AppSpacing.cornerRadius)) .padding(horizontal = AppSpacing.md, vertical = AppSpacing.sm), contentAlignment = Alignment.Center ) { Text( text = data.message, style = AppTypography.body, color = Color.White ) } } } }