mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 14:07:05 +05:30
fix(android): add Snackbars to data transfer flow
This commit is contained in:
parent
a82d0e7063
commit
79fd814c14
2 changed files with 22 additions and 4 deletions
|
@ -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,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue