diff --git a/MVMCore/MVMCore.xcodeproj/project.pbxproj b/MVMCore/MVMCore.xcodeproj/project.pbxproj index 46b0ab0..5bbffe9 100644 --- a/MVMCore/MVMCore.xcodeproj/project.pbxproj +++ b/MVMCore/MVMCore.xcodeproj/project.pbxproj @@ -34,6 +34,7 @@ 01F2A04E23A82CF500D954D8 /* ActionPopupModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F2A04D23A82CF500D954D8 /* ActionPopupModel.swift */; }; 01F2A05223A8325100D954D8 /* ModelMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01F2A05123A8325100D954D8 /* ModelMapping.swift */; }; 0A42538F23F3414800554656 /* Codable+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A42538E23F3414800554656 /* Codable+Helpers.swift */; }; + 0A62624824C1DFDC00C316B9 /* UIAlertControllerStyle+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A62624724C1DFDC00C316B9 /* UIAlertControllerStyle+Extension.swift */; }; 0AFF597A23FC6E60005C24E8 /* ActionShareModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AFF597923FC6E60005C24E8 /* ActionShareModel.swift */; }; 30349BF11FCCA78A00546A1E /* MVMCoreSessionTimeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 30349BEF1FCCA78A00546A1E /* MVMCoreSessionTimeHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; 30349BF21FCCA78A00546A1E /* MVMCoreSessionTimeHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 30349BF01FCCA78A00546A1E /* MVMCoreSessionTimeHandler.m */; }; @@ -188,6 +189,7 @@ 0A11030B20864F94008ADD90 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; 0A11030C20864F9A008ADD90 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Localizable.strings"; sourceTree = ""; }; 0A42538E23F3414800554656 /* Codable+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Codable+Helpers.swift"; sourceTree = ""; }; + 0A62624724C1DFDC00C316B9 /* UIAlertControllerStyle+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIAlertControllerStyle+Extension.swift"; sourceTree = ""; }; 0AFF597923FC6E60005C24E8 /* ActionShareModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionShareModel.swift; sourceTree = ""; }; 30349BEF1FCCA78A00546A1E /* MVMCoreSessionTimeHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreSessionTimeHandler.h; sourceTree = ""; }; 30349BF01FCCA78A00546A1E /* MVMCoreSessionTimeHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreSessionTimeHandler.m; sourceTree = ""; }; @@ -344,6 +346,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0A62624624C1DFB700C316B9 /* Alert Extensions */ = { + isa = PBXGroup; + children = ( + 0184D3FC24BE54A300A05369 /* UIAlertActionStyle+Codable.swift */, + 0A62624724C1DFDC00C316B9 /* UIAlertControllerStyle+Extension.swift */, + ); + path = "Alert Extensions"; + sourceTree = ""; + }; 8876D5BF1FB50A9E00EB2E3D = { isa = PBXGroup; children = ( @@ -463,11 +474,11 @@ 946EE1B6237B66630036751F /* ActionType */ = { isa = PBXGroup; children = ( + 0A62624624C1DFB700C316B9 /* Alert Extensions */, 01F2A03523A80A7300D954D8 /* ActionModelProtocol.swift */, 946EE1BB237B691A0036751F /* ActionOpenPageModel.swift */, 01F2A03823A812DD00D954D8 /* ActionOpenUrlModel.swift */, 0184D3DA24B7D5A600A05369 /* ActionAlertModel.swift */, - 0184D3FC24BE54A300A05369 /* UIAlertActionStyle+Codable.swift */, 01F2A04B23A82B1B00D954D8 /* ActionCallModel.swift */, 01F2A04D23A82CF500D954D8 /* ActionPopupModel.swift */, 01C851D023CF97FE0021F976 /* ActionBackModel.swift */, @@ -933,6 +944,7 @@ AFBB96971FBA3A9A0008D868 /* MVMCorePresentViewControllerOperation.m in Sources */, AFBB96581FBA3A570008D868 /* FreeBeeAuthObject.m in Sources */, 01F2A04E23A82CF500D954D8 /* ActionPopupModel.swift in Sources */, + 0A62624824C1DFDC00C316B9 /* UIAlertControllerStyle+Extension.swift in Sources */, AF43A5781FBA5B7C008E9347 /* MVMCoreJSONConstants.m in Sources */, AFBB96691FBA3A570008D868 /* MVMCoreRequestParameters.m in Sources */, AFED77A31FCCA29400BAE689 /* MVMCoreViewControllerNibMappingObject.m in Sources */, diff --git a/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m b/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m index d5bd6c8..b9cea23 100644 --- a/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m +++ b/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m @@ -70,7 +70,7 @@ NSString * const KeyActionTypeOpen = @"openPage"; } else if ([actionType isEqualToString:KeyActionTypeShare]) { [self shareAction:actionInformation additionalData:additionalData delegateObject:delegateObject]; - + } else if ([actionType isEqualToString:KeyActionTypePreviousSubmit]) { [self previousSubmitAction:actionInformation additionalData:additionalData delegateObject:delegateObject]; @@ -314,21 +314,20 @@ NSString * const KeyActionTypeOpen = @"openPage"; } - (void)showAlert:(nullable NSDictionary *)actionInformation additionalData:(nullable NSDictionary *)additionalData delegateObject:(nullable DelegateObject *)delegateObject { - + MVMCoreErrorObject *error = nil; MVMCoreAlertObject *alertObject = [MVMCoreAlertObject alertObjectWithAction:actionInformation additionalData:additionalData delegateObject:delegateObject error:&error]; if ([delegateObject.actionDelegate respondsToSelector:@selector(willShowPopupWithAlertObject:alertJson:)]) { [delegateObject.actionDelegate willShowPopupWithAlertObject:alertObject alertJson:actionInformation]; } - + if (alertObject) { [[MVMCoreAlertHandler sharedAlertHandler] showAlertWithAlertObject:alertObject]; } else { - [self handleActionError:error actionInformation:actionInformation additionalData:additionalData delegateObject:delegateObject]; + [self handleActionError:error actionInformation:actionInformation additionalData:additionalData delegateObject:delegateObject]; } } - - (BOOL)handleOtherActions:(nullable NSString *)actionType actionInformation:(nullable NSDictionary *)actionInformation additionalData:(nullable NSDictionary *)additionalData delegateObject:(nullable DelegateObject *)delegateObject { return NO; } diff --git a/MVMCore/MVMCore/AlertHandling/MVMCoreAlertObject+Swift.swift b/MVMCore/MVMCore/AlertHandling/MVMCoreAlertObject+Swift.swift index d15ed80..162dd2d 100644 --- a/MVMCore/MVMCore/AlertHandling/MVMCoreAlertObject+Swift.swift +++ b/MVMCore/MVMCore/AlertHandling/MVMCoreAlertObject+Swift.swift @@ -6,32 +6,40 @@ // Copyright © 2020 myverizon. All rights reserved. // -import UIKit public extension MVMCoreAlertObject { - - @objc static func alertObjectWith(action actionJson: [AnyHashable : Any]?, additionalData: [AnyHashable : Any]?, delegateObject: DelegateObject?, error: AutoreleasingUnsafeMutablePointer?) -> MVMCoreAlertObject? { - + + @objc static func alertObjectWith(action actionJson: [AnyHashable: Any]?, additionalData: [AnyHashable: Any]?, delegateObject: DelegateObject?, error: AutoreleasingUnsafeMutablePointer?) -> MVMCoreAlertObject? { + guard let alertJson = actionJson?.optionalDictionaryForKey("alert"), (alertJson.optionalStringForKey(KeyTitle) != nil || alertJson.optionalStringForKey(KeyMessage) != nil), - let actionsList = alertJson.optionalArrayForKey("alertActions") as? [[AnyHashable : Any]] else { + let actionsList = alertJson.optionalArrayForKey("alertActions") as? [[AnyHashable: Any]] + else { error?.pointee = MVMCoreErrorObject(title: nil, message: MVMCoreGetterUtility.hardcodedString(withKey: HardcodedErrorUnableToProcess), code: ErrorCode.popupFailed.rawValue, domain: ErrorDomainNative, location: String(describing: self)) - return nil + return nil } - + var actionsForAlert: [UIAlertAction] = [] + for actionJson in actionsList { let style = UIAlertAction.Style(rawValue: actionJson.stringForkey("style")) - let alertAction = UIAlertAction(title: actionJson.optionalStringForKey(KeyTitle), style: style) { (action) in - MVMCoreActionHandler.shared()?.handleAction(with: actionJson.optionalDictionaryForKey("action"), additionalData: additionalData, delegateObject: delegateObject) + let alertAction = UIAlertAction(title: actionJson.optionalStringForKey(KeyTitle), style: style) { action in + MVMCoreActionHandler.shared()?.handleAction(with: actionJson.optionalDictionaryForKey("action"), + additionalData: additionalData, + delegateObject: delegateObject) } actionsForAlert.append(alertAction) } - - let alert = MVMCoreAlertObject(popupAlertWithTitle: alertJson.optionalStringForKey(KeyTitle), - message: alertJson.optionalStringForKey(KeyMessage), - actions: actionsForAlert, - isGreedy: false) - return alert + + let alertObject = MVMCoreAlertObject(popupAlertWithTitle: alertJson.optionalStringForKey(KeyTitle), + message: alertJson.optionalStringForKey(KeyMessage), + actions: actionsForAlert, + isGreedy: false) + + if let alertStyle = alertJson.optionalStringForKey("style") { + alertObject?.alertStyle = UIAlertController.Style(rawValue: alertStyle) + } + + return alertObject } } diff --git a/MVMCore/MVMCore/AlertHandling/MVMCoreTopAlertOperation.m b/MVMCore/MVMCore/AlertHandling/MVMCoreTopAlertOperation.m index 50f296c..ccf7545 100644 --- a/MVMCore/MVMCore/AlertHandling/MVMCoreTopAlertOperation.m +++ b/MVMCore/MVMCore/AlertHandling/MVMCoreTopAlertOperation.m @@ -121,11 +121,11 @@ if (self.isCancelled) { // Cancelled, dismiss immediately. - [self dismissAlertView:YES]; + [self dismissAlertView:YES forceful:YES]; } else if (self.isPaused) { // Paused, dismiss for the time being if persistent. - [self dismissAlertView:!self.topAlertObject.persistent]; + [self dismissAlertView:!self.topAlertObject.persistent forceful:YES]; } else if (!self.topAlertObject.persistent) { // Set timer to dismiss top alert if it's not persistent (or it's survival mode and not short bar). @@ -141,7 +141,7 @@ if (weakSelf.isFinished || [weakSelf checkAndHandleForCancellation]) { return; } - [weakSelf dismissAlertView:YES]; + [weakSelf dismissAlertView:YES forceful:NO]; }); } }]; @@ -159,19 +159,19 @@ if (!self.isAnimating) { if (self.isDisplayed) { - [self dismissAlertView:YES]; + [self dismissAlertView:YES forceful:YES]; } else if (self.isExecuting) { [self markAsFinished]; } } } -- (void)dismissAlertView:(BOOL)andFinish { +- (void)dismissAlertView:(BOOL)andFinish forceful:(BOOL)forceful { if (self.isDisplayed && !self.isAnimating) { // Dismisses. - [[[MVMCoreObject sharedInstance].globalTopAlertDelegate getTopAlertView] hideAlertView:^(BOOL finished) { + [[[MVMCoreObject sharedInstance].globalTopAlertDelegate getTopAlertView] hideAlertView:forceful completionHandler:^(BOOL finished) { self.displayed = NO; if (andFinish) { @@ -188,7 +188,7 @@ self.paused = YES; [self didChangeValueForKey:@"isPaused"]; } - [self dismissAlertView:!self.topAlertObject.persistent]; + [self dismissAlertView:!self.topAlertObject.persistent forceful:YES]; } - (void)unpause { @@ -214,7 +214,7 @@ } - (void)topAlertCloseButtonPressed { - [self dismissAlertView:YES]; + [self dismissAlertView:YES forceful:YES]; } @end diff --git a/MVMCore/MVMCore/AlertHandling/MVMCoreTopAlertViewProtocol.h b/MVMCore/MVMCore/AlertHandling/MVMCoreTopAlertViewProtocol.h index 6f21c40..f667037 100644 --- a/MVMCore/MVMCore/AlertHandling/MVMCoreTopAlertViewProtocol.h +++ b/MVMCore/MVMCore/AlertHandling/MVMCoreTopAlertViewProtocol.h @@ -17,7 +17,7 @@ - (void)showWithTopAlertObject:(nullable MVMCoreTopAlertObject *)topAlertObject animationDelegate:(nonnull id )animationDelegate completionHandler:(void (^ __nullable)(BOOL finished))completionHandler; // Hides -- (void)hideAlertView:(void (^ __nullable)(BOOL finished))completionHandler; +- (void)hideAlertView:(BOOL)forceful completionHandler:(void (^ __nullable)(BOOL finished))completionHandler; // Collapses the notification if it has a short top message. Otherwise removes notification. - (void)collapseNotification; diff --git a/MVMCore/MVMCore/Models/ActionType/ActionAlertModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionAlertModel.swift index 5893dc0..cc6b3f6 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionAlertModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionAlertModel.swift @@ -6,10 +6,12 @@ // Copyright © 2020 Verizon Wireless. All rights reserved. // -import UIKit @objcMembers public class ActionAlertModel: ActionModelProtocol { - + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "alert" public var actionType: String = ActionAlertModel.identifier public var alert: AlertModel diff --git a/MVMCore/MVMCore/Models/ActionType/ActionBackModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionBackModel.swift index cb8b643..3ecdfe4 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionBackModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionBackModel.swift @@ -1,19 +1,26 @@ // -// File.swift +// ActionBackModel.swift // MVMCore // // Created by Suresh, Kamlesh on 1/15/20. // Copyright © 2020 myverizon. All rights reserved. // -import Foundation @objcMembers public class ActionBackModel: ActionModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "back" public var actionType: String = ActionBackModel.identifier public var extraParameters: JSONValueDictionary? public var analyticsData: JSONValueDictionary? + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(_ extraParameters: JSONValueDictionary? = nil, _ analyticsData: JSONValueDictionary? = nil) { self.extraParameters = extraParameters self.analyticsData = analyticsData diff --git a/MVMCore/MVMCore/Models/ActionType/ActionCallModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionCallModel.swift index 75ce450..e5dba2b 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionCallModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionCallModel.swift @@ -6,9 +6,12 @@ // Copyright © 2019 myverizon. All rights reserved. // -import Foundation @objcMembers public class ActionCallModel: ActionModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "call" public var actionType: String = ActionCallModel.identifier // TODO: decode into phone number once action handler is re-written @@ -16,6 +19,10 @@ import Foundation public var extraParameters: JSONValueDictionary? public var analyticsData: JSONValueDictionary? + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(callNumber: String, _ extraParameters: JSONValueDictionary? = nil, _ analyticsData: JSONValueDictionary? = nil) { self.callNumber = callNumber self.extraParameters = extraParameters diff --git a/MVMCore/MVMCore/Models/ActionType/ActionCancelModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionCancelModel.swift index 0b1b675..8a77c11 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionCancelModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionCancelModel.swift @@ -6,14 +6,21 @@ // Copyright © 2020 myverizon. All rights reserved. // -import UIKit @objcMembers public class ActionCancelModel: ActionModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "cancel" public var actionType: String = ActionCancelModel.identifier public var extraParameters: JSONValueDictionary? public var analyticsData: JSONValueDictionary? + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(_ extraParameters: JSONValueDictionary? = nil, _ analyticsData: JSONValueDictionary? = nil) { self.extraParameters = extraParameters self.analyticsData = analyticsData diff --git a/MVMCore/MVMCore/Models/ActionType/ActionModelProtocol.swift b/MVMCore/MVMCore/Models/ActionType/ActionModelProtocol.swift index 70c3150..a5d3229 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionModelProtocol.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionModelProtocol.swift @@ -6,7 +6,6 @@ // Copyright © 2019 myverizon. All rights reserved. // -import Foundation public protocol ActionModelProtocol: ModelProtocol { diff --git a/MVMCore/MVMCore/Models/ActionType/ActionOpenPageModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionOpenPageModel.swift index 7478e3a..94b7a3d 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionOpenPageModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionOpenPageModel.swift @@ -6,9 +6,12 @@ // Copyright © 2019 Suresh, Kamlesh. All rights reserved. // -import Foundation @objcMembers open class ActionOpenPageModel: ActionModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "openPage" public var actionType: String = ActionOpenPageModel.identifier public var pageType: String @@ -17,6 +20,10 @@ import Foundation public var presentationStyle: String? public var tabBarIndex: Int? + //-------------------------------------------------- + // MARK: - Initialzier + //-------------------------------------------------- + public init(pageType: String, presentationStyle: String? = nil, extraParameters: JSONValueDictionary? = nil, analyticsData: JSONValueDictionary? = nil, tabBarIndex: Int? = nil) { self.pageType = pageType self.presentationStyle = presentationStyle diff --git a/MVMCore/MVMCore/Models/ActionType/ActionOpenUrlModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionOpenUrlModel.swift index df86873..274b7a4 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionOpenUrlModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionOpenUrlModel.swift @@ -6,9 +6,12 @@ // Copyright © 2019 myverizon. All rights reserved. // -import Foundation @objcMembers public class ActionOpenUrlModel: ActionModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "openURL" public var actionType: String = ActionOpenUrlModel.identifier // TODO: decode into url once action handler is re-written @@ -27,6 +30,10 @@ import Foundation public var dontShowProgress: Bool? public var headerParameters: JSONValueDictionary? + //-------------------------------------------------- + // MARK: - Initialzier + //-------------------------------------------------- + public init(browserUrl: String) { self.browserUrl = browserUrl } diff --git a/MVMCore/MVMCore/Models/ActionType/ActionPopupModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionPopupModel.swift index 9c5ee17..8cdbd83 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionPopupModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionPopupModel.swift @@ -6,15 +6,22 @@ // Copyright © 2019 myverizon. All rights reserved. // -import Foundation @objcMembers public class ActionPopupModel: ActionModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "popup" public var actionType: String = ActionPopupModel.identifier public var pageType: String public var extraParameters: JSONValueDictionary? public var analyticsData: JSONValueDictionary? + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(pageType: String, _ extraParameters: JSONValueDictionary? = nil, _ analyticsData: JSONValueDictionary? = nil) { self.pageType = pageType self.extraParameters = extraParameters diff --git a/MVMCore/MVMCore/Models/ActionType/ActionPreviousSubmitModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionPreviousSubmitModel.swift index f64b5ba..506f056 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionPreviousSubmitModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionPreviousSubmitModel.swift @@ -6,14 +6,21 @@ // Copyright © 2020 myverizon. All rights reserved. // -import UIKit @objcMembers public class ActionPreviousSubmitModel: ActionModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "previousSubmit" public var actionType: String = ActionPreviousSubmitModel.identifier public var extraParameters: JSONValueDictionary? public var analyticsData: JSONValueDictionary? + //-------------------------------------------------- + // MARK: - Initialzier + //-------------------------------------------------- + public init(_ extraParameters: JSONValueDictionary? = nil, _ analyticsData: JSONValueDictionary? = nil) { self.extraParameters = extraParameters self.analyticsData = analyticsData diff --git a/MVMCore/MVMCore/Models/ActionType/ActionRestartModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionRestartModel.swift index fe9c09d..da785ac 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionRestartModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionRestartModel.swift @@ -6,9 +6,12 @@ // Copyright © 2020 myverizon. All rights reserved. // -import UIKit @objcMembers public class ActionRestartModel: ActionModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "restart" public var actionType: String = ActionRestartModel.identifier public var extraParameters: JSONValueDictionary? @@ -17,6 +20,10 @@ import UIKit ///Optional pageType, if pageType is nil, will start with pageType launchApp public var pageType: String? + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(_ pageType: String? = nil, _ extraParameters: JSONValueDictionary? = nil, _ analyticsData: JSONValueDictionary? = nil) { self.pageType = pageType self.extraParameters = extraParameters diff --git a/MVMCore/MVMCore/Models/ActionType/ActionSettingModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionSettingModel.swift index 5986e47..96e95d3 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionSettingModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionSettingModel.swift @@ -6,14 +6,21 @@ // Copyright © 2020 myverizon. All rights reserved. // -import UIKit @objcMembers public class ActionSettingModel: ActionModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "openSettings" public var actionType: String = ActionSettingModel.identifier public var extraParameters: JSONValueDictionary? public var analyticsData: JSONValueDictionary? + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(_ extraParameters: JSONValueDictionary? = nil, _ analyticsData: JSONValueDictionary? = nil) { self.extraParameters = extraParameters self.analyticsData = analyticsData diff --git a/MVMCore/MVMCore/Models/ActionType/ActionShareModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionShareModel.swift index 7dc327f..893c638 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionShareModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionShareModel.swift @@ -6,7 +6,6 @@ // Copyright © 2020 myverizon. All rights reserved. // -import UIKit @objcMembers public class ActionShareModel: ActionModelProtocol { //-------------------------------------------------- diff --git a/MVMCore/MVMCore/Models/ActionType/UIAlertActionStyle+Codable.swift b/MVMCore/MVMCore/Models/ActionType/Alert Extensions/UIAlertActionStyle+Codable.swift similarity index 90% rename from MVMCore/MVMCore/Models/ActionType/UIAlertActionStyle+Codable.swift rename to MVMCore/MVMCore/Models/ActionType/Alert Extensions/UIAlertActionStyle+Codable.swift index bb3f5bd..266a305 100644 --- a/MVMCore/MVMCore/Models/ActionType/UIAlertActionStyle+Codable.swift +++ b/MVMCore/MVMCore/Models/ActionType/Alert Extensions/UIAlertActionStyle+Codable.swift @@ -6,7 +6,6 @@ // Copyright © 2020 myverizon. All rights reserved. // -import UIKit extension UIAlertAction.Style: Codable { @@ -14,10 +13,13 @@ extension UIAlertAction.Style: Codable { switch rawValue { case "default": self = .default + case "cancel": self = .cancel + case "destructive": self = .destructive + default: self = .default } @@ -27,10 +29,13 @@ extension UIAlertAction.Style: Codable { switch self { case .default: return "default" + case .cancel: return "cancel" + case .destructive: return "destructive" + @unknown default: return "default" } diff --git a/MVMCore/MVMCore/Models/ActionType/Alert Extensions/UIAlertControllerStyle+Extension.swift b/MVMCore/MVMCore/Models/ActionType/Alert Extensions/UIAlertControllerStyle+Extension.swift new file mode 100644 index 0000000..1de084a --- /dev/null +++ b/MVMCore/MVMCore/Models/ActionType/Alert Extensions/UIAlertControllerStyle+Extension.swift @@ -0,0 +1,37 @@ +// +// UIAlertControllerStyle+Extension.swift +// MVMCore +// +// Created by Kevin Christiano on 7/17/20. +// Copyright © 2020 myverizon. All rights reserved. +// + + +extension UIAlertController.Style: Codable { + + init(rawValue: String) { + switch rawValue { + case "alert": + self = .alert + + case "actionSheet": + self = .actionSheet + + default: + self = .alert + } + } + + var rawValueString: String { + switch self { + case .alert: + return "alert" + + case .actionSheet: + return "actionSheet" + + @unknown default: + return "alert" + } + } +} diff --git a/MVMCore/MVMCore/Models/ActionType/AlertModel.swift b/MVMCore/MVMCore/Models/ActionType/AlertModel.swift index 6b4c634..866bfb3 100644 --- a/MVMCore/MVMCore/Models/ActionType/AlertModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/AlertModel.swift @@ -10,26 +10,43 @@ import UIKit public class AlertButtonModel: Codable { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public var title: String public var action: ActionModelProtocol public var style: UIAlertAction.Style = .default + + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(_ title: String,_ action: ActionModelProtocol,_ style: UIAlertAction.Style = .default) { self.title = title self.action = action self.style = style } + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case title case action case style } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) title = try typeContainer.decode(String.self, forKey: .title) - if let style = try? typeContainer.decodeIfPresent(String.self, forKey: .style) { + if let style = try typeContainer.decodeIfPresent(String.self, forKey: .style) { self.style = UIAlertAction.Style(rawValue: style) } action = try typeContainer.decodeModel(codingKey: .action) @@ -44,26 +61,49 @@ public class AlertButtonModel: Codable { } public class AlertModel: Codable { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public var title: String public var message: String + public var style: UIAlertController.Style = .alert public var alertActions: [AlertButtonModel] + + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public init(_ title: String,_ message: String,_ alertActions: [AlertButtonModel]) { self.title = title self.message = message self.alertActions = alertActions } + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case title case message case alertActions + case style } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) title = try typeContainer.decode(String.self, forKey: .title) message = try typeContainer.decode(String.self, forKey: .message) alertActions = try typeContainer.decode([AlertButtonModel].self, forKey: .alertActions) + + if let style = try typeContainer.decodeIfPresent(String.self, forKey: .style) { + self.style = UIAlertController.Style(rawValue: style) + } } open func encode(to encoder: Encoder) throws { @@ -71,5 +111,6 @@ public class AlertModel: Codable { try container.encode(title, forKey: .title) try container.encode(message, forKey: .message) try container.encode(alertActions, forKey: .alertActions) + try container.encode(style.rawValueString, forKey: .style) } }