Skip to content
Snippets Groups Projects
Commit 6eeec02c authored by Kateryna Kostiuk's avatar Kateryna Kostiuk
Browse files

conversation: update navigation bar info

Display both the group title and participants in
the conversation info for group conversations.

Gitlab: #424
Change-Id: Ib814f280fe58d29eeb1c881a7abdc59a0c43ea78
parent add0b0d7
Branches
No related tags found
No related merge requests found
...@@ -309,13 +309,20 @@ class ConversationViewModel: Stateable, ViewModel, ObservableObject, Identifiabl ...@@ -309,13 +309,20 @@ class ConversationViewModel: Stateable, ViewModel, ObservableObject, Identifiabl
} onError: { _ in } onError: { _ in
} }
.disposed(by: self.disposeBag) .disposed(by: self.disposeBag)
self.swarmInfo!.finalTitle.share() self.swarmInfo!.title.share()
.observe(on: MainScheduler.instance) .observe(on: MainScheduler.instance)
.subscribe { [weak self] name in .subscribe { [weak self] name in
self?.displayName.accept(name) self?.displayName.accept(name)
} onError: { _ in } onError: { _ in
} }
.disposed(by: self.disposeBag) .disposed(by: self.disposeBag)
self.swarmInfo!.participantsString.share()
.observe(on: MainScheduler.instance)
.subscribe { [weak self] name in
self?.userName.accept(name)
} onError: { _ in
}
.disposed(by: self.disposeBag)
} }
private func subscribeNonSwarmProfiles(uri: String, accountId: String) { private func subscribeNonSwarmProfiles(uri: String, accountId: String) {
......
...@@ -35,6 +35,7 @@ protocol SwarmInfoProtocol { ...@@ -35,6 +35,7 @@ protocol SwarmInfoProtocol {
var avatarSpacing: CGFloat { get set } var avatarSpacing: CGFloat { get set }
var finalTitle: Observable<String> { get set } var finalTitle: Observable<String> { get set }
var participantsString: BehaviorRelay<String> { get set }
var finalAvatar: Observable<UIImage> { get set } var finalAvatar: Observable<UIImage> { get set }
...@@ -141,6 +142,8 @@ class SwarmInfo: SwarmInfoProtocol { ...@@ -141,6 +142,8 @@ class SwarmInfo: SwarmInfoProtocol {
} }
}() }()
var participantsString = BehaviorRelay(value: "")
lazy var finalAvatar: Observable<UIImage> = { lazy var finalAvatar: Observable<UIImage> = {
return Observable return Observable
.combineLatest(self.avatar.asObservable().startWith(self.avatar.value), .combineLatest(self.avatar.asObservable().startWith(self.avatar.value),
...@@ -239,37 +242,51 @@ class SwarmInfo: SwarmInfoProtocol { ...@@ -239,37 +242,51 @@ class SwarmInfo: SwarmInfoProtocol {
private func subscribeParticipantsInfo() { private func subscribeParticipantsInfo() {
tempBag = DisposeBag() tempBag = DisposeBag()
let namesObservable = participants.value
.map({ participantInfo in guard !participants.value.isEmpty else { return }
return participantInfo.finalName.share().asObservable()
}) let isDialog = conversation?.isDialog() ?? false
Observable
.combineLatest(namesObservable) { (items: [String]) -> [String] in // Create a single shared observable for all participant data
return items.filter { name in // swiftlint:disable large_tuple
!name.isEmpty let participantData = Observable.combineLatest(
} participants.value.map { participant -> Observable<(String, String, String, UIImage?)> in
} return Observable.combineLatest(
.subscribe { [weak self] names in participant.finalName.asObservable(),
guard let self = self else { return } participant.registeredName.asObservable(),
self.participantsNames.accept(Array(Set(names))) participant.profileName.asObservable(),
} onError: { _ in participant.avatar.asObservable()
} )
.disposed(by: self.tempBag)
// filter out default avatars
let avatarsObservable = participants.value
.map({ participantInfo in
return participantInfo.avatar.share().asObservable()
})
Observable
.combineLatest(avatarsObservable) { (items: [UIImage?]) -> [UIImage] in
return items.compactMap { $0 }
} }
.subscribe { [weak self] avatars in )
.share(replay: 1)
// swiftlint:enable large_tuple
participantData
.subscribe(onNext: { [weak self] data in
guard let self = self else { return } guard let self = self else { return }
let finalNames = data.map { $0.0 }.filter { !$0.isEmpty }
let registeredNames = data.map { $0.1 }.filter { !$0.isEmpty }
let profileNames = data.map { $0.2 }.filter { !$0.isEmpty }
let avatars = data.map { $0.3 }.compactMap { $0 }
self.participantsAvatars.accept(avatars) self.participantsAvatars.accept(avatars)
} onError: { _ in
} if isDialog {
.disposed(by: self.tempBag) self.participantsNames.accept(Array(Set(finalNames)))
self.participantsString.accept(self.buildTitleFrom(names: Array(Set(registeredNames))))
if self.title.value.isEmpty, let name = profileNames.first {
self.title.accept(name)
}
} else {
let uniqueNames = Array(Set(finalNames))
self.participantsNames.accept(uniqueNames)
self.participantsString.accept(self.buildTitleFrom(names: uniqueNames))
}
})
.disposed(by: tempBag)
} }
private func subscribeConversationEvents() { private func subscribeConversationEvents() {
......
...@@ -31,6 +31,7 @@ class TestableSwarmInfo: SwarmInfoProtocol { ...@@ -31,6 +31,7 @@ class TestableSwarmInfo: SwarmInfoProtocol {
var description = BehaviorRelay(value: "") var description = BehaviorRelay(value: "")
var participantsNames: BehaviorRelay<[String]> = BehaviorRelay(value: [""]) var participantsNames: BehaviorRelay<[String]> = BehaviorRelay(value: [""])
var participantsAvatars: BehaviorRelay<[UIImage]> = BehaviorRelay(value: [UIImage()]) var participantsAvatars: BehaviorRelay<[UIImage]> = BehaviorRelay(value: [UIImage()])
var participantsString = BehaviorRelay<String>(value: "")
var avatarHeight: CGFloat = 55 var avatarHeight: CGFloat = 55
var avatarSpacing: CGFloat = 2 var avatarSpacing: CGFloat = 2
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment