Skip to content
Snippets Groups Projects
Commit 4d0518ad authored by Bruno Muniz's avatar Bruno Muniz :apple:
Browse files

Merge branch 'fix/group-chat-members-list' into 'dev'

Fixes group chat member list

See merge request elixxir/client-ios!87
parents 0d26325f 7d9ed36a
No related branches found
No related tags found
1 merge request!87Fixes group chat member list
...@@ -104,6 +104,9 @@ extension NavigatorKey: DependencyKey { ...@@ -104,6 +104,9 @@ extension NavigatorKey: DependencyKey {
PresentCountryListNavigator( PresentCountryListNavigator(
CountryListController.init(_:) CountryListController.init(_:)
), ),
PresentGroupMembersNavigator(
GroupMembersController.init(_:)
),
PresentOnboardingEmailNavigator( PresentOnboardingEmailNavigator(
OnboardingEmailController.init OnboardingEmailController.init
), ),
......
import UIKit
import XXModels
/// Opens up `GroupMembers` on a given parent view controller
public struct PresentGroupMembers: Action {
/// - Parameters:
/// - groupInfo: Model that represents the group info that contains the members to be shown
/// - parent: Parent view controller from which presentation should happen
/// - animated: Animate the transition
public init(
groupInfo: GroupInfo,
from parent: UIViewController,
animated: Bool = true
) {
self.groupInfo = groupInfo
self.parent = parent
self.animated = animated
}
/// Model that represents the group info that contains the members to be shown
public var groupInfo: GroupInfo
/// Parent view controller from which presentation should happen
public var parent: UIViewController
/// Animate the transition
public var animated: Bool
}
/// Performs `PresentGroupMembers` action
public struct PresentGroupMembersNavigator: TypedNavigator {
/// Custom transitioning delegate
let transitioningDelegate = BottomTransitioningDelegate()
/// View controller which should be opened up
var viewController: (GroupInfo) -> UIViewController
/// - Parameters:
/// - viewController: view controller which should be presented
public init(_ viewController: @escaping (GroupInfo) -> UIViewController) {
self.viewController = viewController
}
public func perform(_ action: PresentGroupMembers, completion: @escaping () -> Void) {
let controller = viewController(action.groupInfo)
controller.transitioningDelegate = transitioningDelegate
controller.modalPresentationStyle = .overFullScreen
action.parent.present(
controller,
animated: action.animated,
completion: completion
)
}
}
import XXModels
public struct PresentMemberList: Action {
public var members: [Contact]
public var animated: Bool
public init(
members: [Contact],
animated: Bool = true
) {
self.members = members
self.animated = animated
}
}
...@@ -29,8 +29,10 @@ public final class GroupChatController: UIViewController { ...@@ -29,8 +29,10 @@ public final class GroupChatController: UIViewController {
// @Dependency var makeReportDrawer: MakeReportDrawer // @Dependency var makeReportDrawer: MakeReportDrawer
// @Dependency var makeAppScreenshot: MakeAppScreenshot // @Dependency var makeAppScreenshot: MakeAppScreenshot
private lazy var moreButton = UIButton()
private lazy var headerView = GroupHeaderView()
private var collectionView: UICollectionView! private var collectionView: UICollectionView!
private lazy var header = GroupHeaderView()
private let inputComponent: ChatInputView private let inputComponent: ChatInputView
private var animator: ManualAnimator? private var animator: ManualAnimator?
...@@ -65,14 +67,18 @@ public final class GroupChatController: UIViewController { ...@@ -65,14 +67,18 @@ public final class GroupChatController: UIViewController {
super.init(nibName: nil, bundle: nil) super.init(nibName: nil, bundle: nil)
let memberList = info.members.map { headerView.titleLabel.text = info.group.name
Member( info.members.forEach {
title: ($0.nickname ?? $0.username) ?? "Fetching username...", let contactTitle = ($0.nickname ?? $0.username) ?? "Fetching username..."
photo: $0.photo let avatarView = AvatarView()
) avatarView.layer.borderWidth = 2
avatarView.layer.borderColor = UIColor.white.cgColor
avatarView.setupProfile(title: contactTitle, image: $0.photo, size: .small)
avatarView.snp.makeConstraints {
$0.width.height.equalTo(26.0)
}
headerView.avatarStackView.addArrangedSubview(avatarView)
} }
header.setup(title: info.group.name, memberList: memberList)
} }
public required init?(coder: NSCoder) { nil } public required init?(coder: NSCoder) { nil }
...@@ -127,12 +133,11 @@ public final class GroupChatController: UIViewController { ...@@ -127,12 +133,11 @@ public final class GroupChatController: UIViewController {
} }
private func setupNavigationBar() { private func setupNavigationBar() {
let more = UIButton() moreButton.setImage(Asset.chatMore.image, for: .normal)
more.setImage(Asset.chatMore.image, for: .normal) moreButton.addTarget(self, action: #selector(didTapDots), for: .touchUpInside)
more.addTarget(self, action: #selector(didTapDots), for: .touchUpInside)
navigationItem.titleView = header navigationItem.titleView = headerView
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: more) navigationItem.rightBarButtonItem = UIBarButtonItem(customView: moreButton)
} }
private func setupCollectionView() { private func setupCollectionView() {
...@@ -317,7 +322,10 @@ public final class GroupChatController: UIViewController { ...@@ -317,7 +322,10 @@ public final class GroupChatController: UIViewController {
} }
@objc private func didTapDots() { @objc private func didTapDots() {
navigator.perform(PresentMemberList(members: viewModel.info.members)) navigator.perform(PresentGroupMembers(
groupInfo: viewModel.info,
from: self
))
} }
func scrollToBottom(completion: (() -> Void)? = nil) { func scrollToBottom(completion: (() -> Void)? = nil) {
......
import UIKit
import XXModels
public final class GroupMembersController: UIViewController {
private lazy var screenView = GroupMembersView()
private let groupInfo: GroupInfo
public init(_ groupInfo: GroupInfo) {
self.groupInfo = groupInfo
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) { nil }
public override func loadView() {
view = screenView
}
public override func viewDidLoad() {
super.viewDidLoad()
groupInfo.members.forEach {
screenView.addMember(
title: ($0.nickname ?? $0.username) ?? "Fetching username...",
photo: $0.photo
)
}
}
}
...@@ -2,26 +2,19 @@ import UIKit ...@@ -2,26 +2,19 @@ import UIKit
import Shared import Shared
import AppResources import AppResources
struct Member {
let title: String
let photo: Data?
}
final class GroupHeaderView: UIView { final class GroupHeaderView: UIView {
let titleLabel = UILabel() let titleLabel = UILabel()
let containerView = UIView() let avatarStackView = UIStackView()
let stackView = UIStackView()
init() { init() {
super.init(frame: .zero) super.init(frame: .zero)
stackView.spacing = -8 avatarStackView.spacing = -5
titleLabel.textColor = Asset.neutralActive.color titleLabel.textColor = Asset.neutralActive.color
titleLabel.font = Fonts.Mulish.semiBold.font(size: 15.0) titleLabel.font = Fonts.Mulish.semiBold.font(size: 15.0)
containerView.addSubview(titleLabel) addSubview(titleLabel)
containerView.addSubview(stackView) addSubview(avatarStackView)
addSubview(containerView)
titleLabel.snp.makeConstraints { titleLabel.snp.makeConstraints {
$0.top.equalToSuperview() $0.top.equalToSuperview()
...@@ -30,31 +23,14 @@ final class GroupHeaderView: UIView { ...@@ -30,31 +23,14 @@ final class GroupHeaderView: UIView {
$0.right.lessThanOrEqualToSuperview() $0.right.lessThanOrEqualToSuperview()
} }
stackView.snp.makeConstraints { avatarStackView.snp.makeConstraints {
$0.top.equalTo(titleLabel.snp.bottom) $0.top.equalTo(titleLabel.snp.bottom)
$0.centerX.equalToSuperview() $0.centerX.equalToSuperview()
$0.left.greaterThanOrEqualToSuperview() $0.left.greaterThanOrEqualToSuperview()
$0.right.lessThanOrEqualToSuperview() $0.right.lessThanOrEqualToSuperview()
$0.bottom.equalToSuperview() $0.bottom.equalToSuperview()
} }
containerView.snp.makeConstraints {
$0.edges.equalToSuperview()
}
} }
required init?(coder: NSCoder) { nil } required init?(coder: NSCoder) { nil }
func setup(title: String, memberList: [Member]) {
titleLabel.text = title
memberList.forEach {
let avatarView = AvatarView()
avatarView.layer.borderWidth = 3
avatarView.layer.borderColor = UIColor.white.cgColor
avatarView.setupProfile(title: $0.title, image: $0.photo, size: .small)
avatarView.snp.makeConstraints { $0.width.height.equalTo(25.0) }
stackView.addArrangedSubview(avatarView)
}
}
} }
import UIKit import UIKit
import Shared import Shared
import XXModels
import AppResources import AppResources
final class MembersController: UIViewController { final class GroupMemberView: UIView {
private lazy var stackView = UIStackView()
private let members: [Contact]
init(with members: [Contact]) {
self.members = members
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) { nil }
public override func viewDidLoad() {
super.viewDidLoad()
view.layer.cornerRadius = 15
view.layer.masksToBounds = true
view.backgroundColor = Asset.neutralWhite.color
stackView.axis = .vertical
stackView.distribution = .fillEqually
view.addSubview(stackView)
stackView.snp.makeConstraints {
$0.top.equalToSuperview().offset(10)
$0.left.right.equalToSuperview()
$0.bottom.equalTo(view.safeAreaLayoutGuide)
}
members.forEach {
let memberView = MemberView()
let assignedTitle = ($0.nickname ?? $0.username) ?? "Fetching username..."
memberView.titleLabel.text = assignedTitle
memberView.avatarView.setupProfile(title: assignedTitle, image: $0.photo, size: .small)
stackView.addArrangedSubview(memberView)
}
}
}
private final class MemberView: UIView {
let titleLabel = UILabel() let titleLabel = UILabel()
let avatarView = AvatarView() let avatarView = AvatarView()
let separatorView = UIView() let separatorView = UIView()
...@@ -74,7 +34,7 @@ private final class MemberView: UIView { ...@@ -74,7 +34,7 @@ private final class MemberView: UIView {
separatorView.snp.makeConstraints { separatorView.snp.makeConstraints {
$0.height.equalTo(1) $0.height.equalTo(1)
$0.left.equalToSuperview().offset(25) $0.left.equalToSuperview().offset(25)
$0.right.equalToSuperview() $0.right.equalToSuperview().offset(-25)
$0.bottom.equalToSuperview() $0.bottom.equalToSuperview()
} }
} }
......
import UIKit
import Shared
import AppResources
final class GroupMembersView: UIView {
private let stackView = UIStackView()
init() {
super.init(frame: .zero)
layer.cornerRadius = 40
layer.masksToBounds = true
backgroundColor = Asset.neutralWhite.color
stackView.axis = .vertical
stackView.distribution = .fillEqually
addSubview(stackView)
stackView.snp.makeConstraints {
$0.top.equalToSuperview().offset(20)
$0.left.equalToSuperview().offset(20)
$0.right.equalToSuperview().offset(-20)
$0.bottom.equalToSuperview().offset(-50)
}
}
required init?(coder: NSCoder) { nil }
func addMember(title: String, photo: Data?) {
let memberView = GroupMemberView()
memberView.titleLabel.text = title
memberView.avatarView.setupProfile(
title: title,
image: photo,
size: .small
)
stackView.addArrangedSubview(memberView)
}
}
...@@ -62,7 +62,7 @@ public final class AvatarView: UIView { ...@@ -62,7 +62,7 @@ public final class AvatarView: UIView {
switch size { switch size {
case .small: case .small:
layer.cornerRadius = 13.0 layer.cornerRadius = 13.0
monogramLabel.font = Fonts.Mulish.semiBold.font(size: 14.0) monogramLabel.font = Fonts.Mulish.semiBold.font(size: 12.0)
case .medium: case .medium:
layer.cornerRadius = 13.0 layer.cornerRadius = 13.0
monogramLabel.font = Fonts.Mulish.semiBold.font(size: 14.0) monogramLabel.font = Fonts.Mulish.semiBold.font(size: 14.0)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment