Skip to content

Instantly share code, notes, and snippets.

@mahdiPourkazemi
Created August 4, 2025 12:52
Show Gist options
  • Save mahdiPourkazemi/a9abb82df0ea05a524b64eeb63e3cb5c to your computer and use it in GitHub Desktop.
Save mahdiPourkazemi/a9abb82df0ea05a524b64eeb63e3cb5c to your computer and use it in GitHub Desktop.
Search With Flow Powered
class SearchViewModel : ViewModel() {
private val _searchQuery = MutableSharedFlow<String>()
val searchResults: StateFlow<UiState<List<SearchResult>>> = _searchQuery
.debounce(300) // صبر می‌کنه تا کاربر تایپ کردن رو تموم کنه
.filter { it.length >= 3 } // حداقل 3 کاراکتر
.flatMapLatest { query ->
if (query.isEmpty()) {
flowOf(UiState.Success(emptyList()))
} else {
searchRepository.search(query)
.map<List<SearchResult>, UiState<List<SearchResult>>> {
UiState.Success(it)
}
.onStart { emit(UiState.Loading) }
.catch { emit(UiState.Error(it, "خطا در جستجو")) }
}
}
.stateIn(
viewModelScope,
SharingStarted.WhileSubscribed(5000),
UiState.Success(emptyList())
)
fun search(query: String) {
_searchQuery.tryEmit(query)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment