diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt index 4264a12e1..2f262e9d4 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/MultiSetCompose.kt @@ -26,11 +26,15 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.compositeOver import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.navigation.NavController import com.google.accompanist.flowlayout.FlowRow import com.vitorpamplona.amethyst.NotificationCache import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.model.ChannelMessageEvent import com.vitorpamplona.amethyst.ui.screen.MultiSetCard import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel @@ -114,18 +118,7 @@ fun MultiSetCompose(multiSetCard: MultiSetCard, routeForLastRead: String, accoun ) } - Column(modifier = Modifier.padding(start = 10.dp)) { - FlowRow() { - multiSetCard.zapEvents.forEach { - NoteAuthorPicture( - note = it.key, - navController = navController, - userAccount = account.userProfile(), - size = 35.dp - ) - } - } - } + AuthorGallery(multiSetCard.zapEvents.keys, navController, account) } } @@ -146,18 +139,7 @@ fun MultiSetCompose(multiSetCard: MultiSetCard, routeForLastRead: String, accoun ) } - Column(modifier = Modifier.padding(start = 10.dp)) { - FlowRow() { - multiSetCard.boostEvents.forEach { - NoteAuthorPicture( - note = it, - navController = navController, - userAccount = account.userProfile(), - size = 35.dp - ) - } - } - } + AuthorGallery(multiSetCard.boostEvents, navController, account) } } @@ -178,18 +160,7 @@ fun MultiSetCompose(multiSetCard: MultiSetCard, routeForLastRead: String, accoun ) } - Column(modifier = Modifier.padding(start = 10.dp)) { - FlowRow() { - multiSetCard.likeEvents.forEach { - NoteAuthorPicture( - note = it, - navController = navController, - userAccount = account.userProfile(), - size = 35.dp - ) - } - } - } + AuthorGallery(multiSetCard.likeEvents, navController, account) } } @@ -218,3 +189,54 @@ fun MultiSetCompose(multiSetCard: MultiSetCard, routeForLastRead: String, accoun } } } + +@Composable +fun AuthorGallery( + authorNotes: Collection, + navController: NavController, + account: Account +) { + val accountState by account.userProfile().live().follows.observeAsState() + val accountUser = accountState?.user ?: return + + Column(modifier = Modifier.padding(start = 10.dp)) { + FlowRow() { + authorNotes.forEach { + FastNoteAuthorPicture( + note = it, + navController = navController, + userAccount = accountUser, + size = 35.dp + ) + } + } + } +} + +@Composable +fun FastNoteAuthorPicture( + note: Note, + navController: NavController, + userAccount: User, + size: Dp, + pictureModifier: Modifier = Modifier +) { + // can't be null if here + val author = note.author ?: return + + val userState by author.live().metadata.observeAsState() + val user = userState?.user ?: return + + val showFollowingMark = userAccount.isFollowingCached(user) || user == userAccount + + UserPicture( + userHex = user.pubkeyHex, + userPicture = user.profilePicture(), + showFollowingMark = showFollowingMark, + size = size, + modifier = pictureModifier, + onClick = { + navController.navigate("User/${user.pubkeyHex}") + } + ) +} diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index 83c537382..c2e341293 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -720,14 +720,49 @@ fun UserPicture( val userState by baseUser.live().metadata.observeAsState() val user = userState?.user ?: return + val accountState by baseUserAccount.live().follows.observeAsState() + val accountUser = accountState?.user ?: return + + val showFollowingMark = accountUser.isFollowingCached(user) || user == accountUser + + UserPicture( + userHex = user.pubkeyHex, + userPicture = user.profilePicture(), + showFollowingMark = showFollowingMark, + size = size, + modifier = modifier, + onClick = { + if (onClick != null) { + onClick(user) + } + }, + onLongClick = { + if (onLongClick != null) { + onLongClick(user) + } + } + ) +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun UserPicture( + userHex: String, + userPicture: String?, + showFollowingMark: Boolean, + size: Dp, + modifier: Modifier = Modifier, + onClick: (() -> Unit)? = null, + onLongClick: (() -> Unit)? = null +) { Box( Modifier .width(size) .height(size) ) { RobohashAsyncImageProxy( - robot = user.pubkeyHex, - model = ResizeImage(user.profilePicture(), size), + robot = userHex, + model = ResizeImage(userPicture, size), contentDescription = stringResource(id = R.string.profile_image), modifier = modifier .width(size) @@ -736,9 +771,9 @@ fun UserPicture( .background(MaterialTheme.colors.background) .run { if (onClick != null && onLongClick != null) { - this.combinedClickable(onClick = { onClick(user) }, onLongClick = { onLongClick(user) }) + this.combinedClickable(onClick = onClick, onLongClick = onLongClick) } else if (onClick != null) { - this.clickable(onClick = { onClick(user) }) + this.clickable(onClick = onClick) } else { this } @@ -746,10 +781,7 @@ fun UserPicture( ) - val accountState by baseUserAccount.live().follows.observeAsState() - val accountUser = accountState?.user ?: return - - if (accountUser.isFollowingCached(user) || user == accountUser) { + if (showFollowingMark) { Box( Modifier .width(size.div(3.5f))