// // SelectorGroupHandlerBase.swift // VDS // // Created by Matt Bruce on 9/8/22. // import Foundation import UIKit import Combine /// Base Class used for any Grouped Form Control of a Selector Type. open class SelectorGroupHandlerBase: Control, Changeable { //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- /// Array of the HandlerType registered. open var selectorViews: [HandlerType] = [] open var onChangeSubscriber: AnyCancellable? { willSet { if let onChangeSubscriber { onChangeSubscriber.cancel() } } } override open var isEnabled: Bool { didSet { selectorViews.forEach { $0.isEnabled = isEnabled } } } ///The background tint that the component will be placed on. This will automatically adjust other elements as needed and takes “light” or “dark” override open var surface: Surface { didSet { selectorViews.forEach { handler in handler.surface = surface } } } //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- /// Handler for the Group to override on a select event. /// - Parameter selectedControl: Selected Control the user interacted. open func didSelect(_ selectedControl: HandlerType) { fatalError("Must override didSelect") } /// Helper method to execute the valueChanged event. open func valueChanged() { DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) { [weak self] in self?.sendActions(for: .valueChanged) } } /// Resets to default settings. open override func reset() { super.reset() selectorViews.forEach{ $0.reset() } } /// Used to update any Accessibility properties. open override func updateAccessibility() { super.updateAccessibility() setAccessibilityLabel(for: selectorViews) } } open class SelectorGroupSelectedHandlerBase: SelectorGroupHandlerBase{ /// Current Selected Control for this group. public var selectedHandler: HandlerType? { return selectorViews.filter { $0.isSelected == true }.first } open override func updateAccessibility() { super.updateAccessibility() if let selectedHandler, let value = selectedHandler.accessibilityValue, let label = selectedHandler.accessibilityLabel { accessibilityValue = "\(label) \(value)" } else { accessibilityValue = nil } } }