forked from GitHub-Mirror/riotX-android
Create direct : remove letter headers when filtering
This commit is contained in:
parent
0255696c88
commit
ff6ce8a4b7
@ -18,14 +18,12 @@
|
|||||||
|
|
||||||
package im.vector.riotx.features.home.createdirect
|
package im.vector.riotx.features.home.createdirect
|
||||||
|
|
||||||
import arrow.core.Option
|
|
||||||
import com.airbnb.epoxy.EpoxyController
|
import com.airbnb.epoxy.EpoxyController
|
||||||
import com.airbnb.mvrx.*
|
import com.airbnb.mvrx.*
|
||||||
import im.vector.matrix.android.api.session.Session
|
import im.vector.matrix.android.api.session.Session
|
||||||
import im.vector.matrix.android.api.session.user.model.User
|
import im.vector.matrix.android.api.session.user.model.User
|
||||||
import im.vector.matrix.android.internal.util.firstLetterOfDisplayName
|
import im.vector.matrix.android.internal.util.firstLetterOfDisplayName
|
||||||
import im.vector.riotx.R
|
import im.vector.riotx.R
|
||||||
import im.vector.riotx.core.epoxy.NoResultItem_
|
|
||||||
import im.vector.riotx.core.epoxy.errorWithRetryItem
|
import im.vector.riotx.core.epoxy.errorWithRetryItem
|
||||||
import im.vector.riotx.core.epoxy.loadingItem
|
import im.vector.riotx.core.epoxy.loadingItem
|
||||||
import im.vector.riotx.core.epoxy.noResultItem
|
import im.vector.riotx.core.epoxy.noResultItem
|
||||||
@ -55,7 +53,8 @@ class CreateDirectRoomController @Inject constructor(private val session: Sessio
|
|||||||
|
|
||||||
override fun buildModels() {
|
override fun buildModels() {
|
||||||
val currentState = state ?: return
|
val currentState = state ?: return
|
||||||
val hasSearch = currentState.searchTerm.isNotBlank()
|
val hasSearch = currentState.directorySearchTerm.isNotBlank()
|
||||||
|
val isFiltering = currentState.filterKnownUsersValue.nonEmpty()
|
||||||
val asyncUsers = if (displayMode == CreateDirectRoomViewState.DisplayMode.DIRECTORY_USERS) {
|
val asyncUsers = if (displayMode == CreateDirectRoomViewState.DisplayMode.DIRECTORY_USERS) {
|
||||||
currentState.directoryUsers
|
currentState.directoryUsers
|
||||||
} else {
|
} else {
|
||||||
@ -64,7 +63,7 @@ class CreateDirectRoomController @Inject constructor(private val session: Sessio
|
|||||||
when (asyncUsers) {
|
when (asyncUsers) {
|
||||||
is Uninitialized -> renderEmptyState(false)
|
is Uninitialized -> renderEmptyState(false)
|
||||||
is Loading -> renderLoading()
|
is Loading -> renderLoading()
|
||||||
is Success -> renderSuccess(asyncUsers(), currentState.selectedUsers.map { it.userId }, hasSearch)
|
is Success -> renderSuccess(asyncUsers(), currentState.selectedUsers.map { it.userId }, hasSearch, isFiltering)
|
||||||
is Fail -> renderFailure(asyncUsers.error)
|
is Fail -> renderFailure(asyncUsers.error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -85,15 +84,16 @@ class CreateDirectRoomController @Inject constructor(private val session: Sessio
|
|||||||
|
|
||||||
private fun renderSuccess(users: List<User>,
|
private fun renderSuccess(users: List<User>,
|
||||||
selectedUsers: List<String>,
|
selectedUsers: List<String>,
|
||||||
hasSearch: Boolean) {
|
hasSearch: Boolean,
|
||||||
|
isFiltering: Boolean) {
|
||||||
if (users.isEmpty()) {
|
if (users.isEmpty()) {
|
||||||
renderEmptyState(hasSearch)
|
renderEmptyState(hasSearch)
|
||||||
} else {
|
} else {
|
||||||
renderUsers(users, selectedUsers)
|
renderUsers(users, selectedUsers, isFiltering)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun renderUsers(users: List<User>, selectedUsers: List<String>) {
|
private fun renderUsers(users: List<User>, selectedUsers: List<String>, isFiltering: Boolean) {
|
||||||
var lastFirstLetter: String? = null
|
var lastFirstLetter: String? = null
|
||||||
for (user in users) {
|
for (user in users) {
|
||||||
if (user.userId == session.myUserId) {
|
if (user.userId == session.myUserId) {
|
||||||
@ -101,7 +101,7 @@ class CreateDirectRoomController @Inject constructor(private val session: Sessio
|
|||||||
}
|
}
|
||||||
val isSelected = selectedUsers.contains(user.userId)
|
val isSelected = selectedUsers.contains(user.userId)
|
||||||
val currentFirstLetter = user.displayName.firstLetterOfDisplayName()
|
val currentFirstLetter = user.displayName.firstLetterOfDisplayName()
|
||||||
val showLetter = currentFirstLetter.isNotEmpty() && lastFirstLetter != currentFirstLetter
|
val showLetter = !isFiltering && currentFirstLetter.isNotEmpty() && lastFirstLetter != currentFirstLetter
|
||||||
lastFirstLetter = currentFirstLetter
|
lastFirstLetter = currentFirstLetter
|
||||||
|
|
||||||
CreateDirectRoomLetterHeaderItem_()
|
CreateDirectRoomLetterHeaderItem_()
|
||||||
|
@ -35,7 +35,6 @@ import im.vector.riotx.core.platform.VectorViewModel
|
|||||||
import im.vector.riotx.core.utils.LiveEvent
|
import im.vector.riotx.core.utils.LiveEvent
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
import io.reactivex.Single
|
import io.reactivex.Single
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
|
||||||
import io.reactivex.functions.BiFunction
|
import io.reactivex.functions.BiFunction
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
@ -147,7 +146,7 @@ class CreateDirectRoomViewModel @AssistedInject constructor(@Assisted
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
stream.toAsync {
|
stream.toAsync {
|
||||||
copy(directoryUsers = it, searchTerm = search)
|
copy(directoryUsers = it, directorySearchTerm = search)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.subscribe()
|
.subscribe()
|
||||||
@ -171,7 +170,10 @@ class CreateDirectRoomViewModel @AssistedInject constructor(@Assisted
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
).execute { async ->
|
).execute { async ->
|
||||||
copy(knownUsers = async)
|
copy(
|
||||||
|
knownUsers = async,
|
||||||
|
filterKnownUsersValue = knownUsersFilter.value ?: Option.empty()
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ data class CreateDirectRoomViewState(
|
|||||||
val directoryUsers: Async<List<User>> = Uninitialized,
|
val directoryUsers: Async<List<User>> = Uninitialized,
|
||||||
val selectedUsers: Set<User> = emptySet(),
|
val selectedUsers: Set<User> = emptySet(),
|
||||||
val createAndInviteState: Async<String> = Uninitialized,
|
val createAndInviteState: Async<String> = Uninitialized,
|
||||||
val searchTerm: String = "",
|
val directorySearchTerm: String = "",
|
||||||
val filterKnownUsersValue: Option<String> = Option.empty()
|
val filterKnownUsersValue: Option<String> = Option.empty()
|
||||||
) : MvRxState {
|
) : MvRxState {
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user