Skip to content

Instantly share code, notes, and snippets.

@alexsullivan114
Created June 20, 2019 14:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexsullivan114/6e24874a23a0fd35b52204490f9a6147 to your computer and use it in GitHub Desktop.
Save alexsullivan114/6e24874a23a0fd35b52204490f9a6147 to your computer and use it in GitHub Desktop.
Rxy-livedatay-example
class UsernameSearchViewModel(
api: CostarApi,
schedulersContainer: SchedulersContainer,
analytics: Analytics
) : ViewModel() {
enum class VisibleSearchComponent { Loading, List, EmptyMessage }
private val minCharacterCount = 3
private val disposables = CompositeDisposable()
private val usernameInputSubject = PublishSubject.create<String>()
private val addFriendSubject = PublishSubject.create<UserSearch>()
val listItemsLiveData = MutableLiveData<List<UserSearch>>()
val visibleSearchComponentLiveData = MutableLiveData<VisibleSearchComponent>()
init {
val searchObservable = usernameInputSubject
.filter { it.length >= minCharacterCount }
.throttleLatest(300, TimeUnit.MILLISECONDS, schedulersContainer.computation)
.doOnNext { visibleSearchComponentLiveData.postValue(Loading) }
.flatMapMaybe { api.searchUser(it).asNetworkCall(null, schedulersContainer.io) }
.doOnNext { visibleSearchComponentLiveData.postValue(VisibleSearchComponent.List) }
.filter { it.isSuccessful && it.body() != null }
.map { it.body()!! }
.share()
// Search for users
searchObservable
.subscribe(listItemsLiveData::postValue)
.addTo(disposables)
// Show an empty message if we get no search matches
searchObservable
.map { if (it.isEmpty()) EmptyMessage else VisibleSearchComponent.List }
.subscribe(visibleSearchComponentLiveData::postValue)
.addTo(disposables)
val hasAlreadySearched = usernameInputSubject.filter { it.length >= 3 }
.switchMap { Observable.just(true) }
// If the user has already made a valid search, show the empty message if their search
// text is too short.
hasAlreadySearched
.flatMap { usernameInputSubject }
.filter { it.length < minCharacterCount }
.subscribe { visibleSearchComponentLiveData.postValue(EmptyMessage) }
.addTo(disposables)
// Send a friend request to a user
addFriendSubject
.flatMapMaybe { api.addFriend(it.id).asNetworkCall(null, schedulersContainer.io) }
.subscribe()
.addTo(disposables)
// Log that we executed a search
searchObservable
.subscribe { analytics.logEvent(SearchPerformSearch) }
.addTo(disposables)
// Log that we executed a search and got back results
searchObservable
.filter { it.isNotEmpty() }
.subscribe { analytics.logEvent(SearchResults) }
.addTo(disposables)
// Log that we executed a search and got back no results
searchObservable
.filter { it.isEmpty() }
.subscribe { analytics.logEvent(SearchNoResults) }
.addTo(disposables)
// Log that a friend was added from search
addFriendSubject
.subscribe { analytics.logEvent(SearchAddFriend) }
.addTo(disposables)
}
fun usernameInput(text: CharSequence) = usernameInputSubject.onNext(text.toString())
fun addFriendClicked(user: UserSearch) = addFriendSubject.onNext(user)
override fun onCleared() {
super.onCleared()
disposables.clear()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment