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.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,
)
}
}

View file

@ -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")
}
}
}