2023-04-28 10:28:19 +00:00
|
|
|
import QtQuick 2.15
|
|
|
|
import QtQml 2.15
|
2021-10-01 15:58:36 +00:00
|
|
|
|
|
|
|
import utils 1.0
|
2023-03-07 16:51:06 +00:00
|
|
|
import SortFilterProxyModel 0.2
|
2022-03-22 08:29:58 +00:00
|
|
|
import StatusQ.Core.Utils 0.1 as StatusQUtils
|
2022-10-17 10:17:25 +00:00
|
|
|
import shared.stores 1.0
|
2021-10-01 15:58:36 +00:00
|
|
|
|
|
|
|
QtObject {
|
|
|
|
id: root
|
2022-01-04 12:06:05 +00:00
|
|
|
|
2022-02-14 12:18:25 +00:00
|
|
|
property var contactsStore
|
2023-04-11 08:09:01 +00:00
|
|
|
property var communityTokensStore
|
2024-02-19 13:58:20 +00:00
|
|
|
property var walletStore
|
2022-03-22 08:29:58 +00:00
|
|
|
|
2023-04-04 11:31:04 +00:00
|
|
|
property var networkConnectionStore
|
|
|
|
|
2023-03-07 08:47:04 +00:00
|
|
|
readonly property PermissionsStore permissionsStore: PermissionsStore {
|
|
|
|
activeSectionId: mainModuleInst.activeSection.id
|
2023-06-08 11:01:01 +00:00
|
|
|
activeChannelId: root.currentChatContentModule().chatDetails.id
|
2023-03-07 08:47:04 +00:00
|
|
|
chatCommunitySectionModuleInst: chatCommunitySectionModule
|
|
|
|
}
|
|
|
|
|
2022-02-15 21:00:05 +00:00
|
|
|
property bool openCreateChat: false
|
2022-03-22 08:29:58 +00:00
|
|
|
|
2022-03-25 11:33:30 +00:00
|
|
|
property var contactsModel: root.contactsStore.myContactsModel
|
2022-03-22 08:29:58 +00:00
|
|
|
|
2022-01-04 12:06:05 +00:00
|
|
|
// Important:
|
|
|
|
// Each `ChatLayout` has its own chatCommunitySectionModule
|
|
|
|
// (on the backend chat and community sections share the same module since they are actually the same)
|
|
|
|
property var chatCommunitySectionModule
|
2023-04-18 09:11:47 +00:00
|
|
|
readonly property var sectionDetails: _d.sectionDetailsInstantiator.count ? _d.sectionDetailsInstantiator.objectAt(0) : null
|
2023-03-07 16:51:06 +00:00
|
|
|
|
|
|
|
property var communityItemsModel: chatCommunitySectionModule.model
|
2023-04-18 09:11:47 +00:00
|
|
|
|
2023-03-07 16:51:06 +00:00
|
|
|
property var assetsModel: SortFilterProxyModel {
|
2023-06-21 14:20:39 +00:00
|
|
|
sourceModel: communitiesModuleInst.tokenList
|
2023-03-07 16:51:06 +00:00
|
|
|
|
|
|
|
proxyRoles: ExpressionRole {
|
2023-03-20 12:29:05 +00:00
|
|
|
function tokenIcon(symbol) {
|
|
|
|
return Constants.tokenIcon(symbol)
|
2023-03-07 16:51:06 +00:00
|
|
|
}
|
|
|
|
name: "iconSource"
|
2023-03-20 12:29:05 +00:00
|
|
|
expression: !!model.icon ? model.icon : tokenIcon(model.symbol)
|
2023-03-07 16:51:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-09 16:54:44 +00:00
|
|
|
property var collectiblesModel: SortFilterProxyModel {
|
2023-06-21 14:20:39 +00:00
|
|
|
sourceModel: communitiesModuleInst.collectiblesModel
|
2023-03-07 16:51:06 +00:00
|
|
|
|
2023-03-09 16:54:44 +00:00
|
|
|
proxyRoles: ExpressionRole {
|
2023-07-05 08:38:47 +00:00
|
|
|
function collectibleIcon(icon) {
|
2023-03-09 16:54:44 +00:00
|
|
|
return !!icon ? icon : Style.png("tokens/DEFAULT-TOKEN")
|
|
|
|
}
|
|
|
|
name: "iconSource"
|
2023-07-05 08:38:47 +00:00
|
|
|
expression: collectibleIcon(model.icon)
|
2023-03-09 16:54:44 +00:00
|
|
|
}
|
|
|
|
}
|
2023-04-28 10:28:19 +00:00
|
|
|
|
2023-08-21 18:54:57 +00:00
|
|
|
function prepareTokenModelForCommunity(publicKey) {
|
|
|
|
root.communitiesModuleInst.prepareTokenModelForCommunity(publicKey)
|
|
|
|
}
|
|
|
|
|
2024-03-25 22:46:58 +00:00
|
|
|
readonly property bool allChannelsAreHiddenBecauseNotPermitted: root.chatCommunitySectionModule.allChannelsAreHiddenBecauseNotPermitted &&
|
|
|
|
!root.chatCommunitySectionModule.requiresTokenPermissionToJoin
|
2024-03-18 17:33:07 +00:00
|
|
|
|
2024-05-07 18:46:54 +00:00
|
|
|
readonly property int communityMemberReevaluationStatus: root.chatCommunitySectionModule && root.chatCommunitySectionModule.communityMemberReevaluationStatus
|
|
|
|
|
2023-08-22 18:04:58 +00:00
|
|
|
readonly property bool requirementsCheckPending: root.communitiesModuleInst.requirementsCheckPending
|
|
|
|
|
2023-08-21 18:54:57 +00:00
|
|
|
readonly property var permissionsModel: !!root.communitiesModuleInst.spectatedCommunityPermissionModel ?
|
|
|
|
root.communitiesModuleInst.spectatedCommunityPermissionModel : null
|
|
|
|
|
2023-08-02 16:03:52 +00:00
|
|
|
readonly property string overviewChartData: chatCommunitySectionModule.overviewChartData
|
|
|
|
|
2023-04-28 10:28:19 +00:00
|
|
|
readonly property bool isUserAllowedToSendMessage: _d.isUserAllowedToSendMessage
|
|
|
|
readonly property string chatInputPlaceHolderText: _d.chatInputPlaceHolderText
|
|
|
|
readonly property var oneToOneChatContact: _d.oneToOneChatContact
|
2022-01-04 12:06:05 +00:00
|
|
|
// Since qml component doesn't follow encaptulation from the backend side, we're introducing
|
|
|
|
// a method which will return appropriate chat content module for selected chat/channel
|
2024-03-20 17:58:46 +00:00
|
|
|
function currentChatContentModule() {
|
2022-01-04 12:06:05 +00:00
|
|
|
// When we decide to have the same struct as it's on the backend we will remove this function.
|
2023-01-27 15:24:00 +00:00
|
|
|
// So far this is a way to deal with refactored backend from the current qml structure.
|
|
|
|
chatCommunitySectionModule.prepareChatContentModuleForChatId(chatCommunitySectionModule.activeItem.id)
|
2022-01-04 12:06:05 +00:00
|
|
|
return chatCommunitySectionModule.getChatContentModule()
|
|
|
|
}
|
|
|
|
|
2023-09-29 14:02:55 +00:00
|
|
|
function copyToClipboard(text) {
|
|
|
|
globalUtils.copyToClipboard(text)
|
|
|
|
}
|
|
|
|
|
2022-01-04 12:06:05 +00:00
|
|
|
// Contact requests related part
|
|
|
|
property var contactRequestsModel: chatCommunitySectionModule.contactRequestsModel
|
|
|
|
|
2023-02-07 14:21:32 +00:00
|
|
|
property bool loadingHistoryMessagesInProgress: chatCommunitySectionModule.loadingHistoryMessagesInProgress
|
2022-02-07 21:55:14 +00:00
|
|
|
|
2022-04-08 10:41:35 +00:00
|
|
|
property var advancedModule: profileSectionModule.advancedModule
|
|
|
|
|
2023-10-16 16:05:55 +00:00
|
|
|
property var privacyModule: profileSectionModule.privacyModule
|
|
|
|
|
2023-08-04 13:14:06 +00:00
|
|
|
readonly property bool permissionsCheckOngoing: chatCommunitySectionModule.permissionsCheckOngoing
|
|
|
|
|
2022-11-28 14:57:56 +00:00
|
|
|
signal importingCommunityStateChanged(string communityId, int state, string errorMsg)
|
|
|
|
|
2023-07-21 08:44:10 +00:00
|
|
|
signal communityAdded(string communityId)
|
|
|
|
|
2023-06-08 11:01:01 +00:00
|
|
|
signal communityAccessRequested(string communityId)
|
|
|
|
|
2023-04-06 11:11:57 +00:00
|
|
|
signal goToMembershipRequestsPage()
|
|
|
|
|
2022-01-25 20:07:03 +00:00
|
|
|
function setActiveCommunity(communityId) {
|
|
|
|
mainModule.setActiveSectionById(communityId);
|
|
|
|
}
|
|
|
|
|
2022-10-20 09:05:10 +00:00
|
|
|
function activateStatusDeepLink(link) {
|
|
|
|
mainModuleInst.activateStatusDeepLink(link)
|
|
|
|
}
|
|
|
|
|
2022-01-25 20:07:03 +00:00
|
|
|
function setObservedCommunity(communityId) {
|
|
|
|
communitiesModuleInst.setObservedCommunity(communityId);
|
|
|
|
}
|
|
|
|
|
2022-02-09 17:35:59 +00:00
|
|
|
function getMySectionId() {
|
|
|
|
return chatCommunitySectionModule.getMySectionId()
|
|
|
|
}
|
|
|
|
|
2022-11-08 08:36:08 +00:00
|
|
|
function amIChatAdmin() {
|
|
|
|
return currentChatContentModule().amIChatAdmin()
|
|
|
|
}
|
|
|
|
|
2023-04-03 16:27:56 +00:00
|
|
|
function acceptContactRequest(pubKey, contactRequestId) {
|
|
|
|
chatCommunitySectionModule.acceptContactRequest(pubKey, contactRequestId)
|
2022-01-04 12:06:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function acceptAllContactRequests() {
|
|
|
|
chatCommunitySectionModule.acceptAllContactRequests()
|
|
|
|
}
|
|
|
|
|
2023-04-03 16:27:56 +00:00
|
|
|
function dismissContactRequest(pubKey, contactRequestId) {
|
|
|
|
chatCommunitySectionModule.dismissContactRequest(pubKey, contactRequestId)
|
2022-01-04 12:06:05 +00:00
|
|
|
}
|
|
|
|
|
2022-05-27 08:57:18 +00:00
|
|
|
function dismissAllContactRequests() {
|
|
|
|
chatCommunitySectionModule.dismissAllContactRequests()
|
2022-01-04 12:06:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function blockContact(pubKey) {
|
|
|
|
chatCommunitySectionModule.blockContact(pubKey)
|
|
|
|
}
|
|
|
|
|
2022-03-22 08:29:58 +00:00
|
|
|
function interpretMessage(msg) {
|
|
|
|
if (msg.startsWith("/shrug")) {
|
|
|
|
return msg.replace("/shrug", "") + " ¯\\\\\\_(ツ)\\_/¯"
|
|
|
|
}
|
|
|
|
if (msg.startsWith("/tableflip")) {
|
|
|
|
return msg.replace("/tableflip", "") + " (╯°□°)╯︵ ┻━┻"
|
|
|
|
}
|
|
|
|
|
|
|
|
return msg
|
|
|
|
}
|
|
|
|
|
2023-07-11 11:30:55 +00:00
|
|
|
function cleanMessageText(formattedMessage) {
|
|
|
|
const text = globalUtilsInst.plainText(StatusQUtils.Emoji.deparse(formattedMessage))
|
|
|
|
return interpretMessage(text)
|
|
|
|
}
|
|
|
|
|
2023-01-09 21:13:08 +00:00
|
|
|
function sendMessage(chatId, event, text, replyMessageId, fileUrlsAndSources) {
|
|
|
|
chatCommunitySectionModule.prepareChatContentModuleForChatId(chatId)
|
|
|
|
const chatContentModule = chatCommunitySectionModule.getChatContentModule()
|
2023-01-10 14:50:47 +00:00
|
|
|
var result = false
|
|
|
|
|
2023-07-11 11:30:55 +00:00
|
|
|
const textMsg = cleanMessageText(text)
|
2023-03-06 09:47:35 +00:00
|
|
|
if (textMsg.trim() !== "") {
|
2023-07-11 11:30:55 +00:00
|
|
|
if (event)
|
2022-03-22 08:29:58 +00:00
|
|
|
event.accepted = true
|
2023-03-06 09:47:35 +00:00
|
|
|
}
|
2022-03-22 08:29:58 +00:00
|
|
|
|
2023-03-06 09:47:35 +00:00
|
|
|
if (fileUrlsAndSources.length > 0) {
|
2023-03-29 22:26:56 +00:00
|
|
|
chatContentModule.inputAreaModule.sendImages(JSON.stringify(fileUrlsAndSources), textMsg.trim(), replyMessageId)
|
2023-01-10 14:50:47 +00:00
|
|
|
result = true
|
2023-03-06 09:47:35 +00:00
|
|
|
|
|
|
|
} else {
|
|
|
|
if (textMsg.trim() !== "") {
|
|
|
|
chatContentModule.inputAreaModule.sendMessage(
|
|
|
|
textMsg,
|
|
|
|
replyMessageId,
|
|
|
|
Utils.isOnlyEmoji(textMsg) ? Constants.messageContentType.emojiType : Constants.messageContentType.messageType,
|
|
|
|
false)
|
|
|
|
|
|
|
|
result = true
|
|
|
|
}
|
2022-03-22 08:29:58 +00:00
|
|
|
}
|
2023-03-06 09:47:35 +00:00
|
|
|
|
2023-01-10 14:50:47 +00:00
|
|
|
return result
|
2022-03-22 08:29:58 +00:00
|
|
|
}
|
|
|
|
|
2023-01-26 18:52:41 +00:00
|
|
|
function openCloseCreateChatView() {
|
|
|
|
if (root.openCreateChat) {
|
|
|
|
Global.closeCreateChatView()
|
|
|
|
} else {
|
|
|
|
Global.openCreateChatView()
|
|
|
|
}
|
|
|
|
}
|
2022-01-04 12:06:05 +00:00
|
|
|
|
2022-01-13 21:41:43 +00:00
|
|
|
property var messageStore: MessageStore { }
|
|
|
|
|
2022-01-05 15:50:03 +00:00
|
|
|
property var emojiReactionsModel
|
2021-10-01 15:58:36 +00:00
|
|
|
|
2022-01-13 10:16:11 +00:00
|
|
|
property var globalUtilsInst: globalUtils
|
|
|
|
|
2022-01-05 15:11:26 +00:00
|
|
|
property var mainModuleInst: mainModule
|
2022-09-15 16:34:41 +00:00
|
|
|
|
2021-12-14 19:21:50 +00:00
|
|
|
property var communitiesModuleInst: communitiesModule
|
|
|
|
property var communitiesList: communitiesModuleInst.model
|
|
|
|
|
2021-11-22 11:08:09 +00:00
|
|
|
property var userProfileInst: userProfile
|
2021-10-01 15:58:36 +00:00
|
|
|
|
2022-02-09 00:04:49 +00:00
|
|
|
property string signingPhrase: walletSection.signingPhrase
|
|
|
|
|
2022-05-16 15:02:03 +00:00
|
|
|
property string channelEmoji: chatCommunitySectionModule && chatCommunitySectionModule.emoji ? chatCommunitySectionModule.emoji : ""
|
2022-03-14 19:32:52 +00:00
|
|
|
|
2021-11-30 10:50:53 +00:00
|
|
|
property ListModel addToGroupContacts: ListModel {}
|
|
|
|
|
2023-04-20 08:41:45 +00:00
|
|
|
property var walletSectionSendInst: walletSectionSend
|
2022-02-09 00:04:49 +00:00
|
|
|
|
2022-06-09 14:59:54 +00:00
|
|
|
property string communityTags: communitiesModule.tags
|
|
|
|
|
2021-11-25 17:12:19 +00:00
|
|
|
property var stickersModuleInst: stickersModule
|
2021-11-15 15:15:21 +00:00
|
|
|
|
2023-01-06 20:19:27 +00:00
|
|
|
property bool isDebugEnabled: advancedModule ? advancedModule.isDebugEnabled : false
|
|
|
|
|
2023-03-30 09:42:28 +00:00
|
|
|
readonly property int loginType: getLoginType()
|
|
|
|
|
2022-02-14 23:27:23 +00:00
|
|
|
property var stickersStore: StickersStore {
|
|
|
|
stickersModule: stickersModuleInst
|
|
|
|
}
|
|
|
|
|
2022-08-10 19:18:20 +00:00
|
|
|
function sendSticker(channelId, hash, replyTo, pack, url) {
|
|
|
|
stickersModuleInst.send(channelId, hash, replyTo, pack, url)
|
2021-12-22 14:55:13 +00:00
|
|
|
}
|
|
|
|
|
2022-03-09 10:27:32 +00:00
|
|
|
function isCurrentUser(pubkey) {
|
|
|
|
return userProfileInst.pubKey === pubkey
|
|
|
|
}
|
|
|
|
|
|
|
|
function displayName(name, pubkey) {
|
|
|
|
return isCurrentUser(pubkey) ? qsTr("You") : name
|
|
|
|
}
|
|
|
|
|
2023-05-02 09:37:12 +00:00
|
|
|
function myPublicKey() {
|
2023-04-06 14:23:19 +00:00
|
|
|
return userProfileInst.pubKey
|
|
|
|
}
|
|
|
|
|
2021-10-21 00:41:54 +00:00
|
|
|
function getCommunity(communityId) {
|
2021-12-13 14:24:21 +00:00
|
|
|
// Not Refactored Yet
|
|
|
|
// try {
|
|
|
|
// const communityJson = chatsModelInst.communities.list.getCommunityByIdJson(communityId);
|
|
|
|
// if (!communityJson) {
|
|
|
|
// return null;
|
|
|
|
// }
|
|
|
|
|
|
|
|
// let community = JSON.parse(communityJson);
|
|
|
|
// if (community) {
|
|
|
|
// community.nbMembers = community.members.length;
|
|
|
|
// }
|
|
|
|
// return community
|
|
|
|
// } catch (e) {
|
|
|
|
// console.error("Error parsing community", e);
|
|
|
|
// }
|
2021-10-21 00:41:54 +00:00
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
2021-10-22 20:49:47 +00:00
|
|
|
|
2021-12-13 14:24:21 +00:00
|
|
|
// Not Refactored Yet
|
|
|
|
property var activeCommunityChatsModel: "" //chatsModelInst.communities.activeCommunity.chats
|
2021-10-22 20:49:47 +00:00
|
|
|
|
2022-06-02 17:48:10 +00:00
|
|
|
function createCommunity(args = {
|
|
|
|
name: "",
|
|
|
|
description: "",
|
|
|
|
introMessage: "",
|
|
|
|
outroMessage: "",
|
|
|
|
color: "",
|
2022-06-09 14:59:54 +00:00
|
|
|
tags: "",
|
2022-06-02 17:48:10 +00:00
|
|
|
image: {
|
|
|
|
src: "",
|
|
|
|
AX: 0,
|
|
|
|
AY: 0,
|
|
|
|
BX: 0,
|
|
|
|
BY: 0,
|
|
|
|
},
|
|
|
|
options: {
|
|
|
|
historyArchiveSupportEnabled: false,
|
|
|
|
checkedMembership: false,
|
2022-10-07 16:33:23 +00:00
|
|
|
pinMessagesAllowedForMembers: false,
|
|
|
|
encrypted: false
|
2022-08-17 12:44:53 +00:00
|
|
|
},
|
|
|
|
bannerJsonStr: ""
|
2022-06-02 17:48:10 +00:00
|
|
|
}) {
|
|
|
|
return communitiesModuleInst.createCommunity(
|
2022-06-09 14:59:54 +00:00
|
|
|
args.name, args.description, args.introMessage, args.outroMessage,
|
|
|
|
args.options.checkedMembership, args.color, args.tags,
|
2022-06-02 17:48:10 +00:00
|
|
|
args.image.src, args.image.AX, args.image.AY, args.image.BX, args.image.BY,
|
2022-10-07 16:33:23 +00:00
|
|
|
args.options.historyArchiveSupportEnabled, args.options.pinMessagesAllowedForMembers,
|
|
|
|
args.bannerJsonStr, args.options.encrypted);
|
2021-10-22 20:49:47 +00:00
|
|
|
}
|
2022-02-02 17:54:28 +00:00
|
|
|
|
2022-01-25 20:39:20 +00:00
|
|
|
function createCommunityCategory(categoryName, channels) {
|
|
|
|
chatCommunitySectionModule.createCommunityCategory(categoryName, channels)
|
2021-10-22 20:49:47 +00:00
|
|
|
}
|
|
|
|
|
2022-02-01 15:31:05 +00:00
|
|
|
function editCommunityCategory(categoryId, categoryName, channels) {
|
|
|
|
chatCommunitySectionModule.editCommunityCategory(categoryId, categoryName, channels);
|
2021-10-22 20:49:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function deleteCommunityCategory(categoryId) {
|
2022-02-01 00:32:53 +00:00
|
|
|
chatCommunitySectionModule.deleteCommunityCategory(categoryId);
|
2021-10-22 20:49:47 +00:00
|
|
|
}
|
|
|
|
|
2022-02-01 15:31:05 +00:00
|
|
|
function prepareEditCategoryModel(categoryId) {
|
|
|
|
chatCommunitySectionModule.prepareEditCategoryModel(categoryId);
|
2022-02-09 09:43:23 +00:00
|
|
|
}
|
2022-02-01 15:31:05 +00:00
|
|
|
|
2022-01-18 20:54:14 +00:00
|
|
|
function leaveCommunity() {
|
|
|
|
chatCommunitySectionModule.leaveCommunity();
|
2021-10-22 20:49:47 +00:00
|
|
|
}
|
|
|
|
|
2022-02-24 21:19:11 +00:00
|
|
|
function removeUserFromCommunity(pubKey) {
|
|
|
|
chatCommunitySectionModule.removeUserFromCommunity(pubKey);
|
|
|
|
}
|
|
|
|
|
2024-03-20 10:50:10 +00:00
|
|
|
function loadCommunityMemberMessages(communityId, pubKey) {
|
|
|
|
chatCommunitySectionModule.loadCommunityMemberMessages(communityId, pubKey);
|
|
|
|
}
|
|
|
|
|
2024-02-22 11:01:01 +00:00
|
|
|
function banUserFromCommunity(pubKey, deleteAllMessages) {
|
|
|
|
chatCommunitySectionModule.banUserFromCommunity(pubKey, deleteAllMessages);
|
2022-04-07 14:49:38 +00:00
|
|
|
}
|
|
|
|
|
2022-06-28 15:03:10 +00:00
|
|
|
function unbanUserFromCommunity(pubKey) {
|
|
|
|
chatCommunitySectionModule.unbanUserFromCommunity(pubKey);
|
|
|
|
}
|
|
|
|
|
2022-03-10 19:28:37 +00:00
|
|
|
function createCommunityChannel(channelName, channelDescription, channelEmoji, channelColor,
|
2024-03-18 17:33:07 +00:00
|
|
|
categoryId, viewersCanPostReactions, hideIfPermissionsNotMet) {
|
2022-03-10 19:28:37 +00:00
|
|
|
chatCommunitySectionModule.createCommunityChannel(channelName, channelDescription,
|
2024-03-18 17:33:07 +00:00
|
|
|
channelEmoji.trim(), channelColor, categoryId, viewersCanPostReactions, hideIfPermissionsNotMet);
|
2021-10-22 20:49:47 +00:00
|
|
|
}
|
|
|
|
|
2022-03-10 19:28:37 +00:00
|
|
|
function editCommunityChannel(chatId, newName, newDescription, newEmoji, newColor,
|
2024-03-18 17:33:07 +00:00
|
|
|
newCategory, channelPosition, viewOnlyCanAddReaction, hideIfPermissionsNotMet) {
|
2022-02-24 21:38:32 +00:00
|
|
|
chatCommunitySectionModule.editCommunityChannel(
|
|
|
|
chatId,
|
|
|
|
newName,
|
|
|
|
newDescription,
|
2022-03-07 14:56:05 +00:00
|
|
|
newEmoji,
|
2022-03-10 19:28:37 +00:00
|
|
|
newColor,
|
2022-02-24 21:38:32 +00:00
|
|
|
newCategory,
|
2024-03-13 19:13:41 +00:00
|
|
|
channelPosition,
|
2024-03-18 17:33:07 +00:00
|
|
|
viewOnlyCanAddReaction,
|
|
|
|
hideIfPermissionsNotMet
|
2022-02-24 21:38:32 +00:00
|
|
|
)
|
2021-10-22 20:49:47 +00:00
|
|
|
}
|
|
|
|
|
2022-10-19 12:56:00 +00:00
|
|
|
function acceptRequestToJoinCommunity(requestId, communityId) {
|
|
|
|
chatCommunitySectionModule.acceptRequestToJoinCommunity(requestId, communityId)
|
2021-10-22 20:49:47 +00:00
|
|
|
}
|
|
|
|
|
2022-10-19 12:56:00 +00:00
|
|
|
function declineRequestToJoinCommunity(requestId, communityId) {
|
|
|
|
chatCommunitySectionModule.declineRequestToJoinCommunity(requestId, communityId)
|
2021-10-22 20:49:47 +00:00
|
|
|
}
|
2021-10-28 20:23:30 +00:00
|
|
|
|
|
|
|
function userNameOrAlias(pk) {
|
2021-12-13 14:24:21 +00:00
|
|
|
// Not Refactored Yet
|
|
|
|
// return chatsModelInst.userNameOrAlias(pk);
|
2021-10-28 20:23:30 +00:00
|
|
|
}
|
|
|
|
|
2022-01-21 19:18:56 +00:00
|
|
|
function generateAlias(pk) {
|
2023-01-06 15:43:54 +00:00
|
|
|
return globalUtilsInst.generateAlias(pk);
|
2022-01-11 21:53:18 +00:00
|
|
|
}
|
|
|
|
|
2022-01-17 18:46:46 +00:00
|
|
|
function plainText(text) {
|
2023-01-06 15:43:54 +00:00
|
|
|
return globalUtilsInst.plainText(text)
|
2022-01-17 18:46:46 +00:00
|
|
|
}
|
2022-01-18 17:20:31 +00:00
|
|
|
|
2022-01-25 12:09:27 +00:00
|
|
|
function removeCommunityChat(chatId) {
|
|
|
|
chatCommunitySectionModule.removeCommunityChat(chatId)
|
2022-01-18 17:20:31 +00:00
|
|
|
}
|
2022-01-25 14:51:38 +00:00
|
|
|
|
2022-02-11 21:41:34 +00:00
|
|
|
function reorderCommunityCategories(categoryId, to) {
|
2022-01-25 14:51:38 +00:00
|
|
|
chatCommunitySectionModule.reorderCommunityCategories(categoryId, to)
|
|
|
|
}
|
|
|
|
|
2024-04-15 18:34:44 +00:00
|
|
|
function toggleCollapsedCommunityCategory(categoryId, collapsed) {
|
|
|
|
chatCommunitySectionModule.toggleCollapsedCommunityCategory(categoryId, collapsed)
|
|
|
|
}
|
|
|
|
|
2022-02-11 21:41:34 +00:00
|
|
|
function reorderCommunityChat(categoryId, chatId, to) {
|
2022-01-25 14:51:38 +00:00
|
|
|
chatCommunitySectionModule.reorderCommunityChat(categoryId, chatId, to)
|
|
|
|
}
|
2022-02-11 21:41:34 +00:00
|
|
|
|
2022-09-22 07:13:03 +00:00
|
|
|
function spectateCommunity(id, ensName) {
|
|
|
|
return communitiesModuleInst.spectateCommunity(id, ensName)
|
2022-02-11 21:41:34 +00:00
|
|
|
}
|
|
|
|
|
2023-10-27 17:20:52 +00:00
|
|
|
function prepareKeypairsForSigning(communityId, ensName, addressesToShare = [], airdropAddress = "", editMode = false) {
|
|
|
|
communitiesModuleInst.prepareKeypairsForSigning(communityId, ensName, JSON.stringify(addressesToShare), airdropAddress, editMode)
|
|
|
|
}
|
|
|
|
|
2024-03-19 08:41:41 +00:00
|
|
|
function signProfileKeypairAndAllNonKeycardKeypairs() {
|
|
|
|
communitiesModuleInst.signProfileKeypairAndAllNonKeycardKeypairs()
|
2023-10-27 17:20:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function signSharedAddressesForKeypair(keyUid) {
|
|
|
|
communitiesModuleInst.signSharedAddressesForKeypair(keyUid)
|
|
|
|
}
|
|
|
|
|
|
|
|
function joinCommunityOrEditSharedAddresses() {
|
|
|
|
communitiesModuleInst.joinCommunityOrEditSharedAddresses()
|
2023-03-24 13:54:59 +00:00
|
|
|
}
|
|
|
|
|
2024-03-27 09:06:14 +00:00
|
|
|
function cleanJoinEditCommunityData() {
|
|
|
|
communitiesModuleInst.cleanJoinEditCommunityData()
|
|
|
|
}
|
|
|
|
|
2023-06-29 17:35:18 +00:00
|
|
|
function getLatestBlockNumber(chainId) {
|
|
|
|
return walletSection.getChainIdForSend(chainId)
|
|
|
|
}
|
|
|
|
|
2022-02-11 21:41:34 +00:00
|
|
|
function userCanJoin(id) {
|
|
|
|
return communitiesModuleInst.userCanJoin(id)
|
|
|
|
}
|
|
|
|
|
|
|
|
function isUserMemberOfCommunity(id) {
|
|
|
|
return communitiesModuleInst.isUserMemberOfCommunity(id)
|
|
|
|
}
|
|
|
|
|
2023-12-04 19:14:13 +00:00
|
|
|
function isMyCommunityRequestPending(id) {
|
|
|
|
return communitiesModuleInst.isMyCommunityRequestPending(id)
|
2022-02-11 21:41:34 +00:00
|
|
|
}
|
|
|
|
|
2022-10-21 10:09:17 +00:00
|
|
|
function cancelPendingRequest(id: string) {
|
|
|
|
communitiesModuleInst.cancelRequestToJoinCommunity(id)
|
|
|
|
}
|
|
|
|
|
2022-02-11 21:41:34 +00:00
|
|
|
function getSectionNameById(id) {
|
|
|
|
return communitiesList.getSectionNameById(id)
|
|
|
|
}
|
|
|
|
|
|
|
|
function getSectionByIdJson(id) {
|
|
|
|
return communitiesList.getSectionByIdJson(id)
|
|
|
|
}
|
|
|
|
|
2023-08-02 16:03:52 +00:00
|
|
|
// intervals is a string containing json array [{startTimestamp: 1690548852, startTimestamp: 1690547684}, {...}]
|
|
|
|
function collectCommunityMetricsMessagesTimestamps(intervals) {
|
|
|
|
chatCommunitySectionModule.collectCommunityMetricsMessagesTimestamps(intervals)
|
|
|
|
}
|
|
|
|
|
2023-08-03 20:30:34 +00:00
|
|
|
function collectCommunityMetricsMessagesCount(intervals) {
|
|
|
|
chatCommunitySectionModule.collectCommunityMetricsMessagesCount(intervals)
|
|
|
|
}
|
|
|
|
|
2023-11-08 19:59:45 +00:00
|
|
|
function requestCommunityInfo(id, shardCluster, shardIndex, importing = false) {
|
|
|
|
communitiesModuleInst.requestCommunityInfo(id, shardCluster, shardIndex, importing)
|
2022-09-22 16:35:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function getCommunityDetailsAsJson(id) {
|
2022-10-28 14:25:48 +00:00
|
|
|
const jsonObj = communitiesModuleInst.getCommunityDetails(id)
|
2022-09-22 16:35:18 +00:00
|
|
|
try {
|
2022-10-28 14:25:48 +00:00
|
|
|
return JSON.parse(jsonObj)
|
2022-09-22 16:35:18 +00:00
|
|
|
}
|
|
|
|
catch (e) {
|
2022-09-23 14:14:31 +00:00
|
|
|
console.warn("error parsing community by id: ", id, " error: ", e.message)
|
2022-09-22 16:35:18 +00:00
|
|
|
return {}
|
|
|
|
}
|
2022-06-20 11:39:40 +00:00
|
|
|
}
|
|
|
|
|
2022-10-28 14:25:48 +00:00
|
|
|
function getChatDetails(id) {
|
|
|
|
const jsonObj = activityCenterModule.getChatDetailsAsJson(id)
|
|
|
|
try {
|
|
|
|
return JSON.parse(jsonObj)
|
|
|
|
}
|
|
|
|
catch (e) {
|
|
|
|
console.warn("error parsing chat by id: ", id, " error: ", e.message)
|
|
|
|
return {}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-09 00:04:49 +00:00
|
|
|
function getPubkey() {
|
|
|
|
return userProfile.getPubKey()
|
|
|
|
}
|
|
|
|
|
2022-10-17 10:17:25 +00:00
|
|
|
// Needed for TX in chat for stickers and via contact
|
|
|
|
|
2023-04-20 08:41:45 +00:00
|
|
|
property var accounts: walletSectionSendInst.accounts
|
2022-10-17 10:17:25 +00:00
|
|
|
property string currentCurrency: walletSection.currentCurrency
|
2022-12-29 16:44:51 +00:00
|
|
|
property CurrenciesStore currencyStore: CurrenciesStore {}
|
2022-10-17 10:17:25 +00:00
|
|
|
property var savedAddressesModel: walletSectionSavedAddresses.model
|
2022-07-01 11:24:32 +00:00
|
|
|
|
2022-10-17 10:17:25 +00:00
|
|
|
property var disabledChainIdsFromList: []
|
|
|
|
property var disabledChainIdsToList: []
|
2022-07-01 11:24:32 +00:00
|
|
|
|
2022-10-17 10:17:25 +00:00
|
|
|
function addRemoveDisabledFromChain(chainID, isDisabled) {
|
|
|
|
if(isDisabled) {
|
|
|
|
disabledChainIdsFromList.push(chainID)
|
2022-07-01 11:24:32 +00:00
|
|
|
}
|
|
|
|
else {
|
2022-10-17 10:17:25 +00:00
|
|
|
for(var i = 0; i < disabledChainIdsFromList.length;i++) {
|
|
|
|
if(disabledChainIdsFromList[i] === chainID) {
|
|
|
|
disabledChainIdsFromList.splice(i, 1)
|
2022-07-01 11:24:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-17 10:17:25 +00:00
|
|
|
function addRemoveDisabledToChain(chainID, isDisabled) {
|
|
|
|
if(isDisabled) {
|
|
|
|
disabledChainIdsToList.push(chainID)
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
for(var i = 0; i < disabledChainIdsToList.length;i++) {
|
|
|
|
if(disabledChainIdsToList[i] === chainID) {
|
|
|
|
disabledChainIdsToList.splice(i, 1)
|
|
|
|
}
|
2022-07-01 11:24:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-17 10:17:25 +00:00
|
|
|
function getFiatValue(balance, cryptoSymbol, fiatSymbol) {
|
|
|
|
return profileSectionModule.ensUsernamesModule.getFiatValue(balance, cryptoSymbol, fiatSymbol)
|
2022-02-09 00:04:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function acceptRequestTransaction(transactionHash, messageId, signature) {
|
|
|
|
return currentChatContentModule().inputAreaModule.acceptRequestTransaction(transactionHash, messageId, signature)
|
|
|
|
}
|
|
|
|
|
|
|
|
function acceptAddressRequest(messageId, address) {
|
|
|
|
currentChatContentModule().inputAreaModule.acceptAddressRequest(messageId, address)
|
|
|
|
}
|
|
|
|
|
|
|
|
function declineAddressRequest(messageId) {
|
|
|
|
currentChatContentModule().inputAreaModule.declineAddressRequest(messageId)
|
|
|
|
}
|
|
|
|
|
|
|
|
function declineRequest(messageId) {
|
|
|
|
currentChatContentModule().inputAreaModule.declineRequest(messageId)
|
|
|
|
}
|
|
|
|
|
|
|
|
function getGasEthValue(gweiValue, gasLimit) {
|
|
|
|
return profileSectionModule.ensUsernamesModule.getGasEthValue(gweiValue, gasLimit)
|
|
|
|
}
|
|
|
|
|
2022-10-17 10:17:25 +00:00
|
|
|
function resolveENS(value) {
|
|
|
|
mainModuleInst.resolveENS(value, "")
|
|
|
|
}
|
|
|
|
|
|
|
|
function getWei2Eth(wei) {
|
2023-01-06 15:43:54 +00:00
|
|
|
return globalUtilsInst.wei2Eth(wei,18)
|
2022-10-17 10:17:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function getEtherscanLink() {
|
|
|
|
return profileSectionModule.ensUsernamesModule.getEtherscanLink()
|
|
|
|
}
|
|
|
|
|
|
|
|
function hex2Eth(value) {
|
2023-01-06 15:43:54 +00:00
|
|
|
return globalUtilsInst.hex2Eth(value)
|
2022-02-14 23:27:23 +00:00
|
|
|
}
|
2022-11-28 14:57:56 +00:00
|
|
|
|
2023-03-30 09:42:28 +00:00
|
|
|
function getLoginType() {
|
|
|
|
if(!userProfileInst)
|
|
|
|
return Constants.LoginType.Password
|
|
|
|
|
|
|
|
if(userProfileInst.usingBiometricLogin)
|
|
|
|
return Constants.LoginType.Biometrics
|
2023-07-04 15:11:41 +00:00
|
|
|
if(userProfileInst.isKeycardUser)
|
2023-03-30 09:42:28 +00:00
|
|
|
return Constants.LoginType.Keycard
|
2023-07-04 15:11:41 +00:00
|
|
|
return Constants.LoginType.Password
|
2023-03-30 09:42:28 +00:00
|
|
|
}
|
|
|
|
|
2022-11-28 14:57:56 +00:00
|
|
|
readonly property Connections communitiesModuleConnections: Connections {
|
|
|
|
target: communitiesModuleInst
|
|
|
|
function onImportingCommunityStateChanged(communityId, state, errorMsg) {
|
|
|
|
root.importingCommunityStateChanged(communityId, state, errorMsg)
|
|
|
|
}
|
2023-05-24 12:06:43 +00:00
|
|
|
|
2023-06-08 11:01:01 +00:00
|
|
|
function onCommunityAccessRequested(communityId) {
|
|
|
|
root.communityAccessRequested(communityId)
|
|
|
|
}
|
2023-07-21 08:44:10 +00:00
|
|
|
|
|
|
|
function onCommunityAdded(communityId) {
|
|
|
|
root.communityAdded(communityId)
|
|
|
|
}
|
2022-11-28 14:57:56 +00:00
|
|
|
}
|
2023-04-06 11:11:57 +00:00
|
|
|
|
|
|
|
readonly property Connections mainModuleInstConnections: Connections {
|
|
|
|
target: mainModuleInst
|
|
|
|
enabled: !!chatCommunitySectionModule
|
|
|
|
function onOpenCommunityMembershipRequestsView(sectionId: string) {
|
2023-08-02 17:39:42 +00:00
|
|
|
if(root.getMySectionId() !== sectionId)
|
2023-04-06 11:11:57 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
root.goToMembershipRequestsPage()
|
|
|
|
}
|
|
|
|
}
|
2023-04-18 09:11:47 +00:00
|
|
|
|
|
|
|
readonly property QtObject _d: QtObject {
|
2024-03-04 09:59:52 +00:00
|
|
|
id: _d
|
2023-04-18 09:11:47 +00:00
|
|
|
readonly property var sectionDetailsInstantiator: Instantiator {
|
|
|
|
model: SortFilterProxyModel {
|
|
|
|
sourceModel: mainModuleInst.sectionsModel
|
|
|
|
filters: ValueFilter {
|
|
|
|
roleName: "id"
|
|
|
|
value: chatCommunitySectionModule.getMySectionId()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
delegate: QtObject {
|
|
|
|
readonly property string id: model.id
|
|
|
|
readonly property int sectionType: model.sectionType
|
|
|
|
readonly property string name: model.name
|
2023-08-02 17:39:42 +00:00
|
|
|
readonly property string image: model.image
|
2023-04-18 09:11:47 +00:00
|
|
|
readonly property bool joined: model.joined
|
|
|
|
readonly property bool amIBanned: model.amIBanned
|
2024-04-25 09:47:40 +00:00
|
|
|
readonly property string introMessage: model.introMessage
|
2023-04-18 09:11:47 +00:00
|
|
|
// add others when needed..
|
|
|
|
}
|
|
|
|
}
|
2023-04-28 10:28:19 +00:00
|
|
|
|
|
|
|
readonly property string activeChatId: chatCommunitySectionModule && chatCommunitySectionModule.activeItem ? chatCommunitySectionModule.activeItem.id : ""
|
|
|
|
readonly property int activeChatType: chatCommunitySectionModule && chatCommunitySectionModule.activeItem ? chatCommunitySectionModule.activeItem.type : -1
|
|
|
|
readonly property bool amIMember: chatCommunitySectionModule ? chatCommunitySectionModule.amIMember : false
|
|
|
|
|
|
|
|
property var oneToOneChatContact: undefined
|
2023-10-27 17:20:52 +00:00
|
|
|
readonly property string oneToOneChatContactName: !!_d.oneToOneChatContact ? ProfileUtils.displayName(_d.oneToOneChatContact.localNickname,
|
|
|
|
_d.oneToOneChatContact.name,
|
|
|
|
_d.oneToOneChatContact.displayName,
|
2023-04-28 10:28:19 +00:00
|
|
|
_d.oneToOneChatContact.alias) : ""
|
|
|
|
|
|
|
|
//Update oneToOneChatContact when the contact is updated
|
|
|
|
readonly property var myContactsModelConnection: Connections {
|
|
|
|
target: root.contactsStore.myContactsModel ?? null
|
|
|
|
enabled: _d.activeChatType === Constants.chatType.oneToOne
|
|
|
|
|
|
|
|
function onItemChanged(pubKey) {
|
|
|
|
if (pubKey === _d.activeChatId) {
|
|
|
|
_d.oneToOneChatContact = Utils.getContactDetailsAsJson(pubKey, false)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
readonly property var receivedContactsReqModelConnection: Connections {
|
|
|
|
target: root.contactsStore.receivedContactRequestsModel ?? null
|
|
|
|
enabled: _d.activeChatType === Constants.chatType.oneToOne
|
|
|
|
|
|
|
|
function onItemChanged(pubKey) {
|
|
|
|
if (pubKey === _d.activeChatId) {
|
|
|
|
_d.oneToOneChatContact = Utils.getContactDetailsAsJson(pubKey, false)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
readonly property var sentContactReqModelConnection: Connections {
|
|
|
|
target: root.contactsStore.sentContactRequestsModel ?? null
|
|
|
|
enabled: _d.activeChatType === Constants.chatType.oneToOne
|
|
|
|
|
|
|
|
function onItemChanged(pubKey) {
|
|
|
|
if (pubKey === _d.activeChatId) {
|
|
|
|
_d.oneToOneChatContact = Utils.getContactDetailsAsJson(pubKey, false)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
readonly property bool isUserAllowedToSendMessage: {
|
|
|
|
if (_d.activeChatType === Constants.chatType.oneToOne && _d.oneToOneChatContact) {
|
fix(contacts): fix inconsistency when banning or unbanning contact
Fixes #10501
The problem was that didn't have access to the updated contact from status-go after banning or unbanning, so we just changed the banned property, but there is more that gets changed in the backend, like `removed` being set to `true` as well.
With this fix, when you unban someone, you go back to a fresh start, as **non** contact, so you need to send a request again. That was the state you got if you restarted the app, so "re-sync" the state with status-go.
Another issue was on the frontend (QML). When banned, and after restarting to get the right state, the unban button would be disabled and the Add contact request button would show, which is not good. We only want to send requests when unbanned.
2023-05-31 19:09:37 +00:00
|
|
|
return _d.oneToOneChatContact.contactRequestState === Constants.ContactRequestState.Mutual
|
2024-03-04 09:59:52 +00:00
|
|
|
} else if (_d.activeChatType === Constants.chatType.privateGroupChat) {
|
2023-04-28 10:28:19 +00:00
|
|
|
return _d.amIMember
|
2024-03-04 09:59:52 +00:00
|
|
|
} else if (_d.activeChatType === Constants.chatType.communityChat) {
|
2024-06-03 19:06:34 +00:00
|
|
|
return currentChatContentModule().chatDetails.canPost
|
2023-04-28 10:28:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
readonly property string chatInputPlaceHolderText: {
|
|
|
|
if(!_d.isUserAllowedToSendMessage && _d.activeChatType === Constants.chatType.privateGroupChat) {
|
|
|
|
return qsTr("You need to be a member of this group to send messages")
|
|
|
|
} else if(!_d.isUserAllowedToSendMessage && _d.activeChatType === Constants.chatType.oneToOne) {
|
|
|
|
return qsTr("Add %1 as a contact to send a message").arg(_d.oneToOneChatContactName)
|
|
|
|
}
|
|
|
|
|
|
|
|
return qsTr("Message")
|
|
|
|
}
|
|
|
|
|
|
|
|
//Update oneToOneChatContact when activeChat id changes
|
|
|
|
Binding on oneToOneChatContact {
|
2023-10-27 17:20:52 +00:00
|
|
|
when: _d.activeChatId && _d.activeChatType === Constants.chatType.oneToOne
|
2023-04-28 10:28:19 +00:00
|
|
|
value: Utils.getContactDetailsAsJson(_d.activeChatId, false)
|
|
|
|
restoreMode: Binding.RestoreBindingOrValue
|
|
|
|
}
|
2023-04-18 09:11:47 +00:00
|
|
|
}
|
2023-08-21 18:54:57 +00:00
|
|
|
|
|
|
|
function updatePermissionsModel(communityId, sharedAddresses) {
|
|
|
|
communitiesModuleInst.checkPermissions(communityId, JSON.stringify(sharedAddresses))
|
|
|
|
}
|
2021-10-01 15:58:36 +00:00
|
|
|
}
|