2020-06-17 19:18:31 +00:00
|
|
|
import QtQuick 2.13
|
|
|
|
import QtQuick.Controls 2.13
|
|
|
|
import QtQuick.Layouts 1.13
|
2020-06-11 17:50:36 +00:00
|
|
|
import "../../../../imports"
|
|
|
|
import "../../../../shared"
|
2020-09-22 14:45:09 +00:00
|
|
|
import "../../../../shared/status"
|
2020-06-11 17:50:36 +00:00
|
|
|
import "./"
|
|
|
|
|
|
|
|
ModalPopup {
|
|
|
|
id: popup
|
2020-06-22 17:24:01 +00:00
|
|
|
property bool addMembers: false
|
|
|
|
property int currMemberCount: 1
|
|
|
|
property int memberCount: 1
|
|
|
|
readonly property int maxMembers: 10
|
|
|
|
property var pubKeys: []
|
2020-10-20 19:46:49 +00:00
|
|
|
property bool isAdmin: false
|
2020-06-22 17:24:01 +00:00
|
|
|
|
|
|
|
function resetSelectedMembers(){
|
|
|
|
pubKeys = [];
|
|
|
|
memberCount = chatsModel.activeChannel.members.rowCount();
|
|
|
|
currMemberCount = memberCount;
|
2020-12-11 20:38:10 +00:00
|
|
|
contactList.membersData.clear();
|
|
|
|
|
|
|
|
const contacts = chatView.getContactListObject()
|
|
|
|
|
|
|
|
contacts.forEach(function (contact) {
|
|
|
|
if(chatsModel.activeChannel.contains(contact.pubKey) ||
|
|
|
|
!contact.isContact) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
contactList.membersData.append(contact)
|
|
|
|
})
|
2020-06-22 17:24:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
onOpened: {
|
|
|
|
addMembers = false;
|
2020-10-20 19:46:49 +00:00
|
|
|
popup.isAdmin = chatsModel.activeChannel.isAdmin(profileModel.profile.pubKey)
|
2020-06-22 17:24:01 +00:00
|
|
|
btnSelectMembers.enabled = false;
|
|
|
|
resetSelectedMembers();
|
|
|
|
}
|
|
|
|
|
|
|
|
function doAddMembers(){
|
|
|
|
if(pubKeys.length === 0) return;
|
2020-12-06 15:24:28 +00:00
|
|
|
chatsModel.groups.addMembers(chatsModel.activeChannel.id, JSON.stringify(pubKeys));
|
2020-06-22 17:24:01 +00:00
|
|
|
popup.close();
|
|
|
|
}
|
2020-06-11 17:50:36 +00:00
|
|
|
|
|
|
|
header: Item {
|
|
|
|
height: children[0].height
|
|
|
|
width: parent.width
|
|
|
|
|
2020-09-22 14:45:09 +00:00
|
|
|
|
|
|
|
StatusLetterIdenticon {
|
2020-06-11 17:50:36 +00:00
|
|
|
id: letterIdenticon
|
|
|
|
width: 36
|
|
|
|
height: 36
|
|
|
|
anchors.top: parent.top
|
|
|
|
color: chatsModel.activeChannel.color
|
2020-09-22 14:45:09 +00:00
|
|
|
chatName: chatsModel.activeChannel.name
|
2020-06-11 17:50:36 +00:00
|
|
|
}
|
|
|
|
|
2020-06-19 18:21:02 +00:00
|
|
|
StyledTextEdit {
|
2020-06-11 17:50:36 +00:00
|
|
|
id: groupName
|
2020-07-06 20:39:55 +00:00
|
|
|
//% "Add members"
|
|
|
|
text: addMembers ? qsTrId("add-members") : chatsModel.activeChannel.name
|
2020-06-11 17:50:36 +00:00
|
|
|
anchors.top: parent.top
|
2020-10-20 19:19:10 +00:00
|
|
|
anchors.topMargin: 2
|
2020-06-11 17:50:36 +00:00
|
|
|
anchors.left: letterIdenticon.right
|
2020-07-02 15:14:31 +00:00
|
|
|
anchors.leftMargin: Style.current.smallPadding
|
2020-06-11 17:50:36 +00:00
|
|
|
font.bold: true
|
|
|
|
font.pixelSize: 14
|
|
|
|
readOnly: true
|
|
|
|
wrapMode: Text.WordWrap
|
|
|
|
}
|
|
|
|
|
2020-06-19 18:06:58 +00:00
|
|
|
StyledText {
|
2020-06-11 17:50:36 +00:00
|
|
|
text: {
|
2020-06-22 17:24:01 +00:00
|
|
|
let cnt = memberCount;
|
|
|
|
if(addMembers){
|
2020-07-06 20:39:55 +00:00
|
|
|
//% "%1 / 10 members"
|
|
|
|
return qsTrId("%1-/-10-members").arg(cnt)
|
2020-06-22 17:24:01 +00:00
|
|
|
} else {
|
2020-07-06 20:39:55 +00:00
|
|
|
//% "%1 members"
|
|
|
|
if(cnt > 1) return qsTrId("%1-members").arg(cnt);
|
|
|
|
//% "1 member"
|
|
|
|
return qsTrId("1-member");
|
2020-06-22 17:24:01 +00:00
|
|
|
}
|
2020-06-11 17:50:36 +00:00
|
|
|
}
|
|
|
|
width: 160
|
|
|
|
anchors.left: letterIdenticon.right
|
2020-07-02 15:14:31 +00:00
|
|
|
anchors.leftMargin: Style.current.smallPadding
|
2020-06-11 17:50:36 +00:00
|
|
|
anchors.top: groupName.bottom
|
|
|
|
anchors.topMargin: 2
|
|
|
|
font.pixelSize: 14
|
2020-07-02 15:14:31 +00:00
|
|
|
color: Style.current.darkGrey
|
2020-06-11 17:50:36 +00:00
|
|
|
}
|
2020-06-15 12:51:04 +00:00
|
|
|
|
|
|
|
Rectangle {
|
|
|
|
id: editGroupNameBtn
|
2020-10-20 19:46:49 +00:00
|
|
|
visible: !addMembers && popup.isAdmin
|
2020-06-15 12:51:04 +00:00
|
|
|
height: 24
|
|
|
|
width: 24
|
2020-10-20 19:19:10 +00:00
|
|
|
anchors.verticalCenter: groupName.verticalCenter
|
2020-06-15 12:51:04 +00:00
|
|
|
anchors.leftMargin: 4
|
|
|
|
anchors.left: groupName.right
|
|
|
|
radius: 8
|
|
|
|
|
2020-06-25 13:23:17 +00:00
|
|
|
SVGImage {
|
2020-06-15 12:51:04 +00:00
|
|
|
id: editGroupImg
|
|
|
|
source: "../../../img/edit-group.svg"
|
2020-08-07 19:26:51 +00:00
|
|
|
height: 16
|
|
|
|
width: 16
|
2020-06-15 12:51:04 +00:00
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
}
|
|
|
|
|
|
|
|
MouseArea {
|
|
|
|
id: closeModalMouseArea
|
|
|
|
cursorShape: Qt.PointingHandCursor
|
|
|
|
anchors.fill: parent
|
|
|
|
hoverEnabled: true
|
|
|
|
onExited: {
|
2020-07-02 15:14:31 +00:00
|
|
|
editGroupNameBtn.color = Style.current.white
|
2020-06-15 12:51:04 +00:00
|
|
|
}
|
|
|
|
onEntered: {
|
2020-07-02 15:14:31 +00:00
|
|
|
editGroupNameBtn.color = Style.current.grey
|
2020-06-15 12:51:04 +00:00
|
|
|
}
|
|
|
|
onClicked: renameGroupPopup.open()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
RenameGroupPopup {
|
|
|
|
id: renameGroupPopup
|
|
|
|
}
|
2020-06-11 17:50:36 +00:00
|
|
|
}
|
|
|
|
|
2020-06-22 17:24:01 +00:00
|
|
|
Item {
|
|
|
|
id: addMembersItem
|
|
|
|
anchors.fill: parent
|
|
|
|
|
|
|
|
SearchBox {
|
|
|
|
id: searchBox
|
|
|
|
visible: addMembers
|
|
|
|
iconWidth: 17
|
|
|
|
iconHeight: 17
|
|
|
|
customHeight: 44
|
|
|
|
fontPixelSize: 15
|
|
|
|
}
|
|
|
|
|
2020-12-11 20:38:10 +00:00
|
|
|
NoFriendsRectangle {
|
2020-08-10 02:14:21 +00:00
|
|
|
id: noContactsRect
|
2020-12-11 20:38:10 +00:00
|
|
|
visible: contactList.membersData.count === 0
|
2020-08-10 02:14:21 +00:00
|
|
|
anchors.top: searchBox.bottom
|
|
|
|
anchors.topMargin: Style.current.xlPadding
|
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
}
|
|
|
|
|
2020-12-11 20:38:10 +00:00
|
|
|
ContactList {
|
|
|
|
id: contactList
|
|
|
|
visible: addMembers && contactList.membersData.count > 0
|
2020-06-22 17:24:01 +00:00
|
|
|
anchors.fill: parent
|
|
|
|
anchors.topMargin: 50
|
|
|
|
anchors.top: searchBox.bottom
|
2020-12-11 20:38:10 +00:00
|
|
|
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);
|
2020-06-22 17:24:01 +00:00
|
|
|
}
|
|
|
|
}
|
2020-12-11 20:38:10 +00:00
|
|
|
memberCount = chatsModel.activeChannel.members.rowCount() + pubKeys.length;
|
|
|
|
btnSelectMembers.enabled = pubKeys.length > 0
|
2020-06-22 17:24:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-06-11 17:50:36 +00:00
|
|
|
|
|
|
|
Item {
|
2020-06-22 17:24:01 +00:00
|
|
|
id: groupInfoItem
|
2020-06-11 17:50:36 +00:00
|
|
|
anchors.fill: parent
|
|
|
|
|
2021-01-18 20:53:02 +00:00
|
|
|
Separator {
|
|
|
|
id: separator
|
|
|
|
visible: !addMembers
|
2020-06-11 17:50:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ListView {
|
|
|
|
id: memberList
|
|
|
|
anchors.fill: parent
|
|
|
|
anchors.top: memberLabel.bottom
|
|
|
|
anchors.bottom: popup.bottom
|
2021-01-18 20:53:02 +00:00
|
|
|
anchors.topMargin: addMembers ? 30 : 15
|
2020-07-02 15:14:31 +00:00
|
|
|
anchors.bottomMargin: Style.current.padding
|
2021-01-18 20:53:02 +00:00
|
|
|
anchors.leftMargin: 15
|
|
|
|
anchors.rightMargin: 15
|
|
|
|
spacing: 15
|
2020-06-11 17:50:36 +00:00
|
|
|
Layout.fillWidth: true
|
|
|
|
Layout.fillHeight: true
|
|
|
|
model: chatsModel.activeChannel.members
|
2020-10-20 19:19:10 +00:00
|
|
|
delegate: Item {
|
2020-09-17 19:39:02 +00:00
|
|
|
id: contactRow
|
2020-10-20 19:19:10 +00:00
|
|
|
width: parent.width
|
|
|
|
height: identicon.height
|
|
|
|
|
2021-01-14 16:03:00 +00:00
|
|
|
property string nickname: appMain.getUserNickname(model.pubKey)
|
2020-09-17 19:39:02 +00:00
|
|
|
|
2020-10-20 19:19:10 +00:00
|
|
|
StatusImageIdenticon {
|
|
|
|
id: identicon
|
|
|
|
anchors.left: parent.left
|
2020-12-21 12:08:44 +00:00
|
|
|
source: appMain.getProfileImage(model.pubKey)|| model.identicon
|
2020-06-11 17:50:36 +00:00
|
|
|
}
|
2020-10-20 19:19:10 +00:00
|
|
|
|
|
|
|
StyledText {
|
|
|
|
text: !model.userName.endsWith(".eth") && !!contactRow.nickname ?
|
|
|
|
contactRow.nickname : Utils.removeStatusEns(model.userName)
|
|
|
|
anchors.left: identicon.right
|
|
|
|
anchors.leftMargin: Style.current.smallPadding
|
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
font.pixelSize: 13
|
2021-01-18 20:53:02 +00:00
|
|
|
StyledText {
|
|
|
|
visible: model.userName === (profileModel.profile.preferredUsername || profileModel.profile.username)
|
|
|
|
anchors.left: parent.right
|
|
|
|
anchors.leftMargin: 5
|
|
|
|
text: "(You)"
|
|
|
|
color: Style.current.darkGrey
|
|
|
|
font.pixelSize: parent.font.pixelSize
|
|
|
|
}
|
2020-10-20 19:19:10 +00:00
|
|
|
MouseArea {
|
|
|
|
anchors.fill: parent
|
|
|
|
cursorShape: Qt.PointingHandCursor
|
2020-11-30 17:03:52 +00:00
|
|
|
onClicked: {
|
2020-12-21 12:08:44 +00:00
|
|
|
const userProfileImage = appMain.getProfileImage(model.pubKey)
|
2020-11-30 17:03:52 +00:00
|
|
|
openProfilePopup(model.userName, model.pubKey, userProfileImage || model.identicon, '', contactRow.nickname)
|
|
|
|
}
|
2020-06-11 17:50:36 +00:00
|
|
|
}
|
2020-10-20 19:19:10 +00:00
|
|
|
}
|
2020-08-06 13:37:09 +00:00
|
|
|
|
2020-10-20 19:19:10 +00:00
|
|
|
StyledText {
|
|
|
|
id: adminLabel
|
|
|
|
visible: model.isAdmin
|
|
|
|
//% "Admin"
|
|
|
|
text: qsTrId("group-chat-admin")
|
|
|
|
anchors.right: parent.right
|
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
font.pixelSize: 13
|
2021-01-18 20:53:02 +00:00
|
|
|
color: Style.current.darkGrey
|
2020-06-11 17:50:36 +00:00
|
|
|
}
|
2020-10-20 19:19:10 +00:00
|
|
|
|
|
|
|
StyledText {
|
|
|
|
id: moreActionsBtn
|
2020-10-20 19:46:49 +00:00
|
|
|
visible: !model.isAdmin && popup.isAdmin
|
2020-10-20 19:19:10 +00:00
|
|
|
text: "..."
|
|
|
|
anchors.right: parent.right
|
|
|
|
anchors.rightMargin: Style.current.smallPadding
|
|
|
|
anchors.verticalCenter: parent.verticalCenter
|
2021-01-18 20:53:02 +00:00
|
|
|
font.pixelSize: 20
|
|
|
|
font.bold: true
|
|
|
|
color: Style.current.darkGrey
|
2020-10-20 19:19:10 +00:00
|
|
|
MouseArea {
|
|
|
|
anchors.fill: parent
|
|
|
|
onClicked: {
|
|
|
|
contextMenu.popup(-contextMenu.width / 2 + moreActionsBtn.width / 2, moreActionsBtn.height + 10)
|
|
|
|
}
|
|
|
|
cursorShape: Qt.PointingHandCursor
|
|
|
|
PopupMenu {
|
|
|
|
id: contextMenu
|
|
|
|
Action {
|
|
|
|
icon.source: "../../../img/make-admin.svg"
|
|
|
|
//% "Make Admin"
|
|
|
|
text: qsTrId("make-admin")
|
2020-12-06 15:24:28 +00:00
|
|
|
onTriggered: chatsModel.groups.makeAdmin(chatsModel.activeChannel.id, model.pubKey)
|
2020-06-12 14:01:46 +00:00
|
|
|
}
|
2020-10-20 19:19:10 +00:00
|
|
|
Action {
|
|
|
|
icon.source: "../../../img/remove-from-group.svg"
|
|
|
|
icon.color: Style.current.red
|
|
|
|
//% "Remove From Group"
|
|
|
|
text: qsTrId("remove-from-group")
|
2020-12-06 15:24:28 +00:00
|
|
|
onTriggered: chatsModel.groups.kickMember(chatsModel.activeChannel.id, model.pubKey)
|
2020-06-12 14:01:46 +00:00
|
|
|
}
|
|
|
|
}
|
2020-06-11 17:50:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-06-22 17:24:01 +00:00
|
|
|
|
|
|
|
footer: Item {
|
2020-10-20 19:46:49 +00:00
|
|
|
visible: popup.isAdmin
|
2020-06-22 17:24:01 +00:00
|
|
|
width: parent.width
|
|
|
|
height: children[0].height
|
|
|
|
StyledButton {
|
|
|
|
visible: !addMembers
|
|
|
|
anchors.right: parent.right
|
2020-07-06 20:39:55 +00:00
|
|
|
//% "Add members"
|
|
|
|
label: qsTrId("add-members")
|
2020-06-22 17:24:01 +00:00
|
|
|
anchors.bottom: parent.bottom
|
|
|
|
onClicked: {
|
|
|
|
addMembers = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Button {
|
|
|
|
id: btnBack
|
|
|
|
visible: addMembers
|
|
|
|
width: 44
|
|
|
|
height: 44
|
|
|
|
anchors.bottom: parent.bottom
|
|
|
|
anchors.left: parent.left
|
2020-06-25 13:23:17 +00:00
|
|
|
SVGImage {
|
2020-06-22 17:24:01 +00:00
|
|
|
source: "../../../img/arrow-left-btn-active.svg"
|
2020-06-25 13:23:17 +00:00
|
|
|
width: 50
|
|
|
|
height: 50
|
2020-06-22 17:24:01 +00:00
|
|
|
}
|
|
|
|
background: Rectangle {
|
|
|
|
color: "transparent"
|
|
|
|
}
|
|
|
|
MouseArea {
|
|
|
|
cursorShape: Qt.PointingHandCursor
|
|
|
|
anchors.fill: parent
|
|
|
|
onClicked : {
|
|
|
|
addMembers = false;
|
|
|
|
resetSelectedMembers();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
StyledButton {
|
|
|
|
id: btnSelectMembers
|
|
|
|
visible: addMembers
|
|
|
|
disabled: memberCount <= currMemberCount
|
|
|
|
anchors.right: parent.right
|
2020-07-06 20:39:55 +00:00
|
|
|
//% "Add selected"
|
|
|
|
label: qsTrId("add-selected")
|
2020-06-22 17:24:01 +00:00
|
|
|
anchors.bottom: parent.bottom
|
|
|
|
onClicked: doAddMembers()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
content: addMembers ? addMembersItem : groupInfoItem
|
2020-06-11 17:50:36 +00:00
|
|
|
}
|