Create a new room when inviting people in a DM (#6756)
* Create a new room when inviting people to a DM * Improve screenshot tests * Update screenshots --------- Co-authored-by: ElementBot <android@element.io>
This commit is contained in:
parent
f55b4d1283
commit
f678dffaed
26 changed files with 220 additions and 34 deletions
|
|
@ -38,12 +38,17 @@ import io.element.android.libraries.di.SessionScope
|
|||
import io.element.android.libraries.di.annotations.SessionCoroutineScope
|
||||
import io.element.android.libraries.matrix.api.MatrixClient
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.createroom.CreateRoomParameters
|
||||
import io.element.android.libraries.matrix.api.createroom.RoomPreset
|
||||
import io.element.android.libraries.matrix.api.encryption.identity.IdentityState
|
||||
import io.element.android.libraries.matrix.api.room.JoinedRoom
|
||||
import io.element.android.libraries.matrix.api.room.RoomMember
|
||||
import io.element.android.libraries.matrix.api.room.RoomMembershipState
|
||||
import io.element.android.libraries.matrix.api.room.filterMembers
|
||||
import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility
|
||||
import io.element.android.libraries.matrix.api.room.join.JoinRule
|
||||
import io.element.android.libraries.matrix.api.room.recent.getRecentDirectRooms
|
||||
import io.element.android.libraries.matrix.api.roomdirectory.RoomVisibility
|
||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||
import io.element.android.libraries.ui.strings.CommonStrings
|
||||
import io.element.android.libraries.usersearch.api.UserRepository
|
||||
|
|
@ -88,6 +93,7 @@ class DefaultInvitePeoplePresenter(
|
|||
var searchActive by rememberSaveable { mutableStateOf(false) }
|
||||
val showSearchLoader = rememberSaveable { mutableStateOf(false) }
|
||||
val sendInvitesAction = remember { mutableStateOf<AsyncAction<Unit>>(AsyncAction.Uninitialized) }
|
||||
val createRoomFromDmAction = remember { mutableStateOf<AsyncAction<RoomId>>(AsyncAction.Uninitialized) }
|
||||
|
||||
val recentDirectRooms by produceState(emptyList(), roomMembers.value) {
|
||||
if (roomMembers.value.isSuccess()) {
|
||||
|
|
@ -208,7 +214,13 @@ class DefaultInvitePeoplePresenter(
|
|||
)
|
||||
} else {
|
||||
room.dataOrNull()?.let {
|
||||
sessionCoroutineScope.sendInvites(it, selectedUsers.value, sendInvitesAction)
|
||||
sessionCoroutineScope.launch {
|
||||
if (it.isDm()) {
|
||||
createRoomFromDm(it, selectedUsers.value, createRoomFromDmAction)
|
||||
} else {
|
||||
sendInvites(it, selectedUsers.value, sendInvitesAction)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -216,6 +228,10 @@ class DefaultInvitePeoplePresenter(
|
|||
searchActive = false
|
||||
queryState.clearText()
|
||||
}
|
||||
is InvitePeopleEvents.ClearError -> {
|
||||
sendInvitesAction.value = AsyncAction.Uninitialized
|
||||
createRoomFromDmAction.value = AsyncAction.Uninitialized
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -228,6 +244,7 @@ class DefaultInvitePeoplePresenter(
|
|||
searchResults = searchResults.value,
|
||||
showSearchLoader = showSearchLoader.value,
|
||||
sendInvitesAction = sendInvitesAction.value,
|
||||
createRoomFromDmAction = createRoomFromDmAction.value,
|
||||
suggestions = suggestions,
|
||||
eventSink = ::handleEvent,
|
||||
)
|
||||
|
|
@ -254,6 +271,35 @@ class DefaultInvitePeoplePresenter(
|
|||
}
|
||||
}
|
||||
|
||||
private fun CoroutineScope.createRoomFromDm(
|
||||
currentRoom: JoinedRoom,
|
||||
selectedUsers: List<MatrixUser>,
|
||||
createRoomFromDmAction: MutableState<AsyncAction<RoomId>>,
|
||||
) = launch {
|
||||
createRoomFromDmAction.runUpdatingState {
|
||||
val currentUsers = currentRoom.getMembers(limit = 100).getOrNull().orEmpty()
|
||||
.filter { it.membership.isActive() }
|
||||
val invitees = (currentUsers.map { it.userId } + selectedUsers.map { it.userId })
|
||||
.filter { it != matrixClient.sessionId }
|
||||
.distinct()
|
||||
matrixClient.createRoom(
|
||||
CreateRoomParameters(
|
||||
name = null,
|
||||
topic = null,
|
||||
isEncrypted = true,
|
||||
isDirect = false,
|
||||
visibility = RoomVisibility.Private,
|
||||
preset = RoomPreset.PRIVATE_CHAT,
|
||||
invite = invitees,
|
||||
avatar = null,
|
||||
joinRuleOverride = JoinRule.Invite,
|
||||
historyVisibilityOverride = RoomHistoryVisibility.Invited,
|
||||
isSpace = false,
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@JvmName("toggleUserInSelectedUsers")
|
||||
private fun MutableState<ImmutableList<MatrixUser>>.toggleUser(user: MatrixUser) {
|
||||
value = if (value.contains(user)) {
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import io.element.android.features.invitepeople.api.InvitePeopleState
|
|||
import io.element.android.libraries.architecture.AsyncAction
|
||||
import io.element.android.libraries.architecture.AsyncData
|
||||
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
|
||||
|
|
@ -26,6 +27,7 @@ data class DefaultInvitePeopleState(
|
|||
val selectedUsers: ImmutableList<MatrixUser>,
|
||||
override val isSearchActive: Boolean,
|
||||
override val sendInvitesAction: AsyncAction<Unit>,
|
||||
override val createRoomFromDmAction: AsyncAction<RoomId>,
|
||||
val suggestions: ImmutableList<InvitableUser>,
|
||||
override val eventSink: (InvitePeopleEvents) -> Unit
|
||||
) : InvitePeopleState
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import io.element.android.libraries.designsystem.preview.USER_NAME_CAROL
|
|||
import io.element.android.libraries.designsystem.preview.USER_NAME_EVE
|
||||
import io.element.android.libraries.designsystem.preview.USER_NAME_JUSTIN
|
||||
import io.element.android.libraries.designsystem.theme.components.SearchBarResultState
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||
import io.element.android.libraries.matrix.ui.components.aMatrixUser
|
||||
import io.element.android.libraries.matrix.ui.components.aMatrixUserList
|
||||
|
|
@ -119,6 +120,7 @@ private fun aDefaultInvitePeopleState(
|
|||
isSearchActive: Boolean = false,
|
||||
showSearchLoader: Boolean = false,
|
||||
sendInvitesAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
|
||||
createRoomFromDmAction: AsyncAction<RoomId> = AsyncAction.Uninitialized,
|
||||
suggestions: List<InvitableUser> = aMatrixUserList()
|
||||
.take(5)
|
||||
.map { user -> anInvitableUser(matrixUser = user, isSelected = user in selectedUsers) },
|
||||
|
|
@ -132,6 +134,7 @@ private fun aDefaultInvitePeopleState(
|
|||
isSearchActive = isSearchActive,
|
||||
showSearchLoader = showSearchLoader,
|
||||
sendInvitesAction = sendInvitesAction,
|
||||
createRoomFromDmAction = createRoomFromDmAction,
|
||||
suggestions = suggestions.toImmutableList(),
|
||||
eventSink = {},
|
||||
)
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import androidx.compose.foundation.layout.Column
|
|||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.imePadding
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
|
|
@ -105,7 +106,7 @@ private fun InvitePeopleContentView(
|
|||
}
|
||||
|
||||
InvitePeopleSearchBar(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
modifier = Modifier.imePadding().fillMaxWidth(),
|
||||
queryState = state.searchQuery,
|
||||
showLoader = state.showSearchLoader,
|
||||
selectedUsers = state.selectedUsers,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue