From b38d1df591f4c2357f157efc13bb18964150e86b Mon Sep 17 00:00:00 2001 From: Jonathan Rainville Date: Thu, 11 Feb 2021 15:37:31 -0500 Subject: [PATCH] refactor: move communities functions to communities view in chat --- src/app/chat/event_handling.nim | 9 +- src/app/chat/view.nim | 287 ++---------------- src/app/chat/views/communities.nim | 277 +++++++++++++++++ src/app/chat/views/community_item.nim | 2 +- src/app/chat/views/community_list.nim | 3 +- src/app/chat/views/community_members_list.nim | 2 +- .../community_membership_request_list.nim | 3 +- ui/app/AppLayouts/Chat/ChatColumn.qml | 2 +- .../Chat/ChatColumn/ChatMessages.qml | 6 +- .../MessageComponents/InvitationBubble.qml | 6 +- ui/app/AppLayouts/Chat/ChatLayout.qml | 2 +- ui/app/AppLayouts/Chat/CommunityColumn.qml | 12 +- .../CommunityComponents/CommunitiesPopup.qml | 6 +- .../CommunityComponents/CommunityButton.qml | 2 +- .../CommunityDetailPopup.qml | 8 +- .../CommunityHeaderButton.qml | 10 +- .../CommunityComponents/CommunityList.qml | 2 +- .../CommunityMembersPopup.qml | 2 +- .../CommunityProfilePopup.qml | 6 +- .../CreateChannelPopup.qml | 2 +- .../CreateCommunityPopup.qml | 4 +- .../ImportCommunityPopup.qml | 2 +- .../MembershipRequestsButton.qml | 2 +- .../MembershipRequestsPopup.qml | 6 +- 24 files changed, 351 insertions(+), 312 deletions(-) create mode 100644 src/app/chat/views/communities.nim diff --git a/src/app/chat/event_handling.nim b/src/app/chat/event_handling.nim index e7097cd128..784db00bba 100644 --- a/src/app/chat/event_handling.nim +++ b/src/app/chat/event_handling.nim @@ -1,5 +1,6 @@ import sugar, sequtils, times, strutils import ../../status/chat/chat as status_chat +import ./views/communities proc handleChatEvents(self: ChatController) = # Display already saved messages @@ -27,9 +28,9 @@ proc handleChatEvents(self: ChatController) = self.view.reactions.push(evArgs.emojiReactions) if (evArgs.communities.len > 0): for community in evArgs.communities: - self.view.addCommunityToList(community) + self.view.communities.addCommunityToList(community) if (evArgs.communityMembershipRequests.len > 0): - self.view.addMembershipRequests(evArgs.communityMembershipRequests) + self.view.communities.addMembershipRequests(evArgs.communityMembershipRequests) self.status.events.on("channelUpdate") do(e: Args): var evArgs = ChatUpdateArgs(e) @@ -62,10 +63,10 @@ proc handleChatEvents(self: ChatController) = if (evArgs.active == false): self.view.restorePreviousActiveChannel() else: - if (self.view.activeCommunity.communityItem.lastChannelSeen == ""): + if (self.view.communities.activeCommunity.communityItem.lastChannelSeen == ""): self.view.setActiveChannelByIndex(0) else: - self.view.setActiveChannel(self.view.activeCommunity.communityItem.lastChannelSeen) + self.view.setActiveChannel(self.view.communities.activeCommunity.communityItem.lastChannelSeen) self.status.events.on("channelJoined") do(e: Args): var channel = ChannelArgs(e) diff --git a/src/app/chat/view.nim b/src/app/chat/view.nim index ca53b08db2..ca83887532 100644 --- a/src/app/chat/view.nim +++ b/src/app/chat/view.nim @@ -4,8 +4,6 @@ import ../../status/mailservers import ../../status/libstatus/chat as libstatus_chat import ../../status/libstatus/accounts/constants import ../../status/libstatus/mailservers as status_mailservers -import ../../status/libstatus/types -import ../../status/libstatus/core import ../../status/libstatus/chat as core_chat import ../../status/libstatus/utils as status_utils import ../../status/accounts as status_accounts @@ -17,7 +15,7 @@ import ../../status/chat/[chat, message] import ../../status/profile/profile import web3/[conversions, ethtypes] import ../../status/threads -import views/[channels_list, message_list, chat_item, suggestions_list, reactions, stickers, groups, transactions, community_list, community_item, community_membership_request_list] +import views/[channels_list, message_list, chat_item, suggestions_list, reactions, stickers, groups, transactions, communities, community_list, community_item] import json_serialization import ../utils/image_utils @@ -43,12 +41,8 @@ QtObject: transactions*: TransactionsView activeChannel*: ChatItemView contextChannel*: ChatItemView + communities*: CommunitiesView previousActiveChannelIndex: int - activeCommunity*: CommunityItemView - observedCommunity*: CommunityItemView - communityList*: CommunityList - joinedCommunityList*: CommunityList - myCommunityRequests*: seq[CommunityMembershipRequest] replyTo: string channelOpenTime*: Table[string, int64] connected: bool @@ -64,8 +58,6 @@ QtObject: self.chats.delete self.activeChannel.delete self.contextChannel.delete - self.observedCommunity.delete - self.activeCommunity.delete self.currentSuggestions.delete for msg in self.messageList.values: msg.delete @@ -74,6 +66,8 @@ QtObject: self.groups.delete self.transactions.delete self.messageList = initOrderedTable[string, ChatMessageList]() + self.communities.delete + self.messageList = initTable[string, ChatMessageList]() self.channelOpenTime = initTable[string, int64]() self.QAbstractListModel.delete @@ -84,16 +78,13 @@ QtObject: result.chats = newChannelsList(status) result.activeChannel = newChatItemView(status) result.contextChannel = newChatItemView(status) - result.activeCommunity = newCommunityItemView(status) - result.observedCommunity = newCommunityItemView(status) result.currentSuggestions = newSuggestionsList() result.messageList = initOrderedTable[string, ChatMessageList]() result.reactions = newReactionView(status, result.messageList.addr, result.activeChannel) result.stickers = newStickersView(status, result.activeChannel) result.groups = newGroupsView(status,result.activeChannel) - result.communityList = newCommunityList(status) - result.joinedCommunityList = newCommunityList(status) result.transactions = newTransactionsView(status) + result.communities = newCommunitiesView(status) result.unreadMessageCnt = 0 result.loadingMessages = false result.previousActiveChannelIndex = -1 @@ -128,6 +119,12 @@ QtObject: QtProperty[QVariant] chats: read = getChatsList + proc getCommunities*(self: ChatsView): QVariant {.slot.} = + newQVariant(self.communities) + + QtProperty[QVariant] communities: + read = getCommunities + proc getChannelColor*(self: ChatsView, channel: string): string {.slot.} = self.chats.getChannelColor(channel) @@ -230,19 +227,20 @@ QtObject: self.chats.clearUnreadMessagesCount(channel) proc setActiveChannelByIndex*(self: ChatsView, index: int) {.slot.} = - if((self.activeCommunity.active and self.activeCommunity.chats.chats.len == 0) or (not self.activeCommunity.active and self.chats.chats.len == 0)): return + if((self.communities.activeCommunity.active and self.communities.activeCommunity.chats.chats.len == 0) or(not self.communities.activeCommunity.active and self.chats.chats.len == 0)): return - var selectedChannel = - if (self.activeCommunity.active): - self.activeCommunity.chats.getChannel(index) + let selectedChannel = + if (self.communities.activeCommunity.active): + self.communities.activeCommunity.chats.getChannel(index) else: self.chats.getChannel(index) self.clearUnreadIfNeeded(self.activeChannel.chatItem) self.clearUnreadIfNeeded(selectedChannel) - if (self.activeCommunity.active and self.activeCommunity.communityItem.lastChannelSeen != selectedChannel.id): - self.activeCommunity.communityItem.lastChannelSeen = selectedChannel.id - self.joinedCommunityList.replaceCommunity(self.activeCommunity.communityItem) + + if (self.communities.activeCommunity.active and self.communities.activeCommunity.communityItem.lastChannelSeen != selectedChannel.id): + self.communities.activeCommunity.communityItem.lastChannelSeen = selectedChannel.id + self.communities.joinedCommunityList.replaceCommunity(self.communities.activeCommunity.communityItem) if self.activeChannel.id == selectedChannel.id: return @@ -254,8 +252,8 @@ QtObject: self.status.chat.setActiveChannel(selectedChannel.id) proc getActiveChannelIdx(self: ChatsView): int {.slot.} = - if (self.activeCommunity.active): - return self.activeCommunity.chats.chats.findIndexById(self.activeChannel.id) + if (self.communities.activeCommunity.active): + return self.communities.activeCommunity.chats.chats.findIndexById(self.activeChannel.id) else: return self.chats.chats.findIndexById(self.activeChannel.id) @@ -268,8 +266,8 @@ QtObject: if(channel == ""): return let selectedChannel = - if (self.activeCommunity.active): - self.activeCommunity.chats.getChannel(self.activeCommunity.chats.chats.findIndexById(channel)) + if (self.communities.activeCommunity.active): + self.communities.activeCommunity.chats.getChannel(self.communities.activeCommunity.chats.chats.findIndexById(channel)) else: self.chats.getChannel(self.chats.chats.findIndexById(channel)) @@ -704,243 +702,6 @@ QtObject: QtProperty[QVariant] transactions: read = getTransactions - proc pendingRequestsToJoinForCommunity*(self: ChatsView, communityId: string): seq[CommunityMembershipRequest] = - result = self.status.chat.pendingRequestsToJoinForCommunity(communityId) - - proc membershipRequestPushed*(self: ChatsView, communityName: string, pubKey: string) {.signal.} - - proc addMembershipRequests*(self: ChatsView, membershipRequests: seq[CommunityMembershipRequest]) = - var communityId: string - var community: Community - for request in membershipRequests: - communityId = request.communityId - community = self.joinedCommunityList.getCommunityById(communityId) - if (community.id == ""): - continue - let alreadyPresentRequestIdx = community.membershipRequests.findIndexById(request.id) - if (alreadyPresentRequestIdx == -1): - community.membershipRequests.add(request) - self.membershipRequestPushed(community.name, request.publicKey) - else: - community.membershipRequests[alreadyPresentRequestIdx] = request - self.joinedCommunityList.replaceCommunity(community) - - # Add to active community list - if (communityId == self.activeCommunity.communityItem.id): - self.activeCommunity.communityMembershipRequestList.addCommunityMembershipRequestItemToList(request) - - proc communitiesChanged*(self: ChatsView) {.signal.} - - proc getCommunitiesIfNotFetched*(self: ChatsView): CommunityList = - if (not self.communityList.fetched): - let communities = self.status.chat.getAllComunities() - self.communityList.setNewData(communities) - self.communityList.fetched = true - return self.communityList - - proc getComunities*(self: ChatsView): QVariant {.slot.} = - return newQVariant(self.getCommunitiesIfNotFetched()) - - QtProperty[QVariant] communities: - read = getComunities - notify = communitiesChanged - - proc joinedCommunitiesChanged*(self: ChatsView) {.signal.} - - proc getJoinedComunities*(self: ChatsView): QVariant {.slot.} = - if (not self.joinedCommunityList.fetched): - let communities = self.status.chat.getJoinedComunities() - self.joinedCommunityList.setNewData(communities) - self.joinedCommunityList.fetched = true - - # Also fetch requests - self.myCommunityRequests = self.status.chat.myPendingRequestsToJoin() - - return newQVariant(self.joinedCommunityList) - - QtProperty[QVariant] joinedCommunities: - read = getJoinedComunities - notify = joinedCommunitiesChanged - - proc activeCommunityChanged*(self: ChatsView) {.signal.} - - proc setActiveCommunity*(self: ChatsView, communityId: string) {.slot.} = - if(communityId == ""): return - self.addMembershipRequests(self.pendingRequestsToJoinForCommunity(communityId)) - self.activeCommunity.setCommunityItem(self.joinedCommunityList.getCommunityById(communityId)) - self.activeCommunity.setActive(true) - self.activeCommunityChanged() - - proc getActiveCommunity*(self: ChatsView): QVariant {.slot.} = - newQVariant(self.activeCommunity) - - QtProperty[QVariant] activeCommunity: - read = getActiveCommunity - write = setActiveCommunity - notify = activeCommunityChanged - - proc joinCommunity*(self: ChatsView, communityId: string, setActive: bool = true): string {.slot.} = - result = "" - try: - self.status.chat.joinCommunity(communityId) - self.joinedCommunityList.addCommunityItemToList(self.communityList.getCommunityById(communityId)) - if (setActive): - self.setActiveCommunity(communityId) - except Exception as e: - error "Error joining the community", msg = e.msg - result = fmt"Error joining the community: {e.msg}" - - proc membershipRequestChanged*(self: ChatsView, communityName: string, accepted: bool) {.signal.} - - proc addCommunityToList*(self: ChatsView, community: Community) = - let communityCheck = self.communityList.getCommunityById(community.id) - if (communityCheck.id == ""): - self.communityList.addCommunityItemToList(community) - else: - self.communityList.replaceCommunity(community) - - if (community.joined == true): - let joinedCommunityCheck = self.joinedCommunityList.getCommunityById(community.id) - if (joinedCommunityCheck.id == ""): - self.joinedCommunityList.addCommunityItemToList(community) - else: - self.joinedCommunityList.replaceCommunity(community) - elif (community.isMember == true): - discard self.joinCommunity(community.id, false) - var i = 0 - for communityRequest in self.myCommunityRequests: - if (communityRequest.communityId == community.id): - self.membershipRequestChanged(community.name, true) - self.myCommunityRequests.delete(i, i) - break - i = i + 1 - - proc isCommunityRequestPending*(self: ChatsView, communityId: string): bool {.slot.} = - for communityRequest in self.myCommunityRequests: - if (communityRequest.communityId == communityId): - return true - return false - - proc createCommunity*(self: ChatsView, name: string, description: string, access: int, ensOnly: bool, imagePath: string, aX: int, aY: int, bX: int, bY: int): string {.slot.} = - result = "" - try: - var image = image_utils.formatImagePath(imagePath) - let community = self.status.chat.createCommunity(name, description, access, ensOnly, image, aX, aY, bX, bY) - - if (community.id == ""): - return "Community was not created. Please try again later" - - self.communityList.addCommunityItemToList(community) - self.joinedCommunityList.addCommunityItemToList(community) - self.communitiesChanged() - except Exception as e: - error "Error creating the community", msg = e.msg - result = fmt"Error creating the community: {e.msg}" - - proc createCommunityChannel*(self: ChatsView, communityId: string, name: string, description: string): string {.slot.} = - result = "" - try: - let chat = self.status.chat.createCommunityChannel(communityId, name, description) - - if (chat.id == ""): - return "Chat was not created. Please try again later" - - self.joinedCommunityList.addChannelToCommunity(communityId, chat) - discard self.activeCommunity.chats.addChatItemToList(chat) - except Exception as e: - error "Error creating the channel", msg = e.msg - result = fmt"Error creating the channel: {e.msg}" - - proc observedCommunityChanged*(self: ChatsView) {.signal.} - - proc setObservedCommunity*(self: ChatsView, communityId: string) {.slot.} = - if(communityId == ""): return - var community = self.communityList.getCommunityById(communityId) - if (community.id == ""): - discard self.getCommunitiesIfNotFetched() - community = self.communityList.getCommunityById(communityId) - self.observedCommunity.setCommunityItem(community) - self.observedCommunityChanged() - - proc getObservedCommunity*(self: ChatsView): QVariant {.slot.} = - newQVariant(self.observedCommunity) - - QtProperty[QVariant] observedCommunity: - read = getObservedCommunity - write = setObservedCommunity - notify = observedCommunityChanged - - proc leaveCommunity*(self: ChatsView, communityId: string): string {.slot.} = - result = "" - try: - self.status.chat.leaveCommunity(communityId) - if (communityId == self.activeCommunity.communityItem.id): - self.activeCommunity.setActive(false) - self.joinedCommunityList.removeCommunityItemFromList(communityId) - var updatedCommunity = self.communityList.getCommunityById(communityId) - updatedCommunity.joined = false - self.communityList.replaceCommunity(updatedCommunity) - except Exception as e: - error "Error leaving the community", msg = e.msg - result = fmt"Error leaving the community: {e.msg}" - - proc leaveCurrentCommunity*(self: ChatsView): string {.slot.} = - result = self.leaveCommunity(self.activeCommunity.communityItem.id) - - proc inviteUserToCommunity*(self: ChatsView, pubKey: string): string {.slot.} = - try: - self.status.chat.inviteUserToCommunity(self.activeCommunity.id(), pubKey) - except Exception as e: - error "Error inviting to the community", msg = e.msg - result = fmt"Error inviting to the community: {e.msg}" - - proc exportComumnity*(self: ChatsView): string {.slot.} = - try: - result = self.status.chat.exportCommunity(self.activeCommunity.communityItem.id) - except Exception as e: - error "Error exporting the community", msg = e.msg - result = fmt"Error exporting the community: {e.msg}" - - proc importCommunity*(self: ChatsView, communityKey: string) {.slot.} = - try: - self.status.chat.importCommunity(communityKey) - except Exception as e: - error "Error importing the community", msg = e.msg - - proc removeUserFromCommunity*(self: ChatsView, pubKey: string) {.slot.} = - try: - self.status.chat.removeUserFromCommunity(self.activeCommunity.id(), pubKey) - self.activeCommunity.removeMember(pubKey) - except Exception as e: - error "Error removing user from the community", msg = e.msg - - - proc requestToJoinCommunity*(self: ChatsView, communityId: string, ensName: string) {.slot.} = - try: - let requests = self.status.chat.requestToJoinCommunity(communityId, ensName) - for request in requests: - self.myCommunityRequests.add(request) - except Exception as e: - error "Error requesting to join the community", msg = e.msg - - proc acceptRequestToJoinCommunity*(self: ChatsView, requestId: string): string {.slot.} = - try: - self.status.chat.acceptRequestToJoinCommunity(requestId) - self.activeCommunity.communityMembershipRequestList.removeCommunityMembershipRequestItemFromList(requestId) - except Exception as e: - error "Error accepting request to join the community", msg = e.msg - return "Error accepting request to join the community" - return "" - - proc declineRequestToJoinCommunity*(self: ChatsView, requestId: string): string {.slot.} = - try: - self.status.chat.declineRequestToJoinCommunity(requestId) - self.activeCommunity.communityMembershipRequestList.removeCommunityMembershipRequestItemFromList(requestId) - except Exception as e: - error "Error declining request to join the community", msg = e.msg - return "Error declining request to join the community" - return "" - method rowCount*(self: ChatsView, index: QModelIndex = nil): int = result = self.messageList.len @@ -959,6 +720,6 @@ QtObject: proc getMessageListIndex(self: ChatsView):int {.slot.} = var idx = -1 for msg in toSeq(self.messageList.values): - idx = idx + 1 if(self.activeChannel.id == msg.id): return idx + idx = idx + 1 return idx diff --git a/src/app/chat/views/communities.nim b/src/app/chat/views/communities.nim new file mode 100644 index 0000000000..9cb5d979ea --- /dev/null +++ b/src/app/chat/views/communities.nim @@ -0,0 +1,277 @@ +import NimQml, json, sequtils, chronicles, strutils, strformat +import ../../../status/status +import ../../../status/chat/chat +import ./community_list +import ./community_item +import ./community_membership_request_list +import ./channels_list +import ../../utils/image_utils + + +logScope: + topics = "communities-view" + +QtObject: + type CommunitiesView* = ref object of QObject + status: Status + activeCommunity*: CommunityItemView + observedCommunity*: CommunityItemView + communityList*: CommunityList + joinedCommunityList*: CommunityList + myCommunityRequests*: seq[CommunityMembershipRequest] + + proc setup(self: CommunitiesView) = + self.QObject.setup + + proc delete*(self: CommunitiesView) = + self.observedCommunity.delete + self.activeCommunity.delete + self.communityList.delete + self.joinedCommunityList.delete + self.QObject.delete + + proc newCommunitiesView*(status: Status): CommunitiesView = + new(result, delete) + result.status = status + result.activeCommunity = newCommunityItemView(status) + result.observedCommunity = newCommunityItemView(status) + result.communityList = newCommunityList(status) + result.joinedCommunityList = newCommunityList(status) + result.setup + + proc pendingRequestsToJoinForCommunity*(self: CommunitiesView, communityId: string): seq[CommunityMembershipRequest] = + result = self.status.chat.pendingRequestsToJoinForCommunity(communityId) + + proc membershipRequestPushed*(self: CommunitiesView, communityName: string, pubKey: string) {.signal.} + + proc addMembershipRequests*(self: CommunitiesView, membershipRequests: seq[CommunityMembershipRequest]) = + var communityId: string + var community: Community + for request in membershipRequests: + communityId = request.communityId + community = self.joinedCommunityList.getCommunityById(communityId) + if (community.id == ""): + continue + let alreadyPresentRequestIdx = community.membershipRequests.findIndexById(request.id) + if (alreadyPresentRequestIdx == -1): + community.membershipRequests.add(request) + self.membershipRequestPushed(community.name, request.publicKey) + else: + community.membershipRequests[alreadyPresentRequestIdx] = request + self.joinedCommunityList.replaceCommunity(community) + + # Add to active community list + if (communityId == self.activeCommunity.communityItem.id): + self.activeCommunity.communityMembershipRequestList.addCommunityMembershipRequestItemToList(request) + + proc communitiesChanged*(self: CommunitiesView) {.signal.} + + proc getCommunitiesIfNotFetched*(self: CommunitiesView): CommunityList = + if (not self.communityList.fetched): + let communities = self.status.chat.getAllComunities() + self.communityList.setNewData(communities) + self.communityList.fetched = true + return self.communityList + + proc getComunities*(self: CommunitiesView): QVariant {.slot.} = + return newQVariant(self.getCommunitiesIfNotFetched()) + + QtProperty[QVariant] list: + read = getComunities + notify = communitiesChanged + + proc joinedCommunitiesChanged*(self: CommunitiesView) {.signal.} + + proc getJoinedComunities*(self: CommunitiesView): QVariant {.slot.} = + if (not self.joinedCommunityList.fetched): + let communities = self.status.chat.getJoinedComunities() + self.joinedCommunityList.setNewData(communities) + self.joinedCommunityList.fetched = true + + # Also fetch requests + self.myCommunityRequests = self.status.chat.myPendingRequestsToJoin() + + return newQVariant(self.joinedCommunityList) + + QtProperty[QVariant] joinedCommunities: + read = getJoinedComunities + notify = joinedCommunitiesChanged + + proc activeCommunityChanged*(self: CommunitiesView) {.signal.} + + proc setActiveCommunity*(self: CommunitiesView, communityId: string) {.slot.} = + if(communityId == ""): return + self.addMembershipRequests(self.pendingRequestsToJoinForCommunity(communityId)) + self.activeCommunity.setCommunityItem(self.joinedCommunityList.getCommunityById(communityId)) + self.activeCommunity.setActive(true) + self.activeCommunityChanged() + + proc getActiveCommunity*(self: CommunitiesView): QVariant {.slot.} = + newQVariant(self.activeCommunity) + + QtProperty[QVariant] activeCommunity: + read = getActiveCommunity + write = setActiveCommunity + notify = activeCommunityChanged + + proc joinCommunity*(self: CommunitiesView, communityId: string, setActive: bool = true): string {.slot.} = + result = "" + try: + self.status.chat.joinCommunity(communityId) + self.joinedCommunityList.addCommunityItemToList(self.communityList.getCommunityById(communityId)) + if (setActive): + self.setActiveCommunity(communityId) + except Exception as e: + error "Error joining the community", msg = e.msg + result = fmt"Error joining the community: {e.msg}" + + proc membershipRequestChanged*(self: CommunitiesView, communityName: string, accepted: bool) {.signal.} + + proc addCommunityToList*(self: CommunitiesView, community: Community) = + let communityCheck = self.communityList.getCommunityById(community.id) + if (communityCheck.id == ""): + self.communityList.addCommunityItemToList(community) + else: + self.communityList.replaceCommunity(community) + + if (community.joined == true): + let joinedCommunityCheck = self.joinedCommunityList.getCommunityById(community.id) + if (joinedCommunityCheck.id == ""): + self.joinedCommunityList.addCommunityItemToList(community) + else: + self.joinedCommunityList.replaceCommunity(community) + elif (community.isMember == true): + discard self.joinCommunity(community.id, false) + var i = 0 + for communityRequest in self.myCommunityRequests: + if (communityRequest.communityId == community.id): + self.membershipRequestChanged(community.name, true) + self.myCommunityRequests.delete(i, i) + break + i = i + 1 + + proc isCommunityRequestPending*(self: CommunitiesView, communityId: string): bool {.slot.} = + for communityRequest in self.myCommunityRequests: + if (communityRequest.communityId == communityId): + return true + return false + + proc createCommunity*(self: CommunitiesView, name: string, description: string, access: int, ensOnly: bool, imagePath: string, aX: int, aY: int, bX: int, bY: int): string {.slot.} = + result = "" + try: + var image = image_utils.formatImagePath(imagePath) + let community = self.status.chat.createCommunity(name, description, access, ensOnly, image, aX, aY, bX, bY) + + if (community.id == ""): + return "Community was not created. Please try again later" + + self.communityList.addCommunityItemToList(community) + self.joinedCommunityList.addCommunityItemToList(community) + self.communitiesChanged() + except Exception as e: + error "Error creating the community", msg = e.msg + result = fmt"Error creating the community: {e.msg}" + + proc createCommunityChannel*(self: CommunitiesView, communityId: string, name: string, description: string): string {.slot.} = + result = "" + try: + let chat = self.status.chat.createCommunityChannel(communityId, name, description) + + if (chat.id == ""): + return "Chat was not created. Please try again later" + + self.joinedCommunityList.addChannelToCommunity(communityId, chat) + discard self.activeCommunity.chats.addChatItemToList(chat) + except Exception as e: + error "Error creating the channel", msg = e.msg + result = fmt"Error creating the channel: {e.msg}" + + proc observedCommunityChanged*(self: CommunitiesView) {.signal.} + + proc setObservedCommunity*(self: CommunitiesView, communityId: string) {.slot.} = + if(communityId == ""): return + var community = self.communityList.getCommunityById(communityId) + if (community.id == ""): + discard self.getCommunitiesIfNotFetched() + community = self.communityList.getCommunityById(communityId) + self.observedCommunity.setCommunityItem(community) + self.observedCommunityChanged() + + proc getObservedCommunity*(self: CommunitiesView): QVariant {.slot.} = + newQVariant(self.observedCommunity) + + QtProperty[QVariant] observedCommunity: + read = getObservedCommunity + write = setObservedCommunity + notify = observedCommunityChanged + + proc leaveCommunity*(self: CommunitiesView, communityId: string): string {.slot.} = + result = "" + try: + self.status.chat.leaveCommunity(communityId) + if (communityId == self.activeCommunity.communityItem.id): + self.activeCommunity.setActive(false) + self.joinedCommunityList.removeCommunityItemFromList(communityId) + var updatedCommunity = self.communityList.getCommunityById(communityId) + updatedCommunity.joined = false + self.communityList.replaceCommunity(updatedCommunity) + except Exception as e: + error "Error leaving the community", msg = e.msg + result = fmt"Error leaving the community: {e.msg}" + + proc leaveCurrentCommunity*(self: CommunitiesView): string {.slot.} = + result = self.leaveCommunity(self.activeCommunity.communityItem.id) + + proc inviteUserToCommunity*(self: CommunitiesView, pubKey: string): string {.slot.} = + try: + self.status.chat.inviteUserToCommunity(self.activeCommunity.id(), pubKey) + except Exception as e: + error "Error inviting to the community", msg = e.msg + result = fmt"Error inviting to the community: {e.msg}" + + proc exportComumnity*(self: CommunitiesView): string {.slot.} = + try: + result = self.status.chat.exportCommunity(self.activeCommunity.communityItem.id) + except Exception as e: + error "Error exporting the community", msg = e.msg + result = fmt"Error exporting the community: {e.msg}" + + proc importCommunity*(self: CommunitiesView, communityKey: string) {.slot.} = + try: + self.status.chat.importCommunity(communityKey) + except Exception as e: + error "Error importing the community", msg = e.msg + + proc removeUserFromCommunity*(self: CommunitiesView, pubKey: string) {.slot.} = + try: + self.status.chat.removeUserFromCommunity(self.activeCommunity.id(), pubKey) + self.activeCommunity.removeMember(pubKey) + except Exception as e: + error "Error removing user from the community", msg = e.msg + + + proc requestToJoinCommunity*(self: CommunitiesView, communityId: string, ensName: string) {.slot.} = + try: + let requests = self.status.chat.requestToJoinCommunity(communityId, ensName) + for request in requests: + self.myCommunityRequests.add(request) + except Exception as e: + error "Error requesting to join the community", msg = e.msg + + proc acceptRequestToJoinCommunity*(self: CommunitiesView, requestId: string): string {.slot.} = + try: + self.status.chat.acceptRequestToJoinCommunity(requestId) + self.activeCommunity.communityMembershipRequestList.removeCommunityMembershipRequestItemFromList(requestId) + except Exception as e: + error "Error accepting request to join the community", msg = e.msg + return "Error accepting request to join the community" + return "" + + proc declineRequestToJoinCommunity*(self: CommunitiesView, requestId: string): string {.slot.} = + try: + self.status.chat.declineRequestToJoinCommunity(requestId) + self.activeCommunity.communityMembershipRequestList.removeCommunityMembershipRequestItemFromList(requestId) + except Exception as e: + error "Error declining request to join the community", msg = e.msg + return "Error declining request to join the community" + return "" \ No newline at end of file diff --git a/src/app/chat/views/community_item.nim b/src/app/chat/views/community_item.nim index afbd4a9fde..d98182f7af 100644 --- a/src/app/chat/views/community_item.nim +++ b/src/app/chat/views/community_item.nim @@ -1,4 +1,4 @@ -import NimQml, Tables, std/wrapnils +import NimQml, std/wrapnils import ../../../status/[chat/chat, status] import channels_list import ../../../eventemitter diff --git a/src/app/chat/views/community_list.nim b/src/app/chat/views/community_list.nim index 9ef3a35385..34c6cb8dfd 100644 --- a/src/app/chat/views/community_list.nim +++ b/src/app/chat/views/community_list.nim @@ -1,7 +1,6 @@ import NimQml, Tables, chronicles -import ../../../status/chat/[chat, message] +import ../../../status/chat/chat import ../../../status/status -import ../../../status/ens import ../../../status/accounts import strutils diff --git a/src/app/chat/views/community_members_list.nim b/src/app/chat/views/community_members_list.nim index f62b14a68b..fae0c8c618 100644 --- a/src/app/chat/views/community_members_list.nim +++ b/src/app/chat/views/community_members_list.nim @@ -1,5 +1,5 @@ import NimQml, Tables, - ../../../status/[chat/chat, status, ens] + ../../../status/[status, ens] import ../../../status/accounts as status_accounts type CommunityMembersRoles {.pure.} = enum diff --git a/src/app/chat/views/community_membership_request_list.nim b/src/app/chat/views/community_membership_request_list.nim index 3a88cf1419..a800ee73e6 100644 --- a/src/app/chat/views/community_membership_request_list.nim +++ b/src/app/chat/views/community_membership_request_list.nim @@ -1,7 +1,6 @@ import NimQml, Tables, chronicles -import ../../../status/chat/[chat, message] +import ../../../status/chat/chat import ../../../status/status -import ../../../status/ens import ../../../status/accounts import strutils diff --git a/ui/app/AppLayouts/Chat/ChatColumn.qml b/ui/app/AppLayouts/Chat/ChatColumn.qml index 9282f05762..d631ca8a30 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn.qml @@ -280,7 +280,7 @@ StackLayout { StatusChatInput { id: chatInput visible: { - const community = chatsModel.activeCommunity + const community = chatsModel.communities.activeCommunity if (chatsModel.activeChannel.chatType !== Constants.chatTypePrivateGroupChat && (!community.active || community.access === Constants.communityChatPublicAccess || diff --git a/ui/app/AppLayouts/Chat/ChatColumn/ChatMessages.qml b/ui/app/AppLayouts/Chat/ChatColumn/ChatMessages.qml index b52b1a5e0e..b309cb1c42 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn/ChatMessages.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn/ChatMessages.qml @@ -201,8 +201,12 @@ ScrollView { } } } + } - onMembershipRequestChanged: function (communityName, accepted) { + Connections { + target: chatsModel.communities + + onMembershipRequestChanged: function (communityName, accepted) { systemTray.showMessage("Status", accepted ? qsTr("You have been accepted into the ‘%1’ community").arg(communityName) : qsTr("Your request to join the ‘%1’ community was declined").arg(communityName), diff --git a/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/InvitationBubble.qml b/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/InvitationBubble.qml index 08acd812bf..146109c569 100644 --- a/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/InvitationBubble.qml +++ b/ui/app/AppLayouts/Chat/ChatColumn/MessageComponents/InvitationBubble.qml @@ -15,9 +15,9 @@ Item { height: childrenRect.height Component.onCompleted: { - chatsModel.setObservedCommunity(communityId) + chatsModel.communities.setObservedCommunity(communityId) - root.invitedCommunity = chatsModel.observedCommunity + root.invitedCommunity = chatsModel.communities.observedCommunity } UserImage { @@ -144,7 +144,7 @@ Item { //% "Join" qsTrId("join") onClicked: { - chatsModel.joinCommunity(communityId) + chatsModel.communities.joinCommunity(communityId) root.joined = true } } diff --git a/ui/app/AppLayouts/Chat/ChatLayout.qml b/ui/app/AppLayouts/Chat/ChatLayout.qml index 5d93ff9691..150ec795c3 100644 --- a/ui/app/AppLayouts/Chat/ChatLayout.qml +++ b/ui/app/AppLayouts/Chat/ChatLayout.qml @@ -61,7 +61,7 @@ SplitView { SplitView.preferredWidth: Style.current.leftTabPrefferedSize SplitView.minimumWidth: Style.current.leftTabMinimumWidth SplitView.maximumWidth: Style.current.leftTabMaximumWidth - sourceComponent: appSettings.communitiesEnabled && chatsModel.activeCommunity.active ? communtiyColumnComponent : contactsColumnComponent + sourceComponent: appSettings.communitiesEnabled && chatsModel.communities.activeCommunity.active ? communtiyColumnComponent : contactsColumnComponent } Component { diff --git a/ui/app/AppLayouts/Chat/CommunityColumn.qml b/ui/app/AppLayouts/Chat/CommunityColumn.qml index 557f1f5620..a614ffd12a 100644 --- a/ui/app/AppLayouts/Chat/CommunityColumn.qml +++ b/ui/app/AppLayouts/Chat/CommunityColumn.qml @@ -40,7 +40,7 @@ Item { anchors.left: parent.left anchors.leftMargin: Style.current.bigPadding anchors.verticalCenter: communityHeaderButton.verticalCenter - onClicked: chatsModel.activeCommunity.active = false + onClicked: chatsModel.communities.activeCommunity.active = false } CommunityHeaderButton { @@ -72,7 +72,7 @@ Item { icon.source: "../../img/hash.svg" icon.width: 20 icon.height: 20 - onTriggered: openPopup(createChannelPopup, {communityId: chatsModel.activeCommunity.id}) + onTriggered: openPopup(createChannelPopup, {communityId: chatsModel.communities.activeCommunity.id}) } Action { @@ -82,7 +82,7 @@ Item { icon.color: Style.current.red icon.width: 20 icon.height: 20 - onTriggered: chatsModel.leaveCurrentCommunity() + onTriggered: chatsModel.communities.leaveCurrentCommunity() } } } @@ -90,7 +90,7 @@ Item { Loader { id: membershipRequestsLoader width: parent.width - active: chatsModel.activeCommunity.admin + active: chatsModel.communities.activeCommunity.admin anchors.top: communityHeader.bottom anchors.topMargin: item && item.visible ? Style.current.halfPadding : 0 @@ -119,12 +119,12 @@ Item { ChannelList { id: channelList searchStr: "" - channelModel: chatsModel.activeCommunity.chats + channelModel: chatsModel.communities.activeCommunity.chats } CommunityWelcomeBanner { id: emptyViewAndSuggestions - visible: chatsModel.activeCommunity.admin + visible: chatsModel.communities.activeCommunity.admin width: parent.width anchors.top: channelList.bottom anchors.topMargin: Style.current.padding diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/CommunitiesPopup.qml b/ui/app/AppLayouts/Chat/CommunityComponents/CommunitiesPopup.qml index 5e2c1f0fc1..c7de60a148 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/CommunitiesPopup.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/CommunitiesPopup.qml @@ -68,7 +68,7 @@ ModalPopup { } ] - model: chatsModel.communities + model: chatsModel.communities.list delegate: Item { // TODO add the search for the name and category once they exist visible: { @@ -126,9 +126,9 @@ ModalPopup { cursorShape: Qt.PointingHandCursor onClicked: { if (joined && isMember) { - chatsModel.setActiveCommunity(id) + chatsModel.communities.setActiveCommunity(id) } else { - chatsModel.setObservedCommunity(id) + chatsModel.communities.setObservedCommunity(id) openPopup(communityDetailPopup) } popup.close() diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityButton.qml b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityButton.qml index 03716ae2d8..a9815e0681 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityButton.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityButton.qml @@ -89,7 +89,7 @@ Rectangle { communityButton.hovered = false } onClicked: { - chatsModel.setActiveCommunity(communityId) + chatsModel.communities.setActiveCommunity(communityId) } } diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityDetailPopup.qml b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityDetailPopup.qml index 030d2c2a80..cfe0a7c358 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityDetailPopup.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityDetailPopup.qml @@ -6,7 +6,7 @@ import "../../../../shared/status" import "../ContactsColumn" ModalPopup { - property QtObject community: chatsModel.observedCommunity + property QtObject community: chatsModel.communities.observedCommunity property string communityId: community.id property string name: community.name property string description: community.description @@ -185,7 +185,7 @@ ModalPopup { if (access !== Constants.communityChatOnRequestAccess) { return false } - return chatsModel.isCommunityRequestPending(communityId) + return chatsModel.communities.isCommunityRequestPending(communityId) } text: { if (ensOnly && !profileModel.profile.ensVerified) { @@ -221,14 +221,14 @@ ModalPopup { onClicked: { let error if (access === Constants.communityChatOnRequestAccess) { - error = chatsModel.requestToJoinCommunity(popup.communityId, + error = chatsModel.communities.requestToJoinCommunity(popup.communityId, profileModel.profile.ensVerified ? profileModel.profile.username : "") if (!error) { enabled = false text = qsTr("Pending") } } else { - error = chatsModel.joinCommunity(popup.communityId) + error = chatsModel.communities.joinCommunity(popup.communityId) } if (error) { diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityHeaderButton.qml b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityHeaderButton.qml index c994964d70..008fb5fc16 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityHeaderButton.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityHeaderButton.qml @@ -28,7 +28,7 @@ Button { StyledText { id: communityName - text: chatsModel.activeCommunity.name + text: chatsModel.communities.activeCommunity.name anchors.left: communityImage.right anchors.leftMargin: Style.current.halfPadding anchors.top: parent.top @@ -38,11 +38,9 @@ Button { StyledText { id: communityNbMember - text: chatsModel.activeCommunity.nbMembers === 1 ? - //% "1 member" - qsTrId("1-member") : - //% "%1 members" - qsTrId("-1-members").arg(chatsModel.activeCommunity.nbMembers) + text: chatsModel.communities.activeCommunity.nbMembers === 1 ? + qsTr("1 member") : + qsTr("%1 members").arg(chatsModel.communities.activeCommunity.nbMembers) anchors.left: communityName.left anchors.top: communityName.bottom font.pixelSize: 12 diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityList.qml b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityList.qml index d1ffae6ecc..55eb1c8bc1 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityList.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityList.qml @@ -19,7 +19,7 @@ Item { visible: height > 10 width:parent.width interactive: false - model: chatsModel.joinedCommunities + model: chatsModel.communities.joinedCommunities delegate: CommunityButton { communityId: model.id name: model.name diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityMembersPopup.qml b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityMembersPopup.qml index 9495778463..08e7d40673 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityMembersPopup.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityMembersPopup.qml @@ -9,7 +9,7 @@ import "../components" ModalPopup { id: popup - property QtObject community: chatsModel.activeCommunity + property QtObject community: chatsModel.communities.activeCommunity header: Item { height: childrenRect.height diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityProfilePopup.qml b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityProfilePopup.qml index b0d2928db2..5d3bb3b6ad 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/CommunityProfilePopup.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/CommunityProfilePopup.qml @@ -8,7 +8,7 @@ import "../../../../shared/status" import "../ContactsColumn" ModalPopup { - property QtObject community: chatsModel.activeCommunity + property QtObject community: chatsModel.communities.activeCommunity property string communityId: community.id property string name: community.name property string description: community.description @@ -130,7 +130,7 @@ ModalPopup { } Item { - property int nbRequests: chatsModel.activeCommunity.communityMembershipRequests.nbRequests + property int nbRequests: chatsModel.communities.activeCommunity.communityMembershipRequests.nbRequests id: memberBlock anchors.top: parent.top @@ -268,7 +268,7 @@ ModalPopup { //% "Export community" label: qsTrId("export-community") iconName: "../fetch" - onClicked: exportResult = chatsModel.exportComumnity() + onClicked: exportResult = chatsModel.communities.exportComumnity() } } diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/CreateChannelPopup.qml b/ui/app/AppLayouts/Chat/CommunityComponents/CreateChannelPopup.qml index 8f2103caf9..dd84a5abd4 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/CreateChannelPopup.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/CreateChannelPopup.qml @@ -137,7 +137,7 @@ ModalPopup { scrollView.scrollBackUp() return } - const error = chatsModel.createCommunityChannel(communityId, + const error = chatsModel.communities.createCommunityChannel(communityId, Utils.filterXSS(nameInput.text), Utils.filterXSS(descriptionTextArea.text)) diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/CreateCommunityPopup.qml b/ui/app/AppLayouts/Chat/CommunityComponents/CreateCommunityPopup.qml index 78e8f78328..9944841afc 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/CreateCommunityPopup.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/CreateCommunityPopup.qml @@ -19,7 +19,7 @@ ModalPopup { bY: 1 }) - property QtObject community: chatsModel.activeCommunity + property QtObject community: chatsModel.communities.activeCommunity property bool isEdit: false @@ -357,7 +357,7 @@ ModalPopup { if(isEdit) { console.log("TODO: implement this (not available in status-go yet)"); } else { - error = chatsModel.createCommunity(Utils.filterXSS(nameInput.text), + error = chatsModel.communities.createCommunity(Utils.filterXSS(nameInput.text), Utils.filterXSS(descriptionTextArea.text), membershipRequirementSettingPopup.checkedMembership, ensOnlySwitch.switchChecked, diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/ImportCommunityPopup.qml b/ui/app/AppLayouts/Chat/CommunityComponents/ImportCommunityPopup.qml index 9cd400f81f..a0a9b8cde0 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/ImportCommunityPopup.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/ImportCommunityPopup.qml @@ -55,7 +55,7 @@ ModalPopup { communityKey = "0x" + communityKey } - const error = chatsModel.importCommunity(communityKey) + const error = chatsModel.communities.importCommunity(communityKey) if (error) { creatingError.text = error diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/MembershipRequestsButton.qml b/ui/app/AppLayouts/Chat/CommunityComponents/MembershipRequestsButton.qml index d96c51cb7e..d5d7b71982 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/MembershipRequestsButton.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/MembershipRequestsButton.qml @@ -8,7 +8,7 @@ import "../components" import "./" Rectangle { - property int nbRequests: chatsModel.activeCommunity.communityMembershipRequests.nbRequests + property int nbRequests: chatsModel.communities.activeCommunity.communityMembershipRequests.nbRequests id: membershipRequestsBtn visible: nbRequests > 0 diff --git a/ui/app/AppLayouts/Chat/CommunityComponents/MembershipRequestsPopup.qml b/ui/app/AppLayouts/Chat/CommunityComponents/MembershipRequestsPopup.qml index 72ac9fb13a..eb4e2ac728 100644 --- a/ui/app/AppLayouts/Chat/CommunityComponents/MembershipRequestsPopup.qml +++ b/ui/app/AppLayouts/Chat/CommunityComponents/MembershipRequestsPopup.qml @@ -64,7 +64,7 @@ ModalPopup { ListView { id: membershipRequestList - model: chatsModel.activeCommunity.communityMembershipRequests + model: chatsModel.communities.activeCommunity.communityMembershipRequests anchors.top: errorText.bottom anchors.topMargin: Style.current.smallPadding anchors.left: parent.left @@ -120,7 +120,7 @@ ModalPopup { cursorShape: Qt.PointingHandCursor onClicked: { errorText.text = "" - const error = chatsModel.acceptRequestToJoinCommunity(id) + const error = chatsModel.communities.acceptRequestToJoinCommunity(id) if (error) { errorText.text = error } @@ -142,7 +142,7 @@ ModalPopup { cursorShape: Qt.PointingHandCursor onClicked: { errorText.text = "" - const error = chatsModel.declineRequestToJoinCommunity(id) + const error = chatsModel.communities.declineRequestToJoinCommunity(id) if (error) { errorText.text = error }