// // MVMCoreUITopAlertView+Extension.swift // MVMCoreUI // // Created by Scott Pfeil on 9/11/20. // Copyright © 2020 Verizon Wireless. All rights reserved. // import Foundation import MVMCore /// A simple container view that shows and hides a notification. public class NotificationContainerView: UIView { public var currentNotificationView: UIView? lazy private var height = heightAnchor.constraint(equalToConstant: 0) public init() { super.init(frame: .zero) setupView() } required init?(coder: NSCoder) { super.init(coder: coder) setupView() } } extension NotificationContainerView: NotificationTransitionDelegateProtocol { @MainActor public func show(notification: UIView) async { currentNotificationView?.removeFromSuperview() addSubview(notification) NSLayoutConstraint.constraintPinSubview(toSuperview: notification) currentNotificationView = notification if let conformer = notification as? MVMCoreViewProtocol { conformer.updateView(bounds.width) } superview?.layoutIfNeeded() await withCheckedContinuation { continuation in UIView.animate(withDuration: 0.5) { self.height.isActive = false self.superview?.layoutIfNeeded() } completion: { finished in self.superview?.layoutIfNeeded() continuation.resume() } } } @MainActor public func hide(notification: UIView) async { await withCheckedContinuation { continuation in UIView.animate(withDuration: 0.5) { self.height.isActive = true self.superview?.layoutIfNeeded() } completion: { finished in self.currentNotificationView?.removeFromSuperview() self.currentNotificationView = nil continuation.resume() } } } @MainActor public func update(with model: NotificationModel, delegateObject: MVMCoreUIDelegateObject?) { guard let molecule = currentNotificationView as? MoleculeViewProtocol else { return } // Update molecule molecule.reset() molecule.set(with: model.molecule, delegateObject, nil) (molecule as? MVMCoreViewProtocol)?.updateView(self.bounds.width) } } extension NotificationContainerView: MVMCoreViewProtocol { public func updateView(_ size: CGFloat) { (currentNotificationView as? MVMCoreViewProtocol)?.updateView(size) } public func setupView() { translatesAutoresizingMaskIntoConstraints = false clipsToBounds = true height.isActive = true } }