~repos /only-bible-app
git clone
https://pyrossh.dev/repos/only-bible-app.git
The only bible app you will ever need. No ads. No in-app purchases. No distractions.
file:
composeApp/src/commonMain/kotlin/dev/pyrossh/onlyBible/composables/EmbeddedSearchBar.kt
package dev.pyrossh.onlyBible.composables
import dev.pyrossh.onlyBible.AppViewModelimport androidx.compose.foundation.layout.Spacerimport androidx.compose.foundation.layout.fillMaxSizeimport androidx.compose.foundation.layout.navigationBarsPaddingimport androidx.compose.foundation.layout.paddingimport androidx.compose.foundation.lazy.LazyColumnimport androidx.compose.foundation.lazy.itemsimport androidx.compose.material.icons.Iconsimport androidx.compose.material.icons.rounded.Closeimport androidx.compose.material.icons.rounded.Searchimport androidx.compose.material3.ExperimentalMaterial3Apiimport androidx.compose.material3.Iconimport androidx.compose.material3.IconButtonimport androidx.compose.material3.MaterialThemeimport androidx.compose.material3.ProvideTextStyleimport androidx.compose.material3.SearchBarimport androidx.compose.material3.Textimport androidx.compose.runtime.Composableimport androidx.compose.runtime.SideEffectimport androidx.compose.runtime.collectAsStateimport androidx.compose.runtime.getValueimport androidx.compose.runtime.rememberimport androidx.compose.ui.Modifierimport androidx.compose.ui.focus.FocusRequesterimport androidx.compose.ui.focus.focusRequesterimport androidx.compose.ui.text.TextStyleimport androidx.compose.ui.text.font.FontWeightimport androidx.compose.ui.unit.dpimport androidx.compose.ui.unit.sp
@Composable@OptIn(ExperimentalMaterial3Api::class)fun EmbeddedSearchBar( modifier: Modifier = Modifier, model: AppViewModel, onDismiss: () -> Unit,) { val searchText by model.searchText.collectAsState() val searchedVerses by model.searchedVerses.collectAsState() val textFieldFocusRequester = remember { FocusRequester() } SideEffect { textFieldFocusRequester.requestFocus() } ProvideTextStyle( value = TextStyle( fontSize = 18.sp, color = MaterialTheme.colorScheme.onSurface, ) ) { SearchBar( modifier = modifier .fillMaxSize() .navigationBarsPadding() .focusRequester(textFieldFocusRequester), query = searchText, onQueryChange = model::onSearchTextChange, onSearch = model::onSearchTextChange, active = true, onActiveChange = {}, placeholder = { Text( style = TextStyle( fontSize = 18.sp, ), text = "Search" ) }, leadingIcon = { Icon( imageVector = Icons.Rounded.Search, contentDescription = null, tint = MaterialTheme.colorScheme.onSurface, ) }, trailingIcon = { IconButton( onClick = {// view.playSoundEffect(SoundEffectConstants.CLICK) onDismiss() }, ) { Icon( imageVector = Icons.Rounded.Close, contentDescription = "Close", tint = MaterialTheme.colorScheme.onSurface, ) } }, tonalElevation = 0.dp, ) { val groups = searchedVerses.groupBy { "${it.bookName} ${it.chapterIndex + 1}" } LazyColumn { groups.forEach { item( contentType = "header" ) { Text( modifier = Modifier.padding( vertical = 12.dp, ), style = TextStyle( fontFamily = model.fontType.family(), fontSize = (16 + model.fontSizeDelta).sp, fontWeight = FontWeight.W700, color = MaterialTheme.colorScheme.onSurface, ), text = it.key, ) } items(it.value) { v -> VerseText( model = model, fontType = model.fontType, fontSizeDelta = model.fontSizeDelta, fontBoldEnabled = model.fontBoldEnabled, verse = v, highlightWord = searchText, ) Spacer(modifier = Modifier.padding(bottom = 8.dp)) } } } } }}