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

View File

@ -18,26 +18,47 @@
package org.kiwix.kiwixmobile.core.extensions 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.SnackbarHostState
import androidx.compose.material3.SnackbarResult import androidx.compose.material3.SnackbarResult
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch 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 @Composable
fun rememberSnackbarHostState(): SnackbarHostState = remember { SnackbarHostState() } fun KiwixSnackbarHost(snackbarHostState: SnackbarHostState) {
SnackbarHost(hostState = snackbarHostState) { snackbarData ->
Snackbar(
snackbarData = snackbarData,
actionColor = MaterialTheme.colorScheme.primary
)
}
}
fun SnackbarHostState.snack( fun SnackbarHostState.snack(
message: String, message: String,
actionLabel: String? = null, actionLabel: String? = null,
actionClick: (() -> Unit)? = null, actionClick: (() -> Unit)? = null,
// Default duration is 4 seconds.
snackbarDuration: SnackbarDuration = SnackbarDuration.Short,
lifecycleScope: CoroutineScope lifecycleScope: CoroutineScope
) { ) {
lifecycleScope.launch { lifecycleScope.launch {
val result = showSnackbar( val result = showSnackbar(
message = message, message = message,
actionLabel = actionLabel actionLabel = actionLabel,
duration = snackbarDuration
) )
if (result == SnackbarResult.ActionPerformed) { if (result == SnackbarResult.ActionPerformed) {
actionClick?.invoke() 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.material.icons.filled.Share
import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.text.TextRange import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.TextFieldValue 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.CoreApp.Companion.instance
import org.kiwix.kiwixmobile.core.R import org.kiwix.kiwixmobile.core.R
import org.kiwix.kiwixmobile.core.extensions.closeKeyboard 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.snack
import org.kiwix.kiwixmobile.core.extensions.toast import org.kiwix.kiwixmobile.core.extensions.toast
import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem
@ -173,7 +173,7 @@ class AddNoteDialog : DialogFragment() {
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? = ComposeView(requireContext()).apply { ): View? = ComposeView(requireContext()).apply {
setContent { setContent {
snackBarHostState = rememberSnackbarHostState() snackBarHostState = remember { SnackbarHostState() }
AddNoteDialogScreen( AddNoteDialogScreen(
articleTitle.toString(), articleTitle.toString(),
navigationIcon = { navigationIcon = {

View File

@ -18,16 +18,20 @@
package org.kiwix.kiwixmobile.core.main package org.kiwix.kiwixmobile.core.main
import android.content.res.Configuration
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardOptions 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.HorizontalDivider
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextField 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.KeyboardCapitalization
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue 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.R
import org.kiwix.kiwixmobile.core.extensions.KiwixSnackbarHost
import org.kiwix.kiwixmobile.core.ui.components.KiwixAppBar 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.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.ui.theme.KiwixTheme
import org.kiwix.kiwixmobile.core.utils.ComposeDimens.FIVE_DP import org.kiwix.kiwixmobile.core.utils.ComposeDimens.FIVE_DP
import org.kiwix.kiwixmobile.core.utils.ComposeDimens.FOUR_DP import org.kiwix.kiwixmobile.core.utils.ComposeDimens.FOUR_DP
@ -70,11 +80,14 @@ fun AddNoteDialogScreen(
val focusRequester = remember { FocusRequester() } val focusRequester = remember { FocusRequester() }
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
KiwixTheme { KiwixTheme {
Scaffold(snackbarHost = { SnackbarHost(hostState = snackBarHostState) }) { paddingValues -> Scaffold(
snackbarHost = { KiwixSnackbarHost(snackbarHostState = snackBarHostState) }
) { paddingValues ->
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.background(Color.Transparent) .background(Color.Transparent)
.imePadding()
.padding(paddingValues), .padding(paddingValues),
) { ) {
KiwixAppBar(R.string.note, navigationIcon, actionMenuItems) 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()
)
}