package com.sample.content.kotlin.ui.components import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Refresh import androidx.compose.material.icons.filled.Warning import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import kotlinx.coroutines.delay @Composable fun SplashScreen( isConnected: Boolean, onRetry: () -> Unit, modifier: Modifier = Modifier ) { var isChecking by remember { mutableStateOf(true) } var autoRetryCount by remember { mutableStateOf(0) } // Auto-retry every 3 seconds LaunchedEffect(isConnected) { if (!isConnected && !isChecking) { while (true) { delay(3000) autoRetryCount++ onRetry() } } } // Show checking state initially for 1 second LaunchedEffect(Unit) { delay(1000) isChecking = false } Box( modifier = modifier .fillMaxSize() .systemBarsPadding() .background(MaterialTheme.colorScheme.surface), contentAlignment = Alignment.Center ) { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, modifier = Modifier.padding(32.dp) ) { AnimatedVisibility( visible = isChecking, enter = fadeIn(), exit = fadeOut() ) { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { CircularProgressIndicator( modifier = Modifier.size(64.dp), color = MaterialTheme.colorScheme.primary ) Spacer(modifier = Modifier.height(24.dp)) Text( text = "Loading...", style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onSurface ) } } AnimatedVisibility( visible = !isChecking && !isConnected, enter = fadeIn(), exit = fadeOut() ) { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Icon( imageVector = Icons.Default.Warning, contentDescription = "No Internet", modifier = Modifier.size(80.dp), tint = MaterialTheme.colorScheme.error ) Spacer(modifier = Modifier.height(24.dp)) Text( text = "No Internet Connection", style = MaterialTheme.typography.headlineSmall, color = MaterialTheme.colorScheme.onSurface, textAlign = TextAlign.Center ) Spacer(modifier = Modifier.height(12.dp)) Text( text = "Please check your connection and try again", style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.Center ) Spacer(modifier = Modifier.height(32.dp)) Button( onClick = { autoRetryCount = 0 onRetry() }, modifier = Modifier .fillMaxWidth(0.6f) .height(48.dp) ) { Icon( imageVector = Icons.Default.Refresh, contentDescription = "Retry", modifier = Modifier.size(20.dp) ) Spacer(modifier = Modifier.width(8.dp)) Text("Retry") } if (autoRetryCount > 0) { Spacer(modifier = Modifier.height(16.dp)) Text( text = "Auto-retrying... (attempt $autoRetryCount)", style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) } } } } } }