fix compile time errors

This commit is contained in:
Scott Pfeil 2023-04-17 18:52:01 -04:00
parent e55d9e14f6
commit a08a2c678b
6 changed files with 90 additions and 124 deletions

View File

@ -563,7 +563,7 @@
D2ED27EE254B0CE700A1C293 /* ActionAlertModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2ED27E9254B0CE600A1C293 /* ActionAlertModel.swift */; };
D2ED27EF254B0CE700A1C293 /* AlertModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2ED27EA254B0CE700A1C293 /* AlertModel.swift */; };
D2ED27FB254B0E0300A1C293 /* MVMCoreAlertDelegateProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D2ED27F2254B0E0200A1C293 /* MVMCoreAlertDelegateProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
D2ED27FC254B0E0300A1C293 /* MVMCoreAlertObject+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2ED27F3254B0E0200A1C293 /* MVMCoreAlertObject+Swift.swift */; };
D2ED27FC254B0E0300A1C293 /* AlertObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2ED27F3254B0E0200A1C293 /* AlertObject.swift */; };
D2ED280C254B0EB800A1C293 /* MVMCoreTopAlertAnimationDelegateProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = D2ED2805254B0EB700A1C293 /* MVMCoreTopAlertAnimationDelegateProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
D2ED280D254B0EB800A1C293 /* MVMCoreTopAlertOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = D2ED2806254B0EB700A1C293 /* MVMCoreTopAlertOperation.h */; settings = {ATTRIBUTES = (Public, ); }; };
D2ED280E254B0EB800A1C293 /* MVMCoreTopAlertOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = D2ED2807254B0EB700A1C293 /* MVMCoreTopAlertOperation.m */; };
@ -1169,7 +1169,7 @@
D2ED27E9254B0CE600A1C293 /* ActionAlertModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActionAlertModel.swift; sourceTree = "<group>"; };
D2ED27EA254B0CE700A1C293 /* AlertModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlertModel.swift; sourceTree = "<group>"; };
D2ED27F2254B0E0200A1C293 /* MVMCoreAlertDelegateProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreAlertDelegateProtocol.h; sourceTree = "<group>"; };
D2ED27F3254B0E0200A1C293 /* MVMCoreAlertObject+Swift.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MVMCoreAlertObject+Swift.swift"; sourceTree = "<group>"; };
D2ED27F3254B0E0200A1C293 /* AlertObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlertObject.swift; sourceTree = "<group>"; };
D2ED27F7254B0E0200A1C293 /* MVMCoreAlertHandler+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MVMCoreAlertHandler+Extension.swift"; sourceTree = "<group>"; };
D2ED2805254B0EB700A1C293 /* MVMCoreTopAlertAnimationDelegateProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreTopAlertAnimationDelegateProtocol.h; sourceTree = "<group>"; };
D2ED2806254B0EB700A1C293 /* MVMCoreTopAlertOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreTopAlertOperation.h; sourceTree = "<group>"; };
@ -2523,7 +2523,7 @@
children = (
D2ED27F2254B0E0200A1C293 /* MVMCoreAlertDelegateProtocol.h */,
D2ED27F7254B0E0200A1C293 /* MVMCoreAlertHandler+Extension.swift */,
D2ED27F3254B0E0200A1C293 /* MVMCoreAlertObject+Swift.swift */,
D2ED27F3254B0E0200A1C293 /* AlertObject.swift */,
AF7E509729E477C0009DC2AD /* AlertController.swift */,
AF7E509629E477C0009DC2AD /* AlertHandler.swift */,
AFA4931F29E5CA73001A9663 /* AlertOperation.swift */,
@ -2703,7 +2703,7 @@
AAB9C10824346F4B00151545 /* RadioSwatches.swift in Sources */,
94C2D9A923872E5E0006CF46 /* LabelAttributeImageModel.swift in Sources */,
DBC4391922442197001AB423 /* DashLine.swift in Sources */,
D2ED27FC254B0E0300A1C293 /* MVMCoreAlertObject+Swift.swift in Sources */,
D2ED27FC254B0E0300A1C293 /* AlertObject.swift in Sources */,
D264FAAA2440F97600D98315 /* CollectionView.swift in Sources */,
AFE4A1D627DFBB6F00C458D0 /* UINavigationController+Extension.swift in Sources */,
AAC23FAD24D92A0D009208DF /* ListThreeColumnSpeedTestModel.swift in Sources */,

View File

