Improved the SnackbarHostStateExtension for better reusability.

This commit is contained in:
MohitMaliFtechiz 2025-03-10 14:12:19 +05:30 committed by MohitMaliFtechiz
parent bf4ff3c22f
commit f24e28ed45
4 changed files with 82 additions and 9 deletions

View File

@ -78,7 +78,7 @@ fun ErrorActivityScreen(
horizontalAlignment = Alignment.CenterHorizontally
) {
CrashTitle(crashTitleStringId)
CrashImage()
AppIcon()
CrashMessage(messageStringId)
CrashCheckBoxList(
checkBoxData,
@ -121,7 +121,7 @@ private fun CrashTitle(
}
@Composable
private fun CrashImage() {
private fun AppIcon() {
Image(
bitmap = ImageBitmap.loadBitmapFromMipmap(LocalContext.current, R.mipmap.ic_launcher),
contentDescription = stringResource(id = string.app_name),

View File

@ -18,26 +18,47 @@
package org.kiwix.kiwixmobile.core.extensions
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Snackbar
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.SnackbarResult
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
/**
* A custom Snackbar host for displaying snackbars with a consistent style in the Kiwix app.
*
* This Composable wraps the default [SnackbarHost] and applies a custom action text color
* using the primary color from the Material theme.
*
* @param snackbarHostState The state that controls the visibility and content of the Snackbar.
*/
@Composable
fun rememberSnackbarHostState(): SnackbarHostState = remember { SnackbarHostState() }
fun KiwixSnackbarHost(snackbarHostState: SnackbarHostState) {
SnackbarHost(hostState = snackbarHostState) { snackbarData ->
Snackbar(
snackbarData = snackbarData,
actionColor = MaterialTheme.colorScheme.primary
)
}
}
fun SnackbarHostState.snack(
message: String,
actionLabel: String? = null,
actionClick: (() -> Unit)? = null,
// Default duration is 4 seconds.
snackbarDuration: SnackbarDuration = SnackbarDuration.Short,
lifecycleScope: CoroutineScope
) {
lifecycleScope.launch {
val result = showSnackbar(
message = message,
actionLabel = actionLabel
actionLabel = actionLabel,
duration = snackbarDuration
)
if (result == SnackbarResult.ActionPerformed) {
actionClick?.invoke()

View File

@ -33,6 +33,7 @@ import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Share
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.TextFieldValue
@ -44,7 +45,6 @@ import org.kiwix.kiwixmobile.core.CoreApp.Companion.coreComponent
import org.kiwix.kiwixmobile.core.CoreApp.Companion.instance
import org.kiwix.kiwixmobile.core.R
import org.kiwix.kiwixmobile.core.extensions.closeKeyboard
import org.kiwix.kiwixmobile.core.extensions.rememberSnackbarHostState
import org.kiwix.kiwixmobile.core.extensions.snack
import org.kiwix.kiwixmobile.core.extensions.toast
import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem
@ -173,7 +173,7 @@ class AddNoteDialog : DialogFragment() {
savedInstanceState: Bundle?
): View? = ComposeView(requireContext()).apply {
setContent {
snackBarHostState = rememberSnackbarHostState()
snackBarHostState = remember { SnackbarHostState() }
AddNoteDialogScreen(
articleTitle.toString(),
navigationIcon = {

View File

@ -18,16 +18,20 @@
package org.kiwix.kiwixmobile.core.main
import android.content.res.Configuration
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Share
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
@ -46,9 +50,15 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.tooling.preview.Preview
import org.kiwix.kiwixmobile.core.R
import org.kiwix.kiwixmobile.core.extensions.KiwixSnackbarHost
import org.kiwix.kiwixmobile.core.ui.components.KiwixAppBar
import org.kiwix.kiwixmobile.core.ui.components.NavigationIcon
import org.kiwix.kiwixmobile.core.ui.models.ActionMenuItem
import org.kiwix.kiwixmobile.core.ui.models.IconItem
import org.kiwix.kiwixmobile.core.ui.models.IconItem.Drawable
import org.kiwix.kiwixmobile.core.ui.models.IconItem.Vector
import org.kiwix.kiwixmobile.core.ui.theme.KiwixTheme
import org.kiwix.kiwixmobile.core.utils.ComposeDimens.FIVE_DP
import org.kiwix.kiwixmobile.core.utils.ComposeDimens.FOUR_DP
@ -70,11 +80,14 @@ fun AddNoteDialogScreen(
val focusRequester = remember { FocusRequester() }
val focusManager = LocalFocusManager.current
KiwixTheme {
Scaffold(snackbarHost = { SnackbarHost(hostState = snackBarHostState) }) { paddingValues ->
Scaffold(
snackbarHost = { KiwixSnackbarHost(snackbarHostState = snackBarHostState) }
) { paddingValues ->
Column(
modifier = Modifier
.fillMaxWidth()
.background(Color.Transparent)
.imePadding()
.padding(paddingValues),
) {
KiwixAppBar(R.string.note, navigationIcon, actionMenuItems)
@ -145,3 +158,42 @@ private fun NoteTextField(
)
)
}
@Preview
@Preview(name = "Night mode", uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
fun PreviewAddNoteDialog() {
AddNoteDialogScreen(
"Demo note",
navigationIcon = {
NavigationIcon(
iconItem = IconItem.Drawable(R.drawable.ic_close_white_24dp),
onClick = {}
)
},
noteText = TextFieldValue(""),
actionMenuItems = listOf(
ActionMenuItem(
Vector(Icons.Default.Delete),
R.string.delete,
{ },
isEnabled = false
),
ActionMenuItem(
Vector(Icons.Default.Share),
R.string.share,
{ },
isEnabled = false
),
ActionMenuItem(
Drawable(R.drawable.ic_save),
R.string.save,
{ },
isEnabled = false
)
),
onTextChange = { text -> },
isNoteFileExist = true,
snackBarHostState = SnackbarHostState()
)
}