package com.suno.android.common_ui.components.buttons import android.os.Build.VERSION import android.os.Build.VERSION_CODES import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Icon import androidx.compose.material3.LocalContentColor import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.paint import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.suno.android.common_ui.components.aura.auraBackground import com.suno.android.common_ui.extensions.conditional 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 @Composable fun AuraButton( onClick: () -> Unit, modifier: Modifier = Modifier, text: String? = stringResource(CommonResR.string.create), textStyle: TextStyle = ExtendedTheme.typography.largeSubtitle, disabled: Boolean = false, loading: Boolean = false, ) { AuraButton( onClick = onClick, modifier = modifier, disabled = disabled, loading = loading, ) { Icon( imageVector = ImageVector.vectorResource( id = CommonUIR.drawable.create, ), contentDescription = null, ) Text( text = text ?: stringResource(CommonResR.string.create), style = textStyle, ) } } @Composable fun AuraButton( onClick: () -> Unit, modifier: Modifier = Modifier, disabled: Boolean = false, loading: Boolean = false, content: @Composable RowScope.() -> Unit, ) { val contentColor by animateColorAsState( targetValue = if (disabled) Color.White.copy(alpha = .5f) else Color.White, ) CompositionLocalProvider( LocalContentColor provides contentColor, ) { Box( contentAlignment = Alignment.Center, modifier = modifier .clip(CircleShape) .defaultMinSize(minHeight = 64.dp) .conditional( condition = VERSION.SDK_INT >= VERSION_CODES.TIRAMISU, ifTrue = { auraBackground( enabled = !disabled, ) }, ifFalse = { paint( painter = painterResource(CommonUIR.drawable.full_width_button_bg), contentScale = ContentScale.Crop, ) }, ) .clickable(enabled = !disabled) { onClick.invoke() } .padding(horizontal = 16.dp, vertical = 12.dp), ) { val loadingAlpha by animateFloatAsState( targetValue = if (loading) { 1f } else { 0f }, ) CircularProgressIndicator( modifier = Modifier.alpha(loadingAlpha).padding(horizontal = 8.dp).size(24.dp), color = LocalContentColor.current, ) Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.alpha(1 - loadingAlpha), ) { content() } } } } @Preview @Composable private fun FullWidthCreateGlitterButton_Preview() { SunoTheme { AuraButton( onClick = {}, ) } }