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