import QtQuick 2.13 import QtQuick.Controls 2.13 import Qt.labs.settings 1.0 import utils 1.0 import shared 1.0 import shared.panels 1.0 import shared.popups 1.0 import shared.status 1.0 import "views" import "panels" import "panels/communities" import "popups" import "helpers" import "controls" import "stores" import StatusQ.Layout 0.1 import StatusQ.Popups 0.1 StatusAppThreePanelLayout { id: root handle: SplitViewHandle { implicitWidth: 5 } property var messageStore property RootStore rootStore: RootStore { messageStore: root.messageStore } property alias chatColumn: chatColumn property bool stickersLoaded: false signal profileButtonClicked() Connections { target: root.rootStore.chatsModelInst.stickers onStickerPacksLoaded: { stickersLoaded = true; } } property var onActivated: function () { root.rootStore.chatsModelInst.channelView.restorePreviousActiveChannel(); chatColumn.onActivated(); } StatusSearchLocationMenu { id: searchPopupMenu searchPopup: searchPopup locationModel: root.rootStore.chatsModelInst.messageSearchViewController.locationMenuModel onItemClicked: { root.rootStore.chatsModelInst.messageSearchViewController.setSearchLocation(firstLevelItemValue, secondLevelItemValue) if(searchPopup.searchText !== "") searchMessages(searchPopup.searchText) } } property var searchMessages: Backpressure.debounce(searchPopup, 400, function (value) { root.rootStore.chatsModelInst.messageSearchViewController.searchMessages(value) }) Connections { target: root.rootStore.chatsModelInst.messageSearchViewController.locationMenuModel onModelAboutToBeReset: { for (var i = 2; i <= searchPopupMenu.count; i++) { //clear menu if (!!searchPopupMenu.takeItem(i)) { searchPopupMenu.removeItem(searchPopupMenu.takeItem(i)); } } } } StatusSearchPopup { id: searchPopup noResultsLabel: qsTr("No results") defaultSearchLocationText: qsTr("Anywhere") searchOptionsPopupMenu: searchPopupMenu searchResults: root.rootStore.chatsModelInst.messageSearchViewController.resultModel formatTimestampFn: function (ts) { return new Date(parseInt(ts, 10)).toLocaleString(Qt.locale(localAppSettings.locale)) } onSearchTextChanged: { searchMessages(searchPopup.searchText); } onAboutToHide: { if (searchPopupMenu.visible) { searchPopupMenu.close(); } } onClosed: { searchPopupMenu.dismiss(); } onOpened: { searchPopup.resetSearchSelection(); searchPopup.forceActiveFocus() root.rootStore.chatsModelInst.messageSearchViewController.prepareLocationMenuModel() const jsonObj = root.rootStore.chatsModelInst.messageSearchViewController.getSearchLocationObject() if (!jsonObj) { return } let obj = JSON.parse(jsonObj) if (obj.location === "") { if(obj.subLocation === "") { root.rootStore.chatsModelInst.messageSearchViewController.setSearchLocation("", "") } else { searchPopup.setSearchSelection(obj.subLocation.text, "", obj.subLocation.imageSource, obj.subLocation.isIdenticon, obj.subLocation.iconName, obj.subLocation.identiconColor) root.rootStore.chatsModelInst.messageSearchViewController.setSearchLocation("", obj.subLocation.value) } } else { if (obj.location.title === "Chat") { searchPopup.setSearchSelection(obj.subLocation.text, "", obj.subLocation.imageSource, obj.subLocation.isIdenticon, obj.subLocation.iconName, obj.subLocation.identiconColor) root.rootStore.chatsModelInst.messageSearchViewController.setSearchLocation(obj.location.value, obj.subLocation.value) } else { searchPopup.setSearchSelection(obj.location.title, obj.subLocation.text, obj.location.imageSource, obj.location.isIdenticon, obj.location.iconName, obj.location.identiconColor) root.rootStore.chatsModelInst.messageSearchViewController.setSearchLocation(obj.location.value, obj.subLocation.value) } } } onResultItemClicked: { searchPopup.close() root.rootStore.chatsModelInst.switchToSearchedItem(itemId) } onResultItemTitleClicked: { const pk = titleId const userProfileImage = appMain.getProfileImage(pk) return openProfilePopup(root.rootStore.chatsModelInst.userNameOrAlias(pk), pk, userProfileImage || root.rootStore.utilsModelInst.generateIdenticon(pk)) } } leftPanel: Loader { id: contactColumnLoader sourceComponent: localAccountSensitiveSettings.communitiesEnabled && root.rootStore.chatsModelInst.communities.activeCommunity.active ? communtiyColumnComponent : contactsColumnComponent } centerPanel: ChatColumnView { id: chatColumn rootStore: root.rootStore chatGroupsListViewCount: contactColumnLoader.item.chatGroupsListViewCount } showRightPanel: (localAccountSensitiveSettings.expandUsersList && (localAccountSensitiveSettings.showOnlineUsers || chatsModel.communities.activeCommunity.active) && (chatsModel.channelView.activeChannel.chatType !== Constants.chatTypeOneToOne)) rightPanel: localAccountSensitiveSettings.communitiesEnabled && chatsModel.communities.activeCommunity.active ? communityUserListComponent : userListComponent Component { id: communityUserListComponent CommunityUserListPanel { currentTime: chatColumn.currentTime messageContextMenu: quickActionMessageOptionsMenu profilePubKey: root.rootStore.profileModelInst.profile.pubKey contactsList: root.rootStore.profileModelInst.contacts.list community: root.rootStore.chatsModelInst.communities.activeCommunity currentUserName: Utils.removeStatusEns(root.rootStore.profileModelInst.ens.preferredUsername || root.rootStore.profileModelInst.profile.username) currentUserOnline: root.rootStore.profileModelInst.profile.sendUserStatus } } Component { id: userListComponent UserListPanel { currentTime: chatColumn.currentTime userList: chatColumn.userList messageContextMenu: quickActionMessageOptionsMenu profilePubKey: root.rootStore.profileModelInst.profile.pubKey contactsList: root.rootStore.profileModelInst.contacts.list isOnline: root.rootStore.chatsModelInst.isOnline } } Component { id: contactsColumnComponent ContactsColumnView { store: root.rootStore onOpenProfileClicked: { root.profileButtonClicked(); } } } Component { id: communtiyColumnComponent CommunityColumnView { store: root.rootStore pinnedMessagesPopupComponent: chatColumn.pinnedMessagesPopupComponent } } Component { id: groupInfoPopupComponent GroupInfoPopup { store: root.rootStore pinnedMessagesPopupComponent: chatColumn.pinnedMessagesPopupComponent } } Component { id: statusStickerPackClickPopup StatusStickerPackClickPopup{ onClosed: { destroy(); } } } ConfirmationDialog { id: removeContactConfirmationDialog // % "Remove contact" header.title: qsTrId("remove-contact") //% "Are you sure you want to remove this contact?" confirmationText: qsTrId("are-you-sure-you-want-to-remove-this-contact-") onConfirmButtonClicked: { if (root.rootStore.profileModelInst.contacts.isAdded(chatColumn.contactToRemove)) { root.rootStore.profileModelInst.contacts.removeContact(chatColumn.contactToRemove) } removeContactConfirmationDialog.parentPopup.close(); removeContactConfirmationDialog.close(); } } MessageContextMenuView { id: quickActionMessageOptionsMenu store: root.rootStore reactionModel: root.rootStore.emojiReactionsModel } } /*##^## Designer { D{i:0;formeditorColor:"#ffffff";formeditorZoom:1.25;height:770;width:1152} } ##^##*/