From 0b7b73ba09f975d09204a602ec5a059f29e22b07 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 17 Jul 2020 14:33:57 -0400 Subject: [PATCH] opening alert action to allow for action sheet. --- MVMCore/MVMCore.xcodeproj/project.pbxproj | 18 +++-- .../ActionHandling/MVMCoreActionHandler.m | 47 +++---------- .../MVMCoreAlertObject+Swift.swift | 30 ++++---- .../MVMCore/Constants/MVMCoreJSONConstants.h | 1 - .../MVMCore/Constants/MVMCoreJSONConstants.m | 1 - .../Models/ActionType/ActionSheetModel.swift | 70 ------------------- .../UIAlertActionStyle+Codable.swift | 7 +- .../UIAlertControllerStyle+Extension.swift | 37 ++++++++++ .../Models/ActionType/AlertModel.swift | 7 ++ MVMCore/MVMCore/Models/ModelMapping.swift | 1 - 10 files changed, 89 insertions(+), 130 deletions(-) delete mode 100644 MVMCore/MVMCore/Models/ActionType/ActionSheetModel.swift rename MVMCore/MVMCore/Models/ActionType/{ => Alert Extensions}/UIAlertActionStyle+Codable.swift (90%) create mode 100644 MVMCore/MVMCore/Models/ActionType/Alert Extensions/UIAlertControllerStyle+Extension.swift diff --git a/MVMCore/MVMCore.xcodeproj/project.pbxproj b/MVMCore/MVMCore.xcodeproj/project.pbxproj index 0e10622..5bbffe9 100644 --- a/MVMCore/MVMCore.xcodeproj/project.pbxproj +++ b/MVMCore/MVMCore.xcodeproj/project.pbxproj @@ -34,7 +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 */; }; - 0A6173B724C09315005FB46A /* ActionSheetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A6173B624C09315005FB46A /* ActionSheetModel.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 */; }; @@ -189,7 +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 = ""; }; - 0A6173B624C09315005FB46A /* ActionSheetModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionSheetModel.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 = ""; }; @@ -346,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 = ( @@ -465,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 */, @@ -479,7 +488,6 @@ 94C014D424211AF0005811A9 /* ActionCancelModel.swift */, 94C014D824212360005811A9 /* ActionSettingModel.swift */, 0184D3FE24BE554A00A05369 /* AlertModel.swift */, - 0A6173B624C09315005FB46A /* ActionSheetModel.swift */, ); path = ActionType; sourceTree = ""; @@ -936,13 +944,13 @@ 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 */, 8876D5EB1FB50AB000EB2E3D /* NSDecimalNumber+MFConvenience.m in Sources */, 0184D3DB24B7D5A600A05369 /* ActionAlertModel.swift in Sources */, AFBB96A41FBA3A9A0008D868 /* MVMCoreTopAlertObject.m in Sources */, - 0A6173B724C09315005FB46A /* ActionSheetModel.swift in Sources */, 01F2A03923A812DD00D954D8 /* ActionOpenUrlModel.swift in Sources */, AFBB96351FBA34310008D868 /* MVMCoreErrorConstants.m in Sources */, AFBB969C1FBA3A9A0008D868 /* MVMCoreAlertHandler.m in Sources */, diff --git a/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m b/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m index 1f0685b..5642bd6 100644 --- a/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m +++ b/MVMCore/MVMCore/ActionHandling/MVMCoreActionHandler.m @@ -70,10 +70,7 @@ NSString * const KeyActionTypeOpen = @"openPage"; } else if ([actionType isEqualToString:KeyActionTypeShare]) { [self shareAction:actionInformation additionalData:additionalData delegateObject:delegateObject]; - - } else if ([actionType isEqualToString:KeyActionTypeActionSheet]) { - [self actionSheetAction:actionInformation additionalData:additionalData delegateObject:delegateObject]; - + } else if ([actionType isEqualToString:KeyActionTypePreviousSubmit]) { [self previousSubmitAction:actionInformation additionalData:additionalData delegateObject:delegateObject]; @@ -203,35 +200,6 @@ NSString * const KeyActionTypeOpen = @"openPage"; } } -- (void)actionSheetAction:(nullable NSDictionary *)actionInformation additionalData:(nullable NSDictionary *)additionalData delegateObject:(nullable DelegateObject *)delegateObject { - - NSArray *actions = [actionInformation array:@"actions"]; - NSString *title = [actionInformation string:@"title"]; - NSString *message = [actionInformation string:@"message"]; - BOOL isGreedy = [actionInformation boolForKey:@"isGreedy"]; - - NSMutableArray *alertActions = [NSMutableArray array]; - - [actions enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { - - NSDictionary *actionDict = [actions objectAtIndex:idx]; - NSString *actionTitle = [actionDict string:@"title"]; - - UIAlertAction *alertAction = [UIAlertAction actionWithTitle:actionTitle style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { - [[MVMCoreActionHandler sharedActionHandler] handleActionWithDictionary:obj additionalData:nil delegateObject:nil]; - }]; - - [alertActions addObject:alertAction]; - }]; - - [[MVMCoreAlertHandler sharedAlertHandler] showAlertWithTitle:title - message:message - actions:alertActions - alertStyle:UIAlertControllerStyleActionSheet - isGreedy:isGreedy - alertDelegate:nil]; -} - - (void)restartAction:(nullable NSDictionary *)actionInformation additionalData:(nullable NSDictionary *)additionalData delegateObject:(nullable DelegateObject *)delegateObject { // Invalidates the session before restarting. @@ -346,21 +314,26 @@ 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]; } - + + NSDictionary *alertDictionary = [actionInformation dict:@"alert"]; + NSNumber *style = [alertDictionary optionalNumberForKey:@"style"]; + if ([style isEqual:@0]) { + alertObject.alertStyle = UIAlertControllerStyleActionSheet; + } + 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..b5cd66f 100644 --- a/MVMCore/MVMCore/AlertHandling/MVMCoreAlertObject+Swift.swift +++ b/MVMCore/MVMCore/AlertHandling/MVMCoreAlertObject+Swift.swift @@ -6,32 +6,34 @@ // 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 + return MVMCoreAlertObject(popupAlertWithTitle: alertJson.optionalStringForKey(KeyTitle), + message: alertJson.optionalStringForKey(KeyMessage), + actions: actionsForAlert, + isGreedy: false) } } diff --git a/MVMCore/MVMCore/Constants/MVMCoreJSONConstants.h b/MVMCore/MVMCore/Constants/MVMCoreJSONConstants.h index eeb167d..697374c 100644 --- a/MVMCore/MVMCore/Constants/MVMCoreJSONConstants.h +++ b/MVMCore/MVMCore/Constants/MVMCoreJSONConstants.h @@ -31,7 +31,6 @@ extern NSString * const KeyMessage; extern NSString * const KeyActionTypeRestart; extern NSString * const KeyActionTypeBack; extern NSString * const KeyActionTypeShare; -extern NSString * const KeyActionTypeActionSheet; extern NSString * const KeyShareType; extern NSString * const KeyShareText; extern NSString * const KeyActionTypeCall; diff --git a/MVMCore/MVMCore/Constants/MVMCoreJSONConstants.m b/MVMCore/MVMCore/Constants/MVMCoreJSONConstants.m index fd34761..c283fd6 100644 --- a/MVMCore/MVMCore/Constants/MVMCoreJSONConstants.m +++ b/MVMCore/MVMCore/Constants/MVMCoreJSONConstants.m @@ -33,7 +33,6 @@ NSString * const KeyMessage = @"message"; NSString * const KeyActionTypeRestart = @"restart"; NSString * const KeyActionTypeBack = @"back"; NSString * const KeyActionTypeShare = @"share"; -NSString * const KeyActionTypeActionSheet = @"actionSheet"; NSString * const KeyActionTypeCall = @"call"; NSString * const KeyActionTypePreviousSubmit = @"previousSubmit"; NSString * const KeyActionTypePopup = @"popup"; diff --git a/MVMCore/MVMCore/Models/ActionType/ActionSheetModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionSheetModel.swift deleted file mode 100644 index 1c20e9f..0000000 --- a/MVMCore/MVMCore/Models/ActionType/ActionSheetModel.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// ActionSheetModel.swift -// MVMCore -// -// Created by Kevin Christiano on 7/16/20. -// Copyright © 2020 myverizon. All rights reserved. -// - - -@objcMembers public class ActionSheetModel: ActionModelProtocol { - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - public static var identifier: String = "actionSheet" - public var actionType: String = ActionSheetModel.identifier - public var extraParameters: JSONValueDictionary? - public var analyticsData: JSONValueDictionary? - public var actions: [ActionModelProtocol] - public var title: String? - public var message: String? - public var isGreedy = false - - //-------------------------------------------------- - // MARK: - Initializer - //-------------------------------------------------- - - public init(_ extraParameters: JSONValueDictionary? = nil, _ analyticsData: JSONValueDictionary? = nil, _ actions: [ActionModelProtocol]) { - self.extraParameters = extraParameters - self.analyticsData = analyticsData - self.actions = actions - } - - //-------------------------------------------------- - // MARK: - Keys - //-------------------------------------------------- - - private enum CodingKeys: String, CodingKey { - case actionType - case actions - case title - case message - case greedy - } - - //-------------------------------------------------- - // MARK: - Initializer - //-------------------------------------------------- - - required public init(from decoder: Decoder) throws { - let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - actions = try typeContainer.decodeModels(codingKey: .actions) -// actions = try typeContainer.decode([ActionAlertModel].self, forKey: .actions) - title = try typeContainer.decodeIfPresent(String.self, forKey: .title) - message = try typeContainer.decodeIfPresent(String.self, forKey: .message) - - if let isGreedy = try typeContainer.decodeIfPresent(Bool.self, forKey: .greedy) { - self.isGreedy = isGreedy - } - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeModels(actions, forKey: .actions) - try container.encodeIfPresent(title, forKey: .title) - try container.encodeIfPresent(message, forKey: .message) - try container.encode(isGreedy, forKey: .greedy) - try container.encode(actionType, forKey: .actionType) - } -} 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 e85e7c2..f636d99 100644 --- a/MVMCore/MVMCore/Models/ActionType/AlertModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/AlertModel.swift @@ -67,6 +67,7 @@ public class AlertModel: Codable { public var title: String public var message: String + public var style: UIAlertController.Style = .alert public var alertActions: [AlertButtonModel] //-------------------------------------------------- @@ -87,6 +88,7 @@ public class AlertModel: Codable { case title case message case alertActions + case style } //-------------------------------------------------- @@ -98,6 +100,10 @@ public class AlertModel: Codable { 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 { @@ -105,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, forKey: .style) } } diff --git a/MVMCore/MVMCore/Models/ModelMapping.swift b/MVMCore/MVMCore/Models/ModelMapping.swift index 7cf8dd2..66fdab0 100644 --- a/MVMCore/MVMCore/Models/ModelMapping.swift +++ b/MVMCore/MVMCore/Models/ModelMapping.swift @@ -22,6 +22,5 @@ import Foundation try? ModelRegistry.register(ActionCancelModel.self) try? ModelRegistry.register(ActionSettingModel.self) try? ModelRegistry.register(ActionAlertModel.self) - try? ModelRegistry.register(ActionSheetModel.self) } }