diff --git a/JSONCreator_iOS/JSONCreator/AppDelegate.swift b/JSONCreator_iOS/JSONCreator/AppDelegate.swift index 02f7b84..d4e0280 100644 --- a/JSONCreator_iOS/JSONCreator/AppDelegate.swift +++ b/JSONCreator_iOS/JSONCreator/AppDelegate.swift @@ -123,5 +123,113 @@ extension AppDelegate: MVMCoreGlobalTopAlertDelegateProtocol { extension AppDelegate { func register(){ ModelRegistry.register(handler: TestToggle.self, for: TestToggleModel.self) + ModelRegistry.register(handler: DynamicHeadlineBodyToggle.self, for: DynamicHeadlineBodyToggleModel.self) + ModelRegistry.register(handler: BiometricLabelToggle.self, for: BiometricLabelToggleModel.self) } } + + +public class DynamicHeadlineBodyToggleModel: MoleculeModelProtocol { + public static var identifier: String = "dynamicHeadlineBodyToggle" + open var backgroundColor: Color? + public var moleculeName: String? + open var headlineBody: HeadlineBodyModel + open var toggle: ToggleModel? + public var switchOnText: LabelModel? + public var switchOffText: LabelModel? +} +@objcMembers public class DynamicHeadlineBodyToggle: HeadlineBodyToggle { + + //MARK:Declaration + var delegate: MVMCoreUIDelegateObject? + + //override the toggles.valueChangedCancellable + public override func setupView() { + super.setupView() + toggle.valueChangedSubscription = toggle.publisher(for: .valueChanged) + .sink { [weak self] changed in + guard let self = self, + let model = self.model as? DynamicHeadlineBodyToggleModel else { return } + self.updateDynamicHeadLine(model) + self.toggle.executeDefaultAction() + } + } + + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + guard let dynamicHeadlineBodyToggleModel = model as? DynamicHeadlineBodyToggleModel else { return } + delegate = delegateObject + self.model = model + toggle.setOptional(with: dynamicHeadlineBodyToggleModel.toggle, delegateObject, additionalData) + updateDynamicHeadLine(dynamicHeadlineBodyToggleModel) + } + + func updateDynamicHeadLine(_ model: DynamicHeadlineBodyToggleModel) { + + let headLineBodyModel: HeadlineBodyModel? = model.headlineBody + // check if toogle model present + // otherwise toggle should be hidden for member + if let _ = model.toggle { + if toggle.isOn, let switchOnText = model.switchOnText { + headLineBodyModel?.headline = switchOnText + } else if let switchOffText = model.switchOffText { + headLineBodyModel?.headline = switchOffText + } + } else { + toggle.isHidden = true + } + headlineBody.setOptional(with: headLineBodyModel, delegate, nil) + layoutIfNeeded() + } +} + +public class BiometricLabelToggleModel: MoleculeModelProtocol { + public static var identifier: String = "biometricLabelToggle" + public var backgroundColor: Color? + public var touchId: LabelToggleModel + public var faceId: LabelToggleModel +} + +@objc public protocol BiometricLabelToggleDelegate: NSObjectProtocol { + @objc func processBiometricID(_ toggle: MVMCoreUI.Toggle?) + @objc func setupBiometricID(_ toggle: MVMCoreUI.Toggle?) +} + +@objcMembers public class BiometricLabelToggle: LabelToggle { + var biometricDelegate: BiometricLabelToggleDelegate? + + // MARK: - MVMCoreViewProtocol + public override func setupView() { + super.setupView() + // alignment fix + label.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true + trailingAnchor.constraint(equalTo: toggle.trailingAnchor).isActive = true + + //overwrite the default logic for value changed + toggle.valueChangedSubscription = toggle + .publisher(for: .valueChanged) + .sink { [weak self] changed in + self?.biometricDelegate?.processBiometricID(changed) + } + } + + // MARK:- MoleculeViewProtocol + public override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable : Any]?) { + guard let model = model as? BiometricLabelToggleModel else { return } + biometricDelegate = delegateObject?.actionDelegate as? BiometricLabelToggleDelegate + // check device/server supports face id + if false { + // Load the face id label json + super.set(with: model.faceId, delegateObject, additionalData) + } else { + // if device/server supports touch Id + super.set(with: model.touchId, delegateObject, additionalData) + } + biometricDelegate?.setupBiometricID(toggle) + } + + public class override func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { + guard let model = model as? BiometricLabelToggleModel else { return nil } + return LabelToggle.estimatedHeight(with: model.faceId, delegateObject) + } +} + diff --git a/JSONCreator_iOS/JSONCreator/JSON/Samples/ToggleSample.json b/JSONCreator_iOS/JSONCreator/JSON/Samples/ToggleSample.json index e9a76a0..cffa379 100644 --- a/JSONCreator_iOS/JSONCreator/JSON/Samples/ToggleSample.json +++ b/JSONCreator_iOS/JSONCreator/JSON/Samples/ToggleSample.json @@ -7,25 +7,156 @@ "suppressPostLaunchRequests": false, "tabBarHidden": true, "header": { - "moleculeName": "header", - "molecule": { - "moleculeName": "headlineBody", - "headline": { - "moleculeName": "label", - "text": "Zenkey" - } + "moleculeName": "header", + "molecule": { + "moleculeName": "headlineBody", + "headline": { + "moleculeName": "label", + "text": "Zenkey" } - }, + } + }, "stack": { "moleculeName": "stack", "molecules": [ - { - "moleculeName": "stackItem", - "molecule": { - "moleculeName": "toggle", - "fieldKey": "isActive" + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "toggle", + "fieldKey": "isActive" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "labelToggle", + "label": { + "moleculeName": "label", + "text": "Enable touch id." + }, + "toggle": { + "moleculeName": "toggle" } } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "headlineBodyToggle", + "headlineBody": { + "moleculeName": "headlineBody", + "headline": { + "moleculeName": "label", + "text": "Business and Marketing Insights" + }, + "body": { + "moleculeName": "label", + "text": "Allow use of information." + } + }, + "toggle": { + "moleculeName": "toggle" + } + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "headlineBodyLinkToggle", + "headlineBodyLink": { + "moleculeName": "headlineBodyLink", + "headlineBody": { + "moleculeName": "headlineBody", + "headline": { + "moleculeName": "label", + "text": "Relevant Mobile Advertising" + }, + "body": { + "moleculeName": "label", + "text": "Allow use of information." + } + }, + "link": { + "moleculeName": "link", + "title": "Tell me more", + "action": { + "actionType": "openPage", + "pageType": "forgotPasswordPage" + } + } + }, + "toggle": { + "moleculeName": "toggle" + } + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "dynamicHeadlineBodyToggle", + "toggle": { + "moleculeName": "toggle", + "fieldKey": "switchImei1", + "state": true + }, + "headlineBody": { + "moleculeName": "headlineBody", + "headline": { + "moleculeName": "label", + "text": "Safety Mode is On", + "fontStyle": "H3" + }, + "body": { + "moleculeName": "label", + "text": "Safety Mode protects you from overage fees and still lets you use data at reduced speeds, after you've done over monthly data limit.", + "fontStyle": "B2" + } + }, + "switchOnText": { + "moleculeName": "label", + "text": "Safety Mode is On", + "fontStyle": "H3" + }, + "switchOffText": { + "moleculeName": "label", + "text": "Safety Mode is Off", + "fontStyle": "H3" + }, + "required": false + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "biometricLabelToggle", + "faceId": { + "label": { + "moleculeName": "label", + "text": "Enable face ID" + }, + "toggle": { + "moleculeName": "toggle", + "actionMap": { + "actionType": "openPage", + "pageType": "turnOnFaceId" + } + } + }, + "touchId": { + "label": { + "moleculeName": "label", + "text": "Enable Touch ID" + }, + "toggle": { + "moleculeName": "toggle", + "actionMap": { + "actionType": "openPage", + "pageType": "turnOnTouchId" + } + } + } + } + } ] }, "footer": { @@ -50,11 +181,8 @@ "formRules": [ { "groupName": "default", - "rules": [ - - ] + "rules": [] } ] } } -