196 lines
6.8 KiB
QML
196 lines
6.8 KiB
QML
import QtQuick 2.15
|
|
import QtQuick.Controls 2.15
|
|
import QtQuick.Layouts 1.15
|
|
import QtQml.Models 2.15
|
|
|
|
import StatusQ 0.1
|
|
import StatusQ.Components 0.1
|
|
import StatusQ.Controls 0.1
|
|
import StatusQ.Core 0.1
|
|
import StatusQ.Core.Theme 0.1
|
|
|
|
import shared.controls.delegates 1.0
|
|
import shared.status 1.0
|
|
import shared.stores 1.0 as SharedStores
|
|
import utils 1.0
|
|
|
|
import AppLayouts.Chat.stores 1.0 as ChatStores
|
|
|
|
Page {
|
|
id: root
|
|
|
|
property SharedStores.RootStore sharedRootStore
|
|
property SharedStores.UtilsStore utilsStore
|
|
property ChatStores.RootStore rootStore
|
|
property ChatStores.CreateChatPropertiesStore createChatPropertiesStore
|
|
|
|
property var mutualContactsModel
|
|
|
|
property var emojiPopup: null
|
|
property var stickersPopup: null
|
|
|
|
QtObject {
|
|
id: d
|
|
|
|
function createChat() {
|
|
root.createChatPropertiesStore.createChatInitMessage = chatInput.textInput.text
|
|
root.createChatPropertiesStore.createChatFileUrls = chatInput.fileUrlsAndSources
|
|
membersSelector.createChat()
|
|
|
|
membersSelector.cleanup()
|
|
chatInput.textInput.clear()
|
|
|
|
Global.closeCreateChatView()
|
|
}
|
|
}
|
|
|
|
padding: 0
|
|
|
|
Behavior on opacity { NumberAnimation {}}
|
|
Behavior on anchors.bottomMargin { NumberAnimation { duration: 30 }}
|
|
|
|
background: Rectangle {
|
|
color: Theme.palette.statusAppLayout.rightPanelBackgroundColor
|
|
}
|
|
|
|
header: Item {
|
|
implicitHeight: headerLayout.implicitHeight + headerLayout.anchors.topMargin + headerLayout.anchors.bottomMargin
|
|
RowLayout {
|
|
id: headerLayout
|
|
anchors.fill: parent
|
|
MembersSelectorView {
|
|
id: membersSelector
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
Layout.leftMargin: Theme.halfPadding
|
|
Layout.rightMargin: Theme.halfPadding
|
|
|
|
rootStore: root.rootStore
|
|
utilsStore: root.utilsStore
|
|
contactsModel: root.mutualContactsModel
|
|
|
|
function createChat() {
|
|
if (model.count === 0) {
|
|
console.warn("Can't create chat with no members")
|
|
return
|
|
}
|
|
if (model.count === 1) {
|
|
const member = model.get(0)
|
|
const ensName = member.displayName.includes(".eth") ? member.displayName : ""
|
|
root.rootStore.chatCommunitySectionModule.createOneToOneChat("", member.pubKey, ensName)
|
|
} else {
|
|
var groupName = []
|
|
var pubKeys = []
|
|
for (var i = 0; i < model.count; i++) {
|
|
const member = model.get(i)
|
|
groupName.push(member.displayName)
|
|
pubKeys.push(member.pubKey)
|
|
}
|
|
root.rootStore.chatCommunitySectionModule.createGroupChat("", groupName.join("&"), JSON.stringify(pubKeys))
|
|
}
|
|
}
|
|
|
|
onConfirmed: { d.createChat() }
|
|
|
|
onRejected: {
|
|
cleanup()
|
|
Global.closeCreateChatView()
|
|
}
|
|
|
|
onVisibleChanged: {
|
|
if (visible)
|
|
edit.forceActiveFocus()
|
|
}
|
|
|
|
onEnterKeyPressed: {
|
|
entryAccepted(contactsList.itemAtIndex(contactsList.currentIndex));
|
|
}
|
|
|
|
onUpKeyPressed: {
|
|
contactsList.decrementCurrentIndex();
|
|
}
|
|
|
|
onDownKeyPressed: {
|
|
contactsList.incrementCurrentIndex();
|
|
}
|
|
}
|
|
|
|
StatusActivityCenterButton {
|
|
Layout.alignment: Qt.AlignVCenter
|
|
unreadNotificationsCount: activityCenterStore.unreadNotificationsCount
|
|
hasUnseenNotifications: activityCenterStore.hasUnseenNotifications
|
|
onClicked: Global.openActivityCenterPopup()
|
|
}
|
|
}
|
|
}
|
|
|
|
contentItem: Item {
|
|
ColumnLayout {
|
|
anchors {
|
|
fill: parent
|
|
topMargin: Theme.bigPadding
|
|
bottomMargin: Theme.padding
|
|
leftMargin: Theme.halfPadding
|
|
}
|
|
|
|
StatusBaseText {
|
|
Layout.alignment: Qt.AlignTop
|
|
Layout.leftMargin: Theme.halfPadding
|
|
visible: contactsList.visible
|
|
text: qsTr("Contacts")
|
|
color: Theme.palette.baseColor1
|
|
}
|
|
|
|
StatusListView {
|
|
id: contactsList
|
|
objectName: "createChatContactsList"
|
|
|
|
Layout.fillWidth: true
|
|
Layout.fillHeight: true
|
|
visible: membersSelector.suggestionsModel.count &&
|
|
!(membersSelector.edit.text !== "")
|
|
implicitWidth: contentItem.childrenRect.width
|
|
model: membersSelector.suggestionsModel
|
|
delegate: ContactListItemDelegate {
|
|
width: ListView.view.width
|
|
highlighted: ListView.isCurrentItem
|
|
onClicked: membersSelector.entryAccepted(this)
|
|
}
|
|
}
|
|
|
|
StatusChatInput {
|
|
id: chatInput
|
|
Layout.alignment: Qt.AlignBottom
|
|
Layout.fillWidth: true
|
|
visible: membersSelector.model.count > 0
|
|
chatType: membersSelector.model.count === 1? Constants.chatType.oneToOne : Constants.chatType.privateGroupChat
|
|
emojiPopup: root.emojiPopup
|
|
stickersPopup: root.stickersPopup
|
|
closeGifPopupAfterSelection: true
|
|
usersModel: membersSelector.model
|
|
sharedStore: root.sharedRootStore
|
|
onStickerSelected: {
|
|
root.createChatPropertiesStore.createChatStickerHashId = hashId;
|
|
root.createChatPropertiesStore.createChatStickerPackId = packId;
|
|
root.createChatPropertiesStore.createChatStickerUrl = url;
|
|
membersSelector.createChat();
|
|
}
|
|
|
|
onSendMessage: { d.createChat() }
|
|
}
|
|
}
|
|
|
|
StatusBaseText {
|
|
anchors.centerIn: parent
|
|
width: Math.min(553, parent.width - 2 * Theme.padding)
|
|
visible: root.mutualContactsModel.ModelCount.empty
|
|
horizontalAlignment: Text.AlignHCenter
|
|
verticalAlignment: Text.AlignVCenter
|
|
wrapMode: Text.WordWrap
|
|
color: Theme.palette.baseColor1
|
|
text: qsTr("You can only send direct messages to your Contacts.\n
|
|
Send a contact request to the person you would like to chat with, you will be able to chat with them once they have accepted your contact request.")
|
|
}
|
|
}
|
|
}
|