Skip to content

Commit

Permalink
feat(communities): User is able to cancel membership request
Browse files Browse the repository at this point in the history
Part of: #7072
  • Loading branch information
borismelnik committed Oct 24, 2022
1 parent 6e66456 commit a3d73b1
Show file tree
Hide file tree
Showing 11 changed files with 115 additions and 14 deletions.
3 changes: 3 additions & 0 deletions src/app/modules/main/communities/controller.nim
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ proc getCuratedCommunities*(self: Controller): seq[CuratedCommunity] =
proc spectateCommunity*(self: Controller, communityId: string): string =
self.communityService.spectateCommunity(communityId)

proc cancelRequestToJoinCommunity*(self: Controller, communityId: string) =
self.communityService.cancelRequestToJoinCommunity(communityId)

proc requestToJoinCommunity*(self: Controller, communityId: string, ensName: string) =
self.communityService.requestToJoinCommunity(communityId, ensName)

Expand Down
3 changes: 3 additions & 0 deletions src/app/modules/main/communities/io_interface.nim
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ method userCanJoin*(self: AccessInterface, communityId: string): bool {.base.} =
method isCommunityRequestPending*(self: AccessInterface, communityId: string): bool {.base.} =
raise newException(ValueError, "No implementation available")

method cancelRequestToJoinCommunity*(self: AccessInterface, communityId: string) {.base.} =
raise newException(ValueError, "No implementation available")

method requestToJoinCommunity*(self: AccessInterface, communityId: string, ensName: string) {.base.} =
raise newException(ValueError, "No implementation available")

