// // CollectionViewCell.swift // VDS // // Created by Matt Bruce on 8/25/22. // import Foundation import UIKit import Combine open class CollectionViewCell: UICollectionViewCell, ViewProtocol { public typealias ModelType = ModelHandlerType.ModelType //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- private var initialSetupPerformed = false public var modelHandler: ModelHandlerType = ModelHandlerType() @Proxy(\.modelHandler.model.surface) open var surface: Surface @Proxy(\.modelHandler.model.disabled) open var disabled: Bool //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- required public init() { super.init(frame: .zero) initialSetup() } public required init(with model: ModelType) { super.init(frame: .zero) initialSetup() set(with: model) } public override init(frame: CGRect) { super.init(frame: frame) initialSetup() } public required init?(coder: NSCoder) { super.init(coder: coder) initialSetup() } //-------------------------------------------------- // MARK: - Setup //-------------------------------------------------- public func initialSetup() { if !initialSetupPerformed { initialSetupPerformed = true setup() } } //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- open func shouldUpdateView(viewModel: ModelType) -> Bool { return modelHandler.shouldUpdateView(viewModel: viewModel) } open func updateView(viewModel: ModelType) { modelHandler.updateView(viewModel: viewModel) } public func set(with model: ModelType) { modelHandler.set(with: model) } // MARK: - ViewProtocol /// Will be called only once. open func setup() { translatesAutoresizingMaskIntoConstraints = false insetsLayoutMarginsFromSafeArea = false addSubview(modelHandler) modelHandler.topAnchor.constraint(equalTo: topAnchor).isActive = true modelHandler.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true modelHandler.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true modelHandler.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true } open override func prepareForReuse() { super.prepareForReuse() if let handler = modelHandler as? Resettable { handler.reset() } } }