status-desktop/ui/app/AppLayouts/Chat/components/ChannelContextMenu.qml

165 lines
5.4 KiB
QML
Raw Normal View History

import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Layouts 1.13
import "./"
import "../../../../shared"
import "../../../../imports"
PopupMenu {
property int channelIndex
property var contextChannel: ({})
id: channelContextMenu
width: 175
subMenuIcons: [
/* { */
/* source: Qt.resolvedUrl("../../../img/bell.svg"), */
/* width: 16, */
/* height: 16 */
/* }, */
{
source: Qt.resolvedUrl("../../../img/fetch.svg"),
width: 16,
height: 16
}
]
2021-02-12 18:38:25 +00:00
function openMenu(channel, index, x, y) {
channelContextMenu.contextChannel = channel
if (index !== undefined) {
channelContextMenu.channelIndex = index
}
2021-02-12 18:38:25 +00:00
channelContextMenu.popup(x, y)
}
Action {
2021-02-12 18:38:25 +00:00
id: viewProfileButton
enabled: channelContextMenu.contextChannel.chatType !== Constants.chatTypePublic
text: {
if (channelContextMenu.contextChannel.chatType === Constants.chatTypeOneToOne) {
//% "View Profile"
return qsTrId("view-profile")
}
if (channelContextMenu.contextChannel.chatType === Constants.chatTypePrivateGroupChat) {
//% "View Group"
return qsTrId("view-group")
}
//% "Share Chat"
return qsTrId("share-chat")
}
icon.source: "../../../img/group.svg"
icon.width: 16
icon.height: 16
onTriggered: {
if (channelContextMenu.contextChannel.chatType === Constants.chatTypeOneToOne) {
const userProfileImage = appMain.getProfileImage(channelContextMenu.contextChannel.id)
return openProfilePopup(
channelContextMenu.contextChannel.name,
channelContextMenu.contextChannel.id,
userProfileImage || channelContextMenu.contextChannel.identicon
)
}
if (channelContextMenu.contextChannel.chatType === Constants.chatTypePrivateGroupChat) {
fix: kick and re-invite user to group chat Fixes: #2601. Kicking a user and re-inviting them now correctly redisplays the join/decline options. Other combinations of User B leaving or declining an invitation are not handled. Please see the notes below for clarification. Additionally, the group invite popup (that shows the list of members belonging to the group) correctly shows when a user is kicked or when a user leaves the group in real time. Previously, the popup needed to be reopened to display this. fix: decline invitation crash Declining a group invitation was crashing the app. This has been fixed. ### NOTES 1. In the case where User A invites User B to a group, but User B declines (or User B joins, then leaves), then from a status-go standpoint, User B is still part of the group, but the chat is marked as `active: false` for User B. This creates a situation where User B cannot re-join the group once s/he has declined the invitation. @cammellos mentioned there possibly will need to be a refactor of https://github.com/status-im/status-go/blob/cab6281dc520c24912de5b5226b42a2f8415aa40/protocol/messenger.go#L1710 (which, by retaining User B as a member, effectively prevents the re-invitation) once “swipe to delete” is implemented on mobile. There is an activity center notification received for User B that is meant to allow re-joining of the group when the notification is accepted. The activity center notification received from status-go looks like the following: ```json "activityCenterNotifications": [ { "id": "0x0e342d33", "chatId": "e342d33f-dd05-4d7b-b14e-b5335e1a3ee9-0x043bf46aa874c377a34946eab67a32cf36c15907b328216dfce375d169fed7d81c21cada3229db1fd37c762d2c02702111a646657feca6621e2e948febcf378fb4", "name": "test-22", "type": 2, "lastMessage": null, "message": null, "timestamp": 1623305612000, "read": false, "dismissed": false, "accepted": false } ] ```
2021-06-10 07:29:05 +00:00
return openPopup(groupInfoPopupComponent, {channelType: GroupInfoPopup.ChannelType.ContextChannel})
}
}
}
2021-02-12 18:38:25 +00:00
Separator {
visible: viewProfileButton.enabled
}
Action {
text: channelContextMenu.contextChannel.muted ?
//% "Unmute chat"
qsTrId("unmute-chat") :
//% "Mute chat"
qsTrId("mute-chat")
icon.source: "../../../img/bell.svg"
icon.width: 16
icon.height: 16
onTriggered: {
if (chatsModel.channelIsMuted(channelContextMenu.channelIndex)) {
chatsModel.unmuteChannel(channelContextMenu.channelIndex)
return
}
chatsModel.muteChannel(channelContextMenu.channelIndex)
}
}
Action {
//% "Mark as Read"
text: qsTrId("mark-as-read")
icon.source: "../../../img/check-circle.svg"
icon.width: 16
icon.height: 16
onTriggered: {
chatsModel.markAllChannelMessagesReadByIndex(channelContextMenu.channelIndex)
}
}
// FetchMoreMessages {} // TODO: disabling it temporarily because wakuext_syncChatFromSyncedFrom does not support specifying a date range
Action {
//% "Clear History"
text: qsTrId("clear-history")
icon.source: "../../../img/close.svg"
icon.width: 16
icon.height: 16
onTriggered: chatsModel.clearChatHistoryByIndex(channelContextMenu.channelIndex)
}
Action {
enabled: chatsModel.communities.activeCommunity.active && chatsModel.communities.activeCommunity.admin
text: qsTr("Edit Channel")
icon.source: "../../../img/edit.svg"
icon.width: 16
icon.height: 16
onTriggered: openPopup(editChannelPopup, {communityId: chatsModel.communities.activeCommunity.id, channel: chatsModel.activeChannel})
}
Separator {
visible: deleteAction.enabled
}
Action {
id: deleteAction
text: {
if (channelContextMenu.contextChannel.chatType === Constants.chatTypeOneToOne) {
//% "Delete chat"
return qsTrId("delete-chat")
}
if (channelContextMenu.contextChannel.chatType === Constants.chatTypePrivateGroupChat) {
//% "Leave group"
return qsTrId("leave-group")
}
//% "Leave chat"
return qsTrId("leave-chat")
}
icon.source: {
if (channelContextMenu.contextChannel.chatType === Constants.chatTypeOneToOne) {
return "../../../img/delete.svg"
}
return "../../../img/leave_chat.svg"
}
icon.width: 16
icon.height: 16
icon.color: Style.current.red
onTriggered: openPopup(deleteChatConfirmationDialogComponent)
enabled: !chatsModel.communities.activeCommunity.active
}
Component {
id: deleteChatConfirmationDialogComponent
ConfirmationDialog {
btnType: "warn"
2021-05-04 14:53:56 +00:00
confirmationText: qsTr("Are you sure you want to leave this chat?")
onClosed: {
destroy()
}
onConfirmButtonClicked: {
chatsModel.leaveChatByIndex(channelContextMenu.channelIndex)
close();
}
}
}
}