package com.suno.android.ui.screens.songdetails import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.painter.ColorPainter import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import coil3.compose.AsyncImage import com.suno.android.common_core_utils.Id import com.suno.android.common_data.mappers.clips.SongListData import com.suno.android.common_ui.components.buttons.SunoMediumButton import com.suno.android.common_ui.components.images.ProfileAvatarImage import com.suno.android.common_ui.theme.ExtendedTheme import com.suno.android.common_res.R as CommonResR import com.suno.android.common_ui.R as CommonUiR @Composable fun SongDetailsMainScreen( viewModel: SongDetailsViewModel, isInPostingMode: Boolean, onSongArtClicked: () -> Unit, songId: Id, ) { val focusManager = LocalFocusManager.current val state by viewModel.state.collectAsStateWithLifecycle() var captionInputFocused by remember { mutableStateOf(false) } LaunchedEffect(songId) { viewModel.setSongId(songId) } Column(modifier = Modifier.fillMaxSize()) { Column( modifier = Modifier.weight(1f), horizontalAlignment = Alignment.CenterHorizontally, ) { AnimatedVisibility( visible = !captionInputFocused, ) { Box { AsyncImage( model = state.songImageUrl, contentDescription = "Song Cover", modifier = Modifier .height(136.dp) .width(92.dp) .clip(RoundedCornerShape(10.dp)) .clickable( enabled = state.editSongArtFlagEnabled, ) { onSongArtClicked.invoke() }, placeholder = ColorPainter(ExtendedTheme.colors.backgroundSecondary), error = ColorPainter(ExtendedTheme.colors.backgroundSecondary), contentScale = ContentScale.Crop, ) if (state.editSongArtFlagEnabled) { Text( modifier = Modifier .padding(bottom = 4.dp) .background( color = ExtendedTheme.colors.backgroundPrimary.copy(alpha = 0.7f), shape = RoundedCornerShape(10.dp), ) .align(Alignment.BottomCenter) .padding(horizontal = 4.dp), text = stringResource(CommonResR.string.edit_song_art), style = ExtendedTheme.typography.smallSubtitle.copy(fontSize = 10.sp), color = ExtendedTheme.colors.textPrimary, ) } Spacer(modifier = Modifier.height(28.dp)) } } SongDetailsMainInput( songTitle = state.songTitle, songCaptionInputValue = state.songCaptionInputValue, songCaptionLimit = state.songCaptionLimit, captionMentions = state.captionMentions, onTitleFocused = { viewModel.sendEvent( SongDetailsMviEvent.EditSongCaptionInputFocused(isInPostingMode), ) }, onTitleUnfocused = {}, onCaptionFocused = { captionInputFocused = true viewModel.sendEvent( SongDetailsMviEvent.EditSongCaptionInputFocused(isInPostingMode), ) }, onCaptionUnfocused = { captionInputFocused = false }, onTitleChanged = { viewModel.sendEvent( SongDetailsMviEvent.EditSongTitleInputChanged( isInPostingMode = isInPostingMode, text = it, ), ) }, onCaptionChanged = { viewModel.sendEvent( SongDetailsMviEvent.EditSongCaptionInputChanged( isInPostingMode = isInPostingMode, textFieldValue = it, ), ) }, ) AnimatedVisibility( visible = captionInputFocused, ) { LazyColumn( modifier = Modifier.fillMaxSize(), ) { items(state.captionMentionTargets) { mention -> Row( modifier = Modifier .fillMaxSize() .padding(vertical = 8.dp) .clickable { viewModel.addMentionToComment(mention) }, ) { ProfileAvatarImage( modifier = Modifier .padding(end = 8.dp) .size(44.dp), ) Column( modifier = Modifier.height(44.dp), verticalArrangement = Arrangement.Center, ) { if (!mention.displayName.isNullOrEmpty()) { Text( text = mention.displayName ?: "", style = ExtendedTheme.typography.body, color = ExtendedTheme.colors.textPrimary, ) } Text( text = "@" + mention.handle, style = ExtendedTheme.typography.body, color = ExtendedTheme.colors.textTertiary, ) } } } } } AnimatedVisibility( visible = !captionInputFocused, ) { Column { Spacer(modifier = Modifier.height(4.dp)) SongDetailsDivider() SongDetailsOptionRow( text = stringResource(CommonResR.string.edit_song_detais_action_lyrics), iconRes = CommonUiR.drawable.lyrics, onClick = { focusManager.clearFocus() viewModel.sendEvent( SongDetailsMviEvent.EditSongLyricsClick(isInPostingMode = isInPostingMode), ) }, ) SongDetailsDivider() if (isInPostingMode) { SongDetailsOptionRow( text = stringResource(CommonResR.string.song_details_action_more_options), iconRes = CommonUiR.drawable.gear, onClick = { focusManager.clearFocus() viewModel.sendEvent( SongDetailsMviEvent.MoreOptionsClick(isInPostingMode = isInPostingMode), ) }, ) SongDetailsDivider() } } } if (isInPostingMode) { SunoMediumButton( text = stringResource(CommonResR.string.post_song_details_button_submit), onClick = { viewModel.sendEvent(SongDetailsMviEvent.PostSongSubmitClicked) }, modifier = Modifier.fillMaxWidth(), ) Spacer(modifier = Modifier.height(16.dp)) } } } } @Composable private fun SongDetailsDivider() { HorizontalDivider(color = ExtendedTheme.colors.backgroundTertiary) }