Add action to report a user form the user profile view. EventId is not relevant, but requested by the API.

This commit is contained in:
Benoit Marty 2024-04-02 15:44:25 +02:00
parent 99ec61e120
commit b14cb81ece
5 changed files with 48 additions and 4 deletions

View file

@ -22,6 +22,7 @@ import im.vector.app.core.platform.VectorViewModelAction
sealed class RoomMemberProfileAction : VectorViewModelAction {
object RetryFetchingInfo : RoomMemberProfileAction()
object IgnoreUser : RoomMemberProfileAction()
object ReportUser : RoomMemberProfileAction()
data class BanOrUnbanUser(val reason: String?) : RoomMemberProfileAction()
data class KickUser(val reason: String?) : RoomMemberProfileAction()
object InviteUser : RoomMemberProfileAction()

View file

@ -39,6 +39,7 @@ class RoomMemberProfileController @Inject constructor(
interface Callback {
fun onIgnoreClicked()
fun onReportClicked()
fun onTapVerify()
fun onShowDeviceList()
fun onShowDeviceListNoCrossSigning()
@ -225,7 +226,7 @@ class RoomMemberProfileController @Inject constructor(
title = stringProvider.getString(R.string.room_participants_action_invite),
destructive = false,
editable = false,
divider = ignoreActionTitle != null,
divider = true,
action = { callback?.onInviteClicked() }
)
}
@ -235,10 +236,18 @@ class RoomMemberProfileController @Inject constructor(
title = ignoreActionTitle,
destructive = true,
editable = false,
divider = false,
divider = true,
action = { callback?.onIgnoreClicked() }
)
}
buildProfileAction(
id = "report",
title = stringProvider.getString(R.string.message_report_user),
destructive = true,
editable = false,
divider = false,
action = { callback?.onReportClicked() }
)
}
}
@ -314,9 +323,9 @@ class RoomMemberProfileController @Inject constructor(
private fun RoomMemberProfileViewState.buildIgnoreActionTitle(): String? {
val isIgnored = isIgnored() ?: return null
return if (isIgnored) {
stringProvider.getString(R.string.unignore)
stringProvider.getString(R.string.room_participants_action_unignore_title)
} else {
stringProvider.getString(R.string.action_ignore)
stringProvider.getString(R.string.room_participants_action_ignore_title)
}
}
}

View file

@ -140,11 +140,20 @@ class RoomMemberProfileFragment :
is RoomMemberProfileViewEvents.OnIgnoreActionSuccess -> Unit
is RoomMemberProfileViewEvents.OnInviteActionSuccess -> Unit
RoomMemberProfileViewEvents.GoBack -> handleGoBack()
RoomMemberProfileViewEvents.OnReportActionSuccess -> handleReportSuccess()
}
}
setupLongClicks()
}
private fun handleReportSuccess() {
MaterialAlertDialogBuilder(requireContext())
.setTitle(R.string.user_reported_as_inappropriate_title)
.setMessage(R.string.user_reported_as_inappropriate_content)
.setPositiveButton(R.string.ok, null)
.show()
}
private fun setupLongClicks() {
headerViews.memberProfileNameView.copyOnLongClick()
headerViews.memberProfileIdView.copyOnLongClick()
@ -301,6 +310,10 @@ class RoomMemberProfileFragment :
}
}
override fun onReportClicked() {
viewModel.handle(RoomMemberProfileAction.ReportUser)
}
override fun onTapVerify() {
viewModel.handle(RoomMemberProfileAction.VerifyUser)
}

View file

@ -26,6 +26,7 @@ sealed class RoomMemberProfileViewEvents : VectorViewEvents {
data class Failure(val throwable: Throwable) : RoomMemberProfileViewEvents()
object OnIgnoreActionSuccess : RoomMemberProfileViewEvents()
object OnReportActionSuccess : RoomMemberProfileViewEvents()
object OnSetPowerLevelSuccess : RoomMemberProfileViewEvents()
object OnInviteActionSuccess : RoomMemberProfileViewEvents()
object OnKickActionSuccess : RoomMemberProfileViewEvents()

View file

@ -161,6 +161,7 @@ class RoomMemberProfileViewModel @AssistedInject constructor(
when (action) {
is RoomMemberProfileAction.RetryFetchingInfo -> handleRetryFetchProfileInfo()
is RoomMemberProfileAction.IgnoreUser -> handleIgnoreAction()
is RoomMemberProfileAction.ReportUser -> handleReportAction()
is RoomMemberProfileAction.VerifyUser -> prepareVerification()
is RoomMemberProfileAction.ShareRoomMemberProfile -> handleShareRoomMemberProfile()
is RoomMemberProfileAction.SetPowerLevel -> handleSetPowerLevel(action)
@ -172,6 +173,25 @@ class RoomMemberProfileViewModel @AssistedInject constructor(
}
}
private fun handleReportAction() {
viewModelScope.launch {
val event = try {
// The API need an Event, use the latest Event.
val latestEventId = room?.roomSummary()?.latestPreviewableEvent?.eventId ?: return@launch
room.reportingService()
.reportContent(
eventId = latestEventId,
score = -100,
reason = "Reporting user ${initialState.userId} (eventId is not relevant)"
)
RoomMemberProfileViewEvents.OnReportActionSuccess
} catch (failure: Throwable) {
RoomMemberProfileViewEvents.Failure(failure)
}
_viewEvents.post(event)
}
}
private fun handleOpenOrCreateDm(action: RoomMemberProfileAction.OpenOrCreateDm) {
viewModelScope.launch {
_viewEvents.post(RoomMemberProfileViewEvents.Loading())