package com.craigvg.lichun_android.ui.components.feedback import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.semantics.LiveRegionMode import androidx.compose.ui.semantics.liveRegion import androidx.compose.ui.semantics.semantics import com.craigvg.lichun_android.ui.theme.AppColors import com.craigvg.lichun_android.ui.theme.AppSpacing import com.craigvg.lichun_android.ui.theme.AppTypography enum class ToastType { Info, Success, Warning, Error } data class ToastData( val id: String, val message: String, val type: ToastType = ToastType.Info ) @Composable fun ToastOverlayView( toasts: List, onDismiss: (String) -> Unit, modifier: Modifier = Modifier ) { Column( modifier = modifier .fillMaxWidth() .padding(horizontal = AppSpacing.md, vertical = AppSpacing.sm) .semantics { liveRegion = LiveRegionMode.Polite }, verticalArrangement = Arrangement.spacedBy(AppSpacing.xs) ) { toasts.forEach { toast -> AnimatedVisibility( visible = true, enter = slideInVertically(initialOffsetY = { -it }) + fadeIn(), exit = slideOutVertically(targetOffsetY = { -it }) + fadeOut() ) { ToastItem(toast = toast, onDismiss = { onDismiss(toast.id) }) } } } } @Composable private fun ToastItem( toast: ToastData, onDismiss: () -> Unit ) { val (bg, icon) = when (toast.type) { ToastType.Info -> AppColors.info to "\u2139\uFE0F" ToastType.Success -> AppColors.success to "\u2705" ToastType.Warning -> AppColors.warning to "\u26A0\uFE0F" ToastType.Error -> AppColors.error to "\u274C" } Row( modifier = Modifier .fillMaxWidth() .clip(RoundedCornerShape(AppSpacing.smallCornerRadius)) .background(bg.copy(alpha = 0.9f)) .padding(horizontal = AppSpacing.sm, vertical = AppSpacing.xs), verticalAlignment = Alignment.CenterVertically ) { Text(text = icon, style = AppTypography.body) Spacer(Modifier.width(AppSpacing.xs)) Text( text = toast.message, style = AppTypography.body, color = AppColors.primaryText, modifier = Modifier.weight(1f) ) } }