fix(@desktop/communities): community import has some issues
Fixes #4206
This commit is contained in:
parent
0b3cafdbc4
commit
aeed9303cd
|
@ -34,7 +34,14 @@ method delete*(self: Controller) =
|
|||
method init*(self: Controller) =
|
||||
self.events.on(SIGNAL_COMMUNITY_CREATED) do(e:Args):
|
||||
let args = CommunityArgs(e)
|
||||
self.delegate.addCommunity(args.community)
|
||||
self.delegate.communityAdded(args.community)
|
||||
|
||||
self.events.on(SIGNAL_COMMUNITY_IMPORTED) do(e:Args):
|
||||
let args = CommunityArgs(e)
|
||||
if(args.error.len > 0):
|
||||
self.delegate.onImportCommunityErrorOccured(args.error)
|
||||
else:
|
||||
self.delegate.communityImported(args.community)
|
||||
|
||||
self.events.on(SIGNAL_COMMUNITIES_UPDATE) do(e:Args):
|
||||
let args = CommunitiesArgs(e)
|
||||
|
|
|
@ -12,6 +12,12 @@ import ../../../../app_service/service/contacts/service as contacts_service
|
|||
|
||||
export io_interface
|
||||
|
||||
type
|
||||
ImportCommunityState {.pure.} = enum
|
||||
Imported = 0
|
||||
ImportingInProgress
|
||||
ImportingError
|
||||
|
||||
type
|
||||
Module* = ref object of io_interface.AccessInterface
|
||||
delegate: delegate_interface.AccessInterface
|
||||
|
@ -91,7 +97,7 @@ method setAllCommunities*(self: Module, communities: seq[CommunityDto]) =
|
|||
for community in communities:
|
||||
self.view.addItem(self.getCommunityItem(community))
|
||||
|
||||
method addCommunity*(self: Module, community: CommunityDto) =
|
||||
method communityAdded*(self: Module, community: CommunityDto) =
|
||||
self.view.addItem(self.getCommunityItem(community))
|
||||
|
||||
method joinCommunity*(self: Module, communityId: string): string =
|
||||
|
@ -160,5 +166,13 @@ method requestCommunityInfo*(self: Module, communityId: string) =
|
|||
method deleteCommunityChat*(self: Module, communityId: string, channelId: string) =
|
||||
self.controller.deleteCommunityChat(communityId, channelId)
|
||||
|
||||
method communityImported*(self: Module, community: CommunityDto) =
|
||||
self.view.addItem(self.getCommunityItem(community))
|
||||
self.view.emitImportingCommunityStateChangedSignal(ImportCommunityState.Imported.int, "")
|
||||
|
||||
method importCommunity*(self: Module, communityKey: string) =
|
||||
self.view.emitImportingCommunityStateChangedSignal(ImportCommunityState.ImportingInProgress.int, "")
|
||||
self.controller.importCommunity(communityKey)
|
||||
|
||||
method onImportCommunityErrorOccured*(self: Module, error: string) =
|
||||
self.view.emitImportingCommunityStateChangedSignal(ImportCommunityState.ImportingError.int, error)
|
|
@ -16,9 +16,6 @@ method setAllCommunities*(self: AccessInterface, communities: seq[CommunityDto])
|
|||
method getCommunityItem*(self: AccessInterface, community: CommunityDto): SectionItem {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
||||
|
||||
method addCommunity*(self: AccessInterface, community: CommunityDto) {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
||||
|
||||
method joinCommunity*(self: AccessInterface, communityId: string): string {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
||||
|
||||
|
|
|
@ -22,3 +22,12 @@ method communityCategoryDeleted*(self: AccessInterface) {.base.} =
|
|||
|
||||
method communityEdited*(self: AccessInterface, community: CommunityDto) {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
||||
|
||||
method communityAdded*(self: AccessInterface, community: CommunityDto) {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
||||
|
||||
method communityImported*(self: AccessInterface, community: CommunityDto) {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
||||
|
||||
method onImportCommunityErrorOccured*(self: AccessInterface, error: string) {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
|
@ -96,3 +96,7 @@ QtObject:
|
|||
|
||||
proc importCommunity*(self: View, communityKey: string) {.slot.} =
|
||||
self.delegate.importCommunity(communityKey)
|
||||
|
||||
proc importingCommunityStateChanged*(self:View, state: int, errorMsg: string) {.signal.}
|
||||
proc emitImportingCommunityStateChangedSignal*(self: View, state: int, errorMsg: string) =
|
||||
self.importingCommunityStateChanged(state, errorMsg)
|
|
@ -120,6 +120,22 @@ method init*(self: Controller) =
|
|||
self.mailserversService
|
||||
)
|
||||
|
||||
self.events.on(SIGNAL_COMMUNITY_IMPORTED) do(e:Args):
|
||||
let args = CommunityArgs(e)
|
||||
if(args.error.len > 0):
|
||||
return
|
||||
self.delegate.communityJoined(
|
||||
args.community,
|
||||
self.events,
|
||||
self.settingsService,
|
||||
self.contactsService,
|
||||
self.chatService,
|
||||
self.communityService,
|
||||
self.messageService,
|
||||
self.gifService,
|
||||
self.mailserversService
|
||||
)
|
||||
|
||||
self.events.on(SIGNAL_COMMUNITY_LEFT) do(e:Args):
|
||||
let args = CommunityIdArgs(e)
|
||||
self.delegate.communityLeft(args.communityId)
|
||||
|
|
|
@ -14,9 +14,12 @@ export community_dto
|
|||
logScope:
|
||||
topics = "community-service"
|
||||
|
||||
include ../../common/json_utils
|
||||
|
||||
type
|
||||
CommunityArgs* = ref object of Args
|
||||
community*: CommunityDto
|
||||
error*: string
|
||||
|
||||
CommunitiesArgs* = ref object of Args
|
||||
communities*: seq[CommunityDto]
|
||||
|
@ -54,6 +57,7 @@ const SIGNAL_COMMUNITY_JOINED* = "communityJoined"
|
|||
const SIGNAL_COMMUNITY_MY_REQUEST_ADDED* = "communityMyRequestAdded"
|
||||
const SIGNAL_COMMUNITY_LEFT* = "communityLeft"
|
||||
const SIGNAL_COMMUNITY_CREATED* = "communityCreated"
|
||||
const SIGNAL_COMMUNITY_IMPORTED* = "communityImported"
|
||||
const SIGNAL_COMMUNITY_EDITED* = "communityEdited"
|
||||
const SIGNAL_COMMUNITIES_UPDATE* = "communityUpdated"
|
||||
const SIGNAL_COMMUNITY_CHANNEL_CREATED* = "communityChannelCreated"
|
||||
|
@ -635,11 +639,48 @@ QtObject:
|
|||
proc importCommunity*(self: Service, communityKey: string) =
|
||||
try:
|
||||
let response = status_go.importCommunity(communityKey)
|
||||
## after `importCommunity` call everything should be handled in a slot cnnected to `SignalType.CommunityFound.event`
|
||||
## but because of insufficient data (chats details are missing) sent as a payload of that signal we're unable to do
|
||||
## that until `status-go` part gets improved in ragards of that.
|
||||
|
||||
if (response.error != nil):
|
||||
let error = Json.decode($response.error, RpcError)
|
||||
raise newException(RpcException, fmt"Error importing the community: {error.message}")
|
||||
raise newException(RpcException, fmt"community id `{communityKey}` err: {error.message}")
|
||||
|
||||
if response.result == nil or response.result.kind != JObject:
|
||||
raise newException(RpcException, fmt"response is empty or not an json object, community id `{communityKey}`")
|
||||
|
||||
var communityJArr: JsonNode
|
||||
if(not response.result.getProp("communities", communityJArr)):
|
||||
raise newException(RpcException, fmt"there is no `communities` key in the response for community id: {communityKey}")
|
||||
|
||||
if(communityJArr.len == 0):
|
||||
raise newException(RpcException, fmt"`communities` array is empty in the response for community id: {communityKey}")
|
||||
|
||||
var chatsJArr: JsonNode
|
||||
if(not response.result.getProp("chats", chatsJArr)):
|
||||
raise newException(RpcException, fmt"there is no `chats` key in the response for community id: {communityKey}")
|
||||
|
||||
let communityDto = communityJArr[0].toCommunityDto()
|
||||
self.joinedCommunities[communityDto.id] = communityDto
|
||||
|
||||
for chatObj in chatsJArr:
|
||||
let chatDto = chatObj.toChatDto()
|
||||
self.chatService.updateOrAddChat(chatDto) # we have to update chats stored in the chat service.
|
||||
|
||||
for chat in communityDto.chats:
|
||||
let fullChatId = communityDto.id & chat.id
|
||||
var chatDetails = self.chatService.getChatById(fullChatId)
|
||||
chatDetails.updateMissingFields(chat)
|
||||
self.chatService.updateOrAddChat(chatDetails) # we have to update chats stored in the chat service.
|
||||
|
||||
self.events.emit(SIGNAL_COMMUNITY_IMPORTED, CommunityArgs(community: communityDto))
|
||||
|
||||
except Exception as e:
|
||||
error "Error requesting community info", msg = e.msg
|
||||
error "Error importing the community: ", msg = e.msg
|
||||
# We should apply some notification mechanism on the application level which will deal with errors and
|
||||
# notify user about them. Till then we're using this way.
|
||||
self.events.emit(SIGNAL_COMMUNITY_IMPORTED, CommunityArgs(error: e.msg))
|
||||
|
||||
proc exportCommunity*(self: Service, communityId: string): string =
|
||||
try:
|
||||
|
|
|
@ -160,14 +160,19 @@ QtObject:
|
|||
)
|
||||
self.events.emit(SIGNAL_NEW_MESSAGE_RECEIVED, data)
|
||||
|
||||
proc getNumOfPinnedMessages*(self: Service, chatId: string): int =
|
||||
if(self.numOfPinnedMessagesPerChat.hasKey(chatId)):
|
||||
return self.numOfPinnedMessagesPerChat[chatId]
|
||||
return 0
|
||||
|
||||
proc handlePinnedMessagesUpdate(self: Service, pinnedMessages: seq[PinnedMessageUpdateDto]) =
|
||||
for pm in pinnedMessages:
|
||||
let data = MessagePinUnpinArgs(chatId: pm.chatId, messageId: pm.messageId, actionInitiatedBy: pm.pinnedBy)
|
||||
if(pm.pinned):
|
||||
self.numOfPinnedMessagesPerChat[pm.chatId] = self.numOfPinnedMessagesPerChat[pm.chatId] + 1
|
||||
self.numOfPinnedMessagesPerChat[pm.chatId] = self.getNumOfPinnedMessages(pm.chatId) + 1
|
||||
self.events.emit(SIGNAL_MESSAGE_PINNED, data)
|
||||
else:
|
||||
self.numOfPinnedMessagesPerChat[pm.chatId] = self.numOfPinnedMessagesPerChat[pm.chatId] - 1
|
||||
self.numOfPinnedMessagesPerChat[pm.chatId] = self.getNumOfPinnedMessages(pm.chatId) - 1
|
||||
self.events.emit(SIGNAL_MESSAGE_UNPINNED, data)
|
||||
|
||||
proc handleDeletedMessagesUpdate(self: Service, deletedMessages: seq[RemovedMessageDto]) =
|
||||
|
@ -370,11 +375,11 @@ QtObject:
|
|||
var pinned = false
|
||||
if(pinMessageObj.getProp("pinned", pinned)):
|
||||
if(pinned and pin):
|
||||
self.numOfPinnedMessagesPerChat[chatId] = self.numOfPinnedMessagesPerChat[chatId] + 1
|
||||
self.numOfPinnedMessagesPerChat[chatId] = self.getNumOfPinnedMessages(chatId) + 1
|
||||
self.events.emit(SIGNAL_MESSAGE_PINNED, data)
|
||||
else:
|
||||
if(not pinned and not pin):
|
||||
self.numOfPinnedMessagesPerChat[chatId] = self.numOfPinnedMessagesPerChat[chatId] - 1
|
||||
self.numOfPinnedMessagesPerChat[chatId] = self.getNumOfPinnedMessages(chatId) - 1
|
||||
self.events.emit(SIGNAL_MESSAGE_UNPINNED, data)
|
||||
|
||||
except Exception as e:
|
||||
|
@ -538,9 +543,6 @@ QtObject:
|
|||
|
||||
self.threadpool.start(arg)
|
||||
|
||||
proc getNumOfPinnedMessages*(self: Service, chatId: string): int =
|
||||
return self.numOfPinnedMessagesPerChat[chatId]
|
||||
|
||||
proc onAsyncGetLinkPreviewData*(self: Service, response: string) {.slot.} =
|
||||
self.events.emit(SIGNAL_MESSAGE_LINK_PREVIEW_DATA_LOADED, LinkPreviewDataArgs(response: response))
|
||||
|
||||
|
|
|
@ -17,19 +17,9 @@ StatusModal {
|
|||
height: 400
|
||||
|
||||
property var store
|
||||
property string error: ""
|
||||
property string keyValidationError: ""
|
||||
property string communityKey: ""
|
||||
|
||||
function validate() {
|
||||
keyValidationError = "";
|
||||
|
||||
if (keyInput.text.trim() === "") {
|
||||
//% "You need to enter a key"
|
||||
keyValidationError = qsTrId("you-need-to-enter-a-key");
|
||||
}
|
||||
|
||||
return !keyValidationError;
|
||||
function validate(communityKey) {
|
||||
return communityKey.trim() !== ""
|
||||
}
|
||||
|
||||
//% "Access existing community"
|
||||
|
@ -55,6 +45,10 @@ StatusModal {
|
|||
customHeight: 110
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
onTextChanged: {
|
||||
importButton.enabled = root.validate(keyInput.text)
|
||||
}
|
||||
}
|
||||
|
||||
StatusBaseText {
|
||||
|
@ -72,35 +66,19 @@ StatusModal {
|
|||
|
||||
rightButtons: [
|
||||
StatusQControls.StatusButton {
|
||||
id: importButton
|
||||
enabled: false
|
||||
//% "Import"
|
||||
text: qsTrId("import")
|
||||
onClicked: {
|
||||
if (!validate()) {
|
||||
return;
|
||||
}
|
||||
|
||||
communityKey = keyInput.text.trim();
|
||||
let communityKey = keyInput.text.trim();
|
||||
if (!communityKey.startsWith("0x")) {
|
||||
communityKey = "0x" + communityKey;
|
||||
}
|
||||
|
||||
|
||||
root.error = root.store.chatsModelInst.communities.importCommunity(communityKey, Utils.uuid())
|
||||
if (!!root.error) {
|
||||
creatingError.text = error;
|
||||
return creatingError.open();
|
||||
}
|
||||
|
||||
root.store.importCommunity(communityKey);
|
||||
root.close();
|
||||
}
|
||||
|
||||
MessageDialog {
|
||||
id: creatingError
|
||||
//% "Error importing the community"
|
||||
title: qsTrId("error-importing-the-community")
|
||||
icon: StandardIcon.Critical
|
||||
standardButtons: StandardButton.Ok
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -146,6 +146,10 @@ QtObject {
|
|||
communitiesModuleInst.createCommunity(communityName, communityDescription, checkedMembership, ensOnlySwitchChecked, communityColor, communityImage, imageCropperModalaX, imageCropperModalaY, imageCropperModalbX, imageCropperModalbY);
|
||||
}
|
||||
|
||||
function importCommunity(communityKey) {
|
||||
root.communitiesModuleInst.importCommunity(communityKey);
|
||||
}
|
||||
|
||||
function createCommunityCategory(categoryName, channels) {
|
||||
chatCommunitySectionModule.createCommunityCategory(categoryName, channels)
|
||||
}
|
||||
|
|
|
@ -391,8 +391,7 @@ Item {
|
|||
id: importCommunitiesPopupComponent
|
||||
AccessExistingCommunityPopup {
|
||||
anchors.centerIn: parent
|
||||
// Not Refactored Yet
|
||||
// error: root.store.chatsModelInst.communities.importCommunity(communityKey, Utils.uuid())
|
||||
store: root.store
|
||||
onClosed: {
|
||||
destroy()
|
||||
}
|
||||
|
@ -420,52 +419,46 @@ Item {
|
|||
}
|
||||
}
|
||||
|
||||
// Not Refactored Yet
|
||||
// Connections {
|
||||
// target: root.store.chatsModelInst.communities
|
||||
// onImportingCommunityStateChanged: {
|
||||
// if (state !== Constants.communityImported &&
|
||||
// state !== Constants.communityImportingInProgress &&
|
||||
// state !== Constants.communityImportingError)
|
||||
// {
|
||||
// return
|
||||
// }
|
||||
Connections {
|
||||
target: root.store.communitiesModuleInst
|
||||
onImportingCommunityStateChanged: {
|
||||
if (state !== Constants.communityImported &&
|
||||
state !== Constants.communityImportingInProgress &&
|
||||
state !== Constants.communityImportingError)
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
// if (state === Constants.communityImported)
|
||||
// {
|
||||
// if (Global.toastMessage.uuid !== communityImportingProcessId)
|
||||
// return
|
||||
Global.toastMessage.close()
|
||||
|
||||
// Global.toastMessage.close()
|
||||
if (state === Constants.communityImported)
|
||||
{
|
||||
//% "Community imported"
|
||||
Global.toastMessage.title = qsTrId("community-imported")
|
||||
Global.toastMessage.source = ""
|
||||
Global.toastMessage.iconRotates = false
|
||||
Global.toastMessage.dissapearInMs = 4000
|
||||
}
|
||||
else if (state === Constants.communityImportingInProgress)
|
||||
{
|
||||
//% "Importing community is in progress"
|
||||
Global.toastMessage.title = qsTrId("importing-community-is-in-progress")
|
||||
Global.toastMessage.source = Style.svg("loading")
|
||||
Global.toastMessage.iconRotates = true
|
||||
Global.toastMessage.dissapearInMs = -1
|
||||
}
|
||||
else if (state === Constants.communityImportingError)
|
||||
{
|
||||
Global.toastMessage.title = errorMsg
|
||||
Global.toastMessage.source = ""
|
||||
Global.toastMessage.iconRotates = false
|
||||
Global.toastMessage.dissapearInMs = 4000
|
||||
}
|
||||
|
||||
// //% "Community imported"
|
||||
// Global.toastMessage.title = qsTrId("community-imported")
|
||||
// Global.toastMessage.source = ""
|
||||
// Global.toastMessage.iconRotates = false
|
||||
// Global.toastMessage.dissapearInMs = 4000
|
||||
// }
|
||||
// else if (state === Constants.communityImportingInProgress)
|
||||
// {
|
||||
// Global.toastMessage.uuid = communityImportingProcessId
|
||||
// //% "Importing community is in progress"
|
||||
// Global.toastMessage.title = qsTrId("importing-community-is-in-progress")
|
||||
// Global.toastMessage.source = Style.svg("loading")
|
||||
// Global.toastMessage.iconRotates = true
|
||||
// Global.toastMessage.dissapearInMs = -1
|
||||
// }
|
||||
// else if (state === Constants.communityImportingError)
|
||||
// {
|
||||
// if (Global.toastMessage.uuid !== communityImportingProcessId)
|
||||
// return
|
||||
|
||||
// Global.toastMessage.close()
|
||||
// return
|
||||
// }
|
||||
|
||||
// Global.toastMessage.displayCloseButton = false
|
||||
// Global.toastMessage.displayLink = false
|
||||
// Global.toastMessage.iconColor = Style.current.primary
|
||||
// Global.toastMessage.open()
|
||||
// }
|
||||
// }
|
||||
Global.toastMessage.displayCloseButton = false
|
||||
Global.toastMessage.displayLink = false
|
||||
Global.toastMessage.iconColor = Style.current.primary
|
||||
Global.toastMessage.open()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue