package com.suno.android.common_ui.components.bottom_sheet.projects import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer 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.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.SheetState import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberModalBottomSheetState 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.Modifier import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.suno.android.common_ui.components.buttons.SunoMediumButton import com.suno.android.common_ui.components.omni.CircleIconButton 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 CreateProjectBottomSheet( onDismiss: () -> Unit, onConfirm: (projectName: String) -> Unit, sheetState: SheetState = rememberModalBottomSheetState(true), value: String = "", ) { ModalBottomSheet( onDismissRequest = onDismiss, sheetState = sheetState, dragHandle = null, containerColor = ExtendedTheme.colors.backgroundSecondary, ) { val focusRequester = remember { FocusRequester() } val statusBarHeightDp = with(LocalDensity.current) { WindowInsets.statusBars.getTop(LocalDensity.current).toDp() } // TODO: weird spacing here. fix CenterAlignedTopAppBar( title = { Text( text = stringResource(CommonResR.string.create_new_workspace), style = ExtendedTheme.typography.cardTitle, color = ExtendedTheme.colors.textPrimary, ) }, navigationIcon = { CircleIconButton( vectorDrawableResId = CommonUIR.drawable.arrow_left, contentDescription = null, onClick = { onDismiss.invoke() }, ) }, colors = TopAppBarDefaults.topAppBarColors( containerColor = ExtendedTheme.colors.backgroundSecondary, scrolledContainerColor = ExtendedTheme.colors.backgroundSecondary, ), ) Column( modifier = Modifier .background(ExtendedTheme.colors.backgroundSecondary) .fillMaxWidth() .padding(horizontal = 16.dp) .defaultMinSize(minHeight = 128.dp) .heightIn( max = (LocalConfiguration.current.screenHeightDp - statusBarHeightDp.value).dp, ), ) { var textState by remember { mutableStateOf( TextFieldValue( text = value, selection = TextRange(value.length), ), ) } val focusManager = LocalFocusManager.current TextField( textStyle = ExtendedTheme.typography.mediumHeadline.copy( textAlign = TextAlign.Center, ), colors = TextFieldDefaults.colors( focusedContainerColor = Color.Transparent, unfocusedContainerColor = Color.Transparent, focusedIndicatorColor = Color.Transparent, unfocusedIndicatorColor = Color.Transparent, ), modifier = Modifier .fillMaxWidth() .height(180.dp) .padding(vertical = 16.dp) .focusRequester(focusRequester), value = textState, placeholder = { Text( text = stringResource(CommonResR.string.untitled), modifier = Modifier.fillMaxWidth(), style = ExtendedTheme.typography.mediumHeadline.copy( textAlign = TextAlign.Center, ), color = Color.Gray, ) }, onValueChange = { textState = it }, keyboardOptions = KeyboardOptions( autoCorrectEnabled = true, imeAction = ImeAction.Done, ), keyboardActions = KeyboardActions( onDone = { focusManager.clearFocus() }, ), maxLines = 3, ) Spacer(modifier = Modifier.height(16.dp)) SunoMediumButton( text = stringResource(CommonResR.string.create_workspace), onClick = { onConfirm(textState.text) }, modifier = Modifier.fillMaxWidth(), enabled = textState.text.isNotBlank(), ) Spacer(modifier = Modifier.height(16.dp)) LaunchedEffect(Unit) { focusRequester.requestFocus() } } } }