mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 12:57:04 +05:30
common: refactor post interactions
This commit is contained in:
parent
2cfdf30f05
commit
45db8e8486
7 changed files with 66 additions and 34 deletions
|
@ -5,29 +5,25 @@ import androidx.compose.foundation.layout.fillMaxSize
|
|||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.lazy.LazyListState
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.paging.LoadState
|
||||
import androidx.paging.compose.LazyPagingItems
|
||||
import com.google.accompanist.swiperefresh.SwipeRefresh
|
||||
import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
|
||||
import dev.msfjarvis.claw.common.posts.PostActions
|
||||
import dev.msfjarvis.claw.database.local.SavedPost
|
||||
import dev.msfjarvis.claw.model.LobstersPost
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@Composable
|
||||
fun HottestPosts(
|
||||
items: LazyPagingItems<LobstersPost>,
|
||||
listState: LazyListState,
|
||||
isPostSaved: suspend (SavedPost) -> Boolean,
|
||||
toggleSave: suspend (SavedPost) -> Unit,
|
||||
reloadPosts: () -> Unit,
|
||||
launchUrl: (String) -> Unit,
|
||||
viewComments: (String) -> Unit,
|
||||
postActions: PostActions,
|
||||
modifier: Modifier,
|
||||
) {
|
||||
val coroutineScope = rememberCoroutineScope()
|
||||
val isRefreshing = items.loadState.refresh == LoadState.Loading
|
||||
SwipeRefresh(
|
||||
state = rememberSwipeRefreshState(isRefreshing),
|
||||
|
@ -38,11 +34,9 @@ fun HottestPosts(
|
|||
} else {
|
||||
NetworkPosts(
|
||||
items = items,
|
||||
launchUrl = launchUrl,
|
||||
listState = listState,
|
||||
isSaved = isPostSaved,
|
||||
viewComments = viewComments,
|
||||
toggleSave = { coroutineScope.launch { toggleSave(it) } },
|
||||
postActions = postActions,
|
||||
modifier = Modifier.padding(top = 16.dp).then(modifier),
|
||||
)
|
||||
}
|
||||
|
|
|
@ -31,8 +31,10 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController
|
|||
import com.mikepenz.markdown.Markdown
|
||||
import dev.msfjarvis.claw.android.viewmodel.ClawViewModel
|
||||
import dev.msfjarvis.claw.common.comments.CommentsPage
|
||||
import dev.msfjarvis.claw.common.posts.PostActions
|
||||
import dev.msfjarvis.claw.common.theme.LobstersTheme
|
||||
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
||||
import dev.msfjarvis.claw.database.local.SavedPost
|
||||
import io.github.furstenheim.CopyDown
|
||||
|
||||
private const val ScrollDelta = 50
|
||||
|
@ -65,6 +67,21 @@ fun LobstersApp(
|
|||
}
|
||||
}
|
||||
}
|
||||
val postActions = remember {
|
||||
object : PostActions {
|
||||
override fun viewPost(postUrl: String, commentsUrl: String) {
|
||||
urlLauncher.launch(postUrl.ifEmpty { commentsUrl })
|
||||
}
|
||||
|
||||
override fun viewComments(postId: String) {
|
||||
navController.navigate("comments/$postId")
|
||||
}
|
||||
|
||||
override fun toggleSave(post: SavedPost) {
|
||||
viewModel.toggleSave(post)
|
||||
}
|
||||
}
|
||||
}
|
||||
LobstersTheme(darkTheme = isSystemInDarkTheme()) {
|
||||
ProvideWindowInsets {
|
||||
val useDarkIcons = MaterialTheme.colors.isLight
|
||||
|
@ -93,10 +110,8 @@ fun LobstersApp(
|
|||
items,
|
||||
listState,
|
||||
viewModel::isPostSaved,
|
||||
viewModel::toggleSave,
|
||||
viewModel::reloadPosts,
|
||||
urlLauncher::launch,
|
||||
{ navController.navigate("comments/$it") },
|
||||
postActions,
|
||||
Modifier.nestedScroll(nestedScrollConnection),
|
||||
)
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ import androidx.compose.ui.unit.dp
|
|||
import androidx.paging.compose.LazyPagingItems
|
||||
import androidx.paging.compose.items
|
||||
import dev.msfjarvis.claw.common.posts.LobstersCard
|
||||
import dev.msfjarvis.claw.common.posts.PostActions
|
||||
import dev.msfjarvis.claw.common.posts.toDbModel
|
||||
import dev.msfjarvis.claw.database.local.SavedPost
|
||||
import dev.msfjarvis.claw.model.LobstersPost
|
||||
|
@ -23,10 +24,8 @@ import kotlinx.coroutines.launch
|
|||
fun NetworkPosts(
|
||||
items: LazyPagingItems<LobstersPost>,
|
||||
listState: LazyListState,
|
||||
launchUrl: (String) -> Unit,
|
||||
isSaved: suspend (SavedPost) -> Boolean,
|
||||
toggleSave: (SavedPost) -> Unit,
|
||||
viewComments: (String) -> Unit,
|
||||
postActions: PostActions,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
val coroutineScope = rememberCoroutineScope()
|
||||
|
@ -42,9 +41,7 @@ fun NetworkPosts(
|
|||
LobstersCard(
|
||||
post = dbModel,
|
||||
isSaved = saved,
|
||||
viewPost = { launchUrl(item.url.ifEmpty { item.commentsUrl }) },
|
||||
viewComments = { viewComments(item.shortId) },
|
||||
toggleSave = { toggleSave(dbModel) },
|
||||
postActions = postActions,
|
||||
modifier = Modifier.padding(bottom = 16.dp, start = 16.dp, end = 16.dp),
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package dev.msfjarvis.claw.android.viewmodel
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import androidx.paging.Pager
|
||||
import androidx.paging.PagingConfig
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
|
@ -15,6 +16,7 @@ import kotlinx.coroutines.flow.collect
|
|||
import kotlinx.coroutines.flow.flow
|
||||
import kotlinx.coroutines.flow.last
|
||||
import kotlinx.coroutines.flow.mapLatest
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
|
@ -39,13 +41,15 @@ constructor(
|
|||
return savedPosts.mapLatest { posts -> post in posts }.last()
|
||||
}
|
||||
|
||||
suspend fun toggleSave(post: SavedPost) {
|
||||
val saved = isPostSaved(post)
|
||||
println("saved=$saved")
|
||||
if (saved) {
|
||||
repository.removePost(post)
|
||||
} else {
|
||||
repository.savePost(post)
|
||||
fun toggleSave(post: SavedPost) {
|
||||
viewModelScope.launch {
|
||||
val saved = isPostSaved(post)
|
||||
println("saved=$saved")
|
||||
if (saved) {
|
||||
repository.removePost(post)
|
||||
} else {
|
||||
repository.savePost(post)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -40,14 +40,12 @@ import dev.msfjarvis.claw.database.local.SavedPost
|
|||
fun LobstersCard(
|
||||
post: SavedPost,
|
||||
isSaved: Boolean,
|
||||
viewPost: () -> Unit,
|
||||
viewComments: (String) -> Unit,
|
||||
toggleSave: () -> Unit,
|
||||
postActions: PostActions,
|
||||
modifier: Modifier = Modifier,
|
||||
) {
|
||||
Card(
|
||||
modifier = Modifier.background(MaterialTheme.colors.primarySurface).then(modifier),
|
||||
onClick = { viewPost() },
|
||||
onClick = { postActions.viewPost(post.url, post.commentsUrl) },
|
||||
) {
|
||||
Column(
|
||||
modifier = Modifier.padding(horizontal = 16.dp, vertical = 4.dp).fillMaxWidth(),
|
||||
|
@ -63,13 +61,13 @@ fun LobstersCard(
|
|||
) {
|
||||
SaveButton(
|
||||
isSaved = isSaved,
|
||||
onClick = toggleSave,
|
||||
onClick = { postActions.toggleSave(post) },
|
||||
)
|
||||
Spacer(
|
||||
modifier = Modifier.width(8.dp),
|
||||
)
|
||||
CommentsButton(
|
||||
onClick = { viewComments(post.shortId) },
|
||||
onClick = { postActions.viewComments(post.shortId) },
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
package dev.msfjarvis.claw.common.posts
|
||||
|
||||
import dev.msfjarvis.claw.database.local.SavedPost
|
||||
|
||||
interface PostActions {
|
||||
fun viewPost(postUrl: String, commentsUrl: String)
|
||||
fun viewComments(postId: String)
|
||||
fun toggleSave(post: SavedPost)
|
||||
}
|
|
@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.padding
|
|||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.rememberLazyListState
|
||||
import androidx.compose.foundation.rememberScrollbarAdapter
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
|
@ -13,10 +14,13 @@ import androidx.compose.ui.window.WindowPlacement
|
|||
import androidx.compose.ui.window.WindowPosition
|
||||
import androidx.compose.ui.window.application
|
||||
import androidx.compose.ui.window.rememberWindowState
|
||||
import dev.msfjarvis.claw.api.LobstersApi
|
||||
import dev.msfjarvis.claw.common.posts.LobstersCard
|
||||
import dev.msfjarvis.claw.common.posts.PostActions
|
||||
import dev.msfjarvis.claw.common.posts.toDbModel
|
||||
import dev.msfjarvis.claw.common.theme.LobstersTheme
|
||||
import dev.msfjarvis.claw.common.urllauncher.UrlLauncher
|
||||
import dev.msfjarvis.claw.database.local.SavedPost
|
||||
import org.pushingpixels.aurora.component.AuroraVerticalScrollbar
|
||||
import org.pushingpixels.aurora.skin.ceruleanSkin
|
||||
import org.pushingpixels.aurora.window.AuroraWindow
|
||||
|
@ -30,6 +34,19 @@ fun main() = application {
|
|||
placement = WindowPlacement.Floating,
|
||||
position = WindowPosition.Aligned(Alignment.Center),
|
||||
)
|
||||
val postActions = remember {
|
||||
object : PostActions {
|
||||
override fun viewPost(postUrl: String, commentsUrl: String) {
|
||||
urlLauncher.launch(postUrl.ifEmpty { commentsUrl })
|
||||
}
|
||||
|
||||
override fun viewComments(postId: String) {
|
||||
urlLauncher.launch("${LobstersApi.BASE_URL}/s/${postId}")
|
||||
}
|
||||
|
||||
override fun toggleSave(post: SavedPost) {}
|
||||
}
|
||||
}
|
||||
AuroraWindow(
|
||||
skin = ceruleanSkin(),
|
||||
title = "Claw",
|
||||
|
@ -53,9 +70,7 @@ fun main() = application {
|
|||
LobstersCard(
|
||||
post = item.toDbModel(),
|
||||
isSaved = false,
|
||||
viewPost = { urlLauncher.launch(item.url.ifEmpty { item.commentsUrl }) },
|
||||
viewComments = { urlLauncher.launch(item.commentsUrl) },
|
||||
toggleSave = {},
|
||||
postActions = postActions,
|
||||
modifier = Modifier.padding(bottom = 16.dp, start = 16.dp, end = 16.dp),
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue