392 lines
16 KiB
QML
392 lines
16 KiB
QML
import QtQuick 2.14
|
|
import QtQuick.Controls 2.14
|
|
import QtQuick.Layouts 1.14
|
|
|
|
import utils 1.0
|
|
import shared.popups 1.0
|
|
|
|
import "views"
|
|
import "stores"
|
|
|
|
import AppLayouts.Communities.views 1.0
|
|
import AppLayouts.Communities.popups 1.0
|
|
import AppLayouts.Communities.helpers 1.0
|
|
|
|
import AppLayouts.Chat.stores 1.0
|
|
import AppLayouts.Wallet.stores 1.0 as WalletStore
|
|
|
|
import StatusQ.Core.Utils 0.1
|
|
|
|
StackLayout {
|
|
id: root
|
|
|
|
property RootStore rootStore
|
|
property var createChatPropertiesStore
|
|
readonly property var contactsStore: rootStore.contactsStore
|
|
readonly property var permissionsStore: rootStore.permissionsStore
|
|
property var communitiesStore
|
|
|
|
property var sectionItemModel
|
|
property var sendModalPopup
|
|
|
|
readonly property bool isOwner: sectionItemModel.memberRole === Constants.memberRole.owner
|
|
readonly property bool isAdmin: sectionItemModel.memberRole === Constants.memberRole.admin
|
|
readonly property bool isTokenMasterOwner: sectionItemModel.memberRole === Constants.memberRole.tokenMaster
|
|
readonly property bool isControlNode: sectionItemModel.isControlNode
|
|
readonly property bool isPrivilegedUser: isControlNode || isOwner || isAdmin || isTokenMasterOwner
|
|
|
|
property bool communitySettingsDisabled
|
|
|
|
property var emojiPopup
|
|
property var stickersPopup
|
|
signal profileButtonClicked()
|
|
signal openAppSearch()
|
|
|
|
// Community transfer ownership related props/signals:
|
|
// TODO: Backend integrations:
|
|
property bool isPendingOwnershipRequest: false
|
|
signal ownershipDeclined()
|
|
|
|
onCurrentIndexChanged: {
|
|
Global.closeCreateChatView()
|
|
}
|
|
|
|
Loader {
|
|
id: mainViewLoader
|
|
readonly property var chatItem: root.rootStore.chatCommunitySectionModule
|
|
|
|
sourceComponent: {
|
|
if (chatItem.isCommunity() && !chatItem.amIMember) {
|
|
if (chatItem.isWaitingOnNewCommunityOwnerToConfirmRequestToRejoin) {
|
|
return controlNodeOfflineComponent
|
|
} else if (chatItem.requiresTokenPermissionToJoin) {
|
|
return joinCommunityViewComponent
|
|
}
|
|
}
|
|
return chatViewComponent
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: joinCommunityViewComponent
|
|
JoinCommunityView {
|
|
id: joinCommunityView
|
|
readonly property var communityData: sectionItemModel
|
|
readonly property string communityId: communityData.id
|
|
name: communityData.name
|
|
introMessage: communityData.introMessage
|
|
communityDesc: communityData.description
|
|
color: communityData.color
|
|
image: communityData.image
|
|
membersCount: communityData.members.count
|
|
accessType: communityData.access
|
|
joinCommunity: true
|
|
amISectionAdmin: communityData.memberRole === Constants.memberRole.owner ||
|
|
communityData.memberRole === Constants.memberRole.admin ||
|
|
communityData.memberRole === Constants.memberRole.tokenMaster
|
|
communityItemsModel: root.rootStore.communityItemsModel
|
|
requirementsMet: root.permissionsStore.allTokenRequirementsMet
|
|
requirementsCheckPending: root.rootStore.permissionsCheckOngoing
|
|
requiresRequest: !communityData.amIMember
|
|
communityHoldingsModel: root.permissionsStore.becomeMemberPermissionsModel
|
|
viewOnlyHoldingsModel: root.permissionsStore.viewOnlyPermissionsModel
|
|
viewAndPostHoldingsModel: root.permissionsStore.viewAndPostPermissionsModel
|
|
assetsModel: root.rootStore.assetsModel
|
|
collectiblesModel: root.rootStore.collectiblesModel
|
|
isInvitationPending: root.rootStore.isCommunityRequestPending(communityId)
|
|
notificationCount: activityCenterStore.unreadNotificationsCount
|
|
hasUnseenNotifications: activityCenterStore.hasUnseenNotifications
|
|
openCreateChat: rootStore.openCreateChat
|
|
loginType: root.rootStore.loginType
|
|
onNotificationButtonClicked: Global.openActivityCenterPopup()
|
|
onAdHocChatButtonClicked: rootStore.openCloseCreateChatView()
|
|
onRevealAddressClicked: {
|
|
Global.openPopup(communityIntroDialogPopup, {
|
|
communityId: joinCommunityView.communityId,
|
|
isInvitationPending: joinCommunityView.isInvitationPending,
|
|
name: communityData.name,
|
|
introMessage: communityData.introMessage,
|
|
imageSrc: communityData.image,
|
|
accessType: communityData.access
|
|
})
|
|
}
|
|
onInvitationPendingClicked: {
|
|
root.rootStore.cancelPendingRequest(communityId)
|
|
joinCommunityView.isInvitationPending = root.rootStore.isCommunityRequestPending(communityId)
|
|
}
|
|
|
|
Connections {
|
|
target: root.rootStore.communitiesModuleInst
|
|
function onCommunityAccessRequested(communityId: string) {
|
|
if (communityId === joinCommunityView.communityId) {
|
|
joinCommunityView.isInvitationPending = root.rootStore.isCommunityRequestPending(communityId)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: chatViewComponent
|
|
ChatView {
|
|
id: chatView
|
|
|
|
readonly property var chatItem: root.rootStore.chatCommunitySectionModule
|
|
readonly property string communityId: root.sectionItemModel.id
|
|
|
|
emojiPopup: root.emojiPopup
|
|
stickersPopup: root.stickersPopup
|
|
contactsStore: root.contactsStore
|
|
rootStore: root.rootStore
|
|
createChatPropertiesStore: root.createChatPropertiesStore
|
|
communitiesStore: root.communitiesStore
|
|
sectionItemModel: root.sectionItemModel
|
|
amIMember: chatItem.amIMember
|
|
amISectionAdmin: root.sectionItemModel.memberRole === Constants.memberRole.owner ||
|
|
root.sectionItemModel.memberRole === Constants.memberRole.admin ||
|
|
root.sectionItemModel.memberRole === Constants.memberRole.tokenMaster
|
|
hasViewOnlyPermissions: root.permissionsStore.viewOnlyPermissionsModel.count > 0
|
|
hasViewAndPostPermissions: root.permissionsStore.viewAndPostPermissionsModel.count > 0
|
|
viewOnlyPermissionsModel: root.permissionsStore.viewOnlyPermissionsModel
|
|
viewAndPostPermissionsModel: root.permissionsStore.viewAndPostPermissionsModel
|
|
assetsModel: root.rootStore.assetsModel
|
|
collectiblesModel: root.rootStore.collectiblesModel
|
|
isInvitationPending: root.rootStore.isCommunityRequestPending(chatView.communityId)
|
|
|
|
finaliseOwnershipTransferPopup: finaliseOwnershipPopup
|
|
isPendingOwnershipRequest: root.isPendingOwnershipRequest
|
|
|
|
onCommunityInfoButtonClicked: root.currentIndex = 1
|
|
onCommunityManageButtonClicked: root.currentIndex = 1
|
|
|
|
onProfileButtonClicked: {
|
|
root.profileButtonClicked()
|
|
}
|
|
onOpenAppSearch: {
|
|
root.openAppSearch()
|
|
}
|
|
onRevealAddressClicked: {
|
|
Global.openPopup(communityIntroDialogPopup, {
|
|
communityId: chatView.communityId,
|
|
isInvitationPending: root.rootStore.isCommunityRequestPending(chatView.communityId),
|
|
name: root.sectionItemModel.name,
|
|
introMessage: root.sectionItemModel.introMessage,
|
|
imageSrc: root.sectionItemModel.image,
|
|
accessType: root.sectionItemModel.access
|
|
})
|
|
}
|
|
onInvitationPendingClicked: {
|
|
root.rootStore.cancelPendingRequest(chatView.communityId)
|
|
chatView.isInvitationPending = root.rootStore.isCommunityRequestPending(chatView.communityId)
|
|
}
|
|
}
|
|
}
|
|
|
|
Loader {
|
|
id: communitySettingsLoader
|
|
active: root.rootStore.chatCommunitySectionModule.isCommunity() && root.isPrivilegedUser
|
|
|
|
sourceComponent: CommunitySettingsView {
|
|
id: communitySettingsView
|
|
rootStore: root.rootStore
|
|
walletAccountsModel: WalletStore.RootStore.nonWatchAccounts
|
|
sendModalPopup: root.sendModalPopup
|
|
|
|
finaliseOwnershipTransferPopup: finaliseOwnershipPopup
|
|
isPendingOwnershipRequest: root.isPendingOwnershipRequest
|
|
|
|
chatCommunitySectionModule: root.rootStore.chatCommunitySectionModule
|
|
community: sectionItemModel
|
|
communitySettingsDisabled: root.communitySettingsDisabled
|
|
onCommunitySettingsDisabledChanged: if (communitySettingsDisabled) goTo(Constants.CommunitySettingsSections.Overview)
|
|
|
|
onBackToCommunityClicked: root.currentIndex = 0
|
|
|
|
Connections {
|
|
target: root.rootStore
|
|
function onGoToMembershipRequestsPage() {
|
|
root.currentIndex = 1 // go to settings
|
|
communitySettingsView.goTo(Constants.CommunitySettingsSections.Members, Constants.CommunityMembershipSubSections.MembershipRequests)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: communityIntroDialogPopup
|
|
CommunityIntroDialog {
|
|
id: communityIntroDialog
|
|
|
|
property string communityId
|
|
|
|
loginType: root.rootStore.loginType
|
|
walletAccountsModel: WalletStore.RootStore.nonWatchAccounts
|
|
requirementsCheckPending: root.rootStore.requirementsCheckPending
|
|
permissionsModel: {
|
|
root.rootStore.prepareTokenModelForCommunity(communityIntroDialog.communityId)
|
|
return root.rootStore.permissionsModel
|
|
}
|
|
assetsModel: root.rootStore.assetsModel
|
|
collectiblesModel: root.rootStore.collectiblesModel
|
|
|
|
onPrepareForSigning: {
|
|
root.rootStore.prepareKeypairsForSigning(sharedAddresses)
|
|
|
|
communityIntroDialog.keypairSigningModel = root.rootStore.communitiesModuleInst.keypairsSigningModel
|
|
}
|
|
|
|
onSignSharedAddressesForAllNonKeycardKeypairs: {
|
|
root.rootStore.signSharedAddressesForAllNonKeycardKeypairs()
|
|
}
|
|
|
|
onSignSharedAddressesForKeypair: {
|
|
root.rootStore.signSharedAddressesForKeypair(keyUid)
|
|
}
|
|
|
|
onJoinCommunity: {
|
|
root.rootStore.joinCommunityOrEditSharedAddresses()
|
|
}
|
|
|
|
onCancelMembershipRequest: {
|
|
root.rootStore.cancelPendingRequest(communityIntroDialog.communityId)
|
|
mainViewLoader.item.isInvitationPending = root.rootStore.isCommunityRequestPending(communityIntroDialog.communityId)
|
|
}
|
|
|
|
onSharedAddressesUpdated: {
|
|
root.rootStore.updatePermissionsModel(communityIntroDialog.communityId, sharedAddresses)
|
|
}
|
|
|
|
onClosed: {
|
|
destroy()
|
|
}
|
|
|
|
Connections {
|
|
target: root.rootStore.communitiesModuleInst
|
|
|
|
function onSharedAddressesForAllNonKeycardKeypairsSigned() {
|
|
if (!!communityIntroDialog.replaceItem) {
|
|
communityIntroDialog.replaceLoader.item.sharedAddressesForAllNonKeycardKeypairsSigned()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Components related to transfer community ownership flow:
|
|
Component {
|
|
id: finaliseOwnershipPopup
|
|
|
|
FinaliseOwnershipPopup {
|
|
id: finalisePopup
|
|
|
|
readonly property var communityData: root.sectionItemModel
|
|
readonly property var ownerToken: ModelUtils.getByKey(communityData.communityTokens,
|
|
"privilegesLevel",
|
|
Constants.TokenPrivilegesLevel.Owner)
|
|
|
|
communityName: communityData.name
|
|
communityLogo: communityData.image
|
|
communityColor: communityData.color
|
|
|
|
tokenSymbol: ownerToken.symbol
|
|
tokenChainName: ownerToken.chainName
|
|
|
|
accounts: WalletStore.RootStore.nonWatchAccounts
|
|
|
|
feeText: feeSubscriber.feeText
|
|
feeErrorText: feeSubscriber.feeErrorText
|
|
isFeeLoading: !feeSubscriber.feesResponse
|
|
|
|
onRejectClicked: Global.openPopup(declineOwnershipPopup)
|
|
onFinaliseOwnershipClicked: signPopup.open()
|
|
onVisitCommunityClicked: rootStore.setActiveCommunity(communityData.id)
|
|
onOpenControlNodeDocClicked: Global.openLink(link)
|
|
|
|
DeployFeesSubscriber {
|
|
id: feeSubscriber
|
|
|
|
readonly property TransactionFeesBroker feesBroker: TransactionFeesBroker {
|
|
communityTokensStore: root.rootStore.communityTokensStore
|
|
}
|
|
|
|
chainId: finalisePopup.ownerToken.chainId
|
|
tokenType: finalisePopup.ownerToken.type
|
|
isOwnerDeployment: true
|
|
accountAddress: finalisePopup.ownerToken.accountAddress
|
|
enabled: finalisePopup.visible || signPopup.visible
|
|
Component.onCompleted: feesBroker.registerDeployFeesSubscriber(feeSubscriber)
|
|
}
|
|
|
|
SignTransactionsPopup {
|
|
id: signPopup
|
|
|
|
title: qsTr("Sign transaction - update %1 smart contract").arg(finalisePopup.communityData.name)
|
|
totalFeeText: finalisePopup.isFeeLoading ? "" : finalisePopup.feeText
|
|
errorText: finalisePopup.feeErrorText
|
|
accountName: finalisePopup.ownerToken.accountName
|
|
|
|
model: QtObject {
|
|
readonly property string title: finalisePopup.feeLabel
|
|
readonly property string feeText: signPopup.totalFeeText
|
|
readonly property bool error: finalisePopup.feeErrorText !== ""
|
|
}
|
|
|
|
onSignTransactionClicked: {
|
|
root.rootStore.communityTokensStore.updateSmartContract(finalisePopup.communityData.id, finalisePopup.ownerToken)
|
|
close()
|
|
}
|
|
}
|
|
|
|
Connections {
|
|
target: root
|
|
onOwnershipDeclined: finalisePopup.close()
|
|
}
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: declineOwnershipPopup
|
|
|
|
FinaliseOwnershipDeclinePopup {
|
|
readonly property var communityData: root.sectionItemModel
|
|
|
|
communityName: communityData.name
|
|
|
|
onDeclineClicked: {
|
|
console.warn("TODO: Backend update notification center and display a toast: Ownership Declined!")
|
|
root.ownershipDeclined()
|
|
}
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: controlNodeOfflineComponent
|
|
ControlNodeOfflineCommunityView {
|
|
id: controlNodeOfflineView
|
|
readonly property var communityData: sectionItemModel
|
|
readonly property string communityId: communityData.id
|
|
name: communityData.name
|
|
communityDesc: communityData.description
|
|
color: communityData.color
|
|
image: communityData.image
|
|
membersCount: communityData.members.count
|
|
communityItemsModel: root.rootStore.communityItemsModel
|
|
notificationCount: activityCenterStore.unreadNotificationsCount
|
|
hasUnseenNotifications: activityCenterStore.hasUnseenNotifications
|
|
onNotificationButtonClicked: Global.openActivityCenterPopup()
|
|
onAdHocChatButtonClicked: rootStore.openCloseCreateChatView()
|
|
}
|
|
}
|
|
// End of components related to transfer community ownership flow.
|
|
|
|
Connections {
|
|
target: root.rootStore
|
|
enabled: mainViewLoader.item
|
|
function onCommunityAccessRequested(communityId: string) {
|
|
if (communityId === mainViewLoader.item.communityId) {
|
|
mainViewLoader.item.isInvitationPending = root.rootStore.isCommunityRequestPending(communityId)
|
|
}
|
|
}
|
|
}
|
|
}
|