diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt index fc5c6f4..c402f30 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/detail/LexiconDetailScreen.kt @@ -66,6 +66,7 @@ import com.pixelized.rplexicon.utilitary.extentions.annotatedString import com.pixelized.rplexicon.utilitary.extentions.highlightRegex import com.pixelized.rplexicon.utilitary.extentions.lexicon import com.pixelized.rplexicon.utilitary.extentions.scrollOffset +import com.pixelized.rplexicon.utilitary.extentions.searchCriterion import com.skydoves.landscapist.ImageOptions @Stable @@ -104,7 +105,8 @@ data class AnnotatedLexiconDetailUio( fun LexiconDetailUio.annotate(): AnnotatedLexiconDetailUio { val colorScheme = MaterialTheme.colorScheme val highlight = remember { SpanStyle(color = colorScheme.primary) } - val highlightRegex = remember(search) { search.highlightRegex } + val trimmedSearch = remember(search) { search.searchCriterion() } + val highlightRegex = remember(search) { trimmedSearch.highlightRegex } val gender = stringResource(id = gender, short = true) val race = stringResource(id = race) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/search/SearchItem.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/search/SearchItem.kt index b63ef51..2f77c7d 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/search/SearchItem.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/search/SearchItem.kt @@ -39,6 +39,7 @@ import com.pixelized.rplexicon.utilitary.extentions.finderRegex import com.pixelized.rplexicon.utilitary.extentions.foldAll import com.pixelized.rplexicon.utilitary.extentions.highlightRegex import com.pixelized.rplexicon.utilitary.extentions.lexicon +import com.pixelized.rplexicon.utilitary.extentions.searchCriterion @Stable class SearchItemUio( @@ -109,9 +110,7 @@ class AnnotatedSearchItemUio( private fun SearchItemUio.annotate(): AnnotatedSearchItemUio { val colorScheme = MaterialTheme.colorScheme val highlight = remember { SpanStyle(color = colorScheme.primary) } - val trimmedSearch = remember(search) { - search.split(" ").mapNotNull { it.trim().takeIf { trim -> trim.isNotEmpty() } } - } + val trimmedSearch = remember(search) { search.searchCriterion() } val highlightRegex = remember(search) { trimmedSearch.highlightRegex } val finderRegex = remember(search) { trimmedSearch.finderRegex } val gender = stringResource(id = gender, short = true) diff --git a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/search/SearchViewModel.kt b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/search/SearchViewModel.kt index 413673c..ca6030f 100644 --- a/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/search/SearchViewModel.kt +++ b/app/src/main/java/com/pixelized/rplexicon/ui/screens/lexicon/search/SearchViewModel.kt @@ -11,6 +11,7 @@ import com.pixelized.rplexicon.repository.data.LexiconRepository import com.pixelized.rplexicon.ui.composable.form.DropDownFieldUio import com.pixelized.rplexicon.ui.composable.form.TextFieldUio import com.pixelized.rplexicon.utilitary.composable.stringResource +import com.pixelized.rplexicon.utilitary.extentions.searchCriterion import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject @@ -52,17 +53,15 @@ class SearchViewModel @Inject constructor( data.filter { item -> val gender = _gender.value?.let { it == item.gender } val race = _race.value?.let { it == item.race } - val search = _search.value.split(" ").mapNotNull { - it.takeIf { it.isNotEmpty() }?.trim()?.let { search -> - val name = item.name.contains(search, true) - val diminutive = item.diminutive?.contains(search, true) == true - val status = item.status?.contains(search, true) == true - val location = item.location?.contains(search, true) == true - val description = item.description?.contains(search, true) == true - val history = item.history?.contains(search, true) == true - val tag = item.tags?.contains(search, true) == true - name || diminutive || status || location || description || history || tag - } + val search = _search.value.searchCriterion().map { criteria -> + val name = item.name.contains(criteria, true) + val diminutive = item.diminutive?.contains(criteria, true) == true + val status = item.status?.contains(criteria, true) == true + val location = item.location?.contains(criteria, true) == true + val description = item.description?.contains(criteria, true) == true + val history = item.history?.contains(criteria, true) == true + val tag = item.tags?.contains(criteria, true) == true + name || diminutive || status || location || description || history || tag } (gender == null || gender) && (race == null || race) && (search.all { it }) }.map { diff --git a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEx.kt b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEx.kt index 348e794..b05f5c3 100644 --- a/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEx.kt +++ b/app/src/main/java/com/pixelized/rplexicon/utilitary/extentions/StringEx.kt @@ -41,12 +41,6 @@ val List.finderRegex: Regex? ) } else null -fun String?.toUriOrNull(): Uri? = try { - this?.takeIf { it.isNotBlank() }?.toUri() -} catch (_: Exception) { - null -} - @Stable fun String.annotateWithDropCap( style: SpanStyle, @@ -57,3 +51,16 @@ fun String.annotateWithDropCap( spanStyle = style, ) ) + +@Stable +fun String?.toUriOrNull(): Uri? = try { + this?.takeIf { it.isNotBlank() }?.toUri() +} catch (_: Exception) { + null +} + +@Stable +fun String?.searchCriterion(): List = this + ?.split(" ") + ?.mapNotNull { it.trim().takeIf { trim -> trim.isNotEmpty() } } + ?: emptyList() \ No newline at end of file