package com.suno.android.common_ui.components.omni import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.unit.dp import com.suno.android.common_ui.components.player.PlayerActionButton import com.suno.android.common_ui.extensions.xAsFormattedCount 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 OmniPlayerButtons( modifier: Modifier = Modifier, upvoteCount: Int?, commentCount: Int?, liked: Boolean?, isCasting: Boolean = false, showCastButton: Boolean = true, onLikeClicked: () -> Unit, onCommentsClicked: () -> Unit, onShareClicked: () -> Unit, onCastClicked: () -> Unit, onOverflowMenuClicked: () -> Unit, onRemixClicked: (() -> Unit)? = null, isPreviewClip: Boolean? = null, ) { Column( modifier = modifier, horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(8.dp), ) { val context = LocalContext.current if (showCastButton) { PlayerActionButton( icon = painterResource(CommonUIR.drawable.cast), contentDescription = stringResource(CommonResR.string.cast), text = stringResource(CommonResR.string.cast), isSelected = isCasting, onClick = onCastClicked, ) } if (onRemixClicked != null && isPreviewClip != false) { PlayerActionButton( icon = painterResource(CommonUIR.drawable.remix), contentDescription = stringResource(CommonResR.string.remix), text = stringResource(CommonResR.string.remix), onClick = onRemixClicked, ) } val formattedUpvoteCount = remember(upvoteCount) { if (upvoteCount == null || upvoteCount == 0) { context.getString(CommonResR.string.like) } else { upvoteCount.xAsFormattedCount() } } PlayerActionButton( icon = painterResource(CommonUIR.drawable.thumbs), contentDescription = stringResource(CommonResR.string.like), text = formattedUpvoteCount, isSelected = liked == true, onClick = onLikeClicked, ) if (isPreviewClip != true) { val formattedCommentCount = remember(commentCount) { if (commentCount == null || commentCount == 0) { context.getString(CommonResR.string.comment) } else { commentCount.xAsFormattedCount() } } PlayerActionButton( icon = painterResource(CommonUIR.drawable.comments_v2), contentDescription = stringResource(CommonResR.string.comments), text = formattedCommentCount, onClick = onCommentsClicked, ) } PlayerActionButton( icon = painterResource(CommonUIR.drawable.share_arrow), contentDescription = stringResource(CommonResR.string.share), text = stringResource(CommonResR.string.share), onClick = onShareClicked, ) PlayerActionButton( icon = painterResource(CommonUIR.drawable.ellipsis_horizontal_v2), contentDescription = stringResource(CommonResR.string.more_settings), onClick = onOverflowMenuClicked, ) } } @PreviewLightDark @Composable private fun OmniPlayerButtons_Preview() { SunoTheme { OmniPlayerButtons( upvoteCount = null, commentCount = null, liked = false, onLikeClicked = {}, onCommentsClicked = {}, onShareClicked = {}, onOverflowMenuClicked = {}, onCastClicked = {}, ) } } @PreviewLightDark @Composable private fun OmniPlayerButtons_Enabled_Preview() { SunoTheme { OmniPlayerButtons( upvoteCount = null, commentCount = null, liked = true, onLikeClicked = {}, onCommentsClicked = {}, onShareClicked = {}, onOverflowMenuClicked = {}, onCastClicked = {}, ) } } @PreviewLightDark @Composable private fun OmniPlayerButtons_ClipPreview_Preview() { SunoTheme { OmniPlayerButtons( upvoteCount = null, commentCount = null, liked = true, onLikeClicked = {}, onCommentsClicked = {}, onShareClicked = {}, onOverflowMenuClicked = {}, onCastClicked = {}, isPreviewClip = true, ) } }