diff --git a/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt b/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt index 6bfc27e69..b6e3345d0 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/service/nip19/Nip19.kt @@ -1,6 +1,7 @@ package com.vitorpamplona.amethyst.service.nip19 import android.util.Log +import androidx.compose.runtime.Immutable import com.vitorpamplona.amethyst.model.hexToByteArray import com.vitorpamplona.amethyst.model.toHexKey import nostr.postr.Bech32 @@ -15,6 +16,7 @@ object Nip19 { val nip19regex = Pattern.compile("(nostr:)?@?(nsec1|npub1|nevent1|naddr1|note1|nprofile1|nrelay1)([qpzry9x8gf2tvdw0s3jn54khce6mua7l]+)([\\S]*)", Pattern.CASE_INSENSITIVE) + @Immutable data class Return( val type: Type, val hex: String, diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index 52ad41e47..e28aac2e1 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -365,40 +365,8 @@ private fun RenderContentAsMarkdown(content: String, backgroundColor: Color, tag } nip19References.forEach { - var baseUser by remember(it) { mutableStateOf(null) } - var baseNote by remember(it) { mutableStateOf(null) } - - LaunchedEffect(key1 = it.hex) { - withContext(Dispatchers.IO) { - if (it.type == Nip19.Type.NOTE || it.type == Nip19.Type.EVENT || it.type == Nip19.Type.ADDRESS) { - LocalCache.checkGetOrCreateNote(it.hex)?.let { note -> - baseNote = note - } - } - - if (it.type == Nip19.Type.USER) { - LocalCache.checkGetOrCreateUser(it.hex)?.let { user -> - baseUser = user - } - } - } - } - - baseNote?.let { - val noteState by it.live().metadata.observeAsState() - if (noteState?.note?.event != null) { - LaunchedEffect(key1 = noteState) { - refresh++ - } - } - } - baseUser?.let { - val userState by it.live().metadata.observeAsState() - if (userState?.user?.info != null) { - LaunchedEffect(key1 = userState) { - refresh++ - } - } + ObserveNIP19(it) { + refresh++ } } @@ -423,6 +391,49 @@ private fun RenderContentAsMarkdown(content: String, backgroundColor: Color, tag } } +@Composable +private fun ObserveNIP19( + it: Nip19.Return, + onRefresh: () -> Unit +) { + var baseUser by remember(it) { mutableStateOf(null) } + var baseNote by remember(it) { mutableStateOf(null) } + + LaunchedEffect(key1 = it.hex) { + withContext(Dispatchers.IO) { + if (it.type == Nip19.Type.NOTE || it.type == Nip19.Type.EVENT || it.type == Nip19.Type.ADDRESS) { + LocalCache.checkGetOrCreateNote(it.hex)?.let { note -> + baseNote = note + } + } + + if (it.type == Nip19.Type.USER) { + LocalCache.checkGetOrCreateUser(it.hex)?.let { user -> + baseUser = user + } + } + } + } + + baseNote?.let { note -> + val noteState by note.live().metadata.observeAsState() + if (noteState?.note?.event != null) { + LaunchedEffect(key1 = noteState) { + onRefresh() + } + } + } + + baseUser?.let { user -> + val userState by user.live().metadata.observeAsState() + if (userState?.user?.info != null) { + LaunchedEffect(key1 = userState) { + onRefresh() + } + } + } +} + private fun getDisplayNameAndNIP19FromTag(tag: String, tags: List>): Pair? { val matcher = tagIndex.matcher(tag) val (index, suffix) = try {