From 7cd468542e3e28c414030af7cabdd62cfcf073bd Mon Sep 17 00:00:00 2001 From: Artem Chepurnoy Date: Wed, 27 Mar 2024 10:23:41 +0200 Subject: [PATCH] fix(Markdown): Do not crash the app if the link you've clicked could not be handled --- .../keyguard/ui/markdown/Markdown.kt | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/common/src/commonMain/kotlin/com/artemchep/keyguard/ui/markdown/Markdown.kt b/common/src/commonMain/kotlin/com/artemchep/keyguard/ui/markdown/Markdown.kt index b97e96d..dc989a0 100644 --- a/common/src/commonMain/kotlin/com/artemchep/keyguard/ui/markdown/Markdown.kt +++ b/common/src/commonMain/kotlin/com/artemchep/keyguard/ui/markdown/Markdown.kt @@ -2,14 +2,22 @@ package com.artemchep.keyguard.ui.markdown import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalUriHandler +import com.artemchep.keyguard.common.model.ToastMessage +import com.artemchep.keyguard.common.usecase.ShowMessage import com.halilibo.richtext.commonmark.Markdown import com.halilibo.richtext.markdown.BasicMarkdown import com.halilibo.richtext.markdown.node.AstNode +import com.halilibo.richtext.ui.LinkClickHandler import com.halilibo.richtext.ui.RichTextStyle import com.halilibo.richtext.ui.material3.RichText import com.halilibo.richtext.ui.resolveDefaults import com.halilibo.richtext.ui.string.RichTextStringStyle +import org.kodein.di.compose.rememberInstance @Composable fun MarkdownText( @@ -20,6 +28,7 @@ fun MarkdownText( RichText( modifier = modifier, style = richTextStyle, + linkClickHandler = rememberGracefulLinkClickHandler(), ) { Markdown(markdown) } @@ -34,11 +43,33 @@ fun MarkdownText( RichText( modifier = modifier, style = richTextStyle, + linkClickHandler = rememberGracefulLinkClickHandler(), ) { BasicMarkdown(markdown) } } +@Composable +private fun rememberGracefulLinkClickHandler(): LinkClickHandler { + val showMessage by rememberInstance() + val updatedUriHandler by rememberUpdatedState(LocalUriHandler.current) + return remember { + LinkClickHandler { uri -> + try { + updatedUriHandler.openUri(uri) + } catch (e: Exception) { + val title = e.message + ?: "Could not open a URI" + val msg = ToastMessage( + title = title, + type = ToastMessage.Type.ERROR, + ) + showMessage.copy(msg) + } + } + } +} + @Composable private fun getRichTextStyle(): RichTextStyle { return RichTextStyle().resolveDefaults().copy(