mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 16:27:06 +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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue