feat(settings/profile): add bio and social links functionality to profile module
iterates: #6797
This commit is contained in:
parent
cbfe8cb19e
commit
6804e2aa91
|
@ -83,7 +83,7 @@ proc newModule*(delegate: delegate_interface.AccessInterface,
|
|||
result.controller = controller.newController(result)
|
||||
result.moduleLoaded = false
|
||||
|
||||
result.profileModule = profile_module.newModule(result, profileService)
|
||||
result.profileModule = profile_module.newModule(result, profileService, settingsService)
|
||||
result.contactsModule = contacts_module.newModule(result, events, contactsService, chatService)
|
||||
result.languageModule = language_module.newModule(result, events, languageService)
|
||||
result.privacyModule = privacy_module.newModule(result, events, settingsService, privacyService, generalService)
|
||||
|
|
|
@ -1,17 +1,21 @@
|
|||
import io_interface
|
||||
|
||||
import ../../../../../app_service/service/profile/service as profile_service
|
||||
import ../../../../../app_service/service/settings/service as settings_service
|
||||
import ../../../../../app_service/common/social_links
|
||||
|
||||
type
|
||||
Controller* = ref object of RootObj
|
||||
delegate: io_interface.AccessInterface
|
||||
profileService: profile_service.Service
|
||||
settingsService: settings_service.Service
|
||||
|
||||
proc newController*(delegate: io_interface.AccessInterface,
|
||||
profileService: profile_service.Service): Controller =
|
||||
profileService: profile_service.Service, settingsService: settings_service.Service): Controller =
|
||||
result = Controller()
|
||||
result.delegate = delegate
|
||||
result.profileService = profileService
|
||||
result.settingsService = settingsService
|
||||
|
||||
proc delete*(self: Controller) =
|
||||
discard
|
||||
|
@ -27,3 +31,15 @@ proc deleteIdentityImage*(self: Controller, address: string) =
|
|||
|
||||
proc setDisplayName*(self: Controller, displayName: string) =
|
||||
self.profileService.setDisplayName(displayName)
|
||||
|
||||
proc getSocialLinks*(self: Controller): SocialLinks =
|
||||
self.settingsService.getSocialLinks()
|
||||
|
||||
proc setSocialLinks*(self: Controller, links: SocialLinks): bool =
|
||||
self.settingsService.setSocialLinks(links)
|
||||
|
||||
proc getBio*(self: Controller): string =
|
||||
self.settingsService.getBio()
|
||||
|
||||
proc setBio*(self: Controller, bio: string): bool =
|
||||
self.settingsService.setBio(bio)
|
||||
|
|
|
@ -22,9 +22,18 @@ method storeIdentityImage*(self: AccessInterface, imageUrl: string, aX: int, aY:
|
|||
method deleteIdentityImage*(self: AccessInterface) {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
||||
|
||||
method getBio*(self: AccessInterface): string {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
||||
|
||||
method setBio*(self: AccessInterface, bio: string): bool {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
||||
|
||||
method setDisplayName*(self: AccessInterface, displayName: string) {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
||||
|
||||
method saveSocialLinks*(self: AccessInterface): bool {.base.} =
|
||||
raise newException(ValueError, "No implementation available")
|
||||
|
||||
# View Delegate Interface
|
||||
# Delegate for the view must be declared here due to use of QtObject and multi
|
||||
# inheritance, which is not well supported in Nim.
|
||||
|
|
|
@ -1,10 +1,15 @@
|
|||
import NimQml, chronicles
|
||||
import NimQml, chronicles, sequtils, sugar
|
||||
|
||||
import ./io_interface, ./view, ./controller
|
||||
import ../io_interface as delegate_interface
|
||||
import ../../../../global/global_singleton
|
||||
|
||||
import ../../../../../app_service/service/profile/service as profile_service
|
||||
import ../../../../../app_service/service/settings/service as settings_service
|
||||
import ../../../../../app_service/common/social_links
|
||||
|
||||
import ../../../shared_models/social_links_model
|
||||
import ../../../shared_models/social_link_item
|
||||
|
||||
export io_interface
|
||||
|
||||
|
@ -20,12 +25,12 @@ type
|
|||
moduleLoaded: bool
|
||||
|
||||
proc newModule*(delegate: delegate_interface.AccessInterface,
|
||||
profileService: profile_service.Service): Module =
|
||||
profileService: profile_service.Service, settingsService: settings_service.Service): Module =
|
||||
result = Module()
|
||||
result.delegate = delegate
|
||||
result.view = view.newView(result)
|
||||
result.viewVariant = newQVariant(result.view)
|
||||
result.controller = controller.newController(result, profileService)
|
||||
result.controller = controller.newController(result, profileService, settingsService)
|
||||
result.moduleLoaded = false
|
||||
|
||||
method delete*(self: Module) =
|
||||
|
@ -43,7 +48,21 @@ method isLoaded*(self: Module): bool =
|
|||
method getModuleAsVariant*(self: Module): QVariant =
|
||||
return self.viewVariant
|
||||
|
||||
func hasCustomLink(socialLinks: seq[SocialLinkItem]): bool =
|
||||
for socialLinkItem in socialLinks:
|
||||
if socialLinkItem.linkType() == LinkType.Custom:
|
||||
return true
|
||||
|
||||
method viewDidLoad*(self: Module) =
|
||||
var socialLinkItems = toSocialLinkItems(self.controller.getSocialLinks())
|
||||
|
||||
# Add custom link placeholder
|
||||
if not socialLinkItems.hasCustomLink:
|
||||
socialLinkItems.add(initSocialLinkItem("", "", LinkType.Custom))
|
||||
|
||||
self.view.socialLinksModel().setItems(socialLinkItems)
|
||||
self.view.temporarySocialLinksModel().setItems(socialLinkItems)
|
||||
|
||||
self.moduleLoaded = true
|
||||
self.delegate.profileModuleDidLoad()
|
||||
|
||||
|
@ -58,3 +77,13 @@ method deleteIdentityImage*(self: Module) =
|
|||
|
||||
method setDisplayName*(self: Module, displayName: string) =
|
||||
self.controller.setDisplayName(displayName)
|
||||
|
||||
method getBio(self: Module): string =
|
||||
self.controller.getBio()
|
||||
|
||||
method setBio(self: Module, bio: string): bool =
|
||||
self.controller.setBio(bio)
|
||||
|
||||
method saveSocialLinks*(self: Module): bool =
|
||||
let socialLinks = map(self.view.temporarySocialLinksModel.items(), x => SocialLink(text: x.text, url: x.url))
|
||||
return self.controller.setSocialLinks(socialLinks)
|
||||
|
|
|
@ -1,19 +1,33 @@
|
|||
import NimQml
|
||||
import NimQml, json
|
||||
|
||||
import ./io_interface
|
||||
import io_interface
|
||||
import ../../../shared_models/social_links_model
|
||||
import ../../../shared_models/social_link_item
|
||||
|
||||
QtObject:
|
||||
type
|
||||
View* = ref object of QObject
|
||||
delegate: io_interface.AccessInterface
|
||||
socialLinksModel: SocialLinksModel
|
||||
socialLinksModelVariant: QVariant
|
||||
temporarySocialLinksModel: SocialLinksModel # used for editing purposes
|
||||
temporarySocialLinksModelVariant: QVariant
|
||||
|
||||
proc delete*(self: View) =
|
||||
self.QObject.delete
|
||||
self.socialLinksModel.delete
|
||||
self.socialLinksModelVariant.delete
|
||||
self.temporarySocialLinksModel.delete
|
||||
self.temporarySocialLinksModelVariant.delete
|
||||
|
||||
proc newView*(delegate: io_interface.AccessInterface): View =
|
||||
new(result, delete)
|
||||
result.QObject.setup
|
||||
result.delegate = delegate
|
||||
result.socialLinksModel = newSocialLinksModel()
|
||||
result.socialLinksModelVariant = newQVariant(result.socialLinksModel)
|
||||
result.temporarySocialLinksModel = newSocialLinksModel()
|
||||
result.temporarySocialLinksModelVariant = newQVariant(result.temporarySocialLinksModel)
|
||||
|
||||
proc load*(self: View) =
|
||||
self.delegate.viewDidLoad()
|
||||
|
@ -32,3 +46,75 @@ QtObject:
|
|||
|
||||
proc setDisplayName(self: View, displayName: string) {.slot.} =
|
||||
self.delegate.setDisplayName(displayName)
|
||||
|
||||
proc socialLinksModel*(self: View): SocialLinksModel =
|
||||
return self.socialLinksModel
|
||||
|
||||
proc getSocialLinksModel(self: View): QVariant {.slot.} =
|
||||
return self.socialLinksModelVariant
|
||||
|
||||
QtProperty[QVariant] socialLinksModel:
|
||||
read = getSocialLinksModel
|
||||
|
||||
proc temporarySocialLinksModel*(self: View): SocialLinksModel =
|
||||
return self.temporarySocialLinksModel
|
||||
|
||||
proc getTemporarySocialLinksModel(self: View): QVariant {.slot.} =
|
||||
return self.temporarySocialLinksModelVariant
|
||||
|
||||
QtProperty[QVariant] temporarySocialLinksModel:
|
||||
read = getTemporarySocialLinksModel
|
||||
|
||||
proc socialLinksDirtyChanged*(self: View) {.signal.}
|
||||
proc areSocialLinksDirty(self: View): bool {.slot.} =
|
||||
self.socialLinksModel.items != self.temporarySocialLinksModel.items
|
||||
|
||||
proc socialLinksJsonChanged*(self: View) {.signal.}
|
||||
proc getSocialLinksJson(self: View): string {.slot.} =
|
||||
$(%*self.socialLinksModel.items)
|
||||
|
||||
QtProperty[string] socialLinksJson:
|
||||
read = getSocialLinksJson
|
||||
notify = socialLinksJsonChanged
|
||||
|
||||
QtProperty[bool] socialLinksDirty:
|
||||
read = areSocialLinksDirty
|
||||
notify = socialLinksDirtyChanged
|
||||
|
||||
proc createCustomLink(self: View, text: string, url: string) {.slot.} =
|
||||
self.temporarySocialLinksModel.appendItem(initSocialLinkItem(text, url, LinkType.Custom))
|
||||
self.socialLinksDirtyChanged()
|
||||
|
||||
proc removeCustomLink(self: View, uuid: string) {.slot.} =
|
||||
if (self.temporarySocialLinksModel.removeItem(uuid)):
|
||||
self.socialLinksDirtyChanged()
|
||||
|
||||
proc updateLink(self: View, uuid: string, text: string, url: string): bool {.slot.} =
|
||||
if (self.temporarySocialLinksModel.updateItem(uuid, text, url)):
|
||||
self.socialLinksDirtyChanged()
|
||||
|
||||
proc resetSocialLinks(self: View): bool {.slot.} =
|
||||
if (self.areSocialLinksDirty()):
|
||||
self.temporarySocialLinksModel.setItems(self.socialLinksModel.items)
|
||||
self.socialLinksDirtyChanged()
|
||||
|
||||
proc saveSocialLinks(self: View): bool {.slot.} =
|
||||
result = self.delegate.saveSocialLinks()
|
||||
if (result):
|
||||
self.socialLinksModel.setItems(self.temporarySocialLinksModel.items)
|
||||
self.socialLinksDirtyChanged()
|
||||
self.socialLinksJsonChanged()
|
||||
|
||||
proc bioChanged*(self: View) {.signal.}
|
||||
proc getBio(self: View): string {.slot.} =
|
||||
self.delegate.getBio()
|
||||
|
||||
QtProperty[string] bio:
|
||||
read = getBio
|
||||
notify = bioChanged
|
||||
|
||||
proc setBio(self: View, bio: string): bool {.slot.} =
|
||||
result = self.delegate.setBio(bio)
|
||||
if (result):
|
||||
self.bioChanged()
|
||||
|
||||
|
|
Loading…
Reference in New Issue