feat(communities): Makes requestToJoinCommunity async

Fixes: #10719
This commit is contained in:
Boris Melnik 2023-05-22 13:38:19 +03:00 committed by Iuri Matias
parent 22df203653
commit 0ba7f1d609
5 changed files with 63 additions and 15 deletions

View File

@ -90,12 +90,12 @@ proc setIsCurrentSectionActive*(self: Controller, active: bool) =
self.isCurrentSectionActive = active
proc requestToJoinCommunityAuthenticated*(self: Controller, password: string) =
self.communityService.requestToJoinCommunity(self.tmpRequestToJoinCommunityId, self.tmpRequestToJoinEnsName, password)
self.communityService.asyncRequestToJoinCommunity(self.tmpRequestToJoinCommunityId, self.tmpRequestToJoinEnsName, password)
self.tmpRequestToJoinCommunityId = ""
self.tmpRequestToJoinEnsName = ""
proc requestToJoinCommunity*(self: Controller, communityId: string, ensName: string) =
self.communityService.requestToJoinCommunity(communityId, ensName, "")
self.communityService.asyncRequestToJoinCommunity(communityId, ensName, "")
proc authenticate*(self: Controller, keyUid = "") =
let data = SharedKeycarModuleAuthenticationArgs(uniqueIdentifier: UNIQUE_MAIN_MODULE_AUTH_IDENTIFIER,

View File

@ -123,7 +123,7 @@ proc cancelRequestToJoinCommunity*(self: Controller, communityId: string) =
self.communityService.cancelRequestToJoinCommunity(communityId)
proc requestToJoinCommunity*(self: Controller, communityId: string, ensName: string) =
self.communityService.requestToJoinCommunity(communityId, ensName, password="")
self.communityService.asyncRequestToJoinCommunity(communityId, ensName, password="")
proc createCommunity*(
self: Controller,

View File

@ -79,3 +79,26 @@ const asyncAcceptRequestToJoinCommunityTask: Task = proc(argEncoded: string) {.g
"communityId": arg.communityId,
"requestId": arg.requestId
})
type
AsyncRequestToJoinCommunityTaskArg = ref object of QObjectTaskArg
communityId: string
ensName: string
password: string
const asyncRequestToJoinCommunityTask: Task = proc(argEncoded: string) {.gcsafe, nimcall.} =
let arg = decode[AsyncRequestToJoinCommunityTaskArg](argEncoded)
try:
let response = status_go.requestToJoinCommunity(arg.communityId, arg.ensName, arg.password)
arg.finish(%* {
"response": response,
"communityId": arg.communityId,
"error": "",
})
except Exception as e:
arg.finish(%* {
"error": e.msg,
"communityId": arg.communityId,
"ensName": arg.ensName,
"password": arg.password
})

View File

@ -825,17 +825,6 @@ QtObject:
error "Error joining the community", msg = e.msg
result = fmt"Error joining the community: {e.msg}"
proc requestToJoinCommunity*(self: Service, communityId: string, ensName: string, password: string) =
try:
let response = status_go.requestToJoinCommunity(communityId, ensName, password)
self.activityCenterService.parseActivityCenterResponse(response)
if not self.processRequestsToJoinCommunity(response.result):
error "error: ", procName="requestToJoinCommunity", errDesription = "no 'requestsToJoinCommunity' key in response"
except Exception as e:
error "Error requesting to join the community", msg = e.msg, communityId, ensName
proc canceledRequestsToJoinForCommunity*(self: Service, communityId: string): seq[CommunityMembershipRequestDto] =
try:
let response = status_go.canceledRequestsToJoinForCommunity(communityId)
@ -1351,6 +1340,38 @@ QtObject:
self.events.emit(SIGNAL_COMMUNITY_DATA_IMPORTED, CommunityArgs(community: community))
proc asyncRequestToJoinCommunity*(self: Service, communityId: string, ensName: string, password: string) =
try:
let arg = AsyncRequestToJoinCommunityTaskArg(
tptr: cast[ByteAddress](asyncRequestToJoinCommunityTask),
vptr: cast[ByteAddress](self.vptr),
slot: "onAsyncRequestToJoinCommunityDone",
communityId: communityId,
ensName: ensName,
password: password
)
self.threadpool.start(arg)
except Exception as e:
error "Error request to join community", msg = e.msg
proc onAsyncRequestToJoinCommunityDone*(self: Service, communityIdAndRpcResponse: string) {.slot.} =
try:
let rpcResponseObj = communityIdAndRpcResponse.parseJson
if (rpcResponseObj{"response"}{"error"}.kind != JNull):
let error = Json.decode($rpcResponseObj["response"]["error"], RpcError)
error "Error requesting community info", msg = error.message
return
let communityId = rpcResponseObj{"communityId"}.getStr()
let rpcResponse = Json.decode($rpcResponseObj["response"], RpcResponse[JsonNode])
self.activityCenterService.parseActivityCenterResponse(rpcResponse)
if not self.processRequestsToJoinCommunity(rpcResponse.result):
error "error: ", procName="onAsyncRequestToJoinCommunityDone", errDesription = "no 'requestsToJoinCommunity' key in response"
except Exception as e:
error "Error requesting to join the community", msg = e.msg
proc asyncAcceptRequestToJoinCommunity*(self: Service, communityId: string, requestId: string) =
try:
let userKey = self.getUserPubKeyFromPendingRequest(communityId, requestId)

View File

@ -95,6 +95,7 @@ Item {
function onCommunityAccessRequested(communityId: string) {
if (communityId === communityData.id) {
joinCommunityButton.invitationPending = root.store.isCommunityRequestPending(communityData.id)
joinCommunityButton.loading = false
}
}
}
@ -108,7 +109,10 @@ Item {
imageSrc: communityData.image
accessType: communityData.access
onJoined: root.store.requestToJoinCommunity(communityData.id, root.store.userProfileInst.name)
onJoined: {
joinCommunityButton.loading = true
root.store.requestToJoinCommunity(communityData.id, root.store.userProfileInst.name)
}
onCancelMembershipRequest: {
root.store.cancelPendingRequest(communityData.id)
joinCommunityButton.invitationPending = root.store.isCommunityRequestPending(communityData.id)