@ -29,11 +29,6 @@ public class AlertHandler {
})
}
/// Cancels all current alerts
public func removeAllAlertViews() {
queue.cancelAllOperations()
}
/// Returns if a greedy alert is currently showing in the hierarchy, even if it is not the top presented view.
public func isGreedyAlertShowing() -> Bool {
return queue.operations.contains(where: { operation in
@ -86,4 +81,29 @@ public class AlertHandler {
queue.addOperation(alertOperation)
return alertController
}
/// Cancel Alert with ID.
public func cancelAlert(with id: String) {
queue.operations.first { operation in
guard let operation = operation as? AlertOperation,
operation.alertObject.alertModel.id == id else { return false }
return true
}?.cancel()
}
/** Iterates through all scheduled alerts and cancels any that match the provided predicate.
* @param predicate The predicate block to decide whether to cancel an alert.
*/
public func cancelAlert(using predicate: ((AlertObject) -> Bool)) {
for case let operation as AlertOperation in queue.operations {
if predicate(operation.alertObject) {
operation.cancel()
}
}
}
/// Cancels all current alerts
public func removeAllAlertViews() {
queue.cancelAllOperations()
}
}

View File

@ -0,0 +1,27 @@
//
// AlertObject.swift
// MVMCore
//
// Created by Suresh, Kamlesh on 7/10/20.
// Copyright © 2020 myverizon. All rights reserved.
//
import MVMCore
/// An object with properties for managing the alert.
public struct AlertObject {
/// Greedy alerts dismiss any other alerts and do not allow any other alerts to show until finished.
public var isGreedy = false
/// The alert model for the alert to show.
public var alertModel: AlertModel
public weak var alertDelegate: MVMCoreAlertDelegateProtocol?
public init(alertModel: AlertModel, isGreedy: Bool = false, alertDelegate: MVMCoreAlertDelegateProtocol? = nil) {
self.alertModel = alertModel
self.isGreedy = isGreedy
self.alertDelegate = alertDelegate
}
}

View File

@ -1,103 +0,0 @@
//
// MVMCoreAlertObject+Swift.swift
// MVMCore
//
// Created by Suresh, Kamlesh on 7/10/20.
// Copyright © 2020 myverizon. All rights reserved.
//
import MVMCore
/// An object with properties for managing the alert.
public struct AlertObject {
/// Greedy alerts dismiss any other alerts and do not allow any other alerts to show until finished.
public var isGreedy = false
/// The alert model for the alert to show.
public var alertModel: AlertModel
public weak var alertDelegate: MVMCoreAlertDelegateProtocol?
public init(alertModel: AlertModel, isGreedy: Bool = false, alertDelegate: MVMCoreAlertDelegateProtocol? = nil) {
self.alertModel = alertModel
self.isGreedy = isGreedy
self.alertDelegate = alertDelegate
}
}
//public extension MVMCoreAlertObject {
//
// static func alertObject(from alertModel: AlertModel, additionalData: [AnyHashable: Any]?, delegateObject: DelegateObject?, error: AutoreleasingUnsafeMutablePointer<MVMCoreErrorObject?>?) -> MVMCoreAlertObject? {
//
// let actionsForAlert = actions ?? generateActions(from: alertModel.alertActions, additionalData: additionalData, delegateObject: delegateObject)
//
// let alertObject = MVMCoreAlertObject(popupAlertWithTitle: alertModel.title,
// message: alertModel.message,
// actions: actionsForAlert,
// isGreedy: false)
//
// alertObject?.alertStyle = alertModel.style
// alertObject?.pageJson = alertModel.analyticsData
//
// return alertObject
// }
//
// static func generateActions(from buttonModels: [AlertButtonModel], additionalData: [AnyHashable: Any]?, delegateObject: DelegateObject?, additionalHandling: ((AlertButtonModel, UIAlertAction)->())? = nil) -> [UIAlertAction] {
// return buttonModels.map { alertButtonModel in
// let alertAction = UIAlertAction(title: alertButtonModel.title, style: alertButtonModel.style) { action in
// Task(priority: .userInitiated) {
// do {
// try await (delegateObject?.actionDelegate as? ActionDelegateProtocol)?.performAction(
// with: alertButtonModel.action,
// additionalData: additionalData,
// delegateObject: delegateObject
// )
// } catch {
//
// }
// additionalHandling?(alertButtonModel, action)
// }
// }
// return alertAction
// }
// }
//
// @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 {
// error?.pointee = MVMCoreErrorObject(title: nil, message: MVMCoreGetterUtility.hardcodedString(withKey: HardcodedErrorUnableToProcess), code: ErrorCode.popupFailed.rawValue, domain: ErrorDomainNative, location: String(describing: self))
// 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)
// }
// actionsForAlert.append(alertAction)
// }
//
// 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)
// }
//
// if let analyticsData = alertJson.optionalDictionaryForKey("analyticsData") {
// alertObject?.pageJson = ["analyticsData": analyticsData]
// }
//
// return alertObject
// }
//}

View File

@ -137,6 +137,20 @@ public class TopNotificationHandler {
// MARK: - Show and hide
public func isTopAlertShowing() -> Bool {
return queue.operations.first(where: { operation in
return operation.isExecuting
}) != nil
}
public func hasPersistentTopAlert(of type: String) -> Bool {
return queue.operations.first(where: { operation in
guard operation.isExecuting,
let operation = operation as? MVMCoreTopAlertOperation else { return false }
return operation.topAlertObject.persistent && operation.topAlertObject.type == type
}) as? MVMCoreTopAlertOperation == nil
}
/// Shows the top alert with the json.
func showTopNotification(with json: [AnyHashable: Any]) {
guard let model = decodeTopNotification(with: json, delegateObject: getDelegateObject()) else { return }
@ -176,14 +190,6 @@ public class TopNotificationHandler {
operation.cancel()
}
}
public func hasPersistentTopAlert(of type: String) -> Bool {
return queue.operations.first(where: { operation in
guard operation.isExecuting,
let operation = operation as? MVMCoreTopAlertOperation else { return false }
return operation.topAlertObject.persistent && operation.topAlertObject.type == type
}) as? MVMCoreTopAlertOperation == nil
}
/// Cancel all persistent operations of this type.
public func hidePersistentTopAlertView(of type: String) {
@ -196,6 +202,16 @@ public class TopNotificationHandler {
}
}
/// Finds an cancels top alerts associated with the object.
public func removeTopAlert(for object: MVMCoreTopAlertObject) {
for operation in queue.operations {
guard let operation = operation as? MVMCoreTopAlertOperation,
operation.topAlertObject === object else { return }
operation.reAddAfterCancel = false
operation.cancel()
}
}
public func removeAllTopAlerts() {
queue.cancelAllOperations()
}

View File

@ -60,7 +60,7 @@ public struct AlertButtonModel: Codable {
}
}
public struct AlertModel: Codable {
public struct AlertModel: Codable, Identifiable {
//--------------------------------------------------
// MARK: - Properties
//--------------------------------------------------
@ -71,25 +71,28 @@ public struct AlertModel: Codable {
public var actions: [UIAlertAction]
public var alertActions: [AlertButtonModel]?
public var analyticsData: JSONValueDictionary?
public var id: String
//--------------------------------------------------
// MARK: - Properties
//--------------------------------------------------
public init(title: String, message: String, actions: [UIAlertAction], style: UIAlertController.Style = .alert) {
public init(title: String, message: String, actions: [UIAlertAction], style: UIAlertController.Style = .alert, id: String = UUID().uuidString) {
self.title = title
self.message = message
self.actions = actions
self.style = style
self.id = id
}
public init(title: String, message: String, buttonModels: [AlertButtonModel], style: UIAlertController.Style = .alert, delegateObject: DelegateObject?) {
public init(title: String, message: String, buttonModels: [AlertButtonModel], style: UIAlertController.Style = .alert, delegateObject: DelegateObject?, id: String = UUID().uuidString) {
self.title = title
self.message = message
actions = buttonModels.map({ alertButtonModel in
return alertButtonModel.generateAction(delegateObject: delegateObject)
})
self.style = style
self.id = id
}
//--------------------------------------------------
@ -102,6 +105,7 @@ public struct AlertModel: Codable {
case alertActions
case style
case analyticsData
case id
}
//--------------------------------------------------
@ -122,6 +126,7 @@ public struct AlertModel: Codable {
if let style = try typeContainer.decodeIfPresent(String.self, forKey: .style) {
self.style = UIAlertController.Style(rawValue: style)
}
id = try typeContainer.decodeIfPresent(String.self, forKey: .id) ?? UUID().uuidString
}
public func encode(to encoder: Encoder) throws {
@ -131,6 +136,7 @@ public struct AlertModel: Codable {
try container.encodeIfPresent(alertActions, forKey: .alertActions)
try container.encode(style.rawValueString, forKey: .style)
try container.encodeIfPresent(analyticsData, forKey: .analyticsData)
try container.encode(id, forKey: .id)
}
}