UserAvatar.kt 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package eu.mjdev.desktop.components.custom
  2. import androidx.compose.desktop.ui.tooling.preview.Preview
  3. import androidx.compose.foundation.background
  4. import androidx.compose.foundation.gestures.Orientation
  5. import androidx.compose.foundation.layout.*
  6. import androidx.compose.material.Button
  7. import androidx.compose.material.ButtonDefaults
  8. import androidx.compose.runtime.Composable
  9. import androidx.compose.ui.Alignment
  10. import androidx.compose.ui.Modifier
  11. import androidx.compose.ui.graphics.Color
  12. import androidx.compose.ui.graphics.ColorFilter
  13. import androidx.compose.ui.graphics.vector.ImageVector
  14. import androidx.compose.ui.text.font.FontWeight
  15. import androidx.compose.ui.text.style.TextAlign
  16. import androidx.compose.ui.unit.Dp
  17. import androidx.compose.ui.unit.dp
  18. import eu.mjdev.desktop.components.image.ImageAny
  19. import eu.mjdev.desktop.components.text.TextAny
  20. import eu.mjdev.desktop.extensions.Compose.noElevation
  21. import eu.mjdev.desktop.extensions.Compose.transparent
  22. import eu.mjdev.desktop.extensions.Modifier.circleBorder
  23. import eu.mjdev.desktop.extensions.Modifier.clipCircle
  24. import eu.mjdev.desktop.provider.DesktopProvider
  25. import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop
  26. @Suppress("FunctionName")
  27. @Preview
  28. @Composable
  29. fun UserAvatar(
  30. backgroundColor: Color,
  31. avatarSize: Dp = 128.dp,
  32. orientation: Orientation = Orientation.Vertical,
  33. api: DesktopProvider = LocalDesktop.current,
  34. iconTintColor: Color = Color.White,
  35. textColor: Color = Color.White,
  36. onUserAvatarClick: () -> Unit
  37. ) = Box(
  38. modifier = Modifier
  39. .fillMaxWidth()
  40. .background(backgroundColor)
  41. .padding(16.dp)
  42. ) {
  43. when (orientation) {
  44. Orientation.Vertical -> Column(
  45. modifier = Modifier
  46. .fillMaxWidth()
  47. .align(Alignment.Center),
  48. horizontalAlignment = Alignment.CenterHorizontally
  49. ) {
  50. Button(
  51. modifier = Modifier
  52. .size(avatarSize)
  53. .clipCircle(),
  54. contentPadding = PaddingValues(0.dp),
  55. onClick = onUserAvatarClick,
  56. colors = ButtonDefaults.transparent(),
  57. elevation = ButtonDefaults.noElevation()
  58. ) {
  59. ImageAny(
  60. modifier = Modifier
  61. .size(avatarSize)
  62. .circleBorder(2.dp, iconTintColor),
  63. src = api.currentUser.picture,
  64. colorFilter = if (api.currentUser.picture is ImageVector) ColorFilter.tint(iconTintColor) else null,
  65. contentDescription = ""
  66. )
  67. }
  68. Column(
  69. modifier = Modifier.fillMaxWidth()
  70. .padding(top = 8.dp),
  71. horizontalAlignment = Alignment.CenterHorizontally
  72. ) {
  73. TextAny(
  74. text = api.currentUser.name ?: api.homeDir?.name ?: "-",
  75. color = textColor,
  76. textAlign = TextAlign.Center,
  77. fontWeight = FontWeight.Bold
  78. )
  79. TextAny(
  80. text = api.machineName,
  81. color = textColor,
  82. textAlign = TextAlign.Center,
  83. fontWeight = FontWeight.Medium
  84. )
  85. }
  86. }
  87. Orientation.Horizontal -> Row(
  88. modifier = Modifier
  89. .fillMaxWidth()
  90. .align(Alignment.TopCenter),
  91. horizontalArrangement = Arrangement.Start,
  92. ) {
  93. Button(
  94. modifier = Modifier
  95. .size(avatarSize)
  96. .clipCircle(),
  97. contentPadding = PaddingValues(0.dp),
  98. onClick = {},
  99. colors = ButtonDefaults.transparent(),
  100. elevation = ButtonDefaults.noElevation()
  101. ) {
  102. ImageAny(
  103. modifier = Modifier
  104. .size(avatarSize)
  105. .circleBorder(2.dp, iconTintColor),
  106. src = api.currentUser.picture,
  107. colorFilter = if (api.currentUser.picture is ImageVector) ColorFilter.tint(iconTintColor) else null,
  108. contentDescription = ""
  109. )
  110. }
  111. Column(
  112. modifier = Modifier.padding(start = 8.dp).fillMaxWidth().padding(top = 8.dp),
  113. ) {
  114. TextAny(
  115. text = api.currentUser.name ?: api.homeDir?.name ?: "-",
  116. color = textColor,
  117. textAlign = TextAlign.Start,
  118. fontWeight = FontWeight.Bold
  119. )
  120. TextAny(
  121. text = api.machineName,
  122. color = textColor,
  123. textAlign = TextAlign.Start,
  124. fontWeight = FontWeight.Medium
  125. )
  126. }
  127. }
  128. }
  129. }