fix(@desktop/chats): restore last opened chat during app launch

This commit is contained in:
mprakhov 2022-12-30 12:01:38 +02:00 committed by Mykhailo Prakhov
parent f6660654f7
commit a7a69e1320
5 changed files with 56 additions and 8 deletions

View File

@ -53,6 +53,8 @@ const LSS_KEY_DOWNLOAD_CHANNEL_MESSAGES_ENABLED* = "downloadChannelMessagesEnabl
const DEFAULT_DOWNLOAD_CHANNEL_MESSAGES_ENABLED = false
const LSS_KEY_ACTIVE_SECTION* = "activeSection"
const DEFAULT_ACTIVE_SECTION = ""
const LAST_SECTION_CHAT = "LastSectionChat"
const DEFAULT_ACTIVE_CHAT = ""
const LSS_KEY_SHOW_BROWSER_SELECTOR* = "showBrowserSelector"
const DEFAULT_SHOW_BROWSER_SELECTOR = true
const LSS_KEY_OPEN_LINKS_IN_STATUS* = "openLinksInStatus"
@ -149,6 +151,16 @@ QtObject:
when T is bool:
result = getSettingsPropBool(self, prop, default)
template getSettingsGroupProp[T](self: LocalAccountSensitiveSettings, group: string, prop: string, default: QVariant): untyped =
# This doesn't work in case of QVariant, such properties will be handled in a common way.
if(self.settings.isNil):
return
self.settings.beginGroup(group);
getSettingsProp[T](self, prop, default)
self.settings.endGroup();
template setSettingsProp(self: LocalAccountSensitiveSettings, prop: string, value: QVariant, signal: untyped) =
if(self.settings.isNil):
return
@ -156,6 +168,30 @@ QtObject:
self.settings.setValue(prop, value)
signal
template setSettingsGroupProp(self: LocalAccountSensitiveSettings, group: string, key: string, value: QVariant) =
if(self.settings.isNil):
return
self.settings.beginGroup(group)
self.settings.setValue(key, value)
self.settings.endGroup()
proc removeSettingsGroupKey(self: LocalAccountSensitiveSettings, group: string, key: string) =
if(self.settings.isNil):
return
self.settings.beginGroup(group)
self.settings.remove(key)
self.settings.endGroup()
proc getSectionLastOpenChat*(self: LocalAccountSensitiveSettings, sectionId: string): string =
getSettingsGroupProp[string](self, LAST_SECTION_CHAT, sectionId, newQVariant(DEFAULT_ACTIVE_CHAT))
proc setSectionLastOpenChat*(self: LocalAccountSensitiveSettings, sectionId: string, value: string) =
self.setSettingsGroupProp(LAST_SECTION_CHAT, sectionId, newQVariant(value))
proc removeSectionChatRecord*(self: LocalAccountSensitiveSettings, sectionId: string) =
self.removeSettingsGroupKey(LAST_SECTION_CHAT, sectionId)
proc chatSplitViewChanged*(self: LocalAccountSensitiveSettings) {.signal.}
proc getChatSplitView*(self: LocalAccountSensitiveSettings): QVariant {.slot.} =
@ -498,7 +534,6 @@ QtObject:
write = setActiveSection
notify = activeSectionChanged
proc showBrowserSelectorChanged*(self: LocalAccountSensitiveSettings) {.signal.}
proc getShowBrowserSelector*(self: LocalAccountSensitiveSettings): bool {.slot.} =
# getSettingsProp[bool](self, LSS_KEY_SHOW_BROWSER_SELECTOR, newQVariant(DEFAULT_SHOW_BROWSER_SELECTOR)) # https://github.com/status-im/status-desktop/issues/8568

View File

@ -129,6 +129,7 @@ proc buildChatSectionUI(
mailserversService: mailservers_service.Service) =
var selectedItemId = ""
var selectedSubItemId = ""
let sectionLastOpenChat = singletonInstance.localAccountSensitiveSettings.getSectionLastOpenChat(self.controller.getMySectionId())
# handle channels which don't belong to any category
for chatDto in channelGroup.chats:
@ -173,8 +174,9 @@ proc buildChatSectionUI(
self.addSubmodule(chatDto.id, belongToCommunity, isUsersListAvailable, events, settingsService, nodeConfigurationService,
contactService, chatService, communityService, messageService, gifService, mailserversService)
# make the first channel which doesn't belong to any category active when load the app
if(selectedItemId.len == 0):
# restore on a startup last open channel for the section or
# make the first channel which doesn't belong to any category active
if selectedItemId.len == 0 or chatDto.id == sectionLastOpenChat:
selectedItemId = channelItem.id
# handle categories and channels for each category
@ -203,9 +205,10 @@ proc buildChatSectionUI(
settingsService, nodeConfigurationService, contactService, chatService, communityService, messageService, gifService,
mailserversService)
# restore on a startup last open channel in the category for the section or
# in case there is no channels beyond categories,
# make the first channel of the first category active when load the app
if(selectedItemId.len == 0):
# make the first channel of the first category active
if selectedItemId.len == 0 or channelItem.id == sectionLastOpenChat:
selectedItemId = cat.id
selectedSubItemId = channelItem.id
@ -331,10 +334,13 @@ method makeChatWithIdActive*(self: Module, chatId: string) =
# here, in this step we have appropriate item and subitem assigned
self.setActiveItemSubItem(item.BaseItem.id, subItemId)
singletonInstance.localAccountSensitiveSettings.setSectionLastOpenChat(self.controller.getMySectionId(), chatId)
method activeItemSubItemSet*(self: Module, itemId: string, subItemId: string) =
let mySectionId = self.controller.getMySectionId()
if (itemId == "" and subItemId == ""):
self.view.activeItem().resetActiveItemData()
singletonInstance.localAccountSensitiveSettings.removeSectionChatRecord(mySectionId)
return
let item = self.view.chatsModel().getItemById(itemId)
@ -358,8 +364,13 @@ method activeItemSubItemSet*(self: Module, itemId: string, subItemId: string) =
else:
chatContentModule.onMadeInactive()
let activeChatId = self.controller.getActiveChatId()
# save last open chat in settings for restore on the next app launch
singletonInstance.localAccountSensitiveSettings.setSectionLastOpenChat(mySectionId, activeChatId)
# notify parent module about active chat/channel
self.delegate.onActiveChatChange(self.controller.getMySectionId(), self.controller.getActiveChatId())
self.delegate.onActiveChatChange(mySectionId, activeChatId)
method getModuleAsVariant*(self: Module): QVariant =
return self.viewVariant

View File

@ -749,6 +749,8 @@ method communityLeft*[T](self: Module[T], communityId: string) =
self.view.model().removeItem(communityId)
singletonInstance.localAccountSensitiveSettings.removeSectionChatRecord(communityId)
if (self.controller.getActiveSectionId() == communityId):
let item = self.view.model().getItemById(singletonInstance.userProfile.getPubKey())
self.setActiveSection(item)

2
vendor/DOtherSide vendored

@ -1 +1 @@
Subproject commit 75b70971caf863629b4af83be254c04a84ef8c1e
Subproject commit d1926ff252c7645b04cfff014d6a6c80313d8628

2
vendor/nimqml vendored

@ -1 +1 @@
Subproject commit c428cf43976be8e647e8cf6412e783b06765b5ee
Subproject commit 743674eff154c49386254d8fbb1fc756fffee09c