common: render UserProfile text as Markdown

Fixes #324
This commit is contained in:
Harsh Shandilya 2022-06-24 15:55:22 +05:30
parent 47a7e77654
commit 5fd3ec436a
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
3 changed files with 33 additions and 38 deletions

View file

@ -13,14 +13,11 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.LocalContentColor
import androidx.compose.material.LocalTextStyle
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -29,30 +26,15 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.halilibo.richtext.markdown.Markdown
import com.halilibo.richtext.ui.RichTextScope
import com.halilibo.richtext.ui.material3.Material3RichText
import dev.msfjarvis.claw.common.posts.PostActions import dev.msfjarvis.claw.common.posts.PostActions
import dev.msfjarvis.claw.common.posts.PostTitle import dev.msfjarvis.claw.common.posts.PostTitle
import dev.msfjarvis.claw.common.posts.Submitter import dev.msfjarvis.claw.common.posts.Submitter
import dev.msfjarvis.claw.common.posts.TagRow import dev.msfjarvis.claw.common.posts.TagRow
import dev.msfjarvis.claw.common.res.ClawIcons import dev.msfjarvis.claw.common.res.ClawIcons
import dev.msfjarvis.claw.common.ui.ThemedRichText
import dev.msfjarvis.claw.model.Comment import dev.msfjarvis.claw.model.Comment
import dev.msfjarvis.claw.model.LobstersPostDetails import dev.msfjarvis.claw.model.LobstersPostDetails
@Composable
fun ThemedRichText(
modifier: Modifier = Modifier,
content: @Composable RichTextScope.() -> Unit,
) {
CompositionLocalProvider(
LocalTextStyle provides MaterialTheme.typography.bodyLarge,
LocalContentColor provides MaterialTheme.colorScheme.onBackground,
) {
Material3RichText(modifier) { content() }
}
}
@Composable @Composable
fun CommentsHeader( fun CommentsHeader(
postDetails: LobstersPostDetails, postDetails: LobstersPostDetails,
@ -80,7 +62,7 @@ fun CommentsHeader(
} }
if (postDetails.description.isNotBlank()) { if (postDetails.description.isNotBlank()) {
ThemedRichText { Markdown(htmlConverter.convertHTMLToMarkdown(postDetails.description)) } ThemedRichText(htmlConverter.convertHTMLToMarkdown(postDetails.description))
Spacer(Modifier.height(4.dp)) Spacer(Modifier.height(4.dp))
} }
Submitter( Submitter(
@ -149,9 +131,10 @@ fun CommentEntry(
) )
AnimatedContent(targetState = expanded) { expandedState -> AnimatedContent(targetState = expanded) { expandedState ->
if (expandedState) { if (expandedState) {
ThemedRichText(modifier = Modifier.padding(top = 8.dp)) { ThemedRichText(
Markdown(htmlConverter.convertHTMLToMarkdown(comment.comment)) text = htmlConverter.convertHTMLToMarkdown(comment.comment),
} modifier = Modifier.padding(top = 8.dp)
)
} }
} }
} }

View file

@ -0,0 +1,23 @@
package dev.msfjarvis.claw.common.ui
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier
import com.halilibo.richtext.markdown.Markdown
import com.halilibo.richtext.ui.material3.Material3RichText
@Composable
fun ThemedRichText(
text: String,
modifier: Modifier = Modifier,
) {
CompositionLocalProvider(
LocalTextStyle provides MaterialTheme.typography.bodyLarge,
LocalContentColor provides MaterialTheme.colorScheme.onBackground,
) {
Material3RichText(modifier) { Markdown(text) }
}
}

View file

@ -15,10 +15,6 @@ import androidx.compose.runtime.produceState
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import dev.msfjarvis.claw.common.NetworkState import dev.msfjarvis.claw.common.NetworkState
import dev.msfjarvis.claw.common.NetworkState.Loading import dev.msfjarvis.claw.common.NetworkState.Loading
@ -26,6 +22,7 @@ import dev.msfjarvis.claw.common.NetworkState.Success
import dev.msfjarvis.claw.common.ui.NetworkError import dev.msfjarvis.claw.common.ui.NetworkError
import dev.msfjarvis.claw.common.ui.NetworkImage import dev.msfjarvis.claw.common.ui.NetworkImage
import dev.msfjarvis.claw.common.ui.ProgressBar import dev.msfjarvis.claw.common.ui.ProgressBar
import dev.msfjarvis.claw.common.ui.ThemedRichText
import dev.msfjarvis.claw.model.User import dev.msfjarvis.claw.model.User
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
@ -67,19 +64,11 @@ private fun UserProfileInternal(
text = user.username, text = user.username,
style = MaterialTheme.typography.displaySmall, style = MaterialTheme.typography.displaySmall,
) )
Text( ThemedRichText(
text = user.about, text = user.about,
style = MaterialTheme.typography.bodyLarge,
) )
Text( ThemedRichText(
text = text = "Invited by [${user.invitedBy}](https://lobste.rs/u/${user.invitedBy})",
buildAnnotatedString {
append("Invited by ")
withStyle(style = SpanStyle(textDecoration = TextDecoration.Underline)) {
append(user.invitedBy)
}
},
style = MaterialTheme.typography.bodyLarge,
) )
} }
} }