mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 22:17:03 +05:30
refactor: migrate to HTMLText
This commit is contained in:
parent
2d23ceee83
commit
2dc8eae861
6 changed files with 7 additions and 30 deletions
|
@ -18,7 +18,6 @@ import androidx.core.view.WindowCompat
|
||||||
import com.deliveryhero.whetstone.Whetstone
|
import com.deliveryhero.whetstone.Whetstone
|
||||||
import com.deliveryhero.whetstone.activity.ContributesActivityInjector
|
import com.deliveryhero.whetstone.activity.ContributesActivityInjector
|
||||||
import dev.msfjarvis.claw.android.ui.LobstersApp
|
import dev.msfjarvis.claw.android.ui.LobstersApp
|
||||||
import dev.msfjarvis.claw.common.comments.HTMLConverter
|
|
||||||
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
@ -26,7 +25,6 @@ import javax.inject.Inject
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
|
|
||||||
@Inject lateinit var urlLauncher: UrlLauncher
|
@Inject lateinit var urlLauncher: UrlLauncher
|
||||||
@Inject lateinit var htmlConverter: HTMLConverter
|
|
||||||
private var webUri: String? = null
|
private var webUri: String? = null
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
|
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
|
||||||
|
@ -40,7 +38,6 @@ class MainActivity : ComponentActivity() {
|
||||||
|
|
||||||
LobstersApp(
|
LobstersApp(
|
||||||
urlLauncher = urlLauncher,
|
urlLauncher = urlLauncher,
|
||||||
htmlConverter = htmlConverter,
|
|
||||||
windowSizeClass = windowSizeClass,
|
windowSizeClass = windowSizeClass,
|
||||||
setWebUri = { url -> webUri = url },
|
setWebUri = { url -> webUri = url },
|
||||||
)
|
)
|
||||||
|
|
|
@ -64,7 +64,6 @@ import dev.msfjarvis.claw.android.ui.navigation.Destinations
|
||||||
import dev.msfjarvis.claw.android.viewmodel.ClawViewModel
|
import dev.msfjarvis.claw.android.viewmodel.ClawViewModel
|
||||||
import dev.msfjarvis.claw.api.LobstersApi
|
import dev.msfjarvis.claw.api.LobstersApi
|
||||||
import dev.msfjarvis.claw.common.comments.CommentsPage
|
import dev.msfjarvis.claw.common.comments.CommentsPage
|
||||||
import dev.msfjarvis.claw.common.comments.HTMLConverter
|
|
||||||
import dev.msfjarvis.claw.common.theme.LobstersTheme
|
import dev.msfjarvis.claw.common.theme.LobstersTheme
|
||||||
import dev.msfjarvis.claw.common.ui.decorations.ClawAppBar
|
import dev.msfjarvis.claw.common.ui.decorations.ClawAppBar
|
||||||
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
||||||
|
@ -77,7 +76,6 @@ import kotlinx.coroutines.launch
|
||||||
@Composable
|
@Composable
|
||||||
fun LobstersApp(
|
fun LobstersApp(
|
||||||
urlLauncher: UrlLauncher,
|
urlLauncher: UrlLauncher,
|
||||||
htmlConverter: HTMLConverter,
|
|
||||||
windowSizeClass: WindowSizeClass,
|
windowSizeClass: WindowSizeClass,
|
||||||
setWebUri: (String?) -> Unit,
|
setWebUri: (String?) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
@ -238,7 +236,6 @@ fun LobstersApp(
|
||||||
CommentsPage(
|
CommentsPage(
|
||||||
postId = postId,
|
postId = postId,
|
||||||
postActions = postActions,
|
postActions = postActions,
|
||||||
htmlConverter = htmlConverter,
|
|
||||||
getSeenComments = viewModel::getSeenComments,
|
getSeenComments = viewModel::getSeenComments,
|
||||||
markSeenComments = viewModel::markSeenComments,
|
markSeenComments = viewModel::markSeenComments,
|
||||||
)
|
)
|
||||||
|
|
|
@ -41,8 +41,8 @@ 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.ui.HTMLText
|
||||||
import dev.msfjarvis.claw.common.ui.NetworkImage
|
import dev.msfjarvis.claw.common.ui.NetworkImage
|
||||||
import dev.msfjarvis.claw.common.ui.ThemedRichText
|
|
||||||
import dev.msfjarvis.claw.model.LinkMetadata
|
import dev.msfjarvis.claw.model.LinkMetadata
|
||||||
import dev.msfjarvis.claw.model.LobstersPostDetails
|
import dev.msfjarvis.claw.model.LobstersPostDetails
|
||||||
import java.time.Instant
|
import java.time.Instant
|
||||||
|
@ -53,7 +53,6 @@ import kotlinx.collections.immutable.toImmutableList
|
||||||
internal fun CommentsHeader(
|
internal fun CommentsHeader(
|
||||||
postDetails: LobstersPostDetails,
|
postDetails: LobstersPostDetails,
|
||||||
postActions: PostActions,
|
postActions: PostActions,
|
||||||
htmlConverter: HTMLConverter,
|
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
val uriHandler = LocalUriHandler.current
|
val uriHandler = LocalUriHandler.current
|
||||||
|
@ -84,7 +83,7 @@ internal fun CommentsHeader(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (postDetails.description.isNotBlank()) {
|
if (postDetails.description.isNotBlank()) {
|
||||||
ThemedRichText(htmlConverter.convertHTMLToMarkdown(postDetails.description))
|
HTMLText(postDetails.description)
|
||||||
Spacer(Modifier.height(4.dp))
|
Spacer(Modifier.height(4.dp))
|
||||||
}
|
}
|
||||||
Submitter(
|
Submitter(
|
||||||
|
@ -134,7 +133,6 @@ private val CommentEntryPadding = 16f.dp
|
||||||
@Composable
|
@Composable
|
||||||
internal fun CommentEntry(
|
internal fun CommentEntry(
|
||||||
commentNode: CommentNode,
|
commentNode: CommentNode,
|
||||||
htmlConverter: HTMLConverter,
|
|
||||||
toggleExpanded: (CommentNode) -> Unit,
|
toggleExpanded: (CommentNode) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
) {
|
) {
|
||||||
|
@ -169,10 +167,7 @@ internal fun CommentEntry(
|
||||||
Modifier.clickable { uriHandler.openUri("https://lobste.rs/u/${comment.user.username}") },
|
Modifier.clickable { uriHandler.openUri("https://lobste.rs/u/${comment.user.username}") },
|
||||||
)
|
)
|
||||||
if (commentNode.isExpanded) {
|
if (commentNode.isExpanded) {
|
||||||
ThemedRichText(
|
HTMLText(text = comment.comment, modifier = Modifier.padding(top = 8.dp))
|
||||||
text = htmlConverter.convertHTMLToMarkdown(comment.comment),
|
|
||||||
modifier = Modifier.padding(top = 8.dp)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,13 +68,11 @@ internal fun findTopMostParent(node: CommentNode): CommentNode {
|
||||||
|
|
||||||
internal fun LazyListScope.nodes(
|
internal fun LazyListScope.nodes(
|
||||||
nodes: List<CommentNode>,
|
nodes: List<CommentNode>,
|
||||||
htmlConverter: HTMLConverter,
|
|
||||||
toggleExpanded: (CommentNode) -> Unit,
|
toggleExpanded: (CommentNode) -> Unit,
|
||||||
) {
|
) {
|
||||||
nodes.forEach { node ->
|
nodes.forEach { node ->
|
||||||
node(
|
node(
|
||||||
node = node,
|
node = node,
|
||||||
htmlConverter = htmlConverter,
|
|
||||||
toggleExpanded = toggleExpanded,
|
toggleExpanded = toggleExpanded,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -82,7 +80,6 @@ internal fun LazyListScope.nodes(
|
||||||
|
|
||||||
private fun LazyListScope.node(
|
private fun LazyListScope.node(
|
||||||
node: CommentNode,
|
node: CommentNode,
|
||||||
htmlConverter: HTMLConverter,
|
|
||||||
toggleExpanded: (CommentNode) -> Unit,
|
toggleExpanded: (CommentNode) -> Unit,
|
||||||
) {
|
) {
|
||||||
// Skip the node if neither the node nor its parent is expanded
|
// Skip the node if neither the node nor its parent is expanded
|
||||||
|
@ -92,7 +89,6 @@ private fun LazyListScope.node(
|
||||||
item {
|
item {
|
||||||
CommentEntry(
|
CommentEntry(
|
||||||
commentNode = node,
|
commentNode = node,
|
||||||
htmlConverter = htmlConverter,
|
|
||||||
toggleExpanded = toggleExpanded,
|
toggleExpanded = toggleExpanded,
|
||||||
)
|
)
|
||||||
Divider()
|
Divider()
|
||||||
|
@ -100,7 +96,6 @@ private fun LazyListScope.node(
|
||||||
if (node.children.isNotEmpty()) {
|
if (node.children.isNotEmpty()) {
|
||||||
nodes(
|
nodes(
|
||||||
node.children,
|
node.children,
|
||||||
htmlConverter = htmlConverter,
|
|
||||||
toggleExpanded = toggleExpanded,
|
toggleExpanded = toggleExpanded,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,6 @@ import dev.msfjarvis.claw.model.LobstersPostDetails
|
||||||
private fun CommentsPageInternal(
|
private fun CommentsPageInternal(
|
||||||
details: LobstersPostDetails,
|
details: LobstersPostDetails,
|
||||||
postActions: PostActions,
|
postActions: PostActions,
|
||||||
htmlConverter: HTMLConverter,
|
|
||||||
commentState: PostComments?,
|
commentState: PostComments?,
|
||||||
markSeenComments: (String, List<Comment>) -> Unit,
|
markSeenComments: (String, List<Comment>) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
@ -55,7 +54,6 @@ private fun CommentsPageInternal(
|
||||||
CommentsHeader(
|
CommentsHeader(
|
||||||
postDetails = details,
|
postDetails = details,
|
||||||
postActions = postActions,
|
postActions = postActions,
|
||||||
htmlConverter = htmlConverter,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +68,6 @@ private fun CommentsPageInternal(
|
||||||
|
|
||||||
nodes(
|
nodes(
|
||||||
nodes = commentNodes,
|
nodes = commentNodes,
|
||||||
htmlConverter = htmlConverter,
|
|
||||||
toggleExpanded = { node ->
|
toggleExpanded = { node ->
|
||||||
val newNode = setExpanded(node, !node.isExpanded)
|
val newNode = setExpanded(node, !node.isExpanded)
|
||||||
val parent = findTopMostParent(newNode)
|
val parent = findTopMostParent(newNode)
|
||||||
|
@ -102,7 +99,6 @@ private fun CommentsPageInternal(
|
||||||
fun CommentsPage(
|
fun CommentsPage(
|
||||||
postId: String,
|
postId: String,
|
||||||
postActions: PostActions,
|
postActions: PostActions,
|
||||||
htmlConverter: HTMLConverter,
|
|
||||||
getSeenComments: suspend (String) -> PostComments?,
|
getSeenComments: suspend (String) -> PostComments?,
|
||||||
markSeenComments: (String, List<Comment>) -> Unit,
|
markSeenComments: (String, List<Comment>) -> Unit,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
|
@ -123,7 +119,6 @@ fun CommentsPage(
|
||||||
CommentsPageInternal(
|
CommentsPageInternal(
|
||||||
details = (postDetails as Success<LobstersPostDetails>).data,
|
details = (postDetails as Success<LobstersPostDetails>).data,
|
||||||
postActions = postActions,
|
postActions = postActions,
|
||||||
htmlConverter = htmlConverter,
|
|
||||||
commentState = commentState,
|
commentState = commentState,
|
||||||
markSeenComments = markSeenComments,
|
markSeenComments = markSeenComments,
|
||||||
modifier = modifier.fillMaxSize(),
|
modifier = modifier.fillMaxSize(),
|
||||||
|
|
|
@ -29,10 +29,10 @@ import dev.msfjarvis.claw.common.NetworkState
|
||||||
import dev.msfjarvis.claw.common.NetworkState.Error
|
import dev.msfjarvis.claw.common.NetworkState.Error
|
||||||
import dev.msfjarvis.claw.common.NetworkState.Loading
|
import dev.msfjarvis.claw.common.NetworkState.Loading
|
||||||
import dev.msfjarvis.claw.common.NetworkState.Success
|
import dev.msfjarvis.claw.common.NetworkState.Success
|
||||||
|
import dev.msfjarvis.claw.common.ui.HTMLText
|
||||||
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")
|
||||||
|
@ -99,12 +99,10 @@ private fun UserProfileInternal(
|
||||||
text = user.username,
|
text = user.username,
|
||||||
style = MaterialTheme.typography.displaySmall,
|
style = MaterialTheme.typography.displaySmall,
|
||||||
)
|
)
|
||||||
ThemedRichText(
|
HTMLText(text = user.about)
|
||||||
text = user.about,
|
|
||||||
)
|
|
||||||
user.invitedBy?.let { invitedBy ->
|
user.invitedBy?.let { invitedBy ->
|
||||||
ThemedRichText(
|
HTMLText(
|
||||||
text = "Invited by [${invitedBy}](https://lobste.rs/u/${user.invitedBy})",
|
text = """Invited by <a href="https://lobste.rs/u/${invitedBy}">${invitedBy}</a>""",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue