2020-06-17 19:18:31 +00:00
|
|
|
import QtQuick 2.13
|
|
|
|
import QtQuick.Controls 2.13
|
|
|
|
import QtQuick.Layouts 1.13
|
2020-06-24 03:23:49 +00:00
|
|
|
|
2020-05-25 20:34:26 +00:00
|
|
|
import "../../../imports"
|
2020-05-27 21:09:12 +00:00
|
|
|
import "../../../shared"
|
2021-05-26 17:36:24 +00:00
|
|
|
import "../../../shared/status"
|
2020-05-26 18:16:07 +00:00
|
|
|
import "./components"
|
2020-05-28 00:21:02 +00:00
|
|
|
import "./ContactsColumn"
|
2020-12-11 20:38:10 +00:00
|
|
|
import "./CommunityComponents"
|
2020-05-25 20:34:26 +00:00
|
|
|
|
2021-06-30 14:17:05 +00:00
|
|
|
import StatusQ.Core 0.1
|
|
|
|
import StatusQ.Core.Theme 0.1
|
|
|
|
import StatusQ.Components 0.1
|
|
|
|
import StatusQ.Popups 0.1
|
|
|
|
|
|
|
|
Item {
|
|
|
|
property int chatGroupsListViewCount: channelList.chatListItems.count
|
2020-06-15 16:24:21 +00:00
|
|
|
property alias searchStr: searchBox.text
|
2020-05-25 20:34:26 +00:00
|
|
|
|
|
|
|
id: contactsColumn
|
2021-06-30 14:17:05 +00:00
|
|
|
|
2020-05-27 18:40:58 +00:00
|
|
|
Layout.fillHeight: true
|
2021-06-30 14:17:05 +00:00
|
|
|
width: 304
|
2020-05-27 18:40:58 +00:00
|
|
|
|
2021-06-30 14:17:05 +00:00
|
|
|
StatusNavigationPanelHeadline {
|
|
|
|
id: headline
|
2020-05-27 18:40:58 +00:00
|
|
|
anchors.top: parent.top
|
2021-06-30 14:17:05 +00:00
|
|
|
anchors.topMargin: 16
|
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
text: qsTr("Chat")
|
|
|
|
}
|
|
|
|
|
|
|
|
SearchBox {
|
|
|
|
id: searchBox
|
|
|
|
anchors.top: headline.bottom
|
|
|
|
anchors.topMargin: Style.current.padding
|
|
|
|
anchors.right: addChat.left
|
|
|
|
anchors.rightMargin: Style.current.padding
|
|
|
|
anchors.left: parent.left
|
|
|
|
anchors.leftMargin: Style.current.padding
|
|
|
|
}
|
|
|
|
|
|
|
|
AddChat {
|
|
|
|
id: addChat
|
|
|
|
anchors.right: parent.right
|
|
|
|
anchors.rightMargin: Style.current.padding
|
|
|
|
anchors.top: headline.bottom
|
|
|
|
anchors.topMargin: Style.current.padding
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusContactRequestsIndicatorListItem {
|
|
|
|
id: contactRequests
|
|
|
|
|
|
|
|
property int nbRequests: profileModel.contacts.contactRequests.count
|
|
|
|
|
|
|
|
anchors.top: searchBox.bottom
|
|
|
|
anchors.topMargin: visible ? Style.current.padding : 0
|
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
|
|
|
|
visible: nbRequests > 0
|
|
|
|
height: visible ? implicitHeight : 0
|
|
|
|
|
|
|
|
title: qsTr("Contact requests")
|
|
|
|
requestsCount: nbRequests
|
|
|
|
|
|
|
|
sensor.onClicked: openPopup(contactRequestsPopup)
|
|
|
|
}
|
|
|
|
|
|
|
|
ScrollView {
|
|
|
|
id: chatGroupsContainer
|
|
|
|
|
|
|
|
anchors.top: contactRequests.bottom
|
2020-07-15 19:38:03 +00:00
|
|
|
anchors.topMargin: Style.current.padding
|
2021-06-30 14:17:05 +00:00
|
|
|
anchors.bottom: parent.bottom
|
2020-05-27 18:40:58 +00:00
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
2021-06-30 14:17:05 +00:00
|
|
|
|
|
|
|
width: parent.width
|
|
|
|
|
|
|
|
leftPadding: Style.current.halfPadding
|
|
|
|
rightPadding: Style.current.halfPadding
|
|
|
|
|
|
|
|
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
|
|
|
|
|
|
|
|
contentHeight: channelList.height + 2 * Style.current.padding + emptyViewAndSuggestions.height + emptyViewAndSuggestions.anchors.topMargin
|
|
|
|
clip: true
|
|
|
|
|
|
|
|
Item {
|
|
|
|
id: noSearchResults
|
|
|
|
anchors.top: parent.top
|
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
width: parent.width
|
|
|
|
visible: !!!channelList.height && contactsColumn.searchStr !== ""
|
|
|
|
height: visible ? 300 : 0
|
|
|
|
|
|
|
|
StatusBaseText {
|
|
|
|
font.pixelSize: 15
|
|
|
|
color: Theme.palette.directColor5
|
|
|
|
anchors.centerIn: parent
|
|
|
|
text: qsTr("No search results")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusChatList {
|
|
|
|
id: channelList
|
|
|
|
|
|
|
|
chatNameFn: function (chatItem) {
|
|
|
|
return chatItem.chatType !== Constants.chatTypePublic ?
|
|
|
|
Emoji.parse(Utils.removeStatusEns(Utils.filterXSS(chatItem.name))) :
|
|
|
|
Utils.filterXSS(chatItem.name)
|
|
|
|
}
|
|
|
|
|
|
|
|
profileImageFn: function (id) {
|
|
|
|
return appMain.getProfileImage(id)
|
|
|
|
}
|
|
|
|
|
|
|
|
filterFn: function (chatListItem) {
|
|
|
|
return !!!contactsColumn.searchStr || chatListItem.name.toLowerCase().includes(contactsColumn.searchStr.toLowerCase())
|
|
|
|
}
|
|
|
|
|
|
|
|
Connections {
|
|
|
|
target: profileModel.contacts.list
|
|
|
|
onContactChanged: {
|
|
|
|
for (var i = 0; i < channelList.chatListItems.count; i++) {
|
|
|
|
let chatItem = channelList.chatListItems.itemAt(i);
|
|
|
|
if (chatItem.chatId === pubkey) {
|
|
|
|
let profileImage = appMain.getProfileImage(pubkey)
|
|
|
|
if (!!profileImage) {
|
|
|
|
chatItem.image.isIdenticon = false
|
|
|
|
chatItem.image.source = profileImage
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
chatListItems.model: chatsModel.channelView.chats
|
|
|
|
selectedChatId: chatsModel.channelView.activeChannel.id
|
|
|
|
|
|
|
|
onChatItemSelected: chatsModel.channelView.setActiveChannel(id)
|
|
|
|
onChatItemUnmuted: chatsModel.channelView.unmuteChatItem(id)
|
|
|
|
|
|
|
|
popupMenu: StatusPopupMenu {
|
|
|
|
|
|
|
|
id: chatListContextMenu
|
|
|
|
|
|
|
|
property var chatItem
|
|
|
|
|
|
|
|
openHandler: function (id) {
|
|
|
|
chatItem = chatsModel.channelView.getChatItemById(id)
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusMenuItem {
|
|
|
|
id: viewProfileMenuItem
|
|
|
|
text: {
|
|
|
|
if (chatItem) {
|
|
|
|
switch (chatItem.chatType) {
|
|
|
|
case Constants.chatTypeOneToOne:
|
|
|
|
return qsTr("View Profile")
|
|
|
|
break;
|
|
|
|
case Constants.chatTypePrivateGroupChat:
|
|
|
|
return qsTr("View Group")
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return qsTr("Share Chat")
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
icon.name: "group-chat"
|
|
|
|
enabled: chatItem && chatItem.chatType !== Constants.chatTypePublic
|
|
|
|
onTriggered: {
|
|
|
|
if (chatItem.chatType === Constants.chatTypeOneToOne) {
|
|
|
|
const userProfileImage = appMain.getProfileImage(chatItem.id)
|
|
|
|
return openProfilePopup(
|
|
|
|
chatItem.name,
|
|
|
|
chatItem.id,
|
|
|
|
userProfileImage || chatItem.identicon
|
|
|
|
)
|
|
|
|
}
|
|
|
|
if (chatItem.chatType === Constants.chatTypePrivateGroupChat) {
|
|
|
|
return openPopup(groupInfoPopupComponent, {channelType: GroupInfoPopup.ChannelType.ContextChannel})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusMenuSeparator {
|
|
|
|
visible: viewProfileMenuItem.enabled
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusMenuItem {
|
|
|
|
text: chatItem && chatItem.muted ?
|
|
|
|
qsTr("Unmute chat") :
|
|
|
|
qsTr("Mute chat")
|
|
|
|
icon.name: "notification"
|
|
|
|
onTriggered: {
|
|
|
|
if (chatItem && chatItem.muted) {
|
|
|
|
return chatsModel.channelView.unmuteChatItem(chatItem.id)
|
|
|
|
}
|
|
|
|
chatsModel.channelView.muteChatItem(chatItem.id)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusMenuItem {
|
|
|
|
text: "Mark as Read"
|
|
|
|
icon.name: "checkmark-circle"
|
|
|
|
onTriggered: chatsModel.channelView.markChatItemAsRead(chatItem.id)
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusMenuItem {
|
|
|
|
text: "Clear history"
|
|
|
|
icon.name: "close-circle"
|
|
|
|
onTriggered: chatsModel.channelView.clearChatHistory(chatItem.id)
|
|
|
|
}
|
|
|
|
|
|
|
|
StatusMenuSeparator {}
|
|
|
|
|
|
|
|
StatusMenuItem {
|
|
|
|
text: chatItem && chatItem.chatType === Constants.chatTypeOneToOne ? "Delete chat" : "Leave chat"
|
|
|
|
icon.name: chatItem && chatItem.chatType === Constants.chatTypeOneToOne ? "delete" : "arrow-right"
|
|
|
|
icon.width: chatItem && chatItem.chatType === Constants.chatTypeOneToOne ? 18 : 14
|
|
|
|
iconRotation: chatItem && chatItem.chatType === Constants.chatTypeOneToOne ? 0 : 180
|
|
|
|
|
|
|
|
type: StatusMenuItem.Type.Danger
|
|
|
|
onTriggered: openPopup(deleteChatConfirmationDialogComponent, { chatId: chatItem.id })
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
EmptyView {
|
|
|
|
id: emptyViewAndSuggestions
|
|
|
|
width: parent.width
|
|
|
|
visible: !appSettings.hideChannelSuggestions && !noSearchResults.visible
|
|
|
|
anchors.top: noSearchResults.visible ? noSearchResults.bottom : channelList.bottom
|
|
|
|
anchors.topMargin: 32
|
|
|
|
}
|
2020-05-27 18:40:58 +00:00
|
|
|
}
|
2020-05-25 20:34:26 +00:00
|
|
|
|
2020-12-11 20:29:46 +00:00
|
|
|
Component {
|
|
|
|
id: publicChatPopupComponent
|
|
|
|
PublicChatPopup {
|
|
|
|
onClosed: {
|
|
|
|
destroy()
|
|
|
|
}
|
|
|
|
}
|
2020-05-27 20:11:56 +00:00
|
|
|
}
|
|
|
|
|
2020-12-11 20:29:46 +00:00
|
|
|
Component {
|
|
|
|
id: groupChatPopupComponent
|
|
|
|
GroupChatPopup {
|
|
|
|
onClosed: {
|
|
|
|
destroy()
|
|
|
|
}
|
|
|
|
}
|
2020-06-17 15:56:48 +00:00
|
|
|
}
|
|
|
|
|
2020-12-11 20:29:46 +00:00
|
|
|
Component {
|
|
|
|
id: privateChatPopupComponent
|
|
|
|
PrivateChatPopup {
|
|
|
|
onClosed: {
|
|
|
|
destroy()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Component {
|
|
|
|
id: communitiesPopupComponent
|
|
|
|
CommunitiesPopup {
|
|
|
|
onClosed: {
|
|
|
|
destroy()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Component {
|
|
|
|
id: createCommunitiesPopupComponent
|
|
|
|
CreateCommunityPopup {
|
|
|
|
onClosed: {
|
|
|
|
destroy()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-18 20:55:33 +00:00
|
|
|
Component {
|
|
|
|
id: importCommunitiesPopupComponent
|
2021-02-12 18:19:31 +00:00
|
|
|
AccessExistingCommunityPopup {
|
2020-12-18 20:55:33 +00:00
|
|
|
onClosed: {
|
|
|
|
destroy()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-12-11 20:29:46 +00:00
|
|
|
Component {
|
|
|
|
id: communityDetailPopup
|
|
|
|
CommunityDetailPopup {
|
|
|
|
onClosed: {
|
|
|
|
destroy()
|
|
|
|
}
|
|
|
|
}
|
2020-05-28 12:56:43 +00:00
|
|
|
}
|
|
|
|
|
2021-05-26 17:36:24 +00:00
|
|
|
Component {
|
|
|
|
id: contactRequestsPopup
|
|
|
|
ContactRequestsPopup {
|
|
|
|
onClosed: {
|
|
|
|
destroy()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-30 14:17:05 +00:00
|
|
|
Component {
|
|
|
|
id: deleteChatConfirmationDialogComponent
|
|
|
|
ConfirmationDialog {
|
|
|
|
property string chatId
|
|
|
|
btnType: "warn"
|
|
|
|
confirmationText: qsTr("Are you sure you want to leave this chat?")
|
|
|
|
onClosed: {
|
|
|
|
destroy()
|
|
|
|
}
|
|
|
|
onConfirmButtonClicked: {
|
|
|
|
chatsModel.channelView.leaveChat(chatId)
|
|
|
|
close();
|
|
|
|
}
|
2021-05-26 17:36:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-25 20:34:26 +00:00
|
|
|
}
|
2020-07-08 19:19:34 +00:00
|
|
|
|
|
|
|
/*##^##
|
|
|
|
Designer {
|
|
|
|
D{i:0;autoSize:true;formeditorColor:"#ffffff";height:480;width:640}
|
|
|
|
}
|
|
|
|
##^##*/
|