mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-13 19:37:00 +05:30
all: introduce and migrate to ExtendedPostDetails
This commit is contained in:
parent
87b1377f38
commit
23298dd0f5
6 changed files with 60 additions and 15 deletions
|
@ -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)
|
||||||
|
|
|
@ -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) }
|
||||||
|
|
|
@ -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,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(),
|
||||||
)
|
)
|
||||||
|
|
|
@ -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,
|
||||||
|
)
|
Loading…
Add table
Add a link
Reference in a new issue