Avoids creation of the LiveData in every recomposition.

This commit is contained in:
Vitor Pamplona 2023-10-25 17:22:26 -04:00
parent a66e14f3eb
commit 460a99d95d
7 changed files with 39 additions and 32 deletions

View File

@ -777,6 +777,10 @@ class NoteLiveSet(u: Note) {
}.toImmutableList() }.toImmutableList()
} }
val content = innerMetadata.map {
it.note.event?.content() ?: ""
}
fun isInUse(): Boolean { fun isInUse(): Boolean {
return metadata.hasObservers() || return metadata.hasObservers() ||
reactions.hasObservers() || reactions.hasObservers() ||

View File

@ -60,7 +60,6 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.map
import coil.compose.AsyncImage import coil.compose.AsyncImage
import com.vitorpamplona.amethyst.BuildConfig import com.vitorpamplona.amethyst.BuildConfig
import com.vitorpamplona.amethyst.LocalPreferences import com.vitorpamplona.amethyst.LocalPreferences
@ -178,7 +177,8 @@ fun ProfileContent(
painter = painterResource(R.drawable.profile_banner), painter = painterResource(R.drawable.profile_banner),
contentDescription = stringResource(R.string.profile_banner), contentDescription = stringResource(R.string.profile_banner),
contentScale = ContentScale.FillWidth, contentScale = ContentScale.FillWidth,
modifier = Modifier.fillMaxWidth() modifier = Modifier
.fillMaxWidth()
.height(120.dp) .height(120.dp)
) )
} }
@ -290,9 +290,7 @@ private fun EditStatusBoxes(baseAccountUser: User, accountViewModel: AccountView
) )
} else { } else {
statuses.forEach { statuses.forEach {
val originalStatus by it.live().metadata.map { val originalStatus by it.live().content.observeAsState("")
it.note.event?.content() ?: ""
}.observeAsState(it.event?.content() ?: "")
val thisStatus = remember { val thisStatus = remember {
mutableStateOf(originalStatus) mutableStateOf(originalStatus)

View File

@ -41,6 +41,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.distinctUntilChanged
import androidx.lifecycle.map import androidx.lifecycle.map
import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.Note
@ -121,9 +122,11 @@ fun CheckHiddenChatMessage(
nav: (String) -> Unit, nav: (String) -> Unit,
onWantsToReply: (Note) -> Unit onWantsToReply: (Note) -> Unit
) { ) {
val isHidden by accountViewModel.account.liveHiddenUsers.map { val isHidden by remember {
accountViewModel.account.liveHiddenUsers.map {
baseNote.isHiddenFor(it) baseNote.isHiddenFor(it)
}.observeAsState(accountViewModel.isNoteHidden(baseNote)) }.distinctUntilChanged()
}.observeAsState(false)
if (!isHidden) { if (!isHidden) {
LoadedChatMessageCompose( LoadedChatMessageCompose(

View File

@ -302,9 +302,11 @@ fun CheckHiddenNoteCompose(
nav = nav nav = nav
) )
} else { } else {
val isHidden by accountViewModel.account.liveHiddenUsers.map { val isHidden by remember(note) {
accountViewModel.account.liveHiddenUsers.map {
note.isHiddenFor(it) note.isHiddenFor(it)
}.observeAsState(accountViewModel.isNoteHidden(note)) }.distinctUntilChanged()
}.observeAsState(false)
Crossfade(targetState = isHidden) { Crossfade(targetState = isHidden) {
if (!it) { if (!it) {
@ -791,11 +793,11 @@ private fun ShortCommunityActionOptions(
@Composable @Composable
fun WatchAddressableNoteFollows(note: AddressableNote, accountViewModel: AccountViewModel, onFollowChanges: @Composable (Boolean) -> Unit) { fun WatchAddressableNoteFollows(note: AddressableNote, accountViewModel: AccountViewModel, onFollowChanges: @Composable (Boolean) -> Unit) {
val showFollowingMark by accountViewModel.userFollows.map { val showFollowingMark by remember {
accountViewModel.userFollows.map {
it.user.latestContactList?.isTaggedAddressableNote(note.idHex) ?: false it.user.latestContactList?.isTaggedAddressableNote(note.idHex) ?: false
}.distinctUntilChanged().observeAsState( }.distinctUntilChanged()
accountViewModel.userProfile().latestContactList?.isTaggedAddressableNote(note.idHex) ?: false }.observeAsState(false)
)
onFollowChanges(showFollowingMark) onFollowChanges(showFollowingMark)
} }
@ -2212,9 +2214,11 @@ private fun EmojiListOptions(
accountViewModel accountViewModel
) { ) {
it?.let { usersEmojiList -> it?.let { usersEmojiList ->
val hasAddedThis by usersEmojiList.live().metadata.map { val hasAddedThis by remember {
usersEmojiList.live().metadata.map {
usersEmojiList.event?.isTaggedAddressableNote(emojiPackNote.idHex) usersEmojiList.event?.isTaggedAddressableNote(emojiPackNote.idHex)
}.distinctUntilChanged().observeAsState() }.distinctUntilChanged()
}.observeAsState()
Crossfade(targetState = hasAddedThis) { Crossfade(targetState = hasAddedThis) {
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()

View File

@ -692,9 +692,11 @@ fun BoostReaction(
@Composable @Composable
fun BoostIcon(baseNote: Note, iconSize: Dp = Size20dp, grayTint: Color, accountViewModel: AccountViewModel) { fun BoostIcon(baseNote: Note, iconSize: Dp = Size20dp, grayTint: Color, accountViewModel: AccountViewModel) {
val iconTint by baseNote.live().boosts.map { val iconTint by remember(baseNote) {
baseNote.live().boosts.map {
if (it.note.isBoostedBy(accountViewModel.userProfile())) Color.Unspecified else grayTint if (it.note.isBoostedBy(accountViewModel.userProfile())) Color.Unspecified else grayTint
}.distinctUntilChanged().observeAsState(grayTint) }.distinctUntilChanged()
}.observeAsState(grayTint)
val iconModifier = remember { val iconModifier = remember {
Modifier.size(iconSize) Modifier.size(iconSize)

View File

@ -363,11 +363,11 @@ fun ObserveAndDisplayFollowingMark(userHex: String, iconSize: Dp, accountViewMod
@Composable @Composable
fun WatchUserFollows(userHex: String, accountViewModel: AccountViewModel, onFollowChanges: @Composable (Boolean) -> Unit) { fun WatchUserFollows(userHex: String, accountViewModel: AccountViewModel, onFollowChanges: @Composable (Boolean) -> Unit) {
val showFollowingMark by accountViewModel.userFollows.map { val showFollowingMark by remember {
accountViewModel.userFollows.map {
it.user.isFollowingCached(userHex) || (userHex == accountViewModel.account.userProfile().pubkeyHex) it.user.isFollowingCached(userHex) || (userHex == accountViewModel.account.userProfile().pubkeyHex)
}.distinctUntilChanged().observeAsState( }.distinctUntilChanged()
accountViewModel.account.userProfile().isFollowingCached(userHex) || (userHex == accountViewModel.account.userProfile().pubkeyHex) }.observeAsState(false)
)
onFollowChanges(showFollowingMark) onFollowChanges(showFollowingMark)
} }

View File

@ -21,8 +21,6 @@ import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.distinctUntilChanged
import androidx.lifecycle.map
import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.service.tts.TextToSpeechHelper import com.vitorpamplona.amethyst.service.tts.TextToSpeechHelper
@ -34,9 +32,7 @@ import com.vitorpamplona.quartz.events.ImmutableListOfLists
@Composable @Composable
fun NoteUsernameDisplay(baseNote: Note, weight: Modifier = Modifier, showPlayButton: Boolean = true, textColor: Color = Color.Unspecified) { fun NoteUsernameDisplay(baseNote: Note, weight: Modifier = Modifier, showPlayButton: Boolean = true, textColor: Color = Color.Unspecified) {
val authorState by baseNote.live().metadata.map { val authorState by baseNote.live().authorChanges.observeAsState(baseNote.author)
it.note.author
}.distinctUntilChanged().observeAsState(baseNote.author)
Crossfade(targetState = authorState, modifier = weight) { Crossfade(targetState = authorState, modifier = weight) {
it?.let { it?.let {