fix(android): add Snackbars to data transfer flow

This commit is contained in:
Harsh Shandilya 2023-06-05 01:50:23 +05:30
parent a82d0e7063
commit 79fd814c14
No known key found for this signature in database
2 changed files with 22 additions and 4 deletions

View file

@ -25,11 +25,14 @@ import androidx.compose.material.icons.outlined.Whatshot
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.windowsizeclass.WindowSizeClass import androidx.compose.material3.windowsizeclass.WindowSizeClass
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -85,6 +88,7 @@ fun LobstersApp(
val savedListState = rememberLazyListState() val savedListState = rememberLazyListState()
val navController = rememberNavController() val navController = rememberNavController()
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
val snackbarHostState = remember { SnackbarHostState() }
val postActions = rememberPostActions(urlLauncher, navController, viewModel) val postActions = rememberPostActions(urlLauncher, navController, viewModel)
val backStackEntry by navController.currentBackStackEntryAsState() val backStackEntry by navController.currentBackStackEntryAsState()
val currentDestination = backStackEntry?.destination?.route val currentDestination = backStackEntry?.destination?.route
@ -171,6 +175,7 @@ fun LobstersApp(
) )
} }
}, },
snackbarHost = { SnackbarHost(snackbarHostState) },
modifier = modifier.semantics { testTagsAsResourceId = true }, modifier = modifier.semantics { testTagsAsResourceId = true },
) { paddingValues -> ) { paddingValues ->
Row(modifier = Modifier.padding(paddingValues)) { Row(modifier = Modifier.padding(paddingValues)) {
@ -252,6 +257,7 @@ fun LobstersApp(
DataTransferScreen( DataTransferScreen(
context = context, context = context,
dataTransferRepository = viewModel.dataTransferRepository, dataTransferRepository = viewModel.dataTransferRepository,
snackbarHostState = snackbarHostState,
) )
} }
} }

View file

@ -18,6 +18,7 @@ import androidx.compose.material.icons.outlined.NorthEast
import androidx.compose.material.icons.outlined.SouthWest import androidx.compose.material.icons.outlined.SouthWest
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.ListItem import androidx.compose.material3.ListItem
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
@ -34,12 +35,13 @@ private const val MIME_TYPE = "application/json"
fun DataTransferScreen( fun DataTransferScreen(
context: Context, context: Context,
dataTransferRepository: DataTransferRepository, dataTransferRepository: DataTransferRepository,
snackbarHostState: SnackbarHostState,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
Column(modifier = modifier) { Column(modifier = modifier) {
ImportOption(context, coroutineScope, dataTransferRepository) ImportOption(context, coroutineScope, dataTransferRepository, snackbarHostState)
ExportOption(context, coroutineScope, dataTransferRepository) ExportOption(context, coroutineScope, dataTransferRepository, snackbarHostState)
} }
} }
@ -48,13 +50,18 @@ private fun ImportOption(
context: Context, context: Context,
coroutineScope: CoroutineScope, coroutineScope: CoroutineScope,
dataTransferRepository: DataTransferRepository, dataTransferRepository: DataTransferRepository,
snackbarHostState: SnackbarHostState,
) { ) {
val importAction = val importAction =
rememberLauncherForActivityResult(GetContent()) { uri -> rememberLauncherForActivityResult(GetContent()) { uri ->
if (uri == null) return@rememberLauncherForActivityResult if (uri == null) {
coroutineScope.launch { snackbarHostState.showSnackbar("No file selected") }
return@rememberLauncherForActivityResult
}
coroutineScope.launch { coroutineScope.launch {
context.contentResolver.openInputStream(uri)?.use { stream -> context.contentResolver.openInputStream(uri)?.use { stream ->
dataTransferRepository.importPosts(stream) dataTransferRepository.importPosts(stream)
snackbarHostState.showSnackbar("Successfully imported posts")
} }
} }
} }
@ -72,13 +79,18 @@ private fun ExportOption(
context: Context, context: Context,
coroutineScope: CoroutineScope, coroutineScope: CoroutineScope,
dataTransferRepository: DataTransferRepository, dataTransferRepository: DataTransferRepository,
snackbarHostState: SnackbarHostState,
) { ) {
val exportAction = val exportAction =
rememberLauncherForActivityResult(CreateDocument(MIME_TYPE)) { uri -> rememberLauncherForActivityResult(CreateDocument(MIME_TYPE)) { uri ->
if (uri == null) return@rememberLauncherForActivityResult if (uri == null) {
coroutineScope.launch { snackbarHostState.showSnackbar("No file selected") }
return@rememberLauncherForActivityResult
}
coroutineScope.launch { coroutineScope.launch {
context.contentResolver.openOutputStream(uri)?.use { stream -> context.contentResolver.openOutputStream(uri)?.use { stream ->
dataTransferRepository.exportPosts(stream) dataTransferRepository.exportPosts(stream)
snackbarHostState.showSnackbar("Successfully exported posts")
} }
} }
} }