From 1fba93b4f049bfb68b771ce1bdbc830e7a0723bd Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 14 Jul 2023 17:19:40 -0400 Subject: [PATCH] Moves badges out of the User class --- .../amethyst/model/LocalCache.kt | 2 +- .../com/vitorpamplona/amethyst/model/User.kt | 10 ---- .../service/model/BadgeProfilesEvent.kt | 1 + .../ui/screen/loggedIn/ProfileScreen.kt | 49 +++++++++++++------ 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 52fdb5533..ceae28a33 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -518,7 +518,7 @@ object LocalCache { if (event.createdAt > (note.createdAt() ?: 0)) { note.loadEvent(event, author, replyTo) - author.updateAcceptedBadges(note) + refreshObservers(note) } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt index dbffa6439..71a734947 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/User.kt @@ -31,7 +31,6 @@ class User(val pubkeyHex: String) { var latestContactList: ContactListEvent? = null var latestBookmarkList: BookmarkListEvent? = null - var latestAcceptedBadges: AddressableNote? = null var notes = setOf() private set @@ -144,13 +143,6 @@ class User(val pubkeyHex: String) { } } - fun updateAcceptedBadges(note: AddressableNote) { - if (latestAcceptedBadges?.idHex != note.idHex) { - latestAcceptedBadges = note - liveSet?.badges?.invalidateData() - } - } - fun addZap(zapRequest: Note, zap: Note?) { if (zapRequest !in zaps.keys) { zaps = zaps + Pair(zapRequest, zap) @@ -351,7 +343,6 @@ class UserLiveSet(u: User) { val relayInfo: UserLiveData = UserLiveData(u) val metadata: UserLiveData = UserLiveData(u) val zaps: UserLiveData = UserLiveData(u) - val badges: UserLiveData = UserLiveData(u) val bookmarks: UserLiveData = UserLiveData(u) fun isInUse(): Boolean { @@ -363,7 +354,6 @@ class UserLiveSet(u: User) { relayInfo.hasObservers() || metadata.hasObservers() || zaps.hasObservers() || - badges.hasObservers() || bookmarks.hasObservers() } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt index 3acb994f7..60f7adb71 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/model/BadgeProfilesEvent.kt @@ -25,5 +25,6 @@ class BadgeProfilesEvent( companion object { const val kind = 30008 + const val standardDTAg = "profile_badges" } } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index e04b8c39b..6e7790596 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -49,6 +49,8 @@ import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.distinctUntilChanged +import androidx.lifecycle.map import androidx.lifecycle.viewmodel.compose.viewModel import coil.compose.AsyncImage import com.vitorpamplona.amethyst.R @@ -57,6 +59,7 @@ import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.NostrUserProfileDataSource +import com.vitorpamplona.amethyst.service.model.ATag import com.vitorpamplona.amethyst.service.model.AppDefinitionEvent import com.vitorpamplona.amethyst.service.model.BadgeDefinitionEvent import com.vitorpamplona.amethyst.service.model.BadgeProfilesEvent @@ -78,6 +81,7 @@ import com.vitorpamplona.amethyst.ui.components.figureOutMimeType import com.vitorpamplona.amethyst.ui.dal.UserProfileReportsFeedFilter import com.vitorpamplona.amethyst.ui.navigation.ShowQRDialog import com.vitorpamplona.amethyst.ui.note.ClickableUserPicture +import com.vitorpamplona.amethyst.ui.note.LoadAddressableNote import com.vitorpamplona.amethyst.ui.screen.FeedState import com.vitorpamplona.amethyst.ui.screen.LnZapFeedView import com.vitorpamplona.amethyst.ui.screen.NostrUserAppRecommendationsFeedViewModel @@ -97,6 +101,7 @@ import com.vitorpamplona.amethyst.ui.theme.BitcoinOrange import com.vitorpamplona.amethyst.ui.theme.ButtonBorder import com.vitorpamplona.amethyst.ui.theme.Size35dp import com.vitorpamplona.amethyst.ui.theme.placeholderText +import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -1115,26 +1120,38 @@ private fun DisplayBadges( baseUser: User, nav: (String) -> Unit ) { - val userBadgeState by baseUser.live().badges.observeAsState() - val badgeList by remember(userBadgeState) { - derivedStateOf { - val list = (userBadgeState?.user?.latestAcceptedBadges?.event as? BadgeProfilesEvent)?.badgeAwardEvents() - if (list.isNullOrEmpty()) { - null - } else { - list.toImmutableList() + LoadAddressableNote( + aTag = ATag( + BadgeProfilesEvent.kind, + baseUser.pubkeyHex, + BadgeProfilesEvent.standardDTAg, + null + ) + ) { + if (it != null) { + val badgeList by it.live().metadata.map { + (it.note.event as? BadgeProfilesEvent)?.badgeAwardEvents()?.toImmutableList() + }.distinctUntilChanged().observeAsState() + + badgeList?.let { list -> + RenderBadgeList(list, nav) } } } +} - badgeList?.let { list -> - FlowRow( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.padding(vertical = 5.dp) - ) { - list.forEach { badgeAwardEvent -> - LoadAndRenderBadge(badgeAwardEvent, nav) - } +@Composable +@OptIn(ExperimentalLayoutApi::class) +private fun RenderBadgeList( + list: ImmutableList, + nav: (String) -> Unit +) { + FlowRow( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.padding(vertical = 5.dp) + ) { + list.forEach { badgeAwardEvent -> + LoadAndRenderBadge(badgeAwardEvent, nav) } } }