all: introduce and migrate to ExtendedPostDetails

This commit is contained in:
Harsh Shandilya 2022-08-05 23:03:46 +05:30
parent 87b1377f38
commit 23298dd0f5
No known key found for this signature in database
GPG key ID: 366D7BBAD1031E80
6 changed files with 60 additions and 15 deletions

View file

@ -42,6 +42,8 @@ dependencies {
implementation(projects.api) implementation(projects.api)
implementation(projects.common) implementation(projects.common)
implementation(projects.database) implementation(projects.database)
implementation(projects.metadataExtractor)
implementation(projects.model)
implementation(libs.accompanist.swiperefresh) implementation(libs.accompanist.swiperefresh)
implementation(libs.accompanist.sysuicontroller) implementation(libs.accompanist.sysuicontroller)
implementation(libs.androidx.activity.compose) implementation(libs.androidx.activity.compose)

View file

@ -22,7 +22,8 @@ class ClawViewModel
@Inject @Inject
constructor( constructor(
private val api: LobstersApi, private val api: LobstersApi,
private val repository: SavedPostsRepository, private val savedPostsRepository: SavedPostsRepository,
private val postDetailsRepository: PostDetailsRepository,
) : ViewModel() { ) : ViewModel() {
private var hottestPostsPagingSource: LobstersPagingSource? = null private var hottestPostsPagingSource: LobstersPagingSource? = null
private var newestPostsPagingSource: LobstersPagingSource? = null private var newestPostsPagingSource: LobstersPagingSource? = null
@ -42,7 +43,7 @@ constructor(
get() = newestPostsPager.flow get() = newestPostsPager.flow
private val savedPostsFlow private val savedPostsFlow
get() = repository.savedPosts get() = savedPostsRepository.savedPosts
val savedPosts val savedPosts
get() = savedPostsFlow.map(::mapSavedPosts) get() = savedPostsFlow.map(::mapSavedPosts)
@ -60,15 +61,19 @@ constructor(
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
val saved = isPostSaved(post) val saved = isPostSaved(post)
if (saved) { if (saved) {
repository.removePost(post) savedPostsRepository.removePost(post)
} else { } else {
repository.savePost(post) savedPostsRepository.savePost(post)
} }
} }
} }
suspend fun getPostComments(postId: String) = suspend fun getPostComments(postId: String) =
withContext(Dispatchers.IO) { api.getPostDetails(postId) } withContext(Dispatchers.IO) {
val details = api.getPostDetails(postId)
val extendedDetails = postDetailsRepository.getExtendedDetails(details)
extendedDetails
}
suspend fun getUserProfile(username: String) = suspend fun getUserProfile(username: String) =
withContext(Dispatchers.IO) { api.getUser(username) } withContext(Dispatchers.IO) { api.getUser(username) }

View file

@ -0,0 +1,25 @@
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,
)
}
}

View file

@ -33,11 +33,11 @@ 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.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.ExtendedPostDetails
@Composable @Composable
fun CommentsHeader( fun CommentsHeader(
postDetails: LobstersPostDetails, postDetails: ExtendedPostDetails,
postActions: PostActions, postActions: PostActions,
) { ) {
val htmlConverter = LocalHTMLConverter.current val htmlConverter = LocalHTMLConverter.current
@ -52,11 +52,13 @@ fun CommentsHeader(
TagRow(tags = postDetails.tags) TagRow(tags = postDetails.tags)
Spacer(Modifier.height(4.dp)) Spacer(Modifier.height(4.dp))
if (postDetails.url.isNotBlank()) { if (postDetails.linkMetadata.url.isNotBlank()) {
PostLink( PostLink(
link = postDetails.url, link = postDetails.linkMetadata.url,
modifier = modifier =
Modifier.clickable { postActions.viewPost(postDetails.url, postDetails.commentsUrl) }, Modifier.clickable {
postActions.viewPost(postDetails.linkMetadata.url, postDetails.commentsUrl)
},
) )
Spacer(Modifier.height(4.dp)) Spacer(Modifier.height(4.dp))
} }

View file

@ -21,11 +21,11 @@ import dev.msfjarvis.claw.common.NetworkState
import dev.msfjarvis.claw.common.posts.PostActions import dev.msfjarvis.claw.common.posts.PostActions
import dev.msfjarvis.claw.common.ui.NetworkError import dev.msfjarvis.claw.common.ui.NetworkError
import dev.msfjarvis.claw.common.ui.ProgressBar import dev.msfjarvis.claw.common.ui.ProgressBar
import dev.msfjarvis.claw.model.LobstersPostDetails import dev.msfjarvis.claw.model.ExtendedPostDetails
@Composable @Composable
private fun CommentsPageInternal( private fun CommentsPageInternal(
details: LobstersPostDetails, details: ExtendedPostDetails,
postActions: PostActions, postActions: PostActions,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
@ -33,7 +33,7 @@ private fun CommentsPageInternal(
LazyColumn(modifier = modifier, contentPadding = PaddingValues(bottom = 24.dp)) { LazyColumn(modifier = modifier, contentPadding = PaddingValues(bottom = 24.dp)) {
item { CommentsHeader(postDetails = details, postActions = postActions) } item { CommentsHeader(postDetails = details, postActions = postActions) }
if (details.commentCount > 0) { if (details.comments.isNotEmpty()) {
item { item {
Text( Text(
text = "Comments", text = "Comments",
@ -67,7 +67,7 @@ private fun CommentsPageInternal(
@Composable @Composable
fun CommentsPage( fun CommentsPage(
postId: String, postId: String,
getDetails: suspend (String) -> LobstersPostDetails, getDetails: suspend (String) -> ExtendedPostDetails,
postActions: PostActions, postActions: PostActions,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
@ -79,7 +79,7 @@ fun CommentsPage(
when (postDetails) { when (postDetails) {
is NetworkState.Success<*> -> { is NetworkState.Success<*> -> {
CommentsPageInternal( CommentsPageInternal(
(postDetails as NetworkState.Success<LobstersPostDetails>).data, (postDetails as NetworkState.Success<ExtendedPostDetails>).data,
postActions, postActions,
modifier.fillMaxSize(), modifier.fillMaxSize(),
) )

View file

@ -0,0 +1,11 @@
package dev.msfjarvis.claw.model
class ExtendedPostDetails(
val title: String,
val linkMetadata: LinkMetadata,
val description: String,
val submitter: User,
val tags: List<String>,
val comments: List<Comment>,
val commentsUrl: String,
)