again this is due to the updating internal models via the control, therefore there will be a delay in the eventing from the publisher back up to the parent model Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
104 lines
3.3 KiB
Swift
104 lines
3.3 KiB
Swift
//
|
|
// SelectorGroupHandlerBase.swift
|
|
// VDS
|
|
//
|
|
// Created by Matt Bruce on 9/8/22.
|
|
//
|
|
|
|
import Foundation
|
|
import UIKit
|
|
|
|
public class SelectorGroupHandlerBase<GroupModelType: SelectorGroupModelable, ModelHandlerType: Control<GroupModelType.SelectorModelType>>: Control<GroupModelType>, Changable {
|
|
|
|
//--------------------------------------------------
|
|
// MARK: - Public Properties
|
|
//--------------------------------------------------
|
|
public var selectorViews: [ModelHandlerType] = []
|
|
|
|
public var onChange: Blocks.ActionBlock?
|
|
|
|
//--------------------------------------------------
|
|
// MARK: - Overrides
|
|
//--------------------------------------------------
|
|
override public var disabled: Bool {
|
|
didSet {
|
|
selectorViews.forEach { handler in
|
|
handler.disabled = disabled
|
|
}
|
|
}
|
|
}
|
|
|
|
override public var surface: Surface {
|
|
didSet {
|
|
selectorViews.forEach { handler in
|
|
handler.surface = surface
|
|
}
|
|
}
|
|
}
|
|
|
|
public func findSelectorView(inputId: String?) -> ModelHandlerType? {
|
|
return selectorViews.first(where: { existingSelectorView in
|
|
return existingSelectorView.model.inputId == inputId
|
|
})
|
|
}
|
|
|
|
public func getCachedSelector(viewModel: ModelHandlerType.ModelType) -> ModelHandlerType.ModelType? {
|
|
if let index = model.selectors.firstIndex(where: { element in
|
|
return element.inputId == viewModel.inputId
|
|
}) {
|
|
return model.selectors[index]
|
|
} else {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
public func replace(viewModel: ModelHandlerType.ModelType){
|
|
if let index = model.selectors.firstIndex(where: { element in
|
|
return element.inputId == viewModel.inputId
|
|
}) {
|
|
model.selectors[index] = viewModel
|
|
}
|
|
}
|
|
|
|
public func createModelHandler(selector: ModelHandlerType.ModelType) -> ModelHandlerType {
|
|
//create view
|
|
let newSelectorView = ModelHandlerType(with: selector)
|
|
|
|
//add model update to the subscribers
|
|
newSelectorView
|
|
.modelPublisher
|
|
.sink { [weak self] model in
|
|
self?.replace(viewModel: model)
|
|
}
|
|
.store(in: &subscribers)
|
|
|
|
//add the selectedPublisher for the change
|
|
newSelectorView
|
|
.publisher(for: .touchUpInside)
|
|
.sink { [weak self] control in
|
|
self?.didSelect(control)
|
|
}
|
|
.store(in: &subscribers)
|
|
|
|
return newSelectorView
|
|
|
|
}
|
|
|
|
open func didSelect(_ selectedControl: ModelHandlerType) {
|
|
fatalError("Must override didSelect")
|
|
}
|
|
|
|
public func valueChanged() {
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + Constants.ModelStateDebounce) { [weak self] in
|
|
self?.sendActions(for: .valueChanged)
|
|
}
|
|
}
|
|
}
|
|
|
|
public class SelectorGroupSelectedHandlerBase<GroupModelType: SelectorGroupSelectedModelable, ModelHandlerType: Control<GroupModelType.SelectorModelType>>: SelectorGroupHandlerBase<GroupModelType, ModelHandlerType> where GroupModelType.SelectorModelType == ModelHandlerType.ModelType {
|
|
|
|
public var selectedModel: ModelHandlerType.ModelType? {
|
|
return model.selectedModel
|
|
}
|
|
}
|