package com.hsdiary.ui.components import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.hsdiary.ui.theme.* data class ProfileSwitchItem( val id: Long, val name: String, val avatarColor: Color, val isActive: Boolean ) @OptIn(ExperimentalMaterial3Api::class) @Composable fun ProfileSwitchSheet( profiles: List, onProfileSelected: (Long) -> Unit, onDismiss: () -> Unit ) { var confirmTarget by remember { mutableStateOf(null) } ModalBottomSheet( onDismissRequest = onDismiss, containerColor = SurfaceColor, dragHandle = { Box( modifier = Modifier .padding(top = 12.dp) .size(width = 36.dp, height = 4.dp) .background(BorderSoftColor, RoundedCornerShape(2.dp)) ) } ) { Column( modifier = Modifier .fillMaxWidth() .padding(horizontal = 18.dp) .padding(bottom = 28.dp) ) { Spacer(Modifier.height(4.dp)) // Title Text( text = "Switch diary", fontFamily = CormorantGaramond, fontStyle = FontStyle.Italic, fontSize = 20.sp, color = FgColor ) val lastOpened = "last opened just now" Text( text = "${profiles.size} profiles · $lastOpened".uppercase(), fontFamily = JetBrainsMono, fontSize = 10.sp, color = FgSubtleColor, letterSpacing = 1.2.sp, modifier = Modifier.padding(top = 2.dp, bottom = 14.dp) ) // Profile rows profiles.forEach { profile -> HorizontalDivider(color = BorderSoftColor, thickness = 0.5.dp) Row( modifier = Modifier .fillMaxWidth() .clickable { if (!profile.isActive) confirmTarget = profile else onDismiss() } .padding(vertical = 14.dp, horizontal = 4.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(14.dp) ) { AvatarDot( name = profile.name, avatarColor = profile.avatarColor, size = 36 ) Column(modifier = Modifier.weight(1f)) { Text( text = profile.name, fontFamily = CormorantGaramond, fontStyle = FontStyle.Italic, fontSize = 17.sp, color = FgColor ) Text( text = if (profile.isActive) "CURRENTLY OPEN" else "TAP TO SWITCH", fontFamily = JetBrainsMono, fontSize = 10.sp, color = FgFaintColor, letterSpacing = 1.sp, modifier = Modifier.padding(top = 2.dp) ) } if (profile.isActive) { Box( modifier = Modifier .background(Color.Transparent, RoundedCornerShape(999.dp)) .border(1.dp, AccentFaintColor, RoundedCornerShape(999.dp)) .padding(horizontal = 8.dp, vertical = 3.dp) ) { Text( "ACTIVE", fontFamily = JetBrainsMono, fontSize = 9.sp, color = AccentColor, letterSpacing = 1.2.sp ) } } } } Spacer(Modifier.height(14.dp)) // Add profile button — outline style Box( modifier = Modifier .fillMaxWidth() .border(1.dp, BorderColor, RoundedCornerShape(999.dp)) .padding(vertical = 12.dp), contentAlignment = Alignment.Center ) { Text( text = "+ Add a profile", fontFamily = InstrumentSans, fontSize = 13.sp, color = FgColor ) } } } // Confirm switch dialog confirmTarget?.let { target -> AlertDialog( onDismissRequest = { confirmTarget = null }, containerColor = SurfaceColor, title = { Text( "Switch diary", fontFamily = CormorantGaramond, fontStyle = FontStyle.Italic, fontSize = 20.sp, color = FgColor ) }, text = { Text( "Switch to ${target.name}?", fontFamily = InstrumentSans, fontSize = 14.sp, color = FgMutedColor ) }, confirmButton = { TextButton( onClick = { onProfileSelected(target.id) confirmTarget = null onDismiss() }, colors = ButtonDefaults.textButtonColors(contentColor = AccentColor) ) { Text("Switch", fontFamily = InstrumentSans) } }, dismissButton = { TextButton( onClick = { confirmTarget = null }, colors = ButtonDefaults.textButtonColors(contentColor = FgMutedColor) ) { Text("Cancel", fontFamily = InstrumentSans) } } ) } }