package eu.mjdev.desktop.components.custom import androidx.compose.desktop.ui.tooling.preview.Preview import androidx.compose.foundation.background import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.layout.* import androidx.compose.material.Button import androidx.compose.material.ButtonDefaults import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import eu.mjdev.desktop.components.image.ImageAny import eu.mjdev.desktop.components.text.TextAny import eu.mjdev.desktop.extensions.Compose.noElevation import eu.mjdev.desktop.extensions.Compose.transparent import eu.mjdev.desktop.extensions.Modifier.circleBorder import eu.mjdev.desktop.extensions.Modifier.clipCircle import eu.mjdev.desktop.provider.DesktopProvider import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop @Suppress("FunctionName") @Preview @Composable fun UserAvatar( backgroundColor: Color, avatarSize: Dp = 128.dp, orientation: Orientation = Orientation.Vertical, api: DesktopProvider = LocalDesktop.current, iconTintColor: Color = Color.White, textColor: Color = Color.White, onUserAvatarClick: () -> Unit ) = Box( modifier = Modifier .fillMaxWidth() .background(backgroundColor) .padding(16.dp) ) { when (orientation) { Orientation.Vertical -> Column( modifier = Modifier .fillMaxWidth() .align(Alignment.Center), horizontalAlignment = Alignment.CenterHorizontally ) { Button( modifier = Modifier .size(avatarSize) .clipCircle(), contentPadding = PaddingValues(0.dp), onClick = onUserAvatarClick, colors = ButtonDefaults.transparent(), elevation = ButtonDefaults.noElevation() ) { ImageAny( modifier = Modifier .size(avatarSize) .circleBorder(2.dp, iconTintColor), src = api.currentUser.picture, colorFilter = if (api.currentUser.picture is ImageVector) ColorFilter.tint(iconTintColor) else null, contentDescription = "" ) } Column( modifier = Modifier.fillMaxWidth() .padding(top = 8.dp), horizontalAlignment = Alignment.CenterHorizontally ) { TextAny( text = api.currentUser.name ?: api.homeDir?.name ?: "-", color = textColor, textAlign = TextAlign.Center, fontWeight = FontWeight.Bold ) TextAny( text = api.machineName, color = textColor, textAlign = TextAlign.Center, fontWeight = FontWeight.Medium ) } } Orientation.Horizontal -> Row( modifier = Modifier .fillMaxWidth() .align(Alignment.TopCenter), horizontalArrangement = Arrangement.Start, ) { Button( modifier = Modifier .size(avatarSize) .clipCircle(), contentPadding = PaddingValues(0.dp), onClick = {}, colors = ButtonDefaults.transparent(), elevation = ButtonDefaults.noElevation() ) { ImageAny( modifier = Modifier .size(avatarSize) .circleBorder(2.dp, iconTintColor), src = api.currentUser.picture, colorFilter = if (api.currentUser.picture is ImageVector) ColorFilter.tint(iconTintColor) else null, contentDescription = "" ) } Column( modifier = Modifier.padding(start = 8.dp).fillMaxWidth().padding(top = 8.dp), ) { TextAny( text = api.currentUser.name ?: api.homeDir?.name ?: "-", color = textColor, textAlign = TextAlign.Start, fontWeight = FontWeight.Bold ) TextAny( text = api.machineName, color = textColor, textAlign = TextAlign.Start, fontWeight = FontWeight.Medium ) } } } }