Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2022-03-16 09:12:42 -05:00
parent a88a83e3ec
commit d7781c5532
7 changed files with 590 additions and 113 deletions

View File

@ -7,7 +7,7 @@
// //
import UIKit import UIKit
import MVMCoreUI import CoreTelephony
extension Decodable { extension Decodable {
static func map(JSONString:String) -> Self? { static func map(JSONString:String) -> Self? {
@ -68,12 +68,28 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele
} }
} }
self.register() self.register()
//getCT()
let json = ["actionType" : "trialFraudDeviceCheckGet"] let json = ["actionType" : WebViewBridgeTrialFraudUserGetModel.identifier]
self.testBridge(json: json) self.testBridge(json: json)
return true return true
} }
// func getCT() {
// let info: CTTelephonyNetworkInfo = CTTelephonyNetworkInfo()
// if #available(iOS 12.0, *) {
// for (service, carrier) in info.serviceSubscriberCellularProviders ?? [:] {
// print("\(service), \(carrier)")
// print(carrier.carrierName!)
// print(carrier.mobileCountryCode!)
// print(carrier.mobileNetworkCode!)
// print(carrier.isoCountryCode!)
// print(carrier.allowsVOIP)
// }
// } else {
// // Fallback on earlier versions
// }
// }
@objc func jsonPasteAndGo(_ sender: UILongPressGestureRecognizer) { @objc func jsonPasteAndGo(_ sender: UILongPressGestureRecognizer) {
if sender.state == .ended { if sender.state == .ended {
(dvc as? DetailViewController)?.textView.text = UIPasteboard.general.string (dvc as? DetailViewController)?.textView.text = UIPasteboard.general.string
@ -152,7 +168,7 @@ extension AppDelegate {
func register(){ func register(){
ModelRegistry.register(handler: WebViewBridgeTrialFraudDeviceCheckGet.self, for: WebViewBridgeTrialFraudDeviceCheckGetModel.self) ModelRegistry.register(handler: WebViewBridgeTrialFraudDeviceCheckGet.self, for: WebViewBridgeTrialFraudDeviceCheckGetModel.self)
//ModelRegistry.register(handler: WebViewBridgeTrialFraudUserSet.self, for: WebViewBridgeTrialFraudUserSetModel.self) //ModelRegistry.register(handler: WebViewBridgeTrialFraudUserSet.self, for: WebViewBridgeTrialFraudUserSetModel.self)
//ModelRegistry.register(handler: WebViewBridgeTrialFraudUserGet.self, for: WebViewBridgeTrialFraudUserGetModel.self) ModelRegistry.register(handler: WebViewBridgeTrialFraudUserGet.self, for: WebViewBridgeTrialFraudUserGetModel.self)
ModelRegistry.register(handler: EmailVerifyField.self, for: EmailVerifyModel.self) ModelRegistry.register(handler: EmailVerifyField.self, for: EmailVerifyModel.self)
ModelRegistry.register(handler: PillLabel.self, for: PillLabelModel.self) ModelRegistry.register(handler: PillLabel.self, for: PillLabelModel.self)
ModelRegistry.register(handler: SampleWebViewBridge.self, for: SampleWebViewBridgeModel.self) ModelRegistry.register(handler: SampleWebViewBridge.self, for: SampleWebViewBridgeModel.self)
@ -172,7 +188,6 @@ extension AppDelegate {
print("Thread isMain: \(Thread.isMainThread)") print("Thread isMain: \(Thread.isMainThread)")
anyHandler.perform(then: { result in anyHandler.perform(then: { result in
print("Thread isMain: \(Thread.isMainThread)") print("Thread isMain: \(Thread.isMainThread)")
let value = try? result.get()
switch result{ switch result{
case .success(let value): case .success(let value):
if let value = value { if let value = value {

View File

@ -0,0 +1,195 @@
{
"ResponseInfo": {
"locale": "EN",
"server": "10-74-170-83.ebiz.verizon.com-mf_prepayss01",
"code": "00000",
"hideNotificationLogo": false,
"message": "0",
"buildNumber": "6698",
"type": "Success",
"requestId": "dbb1ee17-69fe-464e-8a82-9563b83422ab",
"topAlertTime": 0
},
"Page": {
"navigationBar": {
"moleculeName": "navigationBar",
"title": "Account security"
},
"pageType": "tbd",
"cache": false,
"screenHeading": "Account security",
"template": "stack",
"header": {
"moleculeName": "header",
"molecule": {
"moleculeName": "headlineBody",
"headline": {
"moleculeName": "label",
"text": "Next up, let's secure this account."
},
"body": {
"moleculeName": "label",
"attributes": [
{
"topPadding": 30,
"length": 19,
"action": {
"actionType": "openPage",
"analyticsData": {
"vzdl.page.pageLinkName": "/mf/Manage Profile|Email Verify",
"vzdl.page.linkName": "Verify"
},
"pageType": "whyWeAskingAEMPR"
},
"location": 113,
"type": "action"
}
],
"text": "We'll use this PIN and security question for verification and help accessing the account. Make sure the PIN meets these requirements."
}
}
},
"stack": {
"moleculeName": "stack",
"molecules": [
{
"moleculeName": "stackItem",
"horizontalAlignment": "leading",
"molecule": {
"moleculeName": "digitTextField",
"editable": true,
"title": "Account security PIN",
"digits": 4,
"fieldKey": "securityPIN"
}
},
{
"moleculeName": "stackItem",
"horizontalAlignment": "leading",
"molecule": {
"moleculeName": "digitTextField",
"editable": true,
"title": "Confirm account security PIN",
"type": "secure",
"digits": 4,
"fieldKey": "confirmSecurityPIN"
}
},
{
"moleculeName": "stackItem",
"molecule": {
"moleculeName": "dropDown",
"fieldKey": "securityQuestion",
"title": "Security question",
"options": [
"What was the first live concert you attended?",
"Where did you and your spouse first meet?",
"What was your favorite place to visit as a child?",
"What was the first name of your first roommate?",
"What is the name of a memorable place?",
"What is the first name of your best friend?",
"What was your favorite restaurant in college?"
],
"selectedIndex": 0
}
},
{
"moleculeName": "stackItem",
"molecule": {
"moleculeName": "textField",
"title": "Security answer",
"type": "text",
"fieldKey": "securityAnswer"
}
},
{
"moleculeName": "stackItem",
"molecule": {
"moleculeName": "label",
"text": "Be sure to remember these details. They'll be needed to access the account later."
}
}
]
},
"footer": {
"moleculeName": "footer",
"molecule": {
"moleculeName": "twoButtonView",
"primaryButton": {
"groupName": "default",
"moleculeName": "button",
"title": "Next",
"action": {
"analyticsData": {
"vzdl.page.linkName": "Legal Disclosure"
},
"fieldKey": "next",
"actionType": "openPage",
"extraParameters": {
"from": "none"
},
"presentationStyle": "push",
"pageType": "legalDisclosurePR"
}
}
}
},
"formRules": [
{
"groupName": "default",
"rules": [
{
"regex": "^(?!.*0123|.*1234|.*2345|.*3456|.*4567|.*5678|.*6789|.*3210|.*4321|.*5432|.*6543|.*7654|.*8765|.*9876|.*0000|.*1111|.*2222|.*3333|.*4444|.*5555|.*6666|.*7777|.*8888|.*9999).*$",
"type": "regex",
"fields": [
"securityPIN"
],
"errorMessage": {
"securityPIN": "Your PIN can't have numbers in order or repeating."
}
},
{
"type": "equals",
"fields": [
"securityPIN",
"confirmSecurityPIN"
],
"errorMessage": {
"confirmSecurityPIN": "Your account PIN entries don't match. Try again."
}
},
{
"type": "regex",
"regex": "^[A-Za-z0-9 ]{3,10}$",
"fields": [
"securityAnswer"
],
"errorMessage": {
"securityAnswer": "Your security answer can only letters, numbers, spaces, and periods."
}
},
{
"type": "regex",
"regex": "^.{3,10}$",
"fields": [
"securityAnswer"
],
"errorMessage": {
"securityAnswer": "Your answer must be between 3-10 characters."
}
},
{
"type": "allRequired",
"ruleId": "requiredRule",
"fields": [
"securityPIN",
"confirmSecurityPIN",
"securityAnswer"
]
}
]
}
]
}
}

View File

@ -0,0 +1,133 @@
{
"ResponseInfo": {
"locale": "EN",
"server": "10-74-170-83.ebiz.verizon.com-mf_prepayss01",
"code": "00000",
"hideNotificationLogo": false,
"message": "0",
"buildNumber": "6698",
"type": "Success",
"requestId": "dbb1ee17-69fe-464e-8a82-9563b83422ab",
"topAlertTime": 0
},
"Page": {
"navigationBar": {
"moleculeName": "navigationBar",
"title": "Account security"
},
"pageType": "tbd",
"cache": false,
"screenHeading": "Account security",
"template": "stack",
"stack": {
"moleculeName": "stack",
"molecules": [
{
"moleculeName": "stackItem",
"horizontalAlignment": "leading",
"molecule": {
"moleculeName": "digitTextField",
"editable": true,
"title": "Account security PIN",
"digits": 4,
"fieldKey": "securityPIN"
}
},
{
"moleculeName": "stackItem",
"horizontalAlignment": "leading",
"molecule": {
"moleculeName": "digitTextField",
"editable": true,
"title": "Confirm account security PIN",
"type": "text",
"digits": 4,
"fieldKey": "confirmSecurityPIN"
}
},
{
"moleculeName": "stackItem",
"molecule": {
"moleculeName": "textField",
"fieldKey": "preferredFirstName",
"type": "text",
"text": "",
"errorMessage": "Please enter a valid first name.",
"title": "Preferred First Name",
"feedback": "This will replace greeting name if you have one.",
"required": false
}
}
]
},
"footer": {
"moleculeName": "footer",
"molecule": {
"moleculeName": "twoButtonView",
"primaryButton": {
"groupName": "default",
"moleculeName": "button",
"title": "Next",
"action": {
"analyticsData": {
"vzdl.page.linkName": "Legal Disclosure"
},
"fieldKey": "next",
"actionType": "openPage",
"extraParameters": {
"from": "none"
},
"presentationStyle": "push",
"pageType": "legalDisclosurePR"
}
}
}
},
"formRules": [
{
"groupName": "default",
"rules": [
{
"regex": "^[0-6]{0,4}$",
"type": "regex",
"fields": [
"securityPIN"
],
"errorMessage": {
"securityPIN": "Your PIN can't have numbers in order or repeating."
}
},
{
"type": "equals",
"fields": [
"securityPIN",
"confirmSecurityPIN"
],
"errorMessage": {
"confirmSecurityPIN": "Your account PIN entries don't match. Try again."
}
},
{
"regex": "^[0-9a-zA-Z@\\.\\-\\_?]{0,25}$",
"ruleId": "anyAlphaNumeric",
"errorMessage": {
"preferredFirstName": "Only use for First Name"
},
"type": "regex",
"fields": [
"preferredFirstName"
]
},
{
"type": "allRequired",
"ruleId": "requiredRule",
"fields": [
"securityPIN",
"confirmSecurityPIN"
]
}
]
}
]
}
}

View File

@ -162,7 +162,7 @@
] ]
}, },
{ {
"type": "equals", "type": "equalsIgnoreCase",
"ruleId": "passwordsEqual", "ruleId": "passwordsEqual",
"fields": [ "fields": [
"password", "password",

View File

@ -0,0 +1,142 @@
{
"ResponseInfo": {
"locale": "EN",
"server": "10-74-165-96.ebiz.verizon.com-mf_prepayss01",
"userMessage": "0",
"code": "00000",
"hideNotificationLogo": false,
"message": "0",
"buildNumber": "124",
"type": "Success",
"requestId": "2094e7b7-0325-4ca5-93a0-6462b99eb4fa",
"topAlertTime": 0
},
"Page": {
"analyticsData": {
"vzdl.page.flow": "account",
"vzwi.mvmapp.pageType": "planDetailsAEMPR",
"vzdl.page.subFlow": "plan details",
"vzdl.page.name": "/mf/account/prepaid plans/explore plans/plan details"
},
"footer": {
"moleculeName": "footer",
"molecule": {
"moleculeName": "twoButtonView",
"primaryButton": {
"moleculeName": "button",
"action": {
"appContext": "mfPrepaySS",
"analyticsData": {
"vzdl.page.linkName": "Next"
},
"actionType": "openPage",
"presentationStyle": "push",
"pageType": "tbd"
},
"title": "Next",
"groupName": "default"
}
}
},
"stack": {
"moleculeName": "stack",
"molecules": [
{
"moleculeName": "stackItem",
"molecule": {
"moleculeName": "label",
"text": "First name"
}
},
{
"spacing": 0,
"moleculeName": "stackItem",
"molecule": {
"moleculeName": "textField",
"fieldKey": "Firstname",
"text": "",
"type": "text"
}
},
{
"moleculeName": "stackItem",
"molecule": {
"moleculeName": "label",
"text": "Last name"
}
},
{
"spacing": 0,
"moleculeName": "stackItem",
"molecule": {
"moleculeName": "textField",
"fieldKey": "Lastname",
"text": "",
"type": "text"
}
}
]
},
"formRules": [
{
"groupName": "default",
"rules": [
{
"regex": "^[a-zA-Z0-9._ ]{0,10}$",
"type": "regex",
"fields": [
"Firstname",
"Lastname"
],
"errorMessage": {
"Firstname": "Your first name can only letters, numbers, spaces, and periods.",
"Lastname": "Your last name can only letters, numbers, spaces, and periods."
}
},
{
"fields": [
"Firstname",
"Lastname"
],
"type": "regex",
"regex": "^.{3,10}$",
"errorMessage": {
"Firstname":"Your first name must be between 3-10 characters.",
"Lastname": "Your last name must be between 3-10 characters."
}
},
{
"type": "allRequired",
"ruleId": "requiredRule",
"fields": [
"Firstname",
"Lastname"
]
}
]
}
],
"pageType": "tbd",
"cache": false,
"screenHeading": "New device Profile",
"header": {
"moleculeName": "header",
"molecule": {
"moleculeName": "headlineBody",
"headline": {
"moleculeName": "label",
"text": "Who will be using this device?"
},
"body": {
"moleculeName": "label",
"text": "We'll use these details to set up this account."
}
}
},
"template": "stack",
"navigationBar": {
"moleculeName": "navigationBar",
"title": "New device Profile"
}
}
}

View File

@ -1,75 +1,67 @@
////
//// WebviewBridgeTrialFraudUserGet.swift
//// MobileFirstFramework
////
//// Created by Matt Bruce on 2/1/22.
//// Copyright © 2022 Verizon Wireless. All rights reserved.
////
// //
//import Foundation // WebviewBridgeTrialFraudUserGet.swift
//import MVMCore // MobileFirstFramework
// //
//extension WebViewBridgeError { // Created by Matt Bruce on 2/1/22.
// static var userCheckICloudNotAvailable = Self.other(code: 150, message: "usercheck_icloud_not_available") // Copyright © 2022 Verizon Wireless. All rights reserved.
// static var userCheckUserDecode = Self.other(code: 151, message: "usercheck_data_decode")
// static var userCheckUserEncode = Self.other(code: 152, message: "usercheck_data_encode")
// static var userCheckUserSynchronization = Self.other(code: 153, message: "usercheck_data_synchronize")
//}
// //
//final class WebViewBridgeTrialFraudUserGet: WebViewBridgeHandlerProtocol {
// import Foundation
// typealias Model = WebViewBridgeTrialFraudUserGetModel import MVMCore
// typealias ViewController = CoreViewControllerable
// extension WebViewBridgeError {
// //properties static var userCheckICloudNotAvailable = Self.other(code: 150, message: "usercheck_icloud_not_available")
// public var bridgeModel: Model! static var userCheckUserDecode = Self.other(code: 151, message: "usercheck_data_decode")
// public var completionHandler: (([String : Any]?) -> Void)! static var userCheckUserEncode = Self.other(code: 152, message: "usercheck_data_encode")
// public weak var viewController: ViewController? static var userCheckUserSynchronization = Self.other(code: 153, message: "usercheck_data_synchronize")
// }
// func runBridgeAction() {
// final class WebViewBridgeTrialFraudUserGet: WebViewBridgeHandler<WebViewBridgeTrialFraudUserGetModel, CoreViewControllerable> {
// //current user state, default is iCloud not available
// //therefore if bridgeModel.isICloudAvaiable() == false override func perform() {
// //then this state is sent back in the "sendSuccess" and
// //this method will NEVER do a "sendError" unless the baseClass throws one //current user state, default is iCloud not available
// var state: TrialFraudUserState = .notAvail //therefore if bridgeModel.isICloudAvaiable() == false
// //then this state is sent back in the "sendSuccess" and
// //return dictionary //this method will NEVER do a "sendError" unless the baseClass throws one
// var result: JSONDictionary = [:] var state: TrialFraudUserState = .notAvail
//
// //ensure that iCloud is available for current user //return dictionary
// if bridgeModel.isICloudAvaiable() { var result: JSONDictionary = [:]
//
// //keyValueStore hooked up to the user's iCloud account //ensure that iCloud is available for current user
// let keyValStore = NSUbiquitousKeyValueStore() if model.isICloudAvaiable() {
//
// //see if there is an existing object set for this user's iCloud account //keyValueStore hooked up to the user's iCloud account
// if let fraudUserData = keyValStore.data(forKey: TrialFraudUser.key) { let keyValStore = NSUbiquitousKeyValueStore()
//
// //decode the data into a object //see if there is an existing object set for this user's iCloud account
// guard let fraudUser: TrialFraudUser = try? fraudUserData.decode() else { if let fraudUserData = keyValStore.data(forKey: TrialFraudUser.key) {
// sendError(for: .userCheckUserDecode)
// return //decode the data into a object
// } guard let fraudUser: TrialFraudUser = try? fraudUserData.decode() else {
// sendError(for: .userCheckUserDecode)
// //current user state is "Set" since there is an existing value return
// //and the user does have iCloud available }
// state = .set
// //get the saved identifier out of the object within iCloud //current user state is "Set" since there is an existing value
// result["userIdentifier"] = fraudUser.identifier //and the user does have iCloud available
// state = .set
// } else { //get the saved identifier out of the object within iCloud
// result["userIdentifier"] = fraudUser.identifier
// //current user state is "Not Set" since there is NOT an existing value
// //and the user does have iCloud available } else {
// state = .notSet
// } //current user state is "Not Set" since there is NOT an existing value
// } //and the user does have iCloud available
// state = .notSet
// //set the state string value }
// result["state"] = state.rawValue }
//
// //execute the completionHandler on the main thread //set the state string value
// sendSuccess(for: result) result["state"] = state.rawValue
// }
//} //execute the completionHandler on the main thread
sendSuccess(for: result)
}
}

View File

@ -1,38 +1,38 @@
////
//// WebviewBridgeTrialFraudUserGetModel.swift
//// MobileFirstFramework
////
//// Created by Matt Bruce on 2/1/22.
//// Copyright © 2022 Verizon Wireless. All rights reserved.
////
// //
//import Foundation // WebviewBridgeTrialFraudUserGetModel.swift
// MobileFirstFramework
// //
//struct TrialFraudUser: Codable { // Created by Matt Bruce on 2/1/22.
// static var key: String { return "trialFraudUser" } // Copyright © 2022 Verizon Wireless. All rights reserved.
// let identifier: String
// let date: Date
//}
// //
//enum TrialFraudUserState: String, Encodable {
// case notAvail = "Not Available" import Foundation
// case notSet = "Not Set"
// case set = "Set" struct TrialFraudUser: Codable {
//} static var key: String { return "trialFraudUser" }
// let identifier: String
//protocol TrialFraudUserModelProtocol {} let date: Date
// }
//extension TrialFraudUserModelProtocol {
// func isICloudAvaiable() -> Bool { enum TrialFraudUserState: String, Encodable {
// guard let _ = FileManager.default.ubiquityIdentityToken else { case notAvail = "Not Available"
// return false case notSet = "Not Set"
// } case set = "Set"
// return true }
// }
//} protocol TrialFraudUserModelProtocol {}
//
//class WebViewBridgeTrialFraudUserGetModel: WebviewBridgeModelProtocol, TrialFraudUserModelProtocol { extension TrialFraudUserModelProtocol {
// func isICloudAvaiable() -> Bool {
// static var identifier: String = "trialFraudUserCheckGet" guard let _ = FileManager.default.ubiquityIdentityToken else {
// var jsCallback: String? return false
//} }
return true
}
}
class WebViewBridgeTrialFraudUserGetModel: WebviewBridgeModelProtocol, TrialFraudUserModelProtocol {
static var identifier: String = "trialFraudUserCheckGet"
var jsCallback: String?
}