fix(CommunityMembershipSetupDialog): wait for the Join Permission response only

- introduce a new boolean property `checkingPermissionToJoinInProgress`
and use it to enable/disable the Join (share addresses) button when
joining a community
- we don't have to wait for both join and channels permissions check to
finish, as the former is much faster
- renamed `joinPermissionsCheckSuccessful` to
`joinPermissionsCheckCompletedWithoutErrors` to avoid confusion

Fixes #14680
This commit is contained in:
Lukáš Tinkl 2024-05-16 11:28:06 +02:00 committed by Lukáš Tinkl
parent e82207c7cb
commit 93d808d020
9 changed files with 88 additions and 44 deletions

View File

@ -267,3 +267,6 @@ method removeCommunityChat*(self: AccessInterface, communityId: string, channelI
method promoteSelfToControlNode*(self: AccessInterface, communityId: string) {.base.} = method promoteSelfToControlNode*(self: AccessInterface, communityId: string) {.base.} =
raise newException(ValueError, "No implementation available") raise newException(ValueError, "No implementation available")
method getCheckingPermissionToJoinInProgress*(self: AccessInterface): bool {.base.} =
raise newException(ValueError, "No implementation available")

View File

@ -97,6 +97,7 @@ method setAllCommunities*(self: Module, communities: seq[CommunityDto])
method setCuratedCommunities*(self: Module, curatedCommunities: seq[CommunityDto]) method setCuratedCommunities*(self: Module, curatedCommunities: seq[CommunityDto])
proc buildTokensAndCollectiblesFromAllCommunities(self: Module) proc buildTokensAndCollectiblesFromAllCommunities(self: Module)
proc buildTokensAndCollectiblesFromCommunities(self: Module, communities: seq[CommunityDto]) proc buildTokensAndCollectiblesFromCommunities(self: Module, communities: seq[CommunityDto])
proc setCheckingPermissionToJoinInProgress(self: Module, inProgress: bool)
proc newModule*( proc newModule*(
delegate: delegate_interface.AccessInterface, delegate: delegate_interface.AccessInterface,
@ -131,7 +132,7 @@ proc newModule*(
result.moduleLoaded = false result.moduleLoaded = false
result.events = events result.events = events
result.curatedCommunitiesLoaded = false result.curatedCommunitiesLoaded = false
result.checkingPermissionToJoinInProgress = false result.setCheckingPermissionToJoinInProgress(false)
result.checkingAllChannelPermissionsInProgress = false result.checkingAllChannelPermissionsInProgress = false
method delete*(self: Module) = method delete*(self: Module) =
@ -859,7 +860,7 @@ method checkPermissions*(self: Module, communityId: string, sharedAddresses: seq
self.controller.asyncCheckPermissionsToJoin(communityId, sharedAddresses) self.controller.asyncCheckPermissionsToJoin(communityId, sharedAddresses)
self.view.setJoinPermissionsCheckSuccessful(false) self.view.setJoinPermissionsCheckSuccessful(false)
self.checkingPermissionToJoinInProgress = true self.setCheckingPermissionToJoinInProgress(true)
self.controller.asyncCheckAllChannelsPermissions(communityId, sharedAddresses) self.controller.asyncCheckAllChannelsPermissions(communityId, sharedAddresses)
self.view.setChannelsPermissionsCheckSuccessful(false) self.view.setChannelsPermissionsCheckSuccessful(false)
@ -938,9 +939,18 @@ proc updateCheckingPermissionsInProgressIfNeeded(self: Module, inProgress = fals
return return
self.view.setCheckingPermissionsInProgress(inProgress) self.view.setCheckingPermissionsInProgress(inProgress)
method getCheckingPermissionToJoinInProgress*(self: Module): bool =
self.checkingPermissionToJoinInProgress
proc setCheckingPermissionToJoinInProgress(self: Module, inProgress: bool) =
if self.checkingPermissionToJoinInProgress == inProgress:
return
self.checkingPermissionToJoinInProgress = inProgress
self.view.checkingPermissionToJoinInProgressChanged()
method onCommunityCheckPermissionsToJoinFailed*(self: Module, communityId: string, error: string) = method onCommunityCheckPermissionsToJoinFailed*(self: Module, communityId: string, error: string) =
self.view.setJoinPermissionsCheckSuccessful(false) self.view.setJoinPermissionsCheckSuccessful(false)
self.checkingPermissionToJoinInProgress = false self.setCheckingPermissionToJoinInProgress(false)
self.updateCheckingPermissionsInProgressIfNeeded(inProgress = false) self.updateCheckingPermissionsInProgressIfNeeded(inProgress = false)
method onCommunityCheckAllChannelPermissionsFailed*(self: Module, communityId: string, error: string) = method onCommunityCheckAllChannelPermissionsFailed*(self: Module, communityId: string, error: string) =
@ -954,7 +964,7 @@ method onCommunityCheckPermissionsToJoinResponse*(self: Module, communityId: str
self.joiningCommunityDetails.communityIdForPermissions != communityId: self.joiningCommunityDetails.communityIdForPermissions != communityId:
return return
self.applyPermissionResponse(communityId, checkPermissionsToJoinResponse.permissions) self.applyPermissionResponse(communityId, checkPermissionsToJoinResponse.permissions)
self.checkingPermissionToJoinInProgress = false self.setCheckingPermissionToJoinInProgress(false)
self.view.setJoinPermissionsCheckSuccessful(true) self.view.setJoinPermissionsCheckSuccessful(true)
self.updateCheckingPermissionsInProgressIfNeeded(inProgress = false) self.updateCheckingPermissionsInProgressIfNeeded(inProgress = false)

View File

@ -55,7 +55,7 @@ QtObject:
discordImportHasCommunityImage: bool discordImportHasCommunityImage: bool
downloadingCommunityHistoryArchives: bool downloadingCommunityHistoryArchives: bool
checkingPermissionsInProgress: bool checkingPermissionsInProgress: bool
joinPermissionsCheckSuccessful: bool joinPermissionsCheckCompletedWithoutErrors: bool
channelsPermissionsCheckSuccessful: bool channelsPermissionsCheckSuccessful: bool
myRevealedAddressesStringForCurrentCommunity: string myRevealedAddressesStringForCurrentCommunity: string
myRevealedAirdropAddressForCurrentCommunity: string myRevealedAirdropAddressForCurrentCommunity: string
@ -123,7 +123,7 @@ QtObject:
result.collectiblesListModel = newTokenListModel() result.collectiblesListModel = newTokenListModel()
result.collectiblesListModelVariant = newQVariant(result.collectiblesListModel) result.collectiblesListModelVariant = newQVariant(result.collectiblesListModel)
result.checkingPermissionsInProgress = false result.checkingPermissionsInProgress = false
result.joinPermissionsCheckSuccessful = false result.joinPermissionsCheckCompletedWithoutErrors = false
result.channelsPermissionsCheckSuccessful = false result.channelsPermissionsCheckSuccessful = false
proc load*(self: View) = proc load*(self: View) =
@ -802,17 +802,26 @@ QtObject:
read = getCheckingPermissionsInProgress read = getCheckingPermissionsInProgress
notify = checkingPermissionsInProgressChanged notify = checkingPermissionsInProgressChanged
proc getCheckingPermissionToJoinInProgress*(self: View): bool {.slot.} =
self.delegate.getCheckingPermissionToJoinInProgress
proc checkingPermissionToJoinInProgressChanged*(self: View) {.signal.}
QtProperty[bool] checkingPermissionToJoinInProgress:
read = getCheckingPermissionToJoinInProgress
notify = checkingPermissionToJoinInProgressChanged
proc joinPermissionsCheckSuccessfulChanged*(self: View) {.signal.} proc joinPermissionsCheckSuccessfulChanged*(self: View) {.signal.}
proc setJoinPermissionsCheckSuccessful*(self: View, successful: bool) = proc setJoinPermissionsCheckSuccessful*(self: View, successful: bool) =
if (self.joinPermissionsCheckSuccessful == successful): return if (self.joinPermissionsCheckCompletedWithoutErrors == successful): return
self.joinPermissionsCheckSuccessful = successful self.joinPermissionsCheckCompletedWithoutErrors = successful
self.joinPermissionsCheckSuccessfulChanged() self.joinPermissionsCheckSuccessfulChanged()
proc getJoinPermissionsCheckSuccessful*(self: View): bool {.slot.} = proc getJoinPermissionsCheckSuccessful*(self: View): bool {.slot.} =
return self.joinPermissionsCheckSuccessful return self.joinPermissionsCheckCompletedWithoutErrors
QtProperty[bool] joinPermissionsCheckSuccessful: QtProperty[bool] joinPermissionsCheckCompletedWithoutErrors:
read = getJoinPermissionsCheckSuccessful read = getJoinPermissionsCheckSuccessful
notify = joinPermissionsCheckSuccessfulChanged notify = joinPermissionsCheckSuccessfulChanged

View File

@ -1,6 +1,7 @@
import QtQuick 2.14 import QtQuick 2.15
import QtQuick.Controls 2.14 import QtQuick.Controls 2.15
import QtQuick.Layouts 1.14 import QtQuick.Layouts 1.15
import QtQml 2.15
import Storybook 1.0 import Storybook 1.0
import Models 1.0 import Models 1.0
@ -38,7 +39,7 @@ SplitView {
closePolicy: Popup.NoAutoClose closePolicy: Popup.NoAutoClose
isEditMode: ctrlIsEditMode.checked isEditMode: ctrlIsEditMode.checked
communityId: "community_id" communityId: "ddls"
communityName: ctrlCommunityName.text communityName: ctrlCommunityName.text
communityIcon: { communityIcon: {
if (ctrlIconStatus.checked) if (ctrlIconStatus.checked)
@ -55,7 +56,8 @@ SplitView {
isInvitationPending: ctrlIsInvitationPending.checked isInvitationPending: ctrlIsInvitationPending.checked
requirementsCheckPending: ctrlRequirementsCheckPending.checked requirementsCheckPending: ctrlRequirementsCheckPending.checked
joinPermissionsCheckSuccessful: ctrlJoinPermissionsCheckSuccessful.checked checkingPermissionToJoinInProgress: ctrlCheckingPermissionToJoinInProgress.checked
joinPermissionsCheckCompletedWithoutErrors: ctrlJoinPermissionsCheckCompletedWithoutErrors.checked
walletAccountsModel: WalletAccountsModel {} walletAccountsModel: WalletAccountsModel {}
walletAssetsModel: root.walletAssetStore.groupedAccountAssetsModel walletAssetsModel: root.walletAssetStore.groupedAccountAssetsModel
@ -220,10 +222,24 @@ Nemo enim 😋 ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
} }
CheckBox { CheckBox {
Layout.leftMargin: 12 Layout.leftMargin: 20
id: ctrlJoinPermissionsCheckSuccessful id: ctrlCheckingPermissionToJoinInProgress
enabled: !ctrlRequirementsCheckPending.checked
visible: !ctrlIsInvitationPending.checked visible: !ctrlIsInvitationPending.checked
text: "Join permission successful" text: "Checking perms to join"
Binding on checked {
when: ctrlRequirementsCheckPending.checked
value: true
restoreMode: Binding.RestoreValue
}
}
CheckBox {
Layout.leftMargin: 12
id: ctrlJoinPermissionsCheckCompletedWithoutErrors
visible: !ctrlIsInvitationPending.checked
text: "Join perm. check completed w/o errors"
checked: true checked: true
} }

View File

@ -33,8 +33,9 @@ Control {
required property bool allAddressesToRevealBelongToSingleNonProfileKeypair required property bool allAddressesToRevealBelongToSingleNonProfileKeypair
required property int /*PermissionTypes.Type*/ eligibleToJoinAs required property int /*PermissionTypes.Type*/ eligibleToJoinAs
property bool requirementsCheckPending: false property bool requirementsCheckPending
property bool joinPermissionsCheckSuccessful property bool checkingPermissionToJoinInProgress
property bool joinPermissionsCheckCompletedWithoutErrors
required property string communityId required property string communityId
required property string communityName required property string communityName
@ -103,18 +104,18 @@ Control {
} }
readonly property string tooltipText: { readonly property string tooltipText: {
if (root.requirementsCheckPending) if (root.requirementsCheckPending || root.checkingPermissionToJoinInProgress)
return qsTr("Requirements check pending") return qsTr("Requirements check pending")
if (!root.joinPermissionsCheckSuccessful) if (!root.joinPermissionsCheckCompletedWithoutErrors)
return qsTr("Checking permissions to join failed") return qsTr("Checking permissions failed")
return "" return ""
} }
readonly property var saveButton: StatusButton { readonly property var saveButton: StatusButton {
visible: root.isEditMode visible: root.isEditMode
interactive: d.dirty && !root.requirementsCheckPending && root.joinPermissionsCheckSuccessful interactive: d.dirty && !root.requirementsCheckPending && root.joinPermissionsCheckCompletedWithoutErrors
loading: root.requirementsCheckPending loading: root.requirementsCheckPending
type: d.lostCommunityPermission || d.lostChannelPermissions ? StatusBaseButton.Type.Danger : StatusBaseButton.Type.Normal type: d.lostCommunityPermission || d.lostChannelPermissions ? StatusBaseButton.Type.Danger : StatusBaseButton.Type.Normal
tooltip.text: { tooltip.text: {
@ -164,8 +165,8 @@ Control {
readonly property var shareAddressesButton: StatusButton { readonly property var shareAddressesButton: StatusButton {
visible: !root.isEditMode visible: !root.isEditMode
interactive: root.eligibleToJoinAs !== PermissionTypes.Type.None && root.joinPermissionsCheckSuccessful interactive: !root.checkingPermissionToJoinInProgress && root.eligibleToJoinAs !== PermissionTypes.Type.None && root.joinPermissionsCheckCompletedWithoutErrors
loading: root.requirementsCheckPending loading: root.checkingPermissionToJoinInProgress
tooltip.text: { tooltip.text: {
if (interactive) if (interactive)
return "" return ""
@ -331,7 +332,8 @@ Control {
assetsModel: root.assetsModel assetsModel: root.assetsModel
collectiblesModel: root.collectiblesModel collectiblesModel: root.collectiblesModel
requirementsCheckPending: root.requirementsCheckPending requirementsCheckPending: root.requirementsCheckPending
joinPermissionsCheckSuccessful: root.joinPermissionsCheckSuccessful checkingPermissionToJoinInProgress: root.checkingPermissionToJoinInProgress
joinPermissionsCheckCompletedWithoutErrors: root.joinPermissionsCheckCompletedWithoutErrors
communityName: root.communityName communityName: root.communityName
communityIcon: root.communityIcon communityIcon: root.communityIcon
eligibleToJoinAs: root.eligibleToJoinAs eligibleToJoinAs: root.eligibleToJoinAs

View File

@ -32,7 +32,8 @@ Rectangle {
property var collectiblesModel property var collectiblesModel
property bool requirementsCheckPending property bool requirementsCheckPending
property bool joinPermissionsCheckSuccessful property bool checkingPermissionToJoinInProgress
property bool joinPermissionsCheckCompletedWithoutErrors
readonly property bool lostPermissionToJoin: d.lostPermissionToJoin readonly property bool lostPermissionToJoin: d.lostPermissionToJoin
readonly property bool lostChannelPermissions: d.lostChannelPermissions readonly property bool lostChannelPermissions: d.lostChannelPermissions
@ -257,7 +258,7 @@ Rectangle {
CommunityEligibilityTag { CommunityEligibilityTag {
id: eligibilityHintBubble id: eligibilityHintBubble
visible: !root.requirementsCheckPending && root.joinPermissionsCheckSuccessful visible: !root.checkingPermissionToJoinInProgress && root.joinPermissionsCheckCompletedWithoutErrors
eligibleToJoinAs: root.eligibleToJoinAs eligibleToJoinAs: root.eligibleToJoinAs
isEditMode: root.isEditMode isEditMode: root.isEditMode
isDirty: root.isDirty isDirty: root.isDirty

View File

@ -18,7 +18,8 @@ QtObject {
property var communitiesModuleInst: communitiesModule property var communitiesModuleInst: communitiesModule
property bool newVersionAvailable: false property bool newVersionAvailable: false
readonly property bool requirementsCheckPending: communitiesModuleInst.requirementsCheckPending readonly property bool requirementsCheckPending: communitiesModuleInst.requirementsCheckPending
readonly property bool joinPermissionsCheckSuccessful: communitiesModuleInst.joinPermissionsCheckSuccessful readonly property bool checkingPermissionToJoinInProgress: communitiesModuleInst.checkingPermissionToJoinInProgress
readonly property bool joinPermissionsCheckCompletedWithoutErrors: communitiesModuleInst.joinPermissionsCheckCompletedWithoutErrors
readonly property bool channelsPermissionsCheckSuccessful: communitiesModuleInst.channelsPermissionsCheckSuccessful readonly property bool channelsPermissionsCheckSuccessful: communitiesModuleInst.channelsPermissionsCheckSuccessful
property string latestVersion property string latestVersion
property string downloadURL property string downloadURL

View File

@ -718,7 +718,8 @@ QtObject {
id: dialogRoot id: dialogRoot
requirementsCheckPending: root.rootStore.requirementsCheckPending requirementsCheckPending: root.rootStore.requirementsCheckPending
joinPermissionsCheckSuccessful: root.rootStore.joinPermissionsCheckSuccessful checkingPermissionToJoinInProgress: root.rootStore.checkingPermissionToJoinInProgress
joinPermissionsCheckCompletedWithoutErrors: root.rootStore.joinPermissionsCheckCompletedWithoutErrors
walletAccountsModel: root.rootStore.walletAccountsModel walletAccountsModel: root.rootStore.walletAccountsModel
walletCollectiblesModel: WalletStore.RootStore.collectiblesStore.allCollectiblesModel walletCollectiblesModel: WalletStore.RootStore.collectiblesStore.allCollectiblesModel
@ -968,7 +969,8 @@ QtObject {
communityIcon: chatStore.sectionDetails.image communityIcon: chatStore.sectionDetails.image
requirementsCheckPending: root.rootStore.requirementsCheckPending requirementsCheckPending: root.rootStore.requirementsCheckPending
joinPermissionsCheckSuccessful: root.rootStore.joinPermissionsCheckSuccessful checkingPermissionToJoinInProgress: root.rootStore.checkingPermissionToJoinInProgress
joinPermissionsCheckCompletedWithoutErrors: root.rootStore.joinPermissionsCheckCompletedWithoutErrors
introMessage: chatStore.sectionDetails.introMessage introMessage: chatStore.sectionDetails.introMessage

View File

@ -29,7 +29,8 @@ StatusStackModal {
required property string communityIcon required property string communityIcon
required property bool requirementsCheckPending required property bool requirementsCheckPending
property bool joinPermissionsCheckSuccessful property bool checkingPermissionToJoinInProgress
property bool joinPermissionsCheckCompletedWithoutErrors
property string introMessage property string introMessage
@ -87,26 +88,23 @@ StatusStackModal {
finishButton: StatusButton { finishButton: StatusButton {
interactive: { interactive: {
if (root.isInvitationPending) if (root.isInvitationPending || d.accessType !== Constants.communityChatOnRequestAccess)
return true return true
if (root.requirementsCheckPending || !root.joinPermissionsCheckSuccessful) if (root.checkingPermissionToJoinInProgress || !root.joinPermissionsCheckCompletedWithoutErrors)
return false return false
if (d.accessType !== Constants.communityChatOnRequestAccess)
return true
return d.eligibleToJoinAs !== PermissionTypes.Type.None return d.eligibleToJoinAs !== PermissionTypes.Type.None
} }
loading: root.requirementsCheckPending && !root.isInvitationPending loading: root.checkingPermissionToJoinInProgress && !root.isInvitationPending
tooltip.text: { tooltip.text: {
if (interactive) if (interactive)
return "" return ""
if (root.requirementsCheckPending) if (root.checkingPermissionToJoinInProgress)
return qsTr("Requirements check pending") return qsTr("Requirements check pending")
if (!root.joinPermissionsCheckSuccessful) if (!root.joinPermissionsCheckCompletedWithoutErrors)
return qsTr("Checking permissions to join failed") return qsTr("Checking permissions to join failed")
return "" return ""
@ -199,6 +197,7 @@ StatusStackModal {
property int eligibleToJoinAs: PermissionsHelpers.isEligibleToJoinAs(root.permissionsModel) property int eligibleToJoinAs: PermissionsHelpers.isEligibleToJoinAs(root.permissionsModel)
readonly property var _con: Connections { readonly property var _con: Connections {
target: root.permissionsModel target: root.permissionsModel
ignoreUnknownSignals: true
function onTokenCriteriaUpdated() { function onTokenCriteriaUpdated() {
d.eligibleToJoinAs = PermissionsHelpers.isEligibleToJoinAs(root.permissionsModel) d.eligibleToJoinAs = PermissionsHelpers.isEligibleToJoinAs(root.permissionsModel)
} }
@ -362,7 +361,8 @@ StatusStackModal {
communityName: root.communityName communityName: root.communityName
communityIcon: root.communityIcon communityIcon: root.communityIcon
requirementsCheckPending: root.requirementsCheckPending requirementsCheckPending: root.requirementsCheckPending
joinPermissionsCheckSuccessful: root.joinPermissionsCheckSuccessful checkingPermissionToJoinInProgress: root.checkingPermissionToJoinInProgress
joinPermissionsCheckCompletedWithoutErrors: root.joinPermissionsCheckCompletedWithoutErrors
walletAccountsModel: d.initialAddressesModel walletAccountsModel: d.initialAddressesModel
@ -454,7 +454,7 @@ StatusStackModal {
StatusRoundedImage { StatusRoundedImage {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: 64 Layout.preferredWidth: 64
Layout.preferredHeight: Layout.preferredWidth Layout.preferredHeight: width
visible: ((image.status == Image.Loading) || visible: ((image.status == Image.Loading) ||
(image.status == Image.Ready)) && (image.status == Image.Ready)) &&
!image.isError !image.isError
@ -477,7 +477,7 @@ StatusStackModal {
anchors.bottomMargin: Style.current.bigPadding anchors.bottomMargin: Style.current.bigPadding
eligibleToJoinAs: d.eligibleToJoinAs eligibleToJoinAs: d.eligibleToJoinAs
isEditMode: root.isEditMode isEditMode: root.isEditMode
visible: !root.isInvitationPending && !root.requirementsCheckPending && root.joinPermissionsCheckSuccessful && visible: !root.isInvitationPending && !root.checkingPermissionToJoinInProgress && root.joinPermissionsCheckCompletedWithoutErrors &&
d.accessType === Constants.communityChatOnRequestAccess d.accessType === Constants.communityChatOnRequestAccess
} }
} }