opening alert action to allow for action sheet.

This commit is contained in:
Kevin G Christiano 2020-07-17 14:33:57 -04:00
parent 2daf72e1c8
commit 0b7b73ba09
10 changed files with 89 additions and 130 deletions

View File

@ -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 = "<group>"; };
0A11030C20864F9A008ADD90 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Localizable.strings"; sourceTree = "<group>"; };
0A42538E23F3414800554656 /* Codable+Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Codable+Helpers.swift"; sourceTree = "<group>"; };
0A6173B624C09315005FB46A /* ActionSheetModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionSheetModel.swift; sourceTree = "<group>"; };
0A62624724C1DFDC00C316B9 /* UIAlertControllerStyle+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIAlertControllerStyle+Extension.swift"; sourceTree = "<group>"; };
0AFF597923FC6E60005C24E8 /* ActionShareModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionShareModel.swift; sourceTree = "<group>"; };
30349BEF1FCCA78A00546A1E /* MVMCoreSessionTimeHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreSessionTimeHandler.h; sourceTree = "<group>"; };
30349BF01FCCA78A00546A1E /* MVMCoreSessionTimeHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MVMCoreSessionTimeHandler.m; sourceTree = "<group>"; };
@ -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 = "<group>";
};
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 = "<group>";
@ -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 */,

View File

@ -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;
}

View File

@ -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<MVMCoreErrorObject?>?) -> MVMCoreAlertObject? {
@objc static func alertObjectWith(action actionJson: [AnyHashable: Any]?, additionalData: [AnyHashable: Any]?, delegateObject: DelegateObject?, error: AutoreleasingUnsafeMutablePointer<MVMCoreErrorObject?>?) -> 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)
}
}

View File

@ -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;

View File

@ -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";

View File

@ -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)
}
}

View File

@ -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"
}

View File

@ -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"
}
}
}

View File

@ -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)
}
}

View File

@ -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)
}
}