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

200 lines
6.3 KiB
QML
Raw Normal View History

2020-06-17 19:18:31 +00:00
import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Layouts 1.13
2020-05-28 12:56:43 +00:00
import "../../../../imports"
import "../../../../shared"
import "../../../../shared/status"
2020-05-28 12:56:43 +00:00
import "./"
2020-05-29 16:27:50 +00:00
ModalPopup {
property string validationError: ""
2020-06-25 13:26:58 +00:00
property string pubKey : "";
property string ensUsername : "";
property bool loading: false;
2020-06-25 13:26:58 +00:00
function validate() {
2020-06-25 13:26:58 +00:00
if (!Utils.isChatKey(chatKey.text) && !Utils.isValidETHNamePrefix(chatKey.text)) {
validationError = "This needs to be a valid chat key or ENS username";
ensUsername.text = "";
} else if (profileModel.profile.pubKey === chatKey.text) {
validationError = qsTr("Can't chat with yourself");
} else {
validationError = ""
}
return validationError === ""
}
2020-07-11 21:56:28 +00:00
property var resolveENS: Backpressure.debounce(popup, 500, function (ensName){
chatsModel.resolveENS(ensName)
loading = true
2020-07-11 21:56:28 +00:00
});
2020-06-25 13:26:58 +00:00
function onKeyReleased(){
if (!validate()) {
return;
}
chatKey.text = chatKey.text.trim();
2020-06-25 13:26:58 +00:00
if(Utils.isChatKey(chatKey.text)){
pubKey = chatKey.text;
ensUsername.text = "";
return;
}
Qt.callLater(resolveENS, chatKey.text)
2020-06-25 13:26:58 +00:00
}
function doJoin() {
if (!validate() || pubKey.trim() === "" || validationError !== "") return;
if(Utils.isChatKey(chatKey.text)){
chatsModel.joinChat(pubKey, Constants.chatTypeOneToOne);
} else {
chatsModel.joinChatWithENS(pubKey, chatKey.text);
}
popup.close();
}
2020-05-28 12:56:43 +00:00
id: popup
//% "New chat"
title: qsTrId("new-chat")
2020-05-29 16:27:50 +00:00
2020-05-29 18:38:11 +00:00
onOpened: {
chatKey.text = "";
2020-06-25 13:26:58 +00:00
pubKey = "";
ensUsername.text = "";
2020-05-29 18:38:11 +00:00
chatKey.forceActiveFocus(Qt.MouseFocusReason)
2020-12-06 22:15:51 +00:00
noContactsRect.visible = !profileModel.contacts.list.hasAddedContacts()
2020-05-29 18:38:11 +00:00
}
Input {
id: chatKey
//% "Enter ENS username or chat key"
placeholderText: qsTrId("enter-contact-code")
Keys.onEnterPressed: doJoin()
Keys.onReturnPressed: doJoin()
validationError: popup.validationError
2020-06-25 13:26:58 +00:00
Keys.onReleased: {
onKeyReleased();
}
Connections {
target: chatsModel
onEnsWasResolved: {
if(chatKey.text == ""){
ensUsername.text == "";
pubKey = "";
} else if(resolvedPubKey == ""){
//% "User not found"
ensUsername.text = qsTrId("user-not-found");
pubKey = "";
} else {
if (profileModel.profile.pubKey === resolvedPubKey) {
validationError = qsTr("Can't chat with yourself");
} else {
ensUsername.text = chatsModel.formatENSUsername(chatKey.text) + " • " + Utils.compactAddress(resolvedPubKey, 4)
pubKey = resolvedPubKey;
}
}
loading = false;
}
}
2020-05-29 16:27:50 +00:00
}
2020-06-25 13:26:58 +00:00
StyledText {
2020-06-25 13:26:58 +00:00
id: ensUsername
anchors.top: chatKey.bottom
anchors.topMargin: Style.current.padding
color: Style.current.darkGrey
2020-06-25 13:26:58 +00:00
font.pixelSize: 12
}
Item {
anchors.top: ensUsername.bottom
2020-07-11 21:56:28 +00:00
anchors.topMargin: 90
2020-06-25 13:26:58 +00:00
anchors.fill: parent
ScrollView {
anchors.fill: parent
Layout.fillWidth: true
Layout.fillHeight: true
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
ScrollBar.vertical.policy: contactListView.contentHeight > contactListView.height ? ScrollBar.AlwaysOn : ScrollBar.AlwaysOff
2020-05-28 12:56:43 +00:00
2020-06-25 13:26:58 +00:00
ListView {
anchors.fill: parent
spacing: 0
clip: true
id: contactListView
2020-12-06 22:15:51 +00:00
model: profileModel.contacts.list
2020-06-25 13:26:58 +00:00
delegate: Contact {
showCheckbox: false
pubKey: model.pubKey
isContact: model.isContact
isUser: false
2020-06-25 13:26:58 +00:00
name: model.name
address: model.address
2020-11-30 17:03:52 +00:00
identicon: model.thumbnailImage || model.identicon
2020-06-25 13:26:58 +00:00
onItemChecked: function(pubKey, itemChecked){
chatsModel.joinChat(pubKey, Constants.chatTypeOneToOne);
popup.close()
}
visible: model.isContact && (chatKey.text === "" ||
model.name.toLowerCase().includes(chatKey.text.toLowerCase()) ||
model.address.toLowerCase().includes(chatKey.text.toLowerCase()))
2020-06-25 13:26:58 +00:00
}
}
Rectangle {
id: noContactsRect
width: 260
anchors.centerIn: parent
StyledText {
id: noContacts
2020-08-26 15:52:26 +00:00
//% "You dont have any contacts yet. Invite your friends to start chatting."
text: qsTrId("you-don-t-have-any-contacts-yet--invite-your-friends-to-start-chatting-")
color: Style.current.darkGrey
anchors.top: parent.top
anchors.topMargin: Style.current.padding
anchors.left: parent.left
anchors.right: parent.right
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
}
StyledButton {
//% "Invite friends"
label: qsTrId("invite-friends")
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: noContacts.bottom
anchors.topMargin: Style.current.xlPadding
onClicked: {
inviteFriendsPopup.open()
}
}
InviteFriendsPopup {
id: inviteFriendsPopup
}
}
2020-06-25 13:26:58 +00:00
}
}
2020-11-16 20:56:10 +00:00
footer: StatusButton {
2020-05-29 16:27:50 +00:00
anchors.right: parent.right
2020-11-16 20:56:10 +00:00
id: submitBtn
state: loading ? "pending" : "default"
text: qsTr("Start chat")
enabled: pubKey !== ""
onClicked : doJoin()
}
2020-05-28 12:56:43 +00:00
}
/*##^##
Designer {
D{i:0;height:300;width:300}
}
##^##*/