3 changed files with 94 additions and 5 deletions
@ -0,0 +1,50 @@
|
||||
package com.utun.chat.ui.components |
||||
|
||||
import android.graphics.Bitmap |
||||
import androidx.compose.foundation.Image |
||||
import androidx.compose.foundation.background |
||||
import androidx.compose.foundation.layout.Box |
||||
import androidx.compose.foundation.layout.size |
||||
import androidx.compose.foundation.shape.CircleShape |
||||
import androidx.compose.material3.MaterialTheme |
||||
import androidx.compose.material3.Text |
||||
import androidx.compose.runtime.* |
||||
import androidx.compose.ui.Alignment |
||||
import androidx.compose.ui.Modifier |
||||
import androidx.compose.ui.draw.clip |
||||
import androidx.compose.ui.graphics.asImageBitmap |
||||
import androidx.compose.ui.layout.ContentScale |
||||
import androidx.compose.ui.unit.Dp |
||||
import androidx.compose.ui.unit.dp |
||||
import com.utun.chat.ChatApplication |
||||
|
||||
@Composable |
||||
fun UserAvatar(group: String?, owner: Long, name: String, modifier: Modifier = Modifier, |
||||
size: Dp = 40.dp, profile: Boolean = false) { |
||||
val repository = ChatApplication.instance.avatars |
||||
val revision by repository.revision.collectAsState() |
||||
LaunchedEffect(group, owner, revision, profile) { |
||||
if (profile) repository.ensureProfile() else repository.ensureUser(group, owner) |
||||
} |
||||
AvatarImage(if (profile) repository.profileBitmap() else repository.userBitmap(group, owner), name, modifier, size) |
||||
} |
||||
|
||||
@Composable |
||||
fun GroupAvatar(group: String, name: String, modifier: Modifier = Modifier, size: Dp = 44.dp) { |
||||
val repository = ChatApplication.instance.avatars |
||||
val revision by repository.revision.collectAsState() |
||||
LaunchedEffect(group, revision) { repository.ensureGroup(group) } |
||||
AvatarImage(repository.groupBitmap(group), name, modifier, size) |
||||
} |
||||
|
||||
@Composable |
||||
private fun AvatarImage(bitmap: Bitmap?, name: String, modifier: Modifier, size: Dp) { |
||||
Box(modifier.size(size).clip(CircleShape).background(MaterialTheme.colorScheme.secondaryContainer), |
||||
contentAlignment = Alignment.Center) { |
||||
if (bitmap != null) Image(bitmap.asImageBitmap(), contentDescription = null, |
||||
modifier = Modifier.size(size), contentScale = ContentScale.Crop) |
||||
else Text(name.trim().split(Regex("\\s+")).filter { it.isNotEmpty() }.take(2) |
||||
.joinToString("") { String(Character.toChars(it.codePointAt(0))) }.uppercase().ifEmpty { "#" }, |
||||
color = MaterialTheme.colorScheme.onSecondaryContainer, style = MaterialTheme.typography.titleMedium) |
||||
} |
||||
} |
||||
Loading…
Reference in new issue