mirror of https://github.com/oxen-io/session-ios
WIP: reactions list
parent
3af692ed01
commit
b5c7902833
@ -0,0 +1,106 @@
|
|||||||
|
import UIKit
|
||||||
|
|
||||||
|
final class ReactionListSheet : BaseVC {
|
||||||
|
private let reactions: [ReactMessage]
|
||||||
|
private var reactionMap: OrderedDictionary<String, [ReactMessage]> = OrderedDictionary()
|
||||||
|
|
||||||
|
// MARK: Components
|
||||||
|
|
||||||
|
lazy var contentView: UIView = {
|
||||||
|
let result = UIView()
|
||||||
|
result.layer.borderWidth = 0.5
|
||||||
|
result.layer.borderColor = Colors.border.withAlphaComponent(0.5).cgColor
|
||||||
|
result.backgroundColor = Colors.modalBackground
|
||||||
|
return result
|
||||||
|
}()
|
||||||
|
|
||||||
|
lazy var reactionContainer: UIStackView = {
|
||||||
|
let result = UIStackView()
|
||||||
|
let spacing = Values.smallSpacing
|
||||||
|
result.spacing = spacing
|
||||||
|
result.layoutMargins = UIEdgeInsets(top: spacing, leading: spacing, bottom: spacing, trailing: spacing)
|
||||||
|
result.isLayoutMarginsRelativeArrangement = true
|
||||||
|
return result
|
||||||
|
}()
|
||||||
|
|
||||||
|
// MARK: Lifecycle
|
||||||
|
|
||||||
|
init(for reactions: [ReactMessage]) {
|
||||||
|
self.reactions = reactions
|
||||||
|
super.init(nibName: nil, bundle: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
override init(nibName: String?, bundle: Bundle?) {
|
||||||
|
preconditionFailure("Use init(for:) instead.")
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
preconditionFailure("Use init(for:) instead.")
|
||||||
|
}
|
||||||
|
|
||||||
|
override func viewDidLoad() {
|
||||||
|
super.viewDidLoad()
|
||||||
|
view.backgroundColor = .clear
|
||||||
|
let swipeGestureRecognizer = UISwipeGestureRecognizer(target: self, action: #selector(close))
|
||||||
|
swipeGestureRecognizer.direction = .down
|
||||||
|
view.addGestureRecognizer(swipeGestureRecognizer)
|
||||||
|
populateData()
|
||||||
|
setUpViewHierarchy()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func setUpViewHierarchy() {
|
||||||
|
view.addSubview(contentView)
|
||||||
|
contentView.pin([ UIView.HorizontalEdge.leading, UIView.HorizontalEdge.trailing, UIView.VerticalEdge.bottom ], to: view)
|
||||||
|
contentView.set(.height, to: 440)
|
||||||
|
populateContentView()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func populateContentView() {
|
||||||
|
// Reactions container
|
||||||
|
let scrollableContainer = UIScrollView(wrapping: reactionContainer, withInsets: .zero)
|
||||||
|
scrollableContainer.showsVerticalScrollIndicator = false
|
||||||
|
scrollableContainer.showsHorizontalScrollIndicator = false
|
||||||
|
scrollableContainer.set(.height, to: 48)
|
||||||
|
for reaction in reactionMap.orderedItems {
|
||||||
|
let reactionView = ReactionButton(emoji: reaction.0, value: reaction.1.count, largeSize: true)
|
||||||
|
reactionContainer.addArrangedSubview(reactionView)
|
||||||
|
}
|
||||||
|
contentView.addSubview(scrollableContainer)
|
||||||
|
scrollableContainer.pin([ UIView.VerticalEdge.top, UIView.HorizontalEdge.leading, UIView.HorizontalEdge.trailing ], to: contentView)
|
||||||
|
// Line
|
||||||
|
let lineView = UIView()
|
||||||
|
lineView.backgroundColor = Colors.border.withAlphaComponent(0.5)
|
||||||
|
lineView.set(.height, to: 0.5)
|
||||||
|
contentView.addSubview(lineView)
|
||||||
|
lineView.pin([ UIView.HorizontalEdge.leading, UIView.HorizontalEdge.trailing ], to: contentView)
|
||||||
|
lineView.pin(.top, to: .bottom, of: scrollableContainer)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private func populateData() {
|
||||||
|
for reaction in reactions {
|
||||||
|
if let emoji = reaction.emoji {
|
||||||
|
if !reactionMap.hasValue(forKey: emoji) { reactionMap.append(key: emoji, value: []) }
|
||||||
|
var value = reactionMap.value(forKey: emoji)!
|
||||||
|
value.append(reaction)
|
||||||
|
reactionMap.replace(key: emoji, value: value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Interaction
|
||||||
|
|
||||||
|
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||||
|
let touch = touches.first!
|
||||||
|
let location = touch.location(in: view)
|
||||||
|
if contentView.frame.contains(location) {
|
||||||
|
super.touchesBegan(touches, with: event)
|
||||||
|
} else {
|
||||||
|
close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func close() {
|
||||||
|
dismiss(animated: true, completion: nil)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue