import QtQuick 2.14 import QtQuick.Controls 2.14 import QtQuick.Layouts 1.14 import StatusQ.Core 0.1 import StatusQ.Core.Theme 0.1 import StatusQ.Components 0.1 import StatusQ.Controls 0.1 import AppLayouts.Communities.helpers 1.0 import AppLayouts.Communities.controls 1.0 import SortFilterProxyModel 0.2 import utils 1.0 Control { id: root property bool joinCommunity: true // Otherwise it means join channel action property bool requirementsMet: false property bool requirementsCheckPending: false property bool requiresRequest: false property bool isInvitationPending: false property bool isJoinRequestRejected: false property string communityName property var communityHoldingsModel property string channelName property var viewOnlyHoldingsModel property var viewAndPostHoldingsModel property var moderateHoldingsModel property bool showOnlyPanels: false property int loginType: Constants.LoginType.Password property var assetsModel property var collectiblesModel signal revealAddressClicked signal invitationPendingClicked QtObject { id: d readonly property string communityRequirementsNotMetText: qsTr("Membership requirements not met") readonly property string communityRevealAddressText: qsTr("Reveal your address to join") readonly property string communityRevealAddressWithRequestText: qsTr("Reveal your address and request to join") readonly property string communityMembershipRequestPendingText: qsTr("Membership Request Pending...") readonly property string channelRequirementsNotMetText: qsTr("Channel requirements not met") readonly property string channelRevealAddressText: qsTr("Reveal your address to enter") readonly property string channelMembershipRequestPendingText: qsTr("Channel Membership Request Pending...") readonly property string memberchipRequestRejectedText: qsTr("Membership Request Rejected") function holdingsTextFormat(name, amount) { return PermissionsHelpers.setHoldingsTextFormat(HoldingTypes.Type.Asset, name, amount) } function getInvitationPendingText() { return root.joinCommunity ? d.communityMembershipRequestPendingText : d.channelMembershipRequestPendingText } function getRevealAddressText() { return root.joinCommunity ? (root.requiresRequest ? d.communityRevealAddressWithRequestText : d.communityRevealAddressText) : d.channelRevealAddressText } function filterPermissions(model) { return !!model && (model.tokenCriteriaMet || !model.isPrivate) } readonly property var communityPermissionsModel: SortFilterProxyModel { sourceModel: root.communityHoldingsModel filters: [ ExpressionFilter { expression: d.filterPermissions(model) } ] } readonly property var viewOnlyPermissionsModel: SortFilterProxyModel { sourceModel: root.viewOnlyHoldingsModel filters: [ ExpressionFilter { expression: d.filterPermissions(model) } ] } readonly property var viewAndPostPermissionsModel: SortFilterProxyModel { sourceModel: root.viewAndPostHoldingsModel filters: [ ExpressionFilter { expression: d.filterPermissions(model) } ] } readonly property var moderatePermissionsModel: SortFilterProxyModel { sourceModel: root.moderateHoldingsModel filters: [ ExpressionFilter { expression: d.filterPermissions(model) } ] } } padding: 35 // default by design spacing: 32 // default by design contentItem: ColumnLayout { id: column spacing: root.spacing component CustomHoldingsListPanel: HoldingsListPanel { Layout.fillWidth: true assetsModel: root.assetsModel collectiblesModel: root.collectiblesModel spacing: root.spacing } CustomHoldingsListPanel { id: communityRequirements visible: root.joinCommunity introText: d.communityPermissionsModel.count > 0 ? qsTr("To join %1 you need to prove that you hold").arg(root.communityName) : qsTr("Sorry, you can't join %1 because it's a private, closed community").arg(root.communityName) model: d.communityPermissionsModel } CustomHoldingsListPanel { visible: !root.joinCommunity && d.viewOnlyPermissionsModel.count > 0 introText: root.requiresRequest ? qsTr("To view the #%1 channel you need to join %2 and prove that you hold").arg(root.channelName).arg(root.communityName) : qsTr("To view the #%1 channel you need to hold").arg(root.channelName) model: d.viewOnlyPermissionsModel } CustomHoldingsListPanel { visible: !root.joinCommunity && d.viewAndPostPermissionsModel.count > 0 introText: root.requiresRequest ? qsTr("To view and post in the #%1 channel you need to join %2 and prove that you hold").arg(root.channelName).arg(root.communityName) : qsTr("To view and post in the #%1 channel you need to hold").arg(root.channelName) model: d.viewAndPostPermissionsModel } CustomHoldingsListPanel { visible: !root.joinCommunity && d.moderatePermissionsModel.count > 0 introText: qsTr("To moderate in the #%1 channel you need to hold").arg(root.channelName) model: d.moderatePermissionsModel } StatusButton { Layout.alignment: Qt.AlignHCenter visible: !root.showOnlyPanels && !root.isJoinRequestRejected && root.requiresRequest text: root.isInvitationPending ? d.getInvitationPendingText() : d.getRevealAddressText() icon.name: root.isInvitationPending ? "" : Constants.authenticationIconByType[root.loginType] font.pixelSize: 13 enabled: root.requirementsMet || d.communityPermissionsModel.count === 0 onClicked: root.isInvitationPending ? root.invitationPendingClicked() : root.revealAddressClicked() } StatusBaseText { Layout.alignment: Qt.AlignHCenter visible: !root.showOnlyPanels && !root.requirementsCheckPending && (root.isJoinRequestRejected || !root.requirementsMet) text: root.isJoinRequestRejected ? d.memberchipRequestRejectedText : (root.joinCommunity ? d.communityRequirementsNotMetText : d.channelRequirementsNotMetText) color: Theme.palette.dangerColor1 } StatusBaseText { id: requirementsCheckPendingText Layout.alignment: Qt.AlignHCenter visible: root.requirementsCheckPending text: qsTr("Requirements check pending...") color: Theme.palette.dangerColor1 SequentialAnimation { id: blinkingAnimation loops: Animation.Infinite running: requirementsCheckPendingText.visible NumberAnimation { target: requirementsCheckPendingText; property: "opacity"; to: 0; duration: 1500;} NumberAnimation { target: requirementsCheckPendingText; property: "opacity"; to: 1; duration: 1500;} } } } }