Create group v2 - Implement navigation to group details screen.

This commit is contained in:
jeffrey-signal
2025-10-23 10:34:10 -04:00
parent 9d545412a5
commit 19558c5325
6 changed files with 142 additions and 31 deletions

View File

@@ -148,10 +148,6 @@ class ContactSearchMediator(
viewModel.clearSelection()
}
fun getSelectedMembersSize(): Int {
return viewModel.getSelectedMembersSize()
}
fun getSelectedContacts(): Set<ContactSearchKey> {
return viewModel.getSelectedContacts()
}

View File

@@ -5,12 +5,16 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.map
import androidx.lifecycle.switchMap
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.kotlin.plusAssign
import io.reactivex.rxjava3.subjects.PublishSubject
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import org.signal.paging.LivePagedData
import org.signal.paging.PagedData
import org.signal.paging.PagingConfig
@@ -52,23 +56,21 @@ class ContactSearchViewModel(
private val pagedData = MutableLiveData<LivePagedData<ContactSearchKey, ContactSearchData>>()
private val configurationStore = Store(ContactSearchState(query = savedStateHandle[QUERY]))
private val selectionStore = Store<Set<ContactSearchKey>>(emptySet())
private val internalSelectedContacts = MutableStateFlow<Set<ContactSearchKey>>(emptySet())
private val errorEvents = PublishSubject.create<ContactSearchError>()
val controller: LiveData<PagingController<ContactSearchKey>> = pagedData.map { it.controller }
val data: LiveData<List<ContactSearchData>> = pagedData.switchMap { it.data }
val configurationState: LiveData<ContactSearchState> = configurationStore.stateLiveData
val selectionState: LiveData<Set<ContactSearchKey>> = selectionStore.stateLiveData
private val selectedContacts: StateFlow<Set<ContactSearchKey>> = internalSelectedContacts
val selectionState: LiveData<Set<ContactSearchKey>> = selectedContacts.asLiveData()
val errorEventsStream: Observable<ContactSearchError> = errorEvents
private var selectionSize = 0
override fun onCleared() {
disposables.clear()
}
fun getSelectedMembersSize(): Int {
return selectionSize
}
fun setConfiguration(contactSearchConfiguration: ContactSearchConfiguration) {
val pagedDataSource = ContactSearchPagedDataSource(
contactSearchConfiguration,
@@ -103,7 +105,6 @@ class ContactSearchViewModel(
val newSelectionEntries = results.filter { it.isSelectable }.map { it.key } - getSelectedContacts()
val newSelectionSize = newSelectionEntries.size + getSelectedContacts().size
selectionSize = newSelectionSize
if (selectionLimits.hasRecommendedLimit() && getSelectedContacts().size < selectionLimits.recommendedLimit && newSelectionSize >= selectionLimits.recommendedLimit) {
errorEvents.onNext(ContactSearchError.RECOMMENDED_LIMIT_REACHED)
} else if (selectionLimits.hasHardLimit() && newSelectionSize > selectionLimits.hardLimit) {
@@ -115,22 +116,20 @@ class ContactSearchViewModel(
safetyNumberRepository.batchSafetyNumberCheck(newSelectionEntries)
}
selectionStore.update { state -> state + newSelectionEntries }
internalSelectedContacts.update { it + newSelectionEntries }
}
}
fun setKeysNotSelected(contactSearchKeys: Set<ContactSearchKey>) {
val newSelectionSize = getSelectedContacts().size - contactSearchKeys.size
selectionSize = newSelectionSize
selectionStore.update { it - contactSearchKeys }
internalSelectedContacts.update { it - contactSearchKeys }
}
fun getSelectedContacts(): Set<ContactSearchKey> {
return selectionStore.state
return selectedContacts.value
}
fun clearSelection() {
selectionStore.update { emptySet() }
internalSelectedContacts.update { emptySet() }
}
fun addToVisibleGroupStories(groupStories: Set<ContactSearchKey.RecipientSearchKey>) {