diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt index ca01ee603d..e49e50c2ab 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel.kt @@ -6,6 +6,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.Subject @@ -25,19 +26,19 @@ class ConversationListTabsViewModel(repository: ConversationListTabRepository) : val tabClickEvents: Observable = internalTabClickEvents.filter { Stories.isFeatureEnabled() } init { - disposables += store.update(repository.getNumberOfUnreadMessages()) { unreadChats, state -> + disposables += performStoreUpdate(repository.getNumberOfUnreadMessages()) { unreadChats, state -> state.copy(unreadMessagesCount = unreadChats) } - disposables += store.update(repository.getNumberOfUnseenCalls()) { unseenCalls, state -> + disposables += performStoreUpdate(repository.getNumberOfUnseenCalls()) { unseenCalls, state -> state.copy(unreadCallsCount = unseenCalls) } - disposables += store.update(repository.getNumberOfUnseenStories()) { unseenStories, state -> + disposables += performStoreUpdate(repository.getNumberOfUnseenStories()) { unseenStories, state -> state.copy(unreadStoriesCount = unseenStories) } - disposables += store.update(repository.getHasFailedOutgoingStories()) { hasFailedStories, state -> + disposables += performStoreUpdate(repository.getHasFailedOutgoingStories()) { hasFailedStories, state -> state.copy(hasFailedStory = hasFailedStories) } } @@ -48,37 +49,49 @@ class ConversationListTabsViewModel(repository: ConversationListTabRepository) : fun onChatsSelected() { internalTabClickEvents.onNext(ConversationListTab.CHATS) - store.update { it.copy(tab = ConversationListTab.CHATS, prevTab = it.tab) } + performStoreUpdate { it.copy(tab = ConversationListTab.CHATS) } } fun onCallsSelected() { internalTabClickEvents.onNext(ConversationListTab.CALLS) - store.update { it.copy(tab = ConversationListTab.CALLS, prevTab = it.tab) } + performStoreUpdate { it.copy(tab = ConversationListTab.CALLS) } } fun onStoriesSelected() { internalTabClickEvents.onNext(ConversationListTab.STORIES) - store.update { it.copy(tab = ConversationListTab.STORIES, prevTab = it.tab) } + performStoreUpdate { it.copy(tab = ConversationListTab.STORIES) } } fun onSearchOpened() { - store.update { it.copy(visibilityState = it.visibilityState.copy(isSearchOpen = true)) } + performStoreUpdate { it.copy(visibilityState = it.visibilityState.copy(isSearchOpen = true)) } } fun onSearchClosed() { - store.update { it.copy(visibilityState = it.visibilityState.copy(isSearchOpen = false)) } + performStoreUpdate { it.copy(visibilityState = it.visibilityState.copy(isSearchOpen = false)) } } fun onMultiSelectStarted() { - store.update { it.copy(visibilityState = it.visibilityState.copy(isMultiSelectOpen = true)) } + performStoreUpdate { it.copy(visibilityState = it.visibilityState.copy(isMultiSelectOpen = true)) } } fun onMultiSelectFinished() { - store.update { it.copy(visibilityState = it.visibilityState.copy(isMultiSelectOpen = false)) } + performStoreUpdate { it.copy(visibilityState = it.visibilityState.copy(isMultiSelectOpen = false)) } } fun isShowingArchived(isShowingArchived: Boolean) { - store.update { it.copy(visibilityState = it.visibilityState.copy(isShowingArchived = isShowingArchived)) } + performStoreUpdate { it.copy(visibilityState = it.visibilityState.copy(isShowingArchived = isShowingArchived)) } + } + + private fun performStoreUpdate(fn: (ConversationListTabsState) -> ConversationListTabsState) { + store.update { + fn(it.copy(prevTab = it.tab)) + } + } + + private fun performStoreUpdate(flowable: Flowable, fn: (T, ConversationListTabsState) -> ConversationListTabsState): Disposable { + return store.update(flowable) { t, state -> + fn(t, state.copy(prevTab = state.tab)) + } } class Factory(private val repository: ConversationListTabRepository) : ViewModelProvider.Factory {