package com.suno.android.common_ui.components.bottom_sheet import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.statusBars import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.SheetState import androidx.compose.material3.SheetValue import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.suno.android.common_ui.components.list_items.BottomSheetSongActionItem import com.suno.android.common_ui.components.omni.CircleIconButton import com.suno.android.common_ui.components.preview.SunoPreview import com.suno.android.common_ui.theme.ExtendedTheme import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import com.suno.android.common_res.R as commonResR import com.suno.android.common_ui.R as uiR @Composable fun AvatarImageBottomSheet( sheetState: SheetState, headerName: String, onDismissRequest: () -> Unit, scope: CoroutineScope = rememberCoroutineScope(), onChooseFromGallery: () -> Unit = {}, onTakePhoto: () -> Unit = {}, ) { ModalBottomSheet( onDismissRequest = onDismissRequest, sheetState = sheetState, dragHandle = null, ) { val statusBarHeightDp = with(LocalDensity.current) { WindowInsets.statusBars.getTop(LocalDensity.current).toDp() } Column( modifier = Modifier .background(ExtendedTheme.colors.backgroundPrimary) .fillMaxWidth() .defaultMinSize(minHeight = 128.dp) .heightIn(max = (LocalConfiguration.current.screenHeightDp - statusBarHeightDp.value).dp), ) { AvatarHeader( headerName = headerName, onDismiss = { scope.launch { sheetState.hide() } }, ) BottomSheetSongActionItem( vectorDrawableRes = uiR.drawable.images, displayText = stringResource(commonResR.string.choose_from_gallery), onClick = onChooseFromGallery, ) BottomSheetSongActionItem( vectorDrawableRes = uiR.drawable.camera, displayText = stringResource(commonResR.string.take_a_photo), onClick = onTakePhoto, ) } } } @Composable private fun AvatarHeader( headerName: String, onDismiss: () -> Unit, ) { Box( modifier = Modifier .fillMaxWidth() .height(64.dp), ) { Text( modifier = Modifier.align(Alignment.Center), text = headerName, style = ExtendedTheme.typography.introCopy, ) CircleIconButton( modifier = Modifier .align(Alignment.CenterEnd) .padding(16.dp), vectorDrawableResId = uiR.drawable.close, contentDescription = stringResource(commonResR.string.close), onClick = onDismiss, ) } } @Preview @Composable private fun AvatarImageBottomSheet_Preview() { SunoPreview { val density = LocalDensity.current val sheetState = remember { SheetState( skipPartiallyExpanded = true, density = density, initialValue = SheetValue.Expanded, ) } AvatarImageBottomSheet( sheetState = sheetState, headerName = "Edit Profile Picture", onDismissRequest = {}, onChooseFromGallery = { }, onTakePhoto = { }, ) } }