package com.suno.android.ui.screens.splash import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.AlertDialog import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.suno.android.common_ui.components.SplashImage import com.suno.android.common_ui.components.UpdateScreen import com.suno.android.common_ui.theme.ExtendedTheme import com.suno.android.common_ui.theme.SunoTheme import com.suno.android.framework.release.api.models.AppUpdate import com.suno.android.common_res.R as CommonResR @Composable fun SplashScreen( vm: SplashScreenVM?, onAppConfigurationLoaded: (Boolean) -> Unit, ) { val viewState = vm?.state?.collectAsStateWithLifecycle()?.value val context = LocalContext.current LaunchedEffect(Unit) { vm?.effects?.collect { effect -> when (effect) { is SplashScreenEffect.ConfigurationFetchRouteResult -> { onAppConfigurationLoaded.invoke(effect.configurationFetchSuccess) } SplashScreenEffect.ConfigurationFetchException -> { onAppConfigurationLoaded.invoke(false) // todo: handle this in error, like network error etc } } } } Box( modifier = Modifier.fillMaxSize(), ) { when (val appUpdate = viewState?.appUpdate) { is AppUpdate.UpdateRequired -> { UpdateScreen( onConfirm = { appUpdate.download.invoke(context) }, ) } is AppUpdate.UpdateAvailable -> { SplashImage(modifier = Modifier.fillMaxSize()) if (!viewState.updateDismissed) { AlertDialog( onDismissRequest = { vm.sendEvent(SplashScreenEvent.OnUpdateDialogDismissed) }, title = { Text( text = stringResource(CommonResR.string.new_version_available), style = ExtendedTheme.typography.playlistCards, color = Color.Black, ) }, text = { Text( text = stringResource( CommonResR.string.update_now_to_unlock, ), style = ExtendedTheme.typography.body, color = Color.Black, ) }, dismissButton = { TextButton( onClick = { vm.sendEvent(SplashScreenEvent.OnUpdateDialogDismissed) }, ) { Text( text = stringResource(CommonResR.string.not_now), style = ExtendedTheme.typography.playlistCards, color = Color.Black, ) } }, confirmButton = { TextButton( onClick = { appUpdate.download.invoke(context) }, ) { Text( text = stringResource(CommonResR.string.update_version), style = ExtendedTheme.typography.playlistCards, color = Color.Black, ) } }, shape = RoundedCornerShape(8.dp), containerColor = Color.White, ) } } else -> { SplashImage(modifier = Modifier.fillMaxSize()) } } } } @Preview( showSystemUi = true, ) @Composable private fun SplashScreen_Preview() { SunoTheme { SplashScreen( vm = null, onAppConfigurationLoaded = {}, ) } }