diff --git a/feature-search/src/main/kotlin/app/transitos/feature/search/SearchViewModel.kt b/feature-search/src/main/kotlin/app/transitos/feature/search/SearchViewModel.kt index 73c493e..9c014b3 100644 --- a/feature-search/src/main/kotlin/app/transitos/feature/search/SearchViewModel.kt +++ b/feature-search/src/main/kotlin/app/transitos/feature/search/SearchViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.glossostudio.transitos.core.repository.FavoritesRepository import com.glossostudio.transitos.core.repository.TransitRepository +import java.text.Normalizer import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted @@ -21,6 +22,7 @@ class SearchViewModel( ) : ViewModel() { private val _query = MutableStateFlow("") + private val normalizedNames = mutableMapOf() val query: StateFlow = _query.asStateFlow() val allStops: StateFlow> = repository.observeStops() @@ -34,7 +36,10 @@ class SearchViewModel( val filteredStops: StateFlow> = combine(allStops, query) { stops, q -> if (q.isBlank()) stops - else stops.filter { it.name.contains(q, ignoreCase = true) } + else { + val normalizedQuery = q.normalized() + stops.filter { it.name.normalized().contains(normalizedQuery, ignoreCase = true) } + } }.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList()) fun onQueryChange(newQuery: String) { @@ -50,4 +55,10 @@ class SearchViewModel( } } } + + private fun String.normalized(): String = + normalizedNames.getOrPut(this) { + Normalizer.normalize(this, Normalizer.Form.NFD) + .replace(Regex("\\p{M}"), "") + } }