fix: issue where UIMarkdown sometimes does not render

Signed-off-by: Infi <infi@infi.sh>
This commit is contained in:
Infi 2023-10-30 13:45:05 +01:00
parent 73be3d56ee
commit 9bf7dae138
1 changed files with 32 additions and 42 deletions

View File

@ -1,8 +1,6 @@
package chat.revolt.components.generic package chat.revolt.components.generic
import android.text.SpannableStringBuilder
import android.text.TextUtils import android.text.TextUtils
import android.util.Log
import android.util.TypedValue import android.util.TypedValue
import android.view.ViewGroup import android.view.ViewGroup
import androidx.compose.material3.LocalContentColor import androidx.compose.material3.LocalContentColor
@ -10,9 +8,6 @@ import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.material3.surfaceColorAtElevation
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@ -51,42 +46,6 @@ fun UIMarkdown(
val context = LocalContext.current val context = LocalContext.current
val foregroundColor = LocalContentColor.current val foregroundColor = LocalContentColor.current
val codeBlockColor = MaterialTheme.colorScheme.surfaceColorAtElevation(2.dp) val codeBlockColor = MaterialTheme.colorScheme.surfaceColorAtElevation(2.dp)
val spannableStringBuilder = remember { mutableStateOf(SpannableStringBuilder()) }
LaunchedEffect(text) {
val parser = MarkdownParser()
.addRules(
SimpleMarkdownRules.createEscapeRule()
)
.addRevoltRules(context)
.addRules(
createCodeRule(context, codeBlockColor.toArgb()),
createInlineCodeRule(context, codeBlockColor.toArgb())
)
.addRules(
SimpleMarkdownRules.createSimpleMarkdownRules(
includeEscapeRule = false
)
)
spannableStringBuilder.value = SimpleRenderer.render(
source = text,
parser = parser,
initialState = MarkdownState(0),
renderContext = MarkdownContext(
memberMap = mapOf(),
userMap = RevoltAPI.userCache.toMap(),
channelMap = RevoltAPI.channelCache.mapValues { ch ->
ch.value.name ?: ch.value.id ?: "{this does not exist 🤫}"
},
emojiMap = RevoltAPI.emojiCache,
serverId = null,
useLargeEmojis = false
)
)
Log.d("Markdown", "Rendered: ${spannableStringBuilder.value}")
}
AndroidView( AndroidView(
factory = { factory = {
@ -108,7 +67,38 @@ fun UIMarkdown(
}, },
modifier = modifier, modifier = modifier,
update = { update = {
it.text = spannableStringBuilder.value val parser = MarkdownParser()
.addRules(
SimpleMarkdownRules.createEscapeRule()
)
.addRevoltRules(context)
.addRules(
createCodeRule(context, codeBlockColor.toArgb()),
createInlineCodeRule(context, codeBlockColor.toArgb())
)
.addRules(
SimpleMarkdownRules.createSimpleMarkdownRules(
includeEscapeRule = false
)
)
val spannableStringBuilder = SimpleRenderer.render(
source = text,
parser = parser,
initialState = MarkdownState(0),
renderContext = MarkdownContext(
memberMap = mapOf(),
userMap = RevoltAPI.userCache.toMap(),
channelMap = RevoltAPI.channelCache.mapValues { ch ->
ch.value.name ?: ch.value.id ?: "{this does not exist 🤫}"
},
emojiMap = RevoltAPI.emojiCache,
serverId = null,
useLargeEmojis = false
)
)
it.text = spannableStringBuilder
} }
) )
} }