Optimizes caching for hidden chars on emoji

This commit is contained in:
Vitor Pamplona
2025-03-14 10:24:03 -04:00
parent 311964ce33
commit de2b1a6c95
4 changed files with 27 additions and 69 deletions
@@ -41,6 +41,12 @@ object CachedRichTextParser {
return result return result
} }
fun cachedText(
content: String,
tags: ImmutableListOfLists<String>,
callbackUri: String? = null,
): RichTextViewerState? = richTextCache[hashCodeCache(content, tags, callbackUri)]
fun parseText( fun parseText(
content: String, content: String,
tags: ImmutableListOfLists<String>, tags: ImmutableListOfLists<String>,
@@ -530,20 +530,22 @@ fun DisplaySecretEmoji(
) { ) {
if (canPreview && quotesLeft > 0) { if (canPreview && quotesLeft > 0) {
var secretContent by remember { var secretContent by remember {
mutableStateOf<RichTextViewerState?>(null) mutableStateOf(CachedRichTextParser.cachedText(EmojiCoder.decode(segment.segmentText), state.tags))
} }
var showPopup by remember { var showPopup by remember {
mutableStateOf(false) mutableStateOf(false)
} }
LaunchedEffect(segment) { if (secretContent == null) {
launch(Dispatchers.Default) { LaunchedEffect(segment) {
secretContent = launch(Dispatchers.Default) {
CachedRichTextParser.parseText( secretContent =
EmojiCoder.decode(segment.segmentText), CachedRichTextParser.parseText(
state.tags, EmojiCoder.decode(segment.segmentText),
) state.tags,
)
}
} }
} }
@@ -64,7 +64,6 @@ import androidx.compose.ui.window.Popup
import androidx.compose.ui.window.PopupProperties import androidx.compose.ui.window.PopupProperties
import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.commons.emojicoder.EmojiCoder import com.vitorpamplona.amethyst.commons.emojicoder.EmojiCoder
import com.vitorpamplona.amethyst.commons.richtext.RichTextViewerState
import com.vitorpamplona.amethyst.model.FeatureSetType import com.vitorpamplona.amethyst.model.FeatureSetType
import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.Note
import com.vitorpamplona.amethyst.model.NoteState import com.vitorpamplona.amethyst.model.NoteState
@@ -251,21 +250,23 @@ fun DisplaySecretEmojiAsReaction(
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
nav: INav, nav: INav,
) { ) {
var secretContent by remember { var secretContent by remember(reaction) {
mutableStateOf<RichTextViewerState?>(null) mutableStateOf(CachedRichTextParser.cachedText(EmojiCoder.decode(reaction), EmptyTagList))
} }
var showPopup by remember { var showPopup by remember {
mutableStateOf(false) mutableStateOf(false)
} }
LaunchedEffect(reaction) { if (secretContent == null) {
launch(Dispatchers.Default) { LaunchedEffect(reaction) {
secretContent = launch(Dispatchers.Default) {
CachedRichTextParser.parseText( secretContent =
EmojiCoder.decode(reaction), CachedRichTextParser.parseText(
EmptyTagList, EmojiCoder.decode(reaction),
) EmptyTagList,
)
}
} }
} }
@@ -53,7 +53,6 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
@@ -79,13 +78,10 @@ import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.R
import com.vitorpamplona.amethyst.commons.emojicoder.EmojiCoder import com.vitorpamplona.amethyst.commons.emojicoder.EmojiCoder
import com.vitorpamplona.amethyst.commons.richtext.RichTextViewerState
import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Account
import com.vitorpamplona.amethyst.model.AddressableNote import com.vitorpamplona.amethyst.model.AddressableNote
import com.vitorpamplona.amethyst.service.CachedRichTextParser
import com.vitorpamplona.amethyst.service.firstFullChar import com.vitorpamplona.amethyst.service.firstFullChar
import com.vitorpamplona.amethyst.ui.components.AnimatedBorderTextCornerRadius import com.vitorpamplona.amethyst.ui.components.AnimatedBorderTextCornerRadius
import com.vitorpamplona.amethyst.ui.components.CoreSecretMessage
import com.vitorpamplona.amethyst.ui.components.InLineIconRenderer import com.vitorpamplona.amethyst.ui.components.InLineIconRenderer
import com.vitorpamplona.amethyst.ui.components.SetDialogToEdgeToEdge import com.vitorpamplona.amethyst.ui.components.SetDialogToEdgeToEdge
import com.vitorpamplona.amethyst.ui.navigation.INav import com.vitorpamplona.amethyst.ui.navigation.INav
@@ -380,53 +376,6 @@ private fun RenderReactionOption(
} }
} }
@Composable
fun DisplaySecretEmoji(
text: String,
state: RichTextViewerState,
callbackUri: String?,
canPreview: Boolean,
quotesLeft: Int,
backgroundColor: MutableState<Color>,
accountViewModel: AccountViewModel,
nav: INav,
) {
if (canPreview && quotesLeft > 0) {
var secretContent by remember {
mutableStateOf<RichTextViewerState?>(null)
}
var showPopup by remember {
mutableStateOf(false)
}
LaunchedEffect(text) {
launch(Dispatchers.Default) {
secretContent =
CachedRichTextParser.parseText(
EmojiCoder.decode(text),
state.tags,
)
}
}
val localSecretContent = secretContent
AnimatedBorderTextCornerRadius(
text,
Modifier.clickable {
showPopup = !showPopup
},
)
if (localSecretContent != null && showPopup) {
CoreSecretMessage(localSecretContent, callbackUri, quotesLeft, backgroundColor, accountViewModel, nav)
}
} else {
Text(text)
}
}
@Composable @Composable
private fun EmojiSelector( private fun EmojiSelector(
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,