From 79fd814c14f14e6c517627719ac84fdd202ac2e2 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Mon, 5 Jun 2023 01:50:23 +0530 Subject: [PATCH] fix(android): add Snackbars to data transfer flow --- .../msfjarvis/claw/android/ui/LobstersApp.kt | 6 ++++++ .../ui/datatransfer/DataTransferScreen.kt | 20 +++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) 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 3c14b376..c135de94 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 @@ -25,11 +25,14 @@ import androidx.compose.material.icons.outlined.Whatshot import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.material3.windowsizeclass.WindowSizeClass import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier @@ -85,6 +88,7 @@ fun LobstersApp( val savedListState = rememberLazyListState() val navController = rememberNavController() val coroutineScope = rememberCoroutineScope() + val snackbarHostState = remember { SnackbarHostState() } val postActions = rememberPostActions(urlLauncher, navController, viewModel) val backStackEntry by navController.currentBackStackEntryAsState() val currentDestination = backStackEntry?.destination?.route @@ -171,6 +175,7 @@ fun LobstersApp( ) } }, + snackbarHost = { SnackbarHost(snackbarHostState) }, modifier = modifier.semantics { testTagsAsResourceId = true }, ) { paddingValues -> Row(modifier = Modifier.padding(paddingValues)) { @@ -252,6 +257,7 @@ fun LobstersApp( DataTransferScreen( context = context, dataTransferRepository = viewModel.dataTransferRepository, + snackbarHostState = snackbarHostState, ) } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt index 441f03b9..572a7768 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt @@ -18,6 +18,7 @@ import androidx.compose.material.icons.outlined.NorthEast import androidx.compose.material.icons.outlined.SouthWest import androidx.compose.material3.Icon import androidx.compose.material3.ListItem +import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.rememberCoroutineScope @@ -34,12 +35,13 @@ private const val MIME_TYPE = "application/json" fun DataTransferScreen( context: Context, dataTransferRepository: DataTransferRepository, + snackbarHostState: SnackbarHostState, modifier: Modifier = Modifier, ) { val coroutineScope = rememberCoroutineScope() Column(modifier = modifier) { - ImportOption(context, coroutineScope, dataTransferRepository) - ExportOption(context, coroutineScope, dataTransferRepository) + ImportOption(context, coroutineScope, dataTransferRepository, snackbarHostState) + ExportOption(context, coroutineScope, dataTransferRepository, snackbarHostState) } } @@ -48,13 +50,18 @@ private fun ImportOption( context: Context, coroutineScope: CoroutineScope, dataTransferRepository: DataTransferRepository, + snackbarHostState: SnackbarHostState, ) { val importAction = rememberLauncherForActivityResult(GetContent()) { uri -> - if (uri == null) return@rememberLauncherForActivityResult + if (uri == null) { + coroutineScope.launch { snackbarHostState.showSnackbar("No file selected") } + return@rememberLauncherForActivityResult + } coroutineScope.launch { context.contentResolver.openInputStream(uri)?.use { stream -> dataTransferRepository.importPosts(stream) + snackbarHostState.showSnackbar("Successfully imported posts") } } } @@ -72,13 +79,18 @@ private fun ExportOption( context: Context, coroutineScope: CoroutineScope, dataTransferRepository: DataTransferRepository, + snackbarHostState: SnackbarHostState, ) { val exportAction = rememberLauncherForActivityResult(CreateDocument(MIME_TYPE)) { uri -> - if (uri == null) return@rememberLauncherForActivityResult + if (uri == null) { + coroutineScope.launch { snackbarHostState.showSnackbar("No file selected") } + return@rememberLauncherForActivityResult + } coroutineScope.launch { context.contentResolver.openOutputStream(uri)?.use { stream -> dataTransferRepository.exportPosts(stream) + snackbarHostState.showSnackbar("Successfully exported posts") } } }