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

View File

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

View File

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

View File

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

View File

@ -363,11 +363,11 @@ fun ObserveAndDisplayFollowingMark(userHex: String, iconSize: Dp, accountViewMod
@Composable
fun WatchUserFollows(userHex: String, accountViewModel: AccountViewModel, onFollowChanges: @Composable (Boolean) -> Unit) {
val showFollowingMark by accountViewModel.userFollows.map {
it.user.isFollowingCached(userHex) || (userHex == accountViewModel.account.userProfile().pubkeyHex)
}.distinctUntilChanged().observeAsState(
accountViewModel.account.userProfile().isFollowingCached(userHex) || (userHex == accountViewModel.account.userProfile().pubkeyHex)
)
val showFollowingMark by remember {
accountViewModel.userFollows.map {
it.user.isFollowingCached(userHex) || (userHex == accountViewModel.account.userProfile().pubkeyHex)
}.distinctUntilChanged()
}.observeAsState(false)
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.style.TextOverflow
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.distinctUntilChanged
import androidx.lifecycle.map
import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.User
import com.vitorpamplona.amethyst.service.tts.TextToSpeechHelper
@ -34,9 +32,7 @@ import com.vitorpamplona.quartz.events.ImmutableListOfLists
@Composable
fun NoteUsernameDisplay(baseNote: Note, weight: Modifier = Modifier, showPlayButton: Boolean = true, textColor: Color = Color.Unspecified) {
val authorState by baseNote.live().metadata.map {
it.note.author
}.distinctUntilChanged().observeAsState(baseNote.author)
val authorState by baseNote.live().authorChanges.observeAsState(baseNote.author)
Crossfade(targetState = authorState, modifier = weight) {
it?.let {