feat(android): add share action

This commit is contained in:
Harsh Shandilya 2024-05-20 01:36:26 +05:30
parent b56de40b12
commit b12b5c800f
7 changed files with 34 additions and 4 deletions

View file

@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Added
- Swiping a post from left to right now offers a share action
## [1.47.0] - 2024-05-14 ## [1.47.0] - 2024-05-14
### Changed ### Changed

View file

@ -8,6 +8,7 @@ package dev.msfjarvis.claw.android.ui
import android.content.Context import android.content.Context
import android.content.ContextWrapper import android.content.ContextWrapper
import android.content.Intent
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -29,6 +30,7 @@ fun Context.getActivity(): ComponentActivity? {
@Composable @Composable
fun rememberPostActions( fun rememberPostActions(
context: Context,
urlLauncher: UrlLauncher, urlLauncher: UrlLauncher,
navController: NavController, navController: NavController,
viewModel: ClawViewModel, viewModel: ClawViewModel,
@ -56,6 +58,18 @@ fun rememberPostActions(
viewModel.toggleSave(post) viewModel.toggleSave(post)
} }
override fun share(post: UIPost) {
val sendIntent: Intent =
Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, post.url.ifEmpty { post.commentsUrl })
putExtra(Intent.EXTRA_TITLE, post.title)
type = "text/plain"
}
val shareIntent = Intent.createChooser(sendIntent, null)
context.startActivity(shareIntent)
}
override suspend fun getComments(postId: String): UIPost { override suspend fun getComments(postId: String): UIPost {
return viewModel.getPostComments(postId) return viewModel.getPostComments(postId)
} }

View file

@ -8,6 +8,7 @@ package dev.msfjarvis.claw.android.ui.lists
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.Reply import androidx.compose.material.icons.automirrored.filled.Reply
import androidx.compose.material.icons.filled.Share
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -31,7 +32,13 @@ fun LobstersListItem(
background = MaterialTheme.colorScheme.tertiary, background = MaterialTheme.colorScheme.tertiary,
onSwipe = { postActions.viewCommentsPage(item) }, onSwipe = { postActions.viewCommentsPage(item) },
) )
SwipeableActionsBox(endActions = listOf(commentsAction)) { val shareAction =
SwipeAction(
icon = rememberVectorPainter(Icons.Filled.Share),
background = MaterialTheme.colorScheme.tertiary,
onSwipe = { postActions.share(item) },
)
SwipeableActionsBox(startActions = listOf(shareAction), endActions = listOf(commentsAction)) {
LobstersCard(post = item, postActions = postActions, refresh = refresh, modifier = modifier) LobstersCard(post = item, postActions = postActions, refresh = refresh, modifier = modifier)
} }
} }

View file

@ -91,16 +91,16 @@ fun LobstersPostsScreen(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
viewModel: ClawViewModel = injectedViewModel(), viewModel: ClawViewModel = injectedViewModel(),
) { ) {
val context = LocalContext.current
val hottestListState = rememberLazyListState() val hottestListState = rememberLazyListState()
val newestListState = rememberLazyListState() val newestListState = rememberLazyListState()
val savedListState = rememberLazyListState() val savedListState = rememberLazyListState()
val navController = rememberNavController() val navController = rememberNavController()
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
val postActions = rememberPostActions(urlLauncher, navController, viewModel) val postActions = rememberPostActions(context, urlLauncher, navController, viewModel)
val backStackEntry by navController.currentBackStackEntryAsState() val backStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = backStackEntry?.destination?.route val currentDestination = backStackEntry?.destination?.route
val context = LocalContext.current
val hottestPosts = viewModel.hottestPosts.collectAsLazyPagingItems() val hottestPosts = viewModel.hottestPosts.collectAsLazyPagingItems()
val newestPosts = viewModel.newestPosts.collectAsLazyPagingItems() val newestPosts = viewModel.newestPosts.collectAsLazyPagingItems()

View file

@ -11,6 +11,7 @@ import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavType import androidx.navigation.NavType
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
@ -35,7 +36,7 @@ fun SearchScreen(
viewModel: ClawViewModel = injectedViewModel(), viewModel: ClawViewModel = injectedViewModel(),
) { ) {
val navController = rememberNavController() val navController = rememberNavController()
val postActions = rememberPostActions(urlLauncher, navController, viewModel) val postActions = rememberPostActions(LocalContext.current, urlLauncher, navController, viewModel)
val listState = rememberLazyListState() val listState = rememberLazyListState()
Scaffold(modifier = modifier) { paddingValues -> Scaffold(modifier = modifier) { paddingValues ->
NavHost( NavHost(

View file

@ -265,6 +265,8 @@ val TEST_POST_ACTIONS =
override fun toggleSave(post: UIPost) {} override fun toggleSave(post: UIPost) {}
override fun share(post: UIPost) {}
override suspend fun getComments(postId: String): UIPost { override suspend fun getComments(postId: String): UIPost {
return UIPost( return UIPost(
shortId = "ooga", shortId = "ooga",

View file

@ -20,6 +20,8 @@ interface PostActions {
fun toggleSave(post: UIPost) fun toggleSave(post: UIPost)
fun share(post: UIPost)
suspend fun getComments(postId: String): UIPost suspend fun getComments(postId: String): UIPost
suspend fun getLinkMetadata(url: String): LinkMetadata suspend fun getLinkMetadata(url: String): LinkMetadata