refactor(android): switch over to PagingData transformations

This commit is contained in:
Harsh Shandilya 2024-01-27 16:52:47 +05:30
parent 051b7ab2bb
commit 74a7835a53
19 changed files with 187 additions and 151 deletions

View file

@ -46,22 +46,22 @@ import dev.msfjarvis.claw.common.posts.TagRow
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.LobstersPostDetails
import dev.msfjarvis.claw.model.UIPost
import java.time.Instant
import java.time.temporal.TemporalAccessor
import kotlinx.collections.immutable.toImmutableList
@Composable
internal fun CommentsHeader(
postDetails: LobstersPostDetails,
post: UIPost,
postActions: PostActions,
htmlConverter: HTMLConverter,
modifier: Modifier = Modifier,
) {
val uriHandler = LocalUriHandler.current
val linkMetadata by
produceState(initialValue = LinkMetadata(postDetails.url, null)) {
runSuspendCatching { postActions.getLinkMetadata(postDetails.url) }
produceState(initialValue = LinkMetadata(post.url, null)) {
runSuspendCatching { postActions.getLinkMetadata(post.url) }
.onSuccess { metadata -> value = metadata }
}
@ -70,8 +70,8 @@ internal fun CommentsHeader(
modifier = Modifier.padding(16.dp).fillMaxWidth(),
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
PostTitle(title = postDetails.title, isRead = false)
TagRow(tags = postDetails.tags.toImmutableList())
PostTitle(title = post.title, isRead = false)
TagRow(tags = post.tags.toImmutableList())
Spacer(Modifier.height(4.dp))
if (linkMetadata.url.isNotBlank()) {
@ -79,23 +79,23 @@ internal fun CommentsHeader(
linkMetadata = linkMetadata,
modifier =
Modifier.clickable {
postActions.viewPost(postDetails.shortId, linkMetadata.url, postDetails.commentsUrl)
postActions.viewPost(post.shortId, linkMetadata.url, post.commentsUrl)
},
)
Spacer(Modifier.height(4.dp))
}
if (postDetails.description.isNotBlank()) {
ThemedRichText(htmlConverter.convertHTMLToMarkdown(postDetails.description))
if (post.description.isNotBlank()) {
ThemedRichText(htmlConverter.convertHTMLToMarkdown(post.description))
Spacer(Modifier.height(4.dp))
}
Submitter(
text = AnnotatedString("Submitted by ${postDetails.submitter.username}"),
avatarUrl = "https://lobste.rs/${postDetails.submitter.avatarUrl}",
contentDescription = "User avatar for ${postDetails.submitter.username}",
text = AnnotatedString("Submitted by ${post.submitter.username}"),
avatarUrl = "https://lobste.rs/${post.submitter.avatarUrl}",
contentDescription = "User avatar for ${post.submitter.username}",
modifier =
Modifier.clickable {
uriHandler.openUri("https://lobste.rs/u/${postDetails.submitter.username}")
uriHandler.openUri("https://lobste.rs/u/${post.submitter.username}")
},
)
}

View file

@ -1,5 +1,5 @@
/*
* Copyright © 2021-2023 Harsh Shandilya.
* Copyright © 2021-2024 Harsh Shandilya.
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT.
@ -36,12 +36,12 @@ import dev.msfjarvis.claw.common.ui.NetworkError
import dev.msfjarvis.claw.common.ui.ProgressBar
import dev.msfjarvis.claw.database.local.PostComments
import dev.msfjarvis.claw.model.Comment
import dev.msfjarvis.claw.model.LobstersPostDetails
import dev.msfjarvis.claw.model.UIPost
@Suppress("LongParameterList")
@Composable
private fun CommentsPageInternal(
details: LobstersPostDetails,
details: UIPost,
postActions: PostActions,
htmlConverter: HTMLConverter,
commentState: PostComments?,
@ -54,11 +54,7 @@ private fun CommentsPageInternal(
Surface(color = MaterialTheme.colorScheme.surfaceVariant) {
LazyColumn(modifier = modifier, contentPadding = PaddingValues(bottom = 24.dp)) {
item {
CommentsHeader(
postDetails = details,
postActions = postActions,
htmlConverter = htmlConverter,
)
CommentsHeader(post = details, postActions = postActions, htmlConverter = htmlConverter)
}
if (commentNodes.isNotEmpty()) {
@ -123,7 +119,7 @@ fun CommentsPage(
when (postDetails) {
is Success<*> -> {
CommentsPageInternal(
details = (postDetails as Success<LobstersPostDetails>).data,
details = (postDetails as Success<UIPost>).data,
postActions = postActions,
htmlConverter = htmlConverter,
commentState = commentState,

View file

@ -51,22 +51,15 @@ import androidx.compose.ui.unit.dp
import dev.msfjarvis.claw.common.theme.LobstersTheme
import dev.msfjarvis.claw.common.ui.NetworkImage
import dev.msfjarvis.claw.common.ui.preview.ThemePreviews
import dev.msfjarvis.claw.database.local.SavedPost
import dev.msfjarvis.claw.model.LinkMetadata
import dev.msfjarvis.claw.model.LobstersPostDetails
import dev.msfjarvis.claw.model.UIPost
import dev.msfjarvis.claw.model.User
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
@Composable
fun LobstersCard(
post: SavedPost,
isSaved: Boolean,
isRead: Boolean,
postActions: PostActions,
modifier: Modifier = Modifier,
) {
var localSavedState by remember(post, isSaved) { mutableStateOf(isSaved) }
fun LobstersCard(post: UIPost, postActions: PostActions, modifier: Modifier = Modifier) {
var localSavedState by remember(post) { mutableStateOf(post.isSaved) }
Box(
modifier =
modifier
@ -79,7 +72,7 @@ fun LobstersCard(
horizontalArrangement = Arrangement.spacedBy(8.dp),
verticalAlignment = Alignment.CenterVertically,
) {
PostDetails(modifier = Modifier.weight(1f), post = post, isRead = isRead)
PostDetails(modifier = Modifier.weight(1f), post = post)
Column(
modifier = Modifier.wrapContentHeight(),
verticalArrangement = Arrangement.spacedBy(8.dp),
@ -108,15 +101,15 @@ fun LobstersCard(
}
@Composable
fun PostDetails(post: SavedPost, isRead: Boolean, modifier: Modifier = Modifier) {
fun PostDetails(post: UIPost, modifier: Modifier = Modifier) {
Column(modifier = modifier, verticalArrangement = Arrangement.spacedBy(8.dp)) {
PostTitle(title = post.title, isRead = isRead)
PostTitle(title = post.title, isRead = post.isRead)
TagRow(tags = post.tags.toImmutableList())
Spacer(Modifier.height(4.dp))
Submitter(
text = AnnotatedString("Submitted by ${post.submitterName}"),
avatarUrl = "https://lobste.rs/${post.submitterAvatarUrl}",
contentDescription = "User avatar for ${post.submitterName}",
text = AnnotatedString("Submitted by ${post.submitter.username}"),
avatarUrl = "https://lobste.rs/${post.submitter.avatarUrl}",
contentDescription = "User avatar for ${post.submitter.username}",
)
}
}
@ -234,20 +227,19 @@ private fun LobstersCardPreview() {
LobstersTheme {
LobstersCard(
post =
SavedPost(
UIPost(
shortId = "ooga",
title = "Simple Anomaly Detection Using Plain SQL",
url = "https://hakibenita.com/sql-anomaly-detection",
createdAt = "2020-09-21T08:04:24.000-05:00",
commentCount = 1,
commentsUrl = "https://lobste.rs/s/q1hh1g/simple_anomaly_detection_using_plain_sql",
submitterName = "Haki",
submitterAvatarUrl = "/avatars/Haki-100.png",
submitter = User("Haki", "", "", "/avatars/Haki-100.png", ""),
tags = listOf("databases", "apis"),
description = "",
isSaved = true,
isRead = true,
),
isRead = true,
isSaved = true,
postActions =
object : PostActions {
override fun viewPost(postId: String, postUrl: String, commentsUrl: String) {}
@ -256,10 +248,10 @@ private fun LobstersCardPreview() {
override fun viewCommentsPage(commentsUrl: String) {}
override fun toggleSave(post: SavedPost) {}
override fun toggleSave(post: UIPost) {}
override suspend fun getComments(postId: String): LobstersPostDetails {
return LobstersPostDetails(
override suspend fun getComments(postId: String): UIPost {
return UIPost(
shortId = "ooga",
title = "Simple Anomaly Detection Using Plain SQL",
url = "https://hakibenita.com/sql-anomaly-detection",

View file

@ -1,5 +1,5 @@
/*
* Copyright © 2021-2023 Harsh Shandilya.
* Copyright © 2021-2024 Harsh Shandilya.
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT.
@ -7,9 +7,8 @@
package dev.msfjarvis.claw.common.posts
import androidx.compose.runtime.Stable
import dev.msfjarvis.claw.database.local.SavedPost
import dev.msfjarvis.claw.model.LinkMetadata
import dev.msfjarvis.claw.model.LobstersPostDetails
import dev.msfjarvis.claw.model.UIPost
@Stable
interface PostActions {
@ -19,9 +18,9 @@ interface PostActions {
fun viewCommentsPage(commentsUrl: String)
fun toggleSave(post: SavedPost)
fun toggleSave(post: UIPost)
suspend fun getComments(postId: String): LobstersPostDetails
suspend fun getComments(postId: String): UIPost
suspend fun getLinkMetadata(url: String): LinkMetadata
}