From 79aba9a18708fbf3e4aabc31fda89ab784c52a43 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Sun, 16 Oct 2022 12:21:19 +0530 Subject: [PATCH] feat: load link metadata lazily --- .../msfjarvis/claw/android/ui/LobstersApp.kt | 1 + .../claw/android/viewmodel/ClawViewModel.kt | 22 ++++++++-------- .../viewmodel/LinkMetadataRepository.kt | 15 +++++++++++ .../viewmodel/PostDetailsRepository.kt | 25 ------------------- .../claw/common/comments/CommentEntry.kt | 20 +++++++++------ .../claw/common/comments/Comments.kt | 15 +++++++---- .../claw/model/ExtendedPostDetails.kt | 13 ---------- 7 files changed, 50 insertions(+), 61 deletions(-) create mode 100644 android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/LinkMetadataRepository.kt delete mode 100644 android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/PostDetailsRepository.kt delete mode 100644 model/src/main/kotlin/dev/msfjarvis/claw/model/ExtendedPostDetails.kt diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt index b885b114..c0329f24 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/LobstersApp.kt @@ -206,6 +206,7 @@ fun LobstersApp( CommentsPage( postId = postId, getDetails = viewModel::getPostComments, + getLinkMetadata = viewModel::getLinkMetadata, postActions = postActions, htmlConverter = htmlConverter, ) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt index 04dbbb60..9a83c8ce 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/ClawViewModel.kt @@ -27,7 +27,7 @@ class ClawViewModel constructor( private val api: LobstersApi, private val savedPostsRepository: SavedPostsRepository, - private val postDetailsRepository: PostDetailsRepository, + private val linkMetadataRepository: LinkMetadataRepository, private val pagingSourceFactory: LobstersPagingSource.Factory, @IODispatcher private val ioDispatcher: CoroutineDispatcher, ) : ViewModel() { @@ -76,18 +76,18 @@ constructor( suspend fun getPostComments(postId: String) = withContext(ioDispatcher) { - val details = - when (val result = api.getPostDetails(postId)) { - is Success -> result.value - is Failure.NetworkFailure -> throw result.error - is Failure.UnknownFailure -> throw result.error - is Failure.HttpFailure, - is Failure.ApiFailure -> throw IOException("API returned an invalid response") - } - val extendedDetails = postDetailsRepository.getExtendedDetails(details) - extendedDetails + when (val result = api.getPostDetails(postId)) { + is Success -> result.value + is Failure.NetworkFailure -> throw result.error + is Failure.UnknownFailure -> throw result.error + is Failure.HttpFailure, + is Failure.ApiFailure -> throw IOException("API returned an invalid response") + } } + suspend fun getLinkMetadata(url: String) = + withContext(ioDispatcher) { linkMetadataRepository.getLinkMetadata(url) } + suspend fun getUserProfile(username: String) = withContext(ioDispatcher) { when (val result = api.getUser(username)) { diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/LinkMetadataRepository.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/LinkMetadataRepository.kt new file mode 100644 index 00000000..5b76fe31 --- /dev/null +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/LinkMetadataRepository.kt @@ -0,0 +1,15 @@ +package dev.msfjarvis.claw.android.viewmodel + +import dev.msfjarvis.claw.metadata.MetadataExtractor +import dev.msfjarvis.claw.model.LinkMetadata +import javax.inject.Inject + +class LinkMetadataRepository +@Inject +constructor( + private val metadataExtractor: MetadataExtractor, +) { + suspend fun getLinkMetadata(url: String): LinkMetadata { + return metadataExtractor.getExtractedMetadata(url) + } +} diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/PostDetailsRepository.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/PostDetailsRepository.kt deleted file mode 100644 index d4e50b57..00000000 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/viewmodel/PostDetailsRepository.kt +++ /dev/null @@ -1,25 +0,0 @@ -package dev.msfjarvis.claw.android.viewmodel - -import dev.msfjarvis.claw.metadata.MetadataExtractor -import dev.msfjarvis.claw.model.ExtendedPostDetails -import dev.msfjarvis.claw.model.LobstersPostDetails -import javax.inject.Inject - -class PostDetailsRepository -@Inject -constructor( - private val metadataExtractor: MetadataExtractor, -) { - suspend fun getExtendedDetails(details: LobstersPostDetails): ExtendedPostDetails { - val metadata = metadataExtractor.getExtractedMetadata(details.url) - return ExtendedPostDetails( - title = details.title, - linkMetadata = metadata, - description = details.description, - submitter = details.submitter, - tags = details.tags, - comments = details.comments, - commentsUrl = details.commentsUrl, - ) - } -} diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt index 3b3cd62f..9e2fd941 100644 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt +++ b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/CommentEntry.kt @@ -23,6 +23,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier @@ -40,19 +41,26 @@ import dev.msfjarvis.claw.common.res.ClawIcons import dev.msfjarvis.claw.common.ui.NetworkImage import dev.msfjarvis.claw.common.ui.ThemedRichText import dev.msfjarvis.claw.model.Comment -import dev.msfjarvis.claw.model.ExtendedPostDetails import dev.msfjarvis.claw.model.LinkMetadata +import dev.msfjarvis.claw.model.LobstersPostDetails import java.time.Instant import java.time.temporal.TemporalAccessor @Composable fun CommentsHeader( - postDetails: ExtendedPostDetails, + postDetails: LobstersPostDetails, + getLinkMetadata: suspend (String) -> LinkMetadata, postActions: PostActions, htmlConverter: HTMLConverter, modifier: Modifier = Modifier, ) { val uriHandler = LocalUriHandler.current + val linkMetadata by + produceState( + initialValue = LinkMetadata(postDetails.url, null, null), + ) { + value = getLinkMetadata(postDetails.url) + } Surface(color = MaterialTheme.colorScheme.background, modifier = modifier) { Column( @@ -63,13 +71,11 @@ fun CommentsHeader( TagRow(tags = postDetails.tags) Spacer(Modifier.height(4.dp)) - if (postDetails.linkMetadata.url.isNotBlank()) { + if (linkMetadata.url.isNotBlank()) { PostLink( - linkMetadata = postDetails.linkMetadata, + linkMetadata = linkMetadata, modifier = - Modifier.clickable { - postActions.viewPost(postDetails.linkMetadata.url, postDetails.commentsUrl) - }, + Modifier.clickable { postActions.viewPost(linkMetadata.url, postDetails.commentsUrl) }, ) Spacer(Modifier.height(4.dp)) } diff --git a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/Comments.kt b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/Comments.kt index 25495dc0..6bfd01e8 100644 --- a/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/Comments.kt +++ b/common/src/main/kotlin/dev/msfjarvis/claw/common/comments/Comments.kt @@ -24,11 +24,13 @@ import dev.msfjarvis.claw.common.NetworkState.Success import dev.msfjarvis.claw.common.posts.PostActions import dev.msfjarvis.claw.common.ui.NetworkError import dev.msfjarvis.claw.common.ui.ProgressBar -import dev.msfjarvis.claw.model.ExtendedPostDetails +import dev.msfjarvis.claw.model.LinkMetadata +import dev.msfjarvis.claw.model.LobstersPostDetails @Composable private fun CommentsPageInternal( - details: ExtendedPostDetails, + details: LobstersPostDetails, + getLinkMetadata: suspend (String) -> LinkMetadata, postActions: PostActions, htmlConverter: HTMLConverter, modifier: Modifier = Modifier, @@ -38,6 +40,7 @@ private fun CommentsPageInternal( item { CommentsHeader( postDetails = details, + getLinkMetadata = getLinkMetadata, postActions = postActions, htmlConverter = htmlConverter, ) @@ -73,11 +76,12 @@ private fun CommentsPageInternal( } } -@Suppress("UNCHECKED_CAST") +@Suppress("UNCHECKED_CAST", "LongParameterList") @Composable fun CommentsPage( postId: String, - getDetails: suspend (String) -> ExtendedPostDetails, + getDetails: suspend (String) -> LobstersPostDetails, + getLinkMetadata: suspend (String) -> LinkMetadata, postActions: PostActions, htmlConverter: HTMLConverter, modifier: Modifier = Modifier, @@ -94,7 +98,8 @@ fun CommentsPage( when (postDetails) { is Success<*> -> { CommentsPageInternal( - details = (postDetails as Success).data, + details = (postDetails as Success).data, + getLinkMetadata = getLinkMetadata, postActions = postActions, htmlConverter = htmlConverter, modifier = modifier.fillMaxSize(), diff --git a/model/src/main/kotlin/dev/msfjarvis/claw/model/ExtendedPostDetails.kt b/model/src/main/kotlin/dev/msfjarvis/claw/model/ExtendedPostDetails.kt deleted file mode 100644 index 4a1cb0e0..00000000 --- a/model/src/main/kotlin/dev/msfjarvis/claw/model/ExtendedPostDetails.kt +++ /dev/null @@ -1,13 +0,0 @@ -@file:Suppress("LongParameterList") - -package dev.msfjarvis.claw.model - -class ExtendedPostDetails( - val title: String, - val linkMetadata: LinkMetadata, - val description: String, - val submitter: User, - val tags: List, - val comments: List, - val commentsUrl: String, -)