Skip to content
Snippets Groups Projects
Commit 7da0db38 authored by Kateryna Kostiuk's avatar Kateryna Kostiuk Committed by Andreas Traczyk
Browse files

UI/UX: fix username and ringId appearance


Because Account View Model is created at the very beginning of app
launching, it is possible to create it when account does not exists.
This patch makes variables lazy, so all values will be rendered when
screen become visible. Also it adds name lookup, account does not have
username.

Change-Id: Ia4747bdb2efaffd8b0f39109407946e736ab09e5
Reviewed-by: default avatarAndreas Traczyk <andreas.traczyk@savoirfairelinux.com>
parent aa9836da
No related branches found
No related tags found
No related merge requests found
...@@ -27,12 +27,12 @@ ...@@ -27,12 +27,12 @@
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Ring id" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="11" translatesAutoresizingMaskIntoConstraints="NO" id="rC6-Ga-QjY" userLabel="RingId Label"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Ring id" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="11" translatesAutoresizingMaskIntoConstraints="NO" id="rC6-Ga-QjY" userLabel="RingId Label">
<rect key="frame" x="21" y="249" width="333" height="18"/> <rect key="frame" x="21" y="209" width="333" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="18" id="UsR-G7-bkE"/> <constraint firstAttribute="height" constant="18" id="UsR-G7-bkE"/>
</constraints> </constraints>
<fontDescription key="fontDescription" type="system" pointSize="13"/> <fontDescription key="fontDescription" type="system" pointSize="14"/>
<color key="textColor" red="0.29803922770000002" green="0.29803922770000002" blue="0.29803922770000002" alpha="1" colorSpace="calibratedRGB"/> <color key="textColor" red="0.29803922770000002" green="0.29803922770000002" blue="0.29803922770000002" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
...@@ -75,13 +75,14 @@ ...@@ -75,13 +75,14 @@
</label> </label>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="ic_contact_picture" translatesAutoresizingMaskIntoConstraints="NO" id="8HY-Zl-94u"> <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="ic_contact_picture" translatesAutoresizingMaskIntoConstraints="NO" id="8HY-Zl-94u">
<rect key="frame" x="137" y="70" width="100" height="100"/> <rect key="frame" x="137" y="70" width="100" height="100"/>
<rect key="frame" x="137" y="30" width="100" height="100"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="100" id="3Ik-A7-Cyx"/> <constraint firstAttribute="height" constant="100" id="3Ik-A7-Cyx"/>
<constraint firstAttribute="width" constant="100" id="xE6-h0-miE"/> <constraint firstAttribute="width" constant="100" id="xE6-h0-miE"/>
</constraints> </constraints>
</imageView> </imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="PERSON PLACEHOLDER" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="w8x-Sv-T50"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Username is not registered" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="w8x-Sv-T50">
<rect key="frame" x="21" y="272" width="333" height="23"/> <rect key="frame" x="21" y="232" width="333" height="23"/>
<fontDescription key="fontDescription" type="system" pointSize="19"/> <fontDescription key="fontDescription" type="system" pointSize="19"/>
<color key="textColor" red="0.20000000300000001" green="0.20000000300000001" blue="0.20000000300000001" alpha="1" colorSpace="calibratedRGB"/> <color key="textColor" red="0.20000000300000001" green="0.20000000300000001" blue="0.20000000300000001" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
......
...@@ -45,7 +45,7 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas ...@@ -45,7 +45,7 @@ class MeViewController: EditProfileViewController, StoryboardBased, ViewModelBas
} }
override func setupUI() { override func setupUI() {
self.viewModel.userName.asObservable() self.viewModel.userName
.bind(to: self.nameLabel.rx.text) .bind(to: self.nameLabel.rx.text)
.disposed(by: disposeBag) .disposed(by: disposeBag)
......
...@@ -73,25 +73,48 @@ class MeViewModel: ViewModel, Stateable { ...@@ -73,25 +73,48 @@ class MeViewModel: ViewModel, Stateable {
// MARK: - Rx Stateable // MARK: - Rx Stateable
private let stateSubject = PublishSubject<State>() private let stateSubject = PublishSubject<State>()
var userName: Single<String?> lazy var userName: Observable<String?> = {
let ringId: Single<String?> // return username if exists, is no start name lookup
let accountName = self.accountService.currentAccount?.volatileDetails?.get(withConfigKeyModel: ConfigKeyModel(withKey: ConfigKey.accountRegisteredName))
if accountName != nil && !accountName!.isEmpty {
return Observable.from(optional: accountName)
}
guard let account = self.accountService.currentAccount else {
return Observable.from(optional: accountName)
}
let accountHelper = AccountModelHelper(withAccount: account)
guard let uri = accountHelper.ringId else {
return Observable.from(optional: accountName)
}
let time = DispatchTime.now() + 2
DispatchQueue.main.asyncAfter(deadline: time) {
self.nameService.lookupAddress(withAccount: "", nameserver: "", address: uri)
}
return self.nameService.usernameLookupStatus
.filter({ lookupNameResponse in
return lookupNameResponse.address != nil &&
lookupNameResponse.address == uri && lookupNameResponse.state == .found
})
.map({ lookupNameResponse in
return lookupNameResponse.name
})
}()
lazy var ringId: Observable<String?> = {
return Observable.from(optional: self.accountService.currentAccount?.details?.get(withConfigKeyModel: ConfigKeyModel(withKey: .accountUsername)))
}()
lazy var state: Observable<State> = { lazy var state: Observable<State> = {
return self.stateSubject.asObservable() return self.stateSubject.asObservable()
}() }()
let disposeBag = DisposeBag() let disposeBag = DisposeBag()
let accountService: AccountsService let accountService: AccountsService
let nameService: NameService
//table section //table section
var settings: Observable<[SettingsSection]> = Observable.just([SettingsSection]()) lazy var settings: Observable<[SettingsSection]> = {
if let account = self.accountService.currentAccount {
required init(with injectionBag: InjectionBag) {
self.accountService = injectionBag.accountService
self.userName = Single.just(accountService.currentAccount?.volatileDetails?.get(withConfigKeyModel: ConfigKeyModel(withKey: ConfigKey.accountRegisteredName)))
self.ringId = Single.just(accountService.currentAccount?.details?.get(withConfigKeyModel: ConfigKeyModel(withKey: .accountUsername)))
if let account = accountService.currentAccount {
let accountHelper = AccountModelHelper(withAccount: account) let accountHelper = AccountModelHelper(withAccount: account)
let uri = accountHelper.ringId let uri = accountHelper.ringId
let devices = Observable.from(optional: account.devices) let devices = Observable.from(optional: account.devices)
...@@ -104,15 +127,12 @@ class MeViewModel: ViewModel, Stateable { ...@@ -104,15 +127,12 @@ class MeViewModel: ViewModel, Stateable {
return account.devices return account.devices
}) })
self.settings = devices.concat(accountDevice) return devices.concat(accountDevice)
.map { devices in .map { devices in
let addNewDevice = SettingsSection.linkNewDevice(header: "", items: [SettingsSection.SectionRow.linkNew]) let addNewDevice = SettingsSection.linkNewDevice(header: "", items: [SettingsSection.SectionRow.linkNew])
var rows: [SettingsSection.SectionRow]? var rows: [SettingsSection.SectionRow]?
if !devices.isEmpty { if !devices.isEmpty {
rows = [SettingsSection.SectionRow.device(device: devices[0])] rows = [SettingsSection.SectionRow.device(device: devices[0])]
for i in 1 ..< devices.count { for i in 1 ..< devices.count {
let device = devices[i] let device = devices[i]
...@@ -128,6 +148,12 @@ class MeViewModel: ViewModel, Stateable { ...@@ -128,6 +148,12 @@ class MeViewModel: ViewModel, Stateable {
} }
} }
} }
return Observable.just([SettingsSection]())
}()
required init (with injectionBag: InjectionBag) {
self.accountService = injectionBag.accountService
self.nameService = injectionBag.nameService
} }
func linkDevice() { func linkDevice() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment