diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/HottestPosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/HottestPosts.kt index 3cb07f20..635e7d30 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/HottestPosts.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/HottestPosts.kt @@ -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, 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), ) } 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 f4cf8455..7ec5985a 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 @@ -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), ) } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/NetworkPosts.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/NetworkPosts.kt index 03f9189a..9e646485 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/NetworkPosts.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/NetworkPosts.kt @@ -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, 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), ) } 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 01c646e6..deccf22b 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 @@ -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) + } } } diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/posts/LobstersItem.kt b/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/posts/LobstersItem.kt index 0a07db7b..2cb4ebba 100644 --- a/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/posts/LobstersItem.kt +++ b/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/posts/LobstersItem.kt @@ -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) }, ) } } diff --git a/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/posts/PostActions.kt b/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/posts/PostActions.kt new file mode 100644 index 00000000..9b1a847b --- /dev/null +++ b/common/src/commonMain/kotlin/dev/msfjarvis/claw/common/posts/PostActions.kt @@ -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) +} diff --git a/desktop/src/jvmMain/kotlin/main.kt b/desktop/src/jvmMain/kotlin/main.kt index f510549d..0e247df9 100644 --- a/desktop/src/jvmMain/kotlin/main.kt +++ b/desktop/src/jvmMain/kotlin/main.kt @@ -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), ) }