Expand Down
3 changes: 3 additions & 0 deletions src/app/modules/main/communities/module.nim
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,9 @@ method discordCategoriesAndChannelsExtracted*(self: Module, categories: seq[Disc
self.view.setDiscordImportErrorsCount(errorsCount)
self.view.discordChannelsModel().hasSelectedItemsChanged()

method cancelRequestToJoinCommunity*(self: Module, communityId: string) =
self.controller.cancelRequestToJoinCommunity(communityId)

method requestToJoinCommunity*(self: Module, communityId: string, ensName: string) =
self.controller.requestToJoinCommunity(communityId, ensName)

Expand Down
3 changes: 3 additions & 0 deletions src/app/modules/main/communities/view.nim
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,9 @@ QtObject:
proc reorderCommunityChannel*(self: View, communityId: string, categoryId: string, chatId: string, position: int): string {.slot} =
self.delegate.reorderCommunityChannel(communityId, categoryId, chatId, position)

proc cancelRequestToJoinCommunity*(self: View, communityId: string) {.slot.} =
self.delegate.cancelRequestToJoinCommunity(communityId)

proc requestToJoinCommunity*(self: View, communityId: string, ensName: string) {.slot.} =
self.delegate.requestToJoinCommunity(communityId, ensName)

Expand Down
8 changes: 5 additions & 3 deletions src/app_service/service/community/dto/community.nim
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ include ../../../common/json_utils
import ../../chat/dto/chat

type RequestToJoinType* {.pure.}= enum
Pending = 0,
Declined = 1,
Accepted = 2
Pending = 1,
Declined = 2,
Accepted = 3,
Canceled = 4

type Member* = object
id*: string
Expand Down Expand Up @@ -71,6 +72,7 @@ type CommunityDto* = object
adminSettings*: CommunityAdminSettingsDto
bannedMembersIds*: seq[string]
declinedRequestsToJoin*: seq[CommunityMembershipRequestDto]
canceledRequestsToJoin*: seq[CommunityMembershipRequestDto]

type CuratedCommunity* = object
available*: bool
Expand Down
63 changes: 59 additions & 4 deletions src/app_service/service/community/service.nim
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ const SIGNAL_COMMUNITY_CATEGORY_REORDERED* = "communityCategoryReordered"
const SIGNAL_COMMUNITY_MEMBER_APPROVED* = "communityMemberApproved"
const SIGNAL_COMMUNITY_MEMBER_REMOVED* = "communityMemberRemoved"
const SIGNAL_NEW_REQUEST_TO_JOIN_COMMUNITY* = "newRequestToJoinCommunity"
const SIGNAL_REQUEST_TO_JOIN_COMMUNITY_CANCELED* = "requestToJoinCommunityCanceled"
const SIGNAL_CURATED_COMMUNITY_FOUND* = "curatedCommunityFound"
const SIGNAL_COMMUNITY_MUTED* = "communityMuted"
const SIGNAL_CATEGORY_MUTED* = "categoryMuted"
Expand Down Expand Up @@ -139,10 +140,13 @@ QtObject:
proc loadCuratedCommunities(self: Service): seq[CuratedCommunity]
proc loadCommunitiesSettings(self: Service): seq[CommunitySettingsDto]
proc loadMyPendingRequestsToJoin*(self: Service)
proc loadMyCanceledRequestsToJoin*(self: Service)
proc handleCommunityUpdates(self: Service, communities: seq[CommunityDto], updatedChats: seq[ChatDto])
proc handleCommunitiesSettingsUpdates(self: Service, communitiesSettings: seq[CommunitySettingsDto])
proc pendingRequestsToJoinForCommunity*(self: Service, communityId: string): seq[CommunityMembershipRequestDto]
proc declinedRequestsToJoinForCommunity*(self: Service, communityId: string): seq[CommunityMembershipRequestDto]
proc canceledRequestsToJoinForCommunity*(self: Service, communityId: string): seq[CommunityMembershipRequestDto]
proc getPendingRequestIndex(self: Service, communityId: string, requestId: string): int

proc delete*(self: Service) =
discard
Expand Down Expand Up @@ -194,11 +198,19 @@ QtObject:
error "Received a membership request for an unknown community", communityId=membershipRequest.communityId
continue
var community = self.joinedCommunities[membershipRequest.communityId]
community.pendingRequestsToJoin.add(membershipRequest)
self.joinedCommunities[membershipRequest.communityId] = community
self.events.emit(SIGNAL_COMMUNITY_EDITED, CommunityArgs(community: community))
if (membershipRequest.state == RequestToJoinType.Pending.int):
community.pendingRequestsToJoin.add(membershipRequest)
self.joinedCommunities[membershipRequest.communityId] = community
self.events.emit(SIGNAL_COMMUNITY_EDITED, CommunityArgs(community: community))
self.events.emit(SIGNAL_NEW_REQUEST_TO_JOIN_COMMUNITY, CommunityRequestArgs(communityRequest: membershipRequest))

if (membershipRequest.state == RequestToJoinType.Canceled.int):
let indexPending = self.getPendingRequestIndex(membershipRequest.communityId, membershipRequest.id)
if (indexPending != -1):
community.pendingRequestsToJoin.delete(indexPending)
self.joinedCommunities[membershipRequest.communityId] = community
self.events.emit(SIGNAL_COMMUNITY_EDITED, CommunityArgs(community: community))

self.events.emit(SIGNAL_NEW_REQUEST_TO_JOIN_COMMUNITY, CommunityRequestArgs(communityRequest: membershipRequest))

self.events.on(SignalType.DiscordCategoriesAndChannelsExtracted.event) do(e: Args):
var receivedData = DiscordCategoriesAndChannelsExtractedSignal(e)
Expand Down Expand Up @@ -258,6 +270,7 @@ QtObject:
# therefore, we must keep the old one
community.pendingRequestsToJoin = self.joinedCommunities[community.id].pendingRequestsToJoin
community.declinedRequestsToJoin = self.joinedCommunities[community.id].declinedRequestsToJoin
community.canceledRequestsToJoin = self.joinedCommunities[community.id].canceledRequestsToJoin

# Update the joinded community list with the new data
self.joinedCommunities[community.id] = community
Expand Down Expand Up @@ -401,6 +414,7 @@ QtObject:
if (community.admin):
self.joinedCommunities[community.id].pendingRequestsToJoin = self.pendingRequestsToJoinForCommunity(community.id)
self.joinedCommunities[community.id].declinedRequestsToJoin = self.declinedRequestsToJoinForCommunity(community.id)
self.joinedCommunities[community.id].canceledRequestsToJoin = self.canceledRequestsToJoinForCommunity(community.id)

let allCommunities = self.loadAllCommunities()
for community in allCommunities:
Expand Down Expand Up @@ -639,6 +653,29 @@ QtObject:
except Exception as e:
error "Error fetching my community requests", msg = e.msg

proc loadMyCanceledRequestsToJoin*(self: Service) =
try:
let response = status_go.myCanceledRequestsToJoin()

if response.result.kind != JNull:
for jsonCommunityReqest in response.result:
let communityRequest = jsonCommunityReqest.toCommunityMembershipRequestDto()
self.myCommunityRequests.add(communityRequest)
self.events.emit(SIGNAL_COMMUNITY_MY_REQUEST_ADDED, CommunityRequestArgs(communityRequest: communityRequest))
except Exception as e:
error "Error fetching my community requests", msg = e.msg

proc canceledRequestsToJoinForCommunity*(self: Service, communityId: string): seq[CommunityMembershipRequestDto] =
try:
let response = status_go.canceledRequestsToJoinForCommunity(communityId)

result = @[]
if response.result.kind != JNull:
for jsonCommunityReqest in response.result:
result.add(jsonCommunityReqest.toCommunityMembershipRequestDto())
except Exception as e:
error "Error fetching community requests", msg = e.msg

proc pendingRequestsToJoinForCommunity*(self: Service, communityId: string): seq[CommunityMembershipRequestDto] =
try:
let response = status_go.pendingRequestsToJoinForCommunity(communityId)
Expand Down Expand Up @@ -1203,6 +1240,24 @@ QtObject:

self.joinedCommunities[communityId] = community

proc cancelRequestToJoinCommunity*(self: Service, communityId: string) =
try:
var i = 0
for communityRequest in self.myCommunityRequests:
if (communityRequest.communityId == communityId):
let response = status_go.cancelRequestToJoinCommunity(communityRequest.id)
if (not response.error.isNil):
let msg = response.error.message & " communityId=" & communityId
error "error while cancel membership request ", msg
return
self.myCommunityRequests.delete(i)

i.inc()

self.events.emit(SIGNAL_REQUEST_TO_JOIN_COMMUNITY_CANCELED, Args())
except Exception as e:
error "Error canceled request to join community", msg = e.msg

proc acceptRequestToJoinCommunity*(self: Service, communityId: string, requestId: string) =
try:
discard status_go.acceptRequestToJoinCommunity(requestId)
Expand Down
11 changes: 11 additions & 0 deletions src/backend/communities.nim
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,23 @@ proc requestToJoinCommunity*(communityId: string, ensName: string): RpcResponse[
proc myPendingRequestsToJoin*(): RpcResponse[JsonNode] {.raises: [Exception].} =
result = callPrivateRPC("myPendingRequestsToJoin".prefix)

proc myCanceledRequestsToJoin*(): RpcResponse[JsonNode] {.raises: [Exception].} =
result = callPrivateRPC("myCanceledRequestsToJoin".prefix)

proc pendingRequestsToJoinForCommunity*(communityId: string): RpcResponse[JsonNode] {.raises: [Exception].} =
result = callPrivateRPC("pendingRequestsToJoinForCommunity".prefix, %*[communityId])

proc declinedRequestsToJoinForCommunity*(communityId: string): RpcResponse[JsonNode] {.raises: [Exception].} =
result = callPrivateRPC("declinedRequestsToJoinForCommunity".prefix, %*[communityId])

proc canceledRequestsToJoinForCommunity*(communityId: string): RpcResponse[JsonNode] {.raises: [Exception].} =
result = callPrivateRPC("canceledRequestsToJoinForCommunity".prefix, %*[communityId])

proc cancelRequestToJoinCommunity*(requestId: string): RpcResponse[JsonNode] {.raises: [Exception].} =
result = callPrivateRPC("cancelRequestToJoinCommunity".prefix, %*[{
"id": requestId
}])

proc leaveCommunity*(communityId: string): RpcResponse[JsonNode] {.raises: [Exception].} =
result = callPrivateRPC("leaveCommunity".prefix, %*[communityId])

Expand Down
4 changes: 4 additions & 0 deletions ui/app/AppLayouts/Chat/stores/RootStore.qml
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,10 @@ QtObject {
return communitiesModuleInst.isCommunityRequestPending(id)
}

function cancelPendingRequest(id: string) {
communitiesModuleInst.cancelRequestToJoinCommunity(id)
}

function getSectionNameById(id) {
return communitiesList.getSectionNameById(id)
}
Expand Down
12 changes: 9 additions & 3 deletions ui/app/AppLayouts/Chat/views/CommunityColumnView.qml
Original file line number Diff line number Diff line change
Expand Up @@ -107,15 +107,16 @@ Item {
anchors.horizontalCenter: parent.horizontalCenter

visible: !communityData.joined
enabled: !invitationPending

text: {
if (invitationPending) return qsTr("Pending")
if (invitationPending) return qsTr("Membership request pending...")
return root.communityData.access === Constants.communityChatOnRequestAccess ?
qsTr("Request to join") : qsTr("Join Community")
}

onClicked: communityIntroDialog.open()
onClicked: {
communityIntroDialog.open()
}

Connections {
target: root.store.communitiesModuleInst
Expand All @@ -129,11 +130,16 @@ Item {
CommunityIntroDialog {
id: communityIntroDialog

isInvitationPending: joinCommunityButton.invitationPending
name: communityData.name
introMessage: communityData.introMessage
imageSrc: communityData.image

onJoined: root.store.requestToJoinCommunity(communityData.id, root.store.userProfileInst.name)
onCancelMembershipRequest: {
root.store.cancelPendingRequest(communityData.id)
joinCommunityButton.invitationPending = root.store.isCommunityRequestPending(communityData.id)
}
}
}

Expand Down
17 changes: 14 additions & 3 deletions ui/imports/shared/popups/CommunityIntroDialog.qml
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,28 @@ StatusDialog {
property string name
property string introMessage
property url imageSrc
property bool isInvitationPending: false

signal joined
signal cancelMembershipRequest

title: qsTr("Welcome to %1").arg(name)

footer: StatusDialogFooter {
rightButtons: ObjectModel {
StatusButton {
text: qsTr("Join %1").arg(root.name)
enabled: checkBox.checked
text: root.isInvitationPending ? qsTr("Cancel Membership Request")
: qsTr("Join %1").arg(root.name)
type: root.isInvitationPending ? StatusBaseButton.Type.Danger
: StatusBaseButton.Type.Normal
enabled: checkBox.checked || root.isInvitationPending
onClicked: {
root.joined()
if (root.isInvitationPending) {
root.cancelMembershipRequest()
} else {
root.joined()
}

root.close()
}
}
Expand Down Expand Up @@ -66,6 +76,7 @@ StatusDialog {
StatusCheckBox {
id: checkBox
Layout.alignment: Qt.AlignCenter
visible: !root.isInvitationPending
text: qsTr("I agree with the above")
}
}
Expand Down
2 changes: 1 addition & 1 deletion vendor/status-go
Submodule status-go updated 82 files
+1 −2 .travis.yml
+1 −1 VERSION
+0 −1 _assets/ci/Jenkinsfile.ios
+1 −1 abi-spec/core_test.go
+255 −0 abi-spec/utf8.go
+170 −0 abi-spec/utils.go
+72 −0 abi-spec/utils_test.go
+117 −151 appdatabase/migrations/bindata.go
+166 −216 appdatabase/migrationsprevnodecfg/bindata.go
+1 −1 cmd/node-canary/main.go
+3 −3 cmd/ping-community/main.go
+19 −3 cmd/populate-db/main.go
+3 −3 cmd/statusd/main.go
+22 −7 contracts/contracts.go
+0 −2 contracts/ethscan/address.go
+0 −1 contracts/resolver/address.go
+0 −1 contracts/snt/address.go
+0 −3 contracts/stickers/address.go
+1 −1 go.mod
+13 −12 mailserver/migrations/bindata.go
+46 −0 mobile/status.go
+37 −44 multiaccounts/migrations/bindata.go
+1 −1 node/geth_node_test.go
+2 −8 params/config.go
+3 −3 params/config_test.go
+0 −14 params/defaults.go
+12 −11 protocol/anonmetrics/migrations/migrations.go
+44 −6 protocol/common/message_sender.go
+29 −0 protocol/common/raw_messages_persistence.go
+233 −57 protocol/communities/manager.go
+154 −12 protocol/communities/manager_test.go
+34 −1 protocol/communities/persistence.go
+1 −0 protocol/communities/request_to_join.go
+159 −0 protocol/communities_messenger_test.go
+2 −2 protocol/encryption/encryption_test.go
+16 −6 protocol/encryption/encryptor.go
+64 −80 protocol/encryption/migrations/migrations.go
+29 −0 protocol/encryption/persistence.go
+51 −11 protocol/encryption/protocol.go
+782 −363 protocol/encryption/protocol_message.pb.go
+9 −0 protocol/encryption/protocol_message.proto
+10 −1 protocol/messenger.go
+69 −11 protocol/messenger_communities.go
+26 −3 protocol/messenger_handler.go
+224 −263 protocol/migrations/migrations.go
+15 −0 protocol/migrations/sqlite/1665484435_add_encrypted_messages.up.sql
+39 −0 protocol/persistence_test.go
+204 −110 protocol/protobuf/anon_metrics.pb.go
+392 −233 protocol/protobuf/application_metadata_message.pb.go
+1 −0 protocol/protobuf/application_metadata_message.proto
+344 −189 protocol/protobuf/chat_identity.pb.go
+1,158 −700 protocol/protobuf/chat_message.pb.go
+478 −283 protocol/protobuf/command.pb.go
+1,488 −793 protocol/protobuf/communities.pb.go
+8 −0 protocol/protobuf/communities.proto
+268 −144 protocol/protobuf/contact.pb.go
+279 −146 protocol/protobuf/contact_verification.pb.go
+206 −108 protocol/protobuf/emoji_reaction.pb.go
+163 −76 protocol/protobuf/enums.pb.go
+180 −88 protocol/protobuf/group_chat_invitation.pb.go
+298 −171 protocol/protobuf/membership_update_message.pb.go
+2,442 −1,505 protocol/protobuf/pairing.pb.go
+139 −69 protocol/protobuf/pin_message.pb.go
+984 −545 protocol/protobuf/push_notifications.pb.go
+180 −89 protocol/protobuf/status_update.pb.go
+239 −144 protocol/protobuf/sync_settings.pb.go
+25 −28 protocol/pushnotificationclient/migrations/migrations.go
+18 −19 protocol/pushnotificationserver/migrations/migrations.go
+21 −0 protocol/requests/cancel_request_to_join_community.go
+22 −24 protocol/transport/migrations/migrations.go
+14 −0 protocol/v1/status_message.go
+0 −26 rpc/network/network_test.go
+9 −0 services/ens/api.go
+10 −0 services/ens/api_test.go
+15 −0 services/ext/api.go
+1 −1 services/wallet/token.go
+8 −2 services/wallet/transfer/commands.go
+2 −6 services/wallet/transfer/iterative.go
+70 −87 static/bindata.go
+13 −12 t/bindata.go
+1 −1 t/doc.go
+0 −14 t/utils/utils.go

0 comments on commit a3d73b1

Please sign in to comment.