package com.suno.android.common_ui.components.banner import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Icon 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.draw.rotate import androidx.compose.ui.draw.shadow import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.ColorPainter import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage import com.suno.android.common_core_utils.model.Url import com.suno.android.common_ui.components.loading.SunoSpinner import com.suno.android.common_ui.theme.ExtendedTheme import com.suno.android.common_ui.theme.SunoTheme import com.suno.android.common_res.R as CommonResR import com.suno.android.common_ui.R as CommonUIR private const val PREVIEW_ROTATION = 8f @Composable fun HookDownloadBanner( onClick: () -> Unit, onDismiss: (exitDirection: ExitDirection) -> Unit, modifier: Modifier = Modifier, isDownloadComplete: Boolean = false, hookPreviewUrl: Url? = null, ) { AuraBanner( modifier = modifier, onClick = onClick, onDismiss = onDismiss, ) { if (isDownloadComplete) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(4.dp), modifier = Modifier.align(Alignment.CenterStart), ) { hookPreviewUrl?.let { HookDownloadPreviewImage(hookUrl = hookPreviewUrl) } Text( text = stringResource(CommonResR.string.hook_download_complete), style = ExtendedTheme.typography.smallBody, color = Color.White, ) } Box( modifier = Modifier .size(32.dp) .align(Alignment.CenterEnd), ) { Icon( modifier = Modifier .size(24.dp) .align(Alignment.Center), imageVector = ImageVector.vectorResource(CommonUIR.drawable.check_v2), tint = Color.White, contentDescription = null, ) } } else { Row( modifier = Modifier.align(Alignment.CenterStart), ) { Spacer(modifier = Modifier.width(18.dp)) Text( text = stringResource(CommonResR.string.downloading_hook), style = ExtendedTheme.typography.smallBody, color = Color.White, ) } SunoSpinner( modifier = Modifier .size(32.dp) .align(Alignment.CenterEnd), ) } } } @Composable private fun HookDownloadPreviewImage( hookUrl: Url, ) { Box( modifier = Modifier .height(48.dp) .width(60.dp) .padding(horizontal = 12.dp), contentAlignment = Alignment.CenterStart, ) { // Back hook image (rotated right) Box(modifier = Modifier.offset(x = 5.dp, y = 3.dp)) { Box( modifier = Modifier .height(37.dp) .width(28.dp) .rotate(PREVIEW_ROTATION) .shadow(elevation = 12.dp) .clip(shape = RoundedCornerShape(6.dp)), ) { AsyncImage( modifier = Modifier.fillMaxHeight(), model = hookUrl, placeholder = ColorPainter(Color.LightGray), contentDescription = null, contentScale = ContentScale.Crop, ) } } // Front download icon (rotated left) Box(modifier = Modifier.offset(x = (-3).dp, y = (-12).dp)) { Box( modifier = Modifier .size(24.dp) .rotate(-PREVIEW_ROTATION) .shadow(elevation = 12.dp) .clip(CircleShape) .background(color = Color.Black), ) { Icon( modifier = Modifier .size(20.dp) .align(Alignment.Center), imageVector = ImageVector.vectorResource(CommonUIR.drawable.download), tint = Color.White, contentDescription = null, ) } } } } @Preview @Composable private fun HookDownloadBanner_Downloading_Preview() { SunoTheme { HookDownloadBanner( isDownloadComplete = false, onClick = {}, onDismiss = {}, ) } } @Preview @Composable private fun HookDownloadBanner_Complete_Preview() { SunoTheme { HookDownloadBanner( isDownloadComplete = true, hookPreviewUrl = Url("https://picsum.photos/200/300"), onClick = {}, onDismiss = {}, ) } }