// // Clickable.swift // VDS // // Created by Matt Bruce on 3/29/23. // import Foundation import UIKit import Combine public protocol Clickable: ViewProtocol { /// Sets the primary Subscriber used for the UIControl event .touchUpInside. var onClickSubscriber: AnyCancellable? { get set } } extension Clickable where Self: UIControl { /// Allows the setting of a completion block against the onClickSubscriber cancellable. This will /// completion block will get executed against the UIControl publisher for the 'touchUpInside' action. public var onClick: ((Self) -> ())? { get { return nil } set { onClickSubscriber?.cancel() if let newValue { onClickSubscriber = publisher(for: .touchUpInside) .sink { [weak self] c in guard let self, self.isEnabled else { return } newValue(c) } } else { onClickSubscriber = nil } setNeedsUpdate() } } } extension Clickable where Self: UIView { /// Allows the setting of a completion block against the onClickSubscriber cancellable. This will /// completion block will get executed against the UIControl publisher for the 'touchUpInside' action. public var onClick: ((Self) -> ())? { get { return nil } set { onClickSubscriber?.cancel() if let newValue { onClickSubscriber = publisher(for: UITapGestureRecognizer()) .sink { [weak self] _ in guard let self, self.isEnabled else { return } newValue(self) } } else { onClickSubscriber = nil } setNeedsUpdate() } } }