2
0

UserAvatar.kt 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package eu.mjdev.desktop.components.custom
  2. import androidx.compose.desktop.ui.tooling.preview.Preview
  3. import androidx.compose.foundation.Image
  4. import androidx.compose.foundation.background
  5. import androidx.compose.foundation.gestures.Orientation
  6. import androidx.compose.foundation.layout.*
  7. import androidx.compose.material.Button
  8. import androidx.compose.material.ButtonDefaults
  9. import androidx.compose.material.Text
  10. import androidx.compose.runtime.Composable
  11. import androidx.compose.ui.Alignment
  12. import androidx.compose.ui.Modifier
  13. import androidx.compose.ui.graphics.Color
  14. import androidx.compose.ui.graphics.ColorFilter
  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.extensions.Compose.noElevation
  19. import eu.mjdev.desktop.extensions.Compose.transparent
  20. import eu.mjdev.desktop.extensions.Modifier.circleBorder
  21. import eu.mjdev.desktop.extensions.Modifier.clipCircle
  22. import eu.mjdev.desktop.provider.DesktopProvider
  23. import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop
  24. @Preview
  25. @Composable
  26. fun UserAvatar(
  27. backgroundColor: Color,
  28. avatarSize: Dp = 128.dp,
  29. orientation: Orientation = Orientation.Vertical,
  30. api: DesktopProvider = LocalDesktop.current,
  31. onUserAvatarClick: () -> Unit
  32. ) = Box(
  33. modifier = Modifier
  34. .fillMaxWidth()
  35. .background(backgroundColor)
  36. .padding(16.dp)
  37. ) {
  38. when (orientation) {
  39. Orientation.Vertical -> Column(
  40. modifier = Modifier
  41. .fillMaxWidth()
  42. .align(Alignment.Center),
  43. horizontalAlignment = Alignment.CenterHorizontally
  44. ) {
  45. Button(
  46. modifier = Modifier
  47. .size(avatarSize)
  48. .clipCircle(),
  49. contentPadding = PaddingValues(0.dp),
  50. onClick = onUserAvatarClick,
  51. colors = ButtonDefaults.transparent(),
  52. elevation = ButtonDefaults.noElevation()
  53. ) {
  54. Image(
  55. modifier = Modifier
  56. .size(avatarSize)
  57. .circleBorder(2.dp, Color.White.copy(alpha = 0.6f)),
  58. imageVector = api.currentUser.picture,
  59. colorFilter = ColorFilter.tint(Color.White),
  60. contentDescription = ""
  61. )
  62. }
  63. Text(
  64. modifier = Modifier.fillMaxWidth().padding(top = 16.dp),
  65. text = api.currentUser.name ?: api.appsProvider.homeDir?.name ?: "-",
  66. color = Color.White,
  67. textAlign = TextAlign.Center
  68. )
  69. }
  70. Orientation.Horizontal -> Row(
  71. modifier = Modifier
  72. .fillMaxWidth()
  73. .align(Alignment.TopCenter),
  74. horizontalArrangement = Arrangement.Start,
  75. ) {
  76. Button(
  77. modifier = Modifier
  78. .size(avatarSize)
  79. .clipCircle(),
  80. contentPadding = PaddingValues(0.dp),
  81. onClick = {},
  82. colors = ButtonDefaults.transparent(),
  83. elevation = ButtonDefaults.noElevation()
  84. ) {
  85. Image(
  86. modifier = Modifier
  87. .size(avatarSize)
  88. .circleBorder(2.dp, Color.White.copy(alpha = 0.6f)),
  89. imageVector = api.currentUser.picture,
  90. colorFilter = ColorFilter.tint(Color.White),
  91. contentDescription = ""
  92. )
  93. }
  94. Text(
  95. modifier = Modifier.padding(start = 16.dp).fillMaxWidth().padding(top = 16.dp),
  96. text = api.currentUser.name ?: api.appsProvider.homeDir?.name ?: "-",
  97. color = Color.White,
  98. textAlign = TextAlign.Start
  99. )
  100. }
  101. }
  102. }