status-desktop/ui/app/AppLayouts/Chat/popups/GroupInfoPopup.qml

311 lines
10 KiB
QML

import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Layouts 1.13
import StatusQ.Controls 0.1
import StatusQ.Components 0.1
import StatusQ.Popups 0.1
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import utils 1.0
import shared.views 1.0
import shared.panels 1.0
import shared.status 1.0
import "../panels"
StatusModal {
id: popup
enum ChannelType {
ActiveChannel,
ContextChannel
}
property var store
property bool addMembers: false
property int currMemberCount: 1
property int memberCount: 1
readonly property int maxMembers: 10
property var pubKeys: []
property int channelType: GroupInfoPopup.ChannelType.ActiveChannel
property QtObject channel
property bool isAdmin: false
property Component pinnedMessagesPopupComponent
function resetSelectedMembers(){
pubKeys = []
memberCount = channel ? channel.members.rowCount() : 0
currMemberCount = memberCount
popup.store.addToGroupContacts.clear()
popup.store.reCalculateAddToGroupContacts(channel)
}
function doAddMembers(){
if(pubKeys.length === 0) return;
if (popup.channel) {
chatsModel.groups.addMembers(popup.channel.id, JSON.stringify(pubKeys));
}
popup.close();
}
height: 504
anchors.centerIn: parent
//% "Add members"
header.title: addMembers ? qsTrId("add-members") : (popup.channel ? popup.channel.name : "")
header.subTitle: {
let cnt = memberCount;
if(addMembers){
//% "%1 / 10 members"
return qsTrId("%1-/-10-members").arg(cnt)
} else {
//% "%1 members"
if(cnt > 1) return qsTrId("%1-members").arg(cnt);
//% "1 member"
return qsTrId("1-member");
}
}
header.editable: !addMembers && popup.isAdmin
header.icon.isLetterIdenticon: true
header.icon.name: popup.channel ? popup.channel.name : ""
header.icon.background.color: popup.channel ? popup.channel.color : "transparent"
onEditButtonClicked: renameGroupPopup.open()
onClosed: {
popup.destroy();
}
onOpened: {
addMembers = false;
if (popup.channel) {
popup.isAdmin = popup.channel.isAdmin(userProfile.pubKey)
}
btnSelectMembers.enabled = false;
resetSelectedMembers();
}
ColumnLayout {
id: addMembersItem
width: parent.width - 2*Style.current.padding
height: parent.height
anchors.top: parent.top
anchors.topMargin: Style.current.halfPadding
anchors.horizontalCenter: parent.horizontalCenter
visible: addMembers
spacing: Style.current.padding
StatusBaseInput {
id: searchBox
implicitHeight: 36
//% "Search"
placeholderText: qsTrId("search")
placeholderFont.pixelSize: 15
icon.name: "search"
icon.width: 17
icon.height: 17
Layout.fillWidth: true
Layout.alignment: Qt.AlignTop
}
NoFriendsRectangle {
visible: popup.store.addToGroupContacts.count === 0 && memberCount === 0
Layout.preferredHeight: childrenRect.height
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
Layout.bottomMargin: childrenRect.height
}
NoFriendsRectangle {
visible: popup.store.addToGroupContacts.count === 0 && memberCount > 0
//% "All your contacts are already in the group"
text: qsTrId("group-chat-all-contacts-invited")
textColor: Style.current.textColor
Layout.preferredHeight: childrenRect.height
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
Layout.bottomMargin: childrenRect.height
}
ContactListPanel {
id: contactList
visible: popup.store.addToGroupContacts.count > 0
Layout.fillHeight: true
Layout.fillWidth: true
model: popup.store.addToGroupContacts
selectMode: memberCount < maxMembers
searchString: searchBox.text.toLowerCase()
onItemChecked: function(pubKey, itemChecked){
var idx = pubKeys.indexOf(pubKey)
if(itemChecked){
if(idx === -1){
pubKeys.push(pubKey)
}
} else {
if(idx > -1){
pubKeys.splice(idx, 1);
}
}
memberCount = popup.channel.members.rowCount() + pubKeys.length;
btnSelectMembers.enabled = pubKeys.length > 0
}
}
}
ColumnLayout {
id: groupInfoItem
width: parent.width - 2*Style.current.padding
height: parent.height - 2*Style.current.padding
anchors.top: parent.top
anchors.topMargin: Style.current.padding
anchors.horizontalCenter: parent.horizontalCenter
visible: !addMembers
spacing: Style.current.padding
StatusSettingsLineButton {
property int pinnedCount: popup.store.chatsModelInst.messageView.pinnedMessagesList.count
id: pinnedMessagesBtn
visible: pinnedCount > 0
//% "Pinned messages"
text: qsTrId("pinned-messages")
currentValue: pinnedCount
onClicked: Global.openPopup(pinnedMessagesPopupComponent)
iconSource: Style.svg("pin")
}
Separator {
id: separator2
visible: pinnedMessagesBtn.visible
}
Connections {
target: popup.store.chatsModelInst.channelView
onActiveChannelChanged: {
if (popup.channelType === GroupInfoPopup.ChannelType.ActiveChannel) {
popup.channel = popup.store.chatsModelInst.channelView.activeChannel
resetSelectedMembers()
}
}
onContextChannelChanged: {
if (popup.channelType === GroupInfoPopup.ChannelType.ContextChannel) {
popup.channel = popup.store.chatsModelInst.channelView.contextChannel
resetSelectedMembers()
}
}
}
ListView {
id: memberList
Layout.fillWidth: true
Layout.fillHeight: true
clip: true
model: popup.channel? popup.channel.members : []
delegate: StatusListItem {
id: contactRow
property string nickname: appMain.getUserNickname(model.publicKey)
title: !model.userName.endsWith(".eth") && !!contactRow.nickname ?
contactRow.nickname : Utils.removeStatusEns(model.userName)
//% "(You)"
titleAsideText: model.publicKey === userProfile.pubKey ? qsTrId("-you-") : ""
//% "Admin"
statusListItemTitle.font.pixelSize: 17
statusListItemTitleAside.font.pixelSize: 17
label: model.isAdmin ? qsTrId("group-chat-admin"): ""
image.source: appMain.getProfileImage(model.publicKey) || model.identicon
image.isIdenticon: model.identicon
components: [
StatusFlatRoundButton {
id: moreActionsBtn
type: StatusFlatRoundButton.Type.Tertiary
color: "transparent"
icon.name: "more"
icon.color: Theme.palette.baseColor1
visible: !model.isAdmin && popup.isAdmin
onClicked: {
contextMenu.popup(-contextMenu.width / 2 + moreActionsBtn.width / 2, moreActionsBtn.height + 10)
}
StatusPopupMenu {
id: contextMenu
StatusMenuItem {
icon.name: "admin"
icon.width: 16
icon.height: 16
//% "Make Admin"
text: qsTrId("make-admin")
onTriggered: popup.store.chatsModelInst.groups.makeAdmin(popup.channel.id, model.publicKey)
}
StatusMenuItem {
icon.name: "remove-contact"
icon.width: 16
icon.height: 16
type: StatusMenuItem.Type.Danger
//% "Remove From Group"
text: qsTrId("remove-from-group")
onTriggered: popup.store.chatsModelInst.groups.kickMember(popup.channel.id, model.publicKey)
}
}
}
]
onTitleClicked: {
const userProfileImage = appMain.getProfileImage(model.publicKey)
openProfilePopup(model.userName, model.publicKey, userProfileImage || model.identicon, '', contactRow.nickname, popup)
}
}
}
}
leftButtons: [
StatusRoundButton {
visible: popup.addMembers
icon.name: "arrow-right"
icon.width: 20
icon.height: 16
icon.rotation: 180
onClicked: {
popup.addMembers = false;
popup.resetSelectedMembers();
}
}
]
rightButtons: [
StatusButton {
visible: !popup.addMembers
//% "Add members"
text: qsTrId("add-members")
onClicked: {
popup.addMembers = true;
}
},
StatusButton {
id: btnSelectMembers
visible: popup.addMembers
enabled: popup.memberCount >= popup.currMemberCount
//% "Add selected"
text: qsTrId("add-selected")
onClicked: popup.doAddMembers()
}
]
RenameGroupPopup {
id: renameGroupPopup
activeChannelName: popup.store.chatsModelInst.channelView.activeChannel.name
onDoRename: {
popup.store.chatsModelInst.groups.rename(groupName)
popup.header.title = groupName
close()
}
}
}