Revoke ThreePid invitation (#548)
This commit is contained in:
parent
863c09142f
commit
c78bba803c
|
@ -18,4 +18,6 @@ package im.vector.riotx.features.roomprofile.members
|
|||
|
||||
import im.vector.riotx.core.platform.VectorViewModelAction
|
||||
|
||||
sealed class RoomMemberListAction : VectorViewModelAction
|
||||
sealed class RoomMemberListAction : VectorViewModelAction {
|
||||
data class RevokeThreePidInvite(val stateKey: String) : RoomMemberListAction()
|
||||
}
|
||||
|
|
|
@ -20,11 +20,14 @@ import android.os.Bundle
|
|||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import androidx.appcompat.app.AlertDialog
|
||||
import com.airbnb.mvrx.args
|
||||
import com.airbnb.mvrx.fragmentViewModel
|
||||
import com.airbnb.mvrx.withState
|
||||
import im.vector.matrix.android.api.session.events.model.Event
|
||||
import im.vector.matrix.android.api.session.events.model.toModel
|
||||
import im.vector.matrix.android.api.session.room.model.RoomMemberSummary
|
||||
import im.vector.matrix.android.api.session.room.model.RoomThirdPartyInviteContent
|
||||
import im.vector.matrix.android.api.util.toMatrixItem
|
||||
import im.vector.riotx.R
|
||||
import im.vector.riotx.core.extensions.cleanup
|
||||
|
@ -90,7 +93,19 @@ class RoomMemberListFragment @Inject constructor(
|
|||
}
|
||||
|
||||
override fun onThreePidInvites(event: Event) {
|
||||
// TODO Display a bottom sheet to revoke invite if power level is high enough
|
||||
// Display a dialog to revoke invite if power level is high enough
|
||||
val content = event.content.toModel<RoomThirdPartyInviteContent>() ?: return
|
||||
val stateKey = event.stateKey ?: return
|
||||
if (withState(viewModel) { it.actionsPermissions.canRevokeThreePidInvite }) {
|
||||
AlertDialog.Builder(requireActivity())
|
||||
.setTitle(R.string.three_pid_revoke_invite_dialog_title)
|
||||
.setMessage(getString(R.string.three_pid_revoke_invite_dialog_content, content.displayName))
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setPositiveButton(R.string.revoke) { _, _ ->
|
||||
viewModel.handle(RoomMemberListAction.RevokeThreePidInvite(stateKey))
|
||||
}
|
||||
.show()
|
||||
}
|
||||
}
|
||||
|
||||
private fun renderRoomSummary(state: RoomMemberListViewState) {
|
||||
|
|
|
@ -16,11 +16,13 @@
|
|||
|
||||
package im.vector.riotx.features.roomprofile.members
|
||||
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.airbnb.mvrx.FragmentViewModelContext
|
||||
import com.airbnb.mvrx.MvRxViewModelFactory
|
||||
import com.airbnb.mvrx.ViewModelContext
|
||||
import com.squareup.inject.assisted.Assisted
|
||||
import com.squareup.inject.assisted.AssistedInject
|
||||
import im.vector.matrix.android.api.NoOpMatrixCallback
|
||||
import im.vector.matrix.android.api.crypto.RoomEncryptionTrustLevel
|
||||
import im.vector.matrix.android.api.extensions.orFalse
|
||||
import im.vector.matrix.android.api.query.QueryStringValue
|
||||
|
@ -37,12 +39,14 @@ import im.vector.matrix.rx.asObservable
|
|||
import im.vector.matrix.rx.mapOptional
|
||||
import im.vector.matrix.rx.rx
|
||||
import im.vector.matrix.rx.unwrap
|
||||
import im.vector.riotx.core.extensions.exhaustive
|
||||
import im.vector.riotx.core.platform.EmptyViewEvents
|
||||
import im.vector.riotx.core.platform.VectorViewModel
|
||||
import im.vector.riotx.features.powerlevel.PowerLevelsObservableFactory
|
||||
import io.reactivex.Observable
|
||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||
import io.reactivex.functions.BiFunction
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
|
||||
class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState: RoomMemberListViewState,
|
||||
|
@ -125,7 +129,12 @@ class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState
|
|||
PowerLevelsObservableFactory(room).createObservable()
|
||||
.subscribe {
|
||||
val permissions = ActionPermissions(
|
||||
canInvite = PowerLevelsHelper(it).isUserAbleToInvite(session.myUserId)
|
||||
canInvite = PowerLevelsHelper(it).isUserAbleToInvite(session.myUserId),
|
||||
canRevokeThreePidInvite = PowerLevelsHelper(it).isUserAllowedToSend(
|
||||
userId = session.myUserId,
|
||||
isState = true,
|
||||
eventType = EventType.STATE_ROOM_THIRD_PARTY_INVITE
|
||||
)
|
||||
)
|
||||
setState {
|
||||
copy(actionsPermissions = permissions)
|
||||
|
@ -177,5 +186,19 @@ class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState
|
|||
}
|
||||
|
||||
override fun handle(action: RoomMemberListAction) {
|
||||
when (action) {
|
||||
is RoomMemberListAction.RevokeThreePidInvite -> handleRevokeThreePidInvite(action)
|
||||
}.exhaustive
|
||||
}
|
||||
|
||||
private fun handleRevokeThreePidInvite(action: RoomMemberListAction.RevokeThreePidInvite) {
|
||||
viewModelScope.launch {
|
||||
room.sendStateEvent(
|
||||
eventType = EventType.STATE_ROOM_THIRD_PARTY_INVITE,
|
||||
stateKey = action.stateKey,
|
||||
body = emptyMap(),
|
||||
callback = NoOpMatrixCallback()
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,7 +40,8 @@ data class RoomMemberListViewState(
|
|||
}
|
||||
|
||||
data class ActionPermissions(
|
||||
val canInvite: Boolean = false
|
||||
val canInvite: Boolean = false,
|
||||
val canRevokeThreePidInvite: Boolean = false
|
||||
)
|
||||
|
||||
typealias RoomMemberSummaries = List<Pair<RoomMemberListCategories, List<RoomMemberSummary>>>
|
||||
|
|
|
@ -2550,4 +2550,7 @@ Not all features in Riot are implemented in RiotX yet. Main missing (and coming
|
|||
<string name="loading_contact_book">Retrieving your contacts…</string>
|
||||
<string name="empty_contact_book">Your contact book is empty</string>
|
||||
<string name="contacts_book_title">Contacts book</string>
|
||||
|
||||
<string name="three_pid_revoke_invite_dialog_title">Revoke invite</string>
|
||||
<string name="three_pid_revoke_invite_dialog_content">Revoke invite to %1$s?</string>
|
||||
</resources>
|
||||
|
|
Loading…
Reference in New Issue