From a88a83e3ec0fd18fd9dc183c8509aede915bbaa7 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Thu, 3 Mar 2022 16:26:15 -0600 Subject: [PATCH] added filed Signed-off-by: Matt Bruce --- .../JSONCreator.xcodeproj/project.pbxproj | 92 ++- JSONCreator_iOS/JSONCreator/AppDelegate.swift | 319 +++++++- .../JSON/Samples/DropDownListHidden.json | 197 +++++ .../JSON/Samples/FormContactInfo.json | 50 +- .../JSON/Samples/FormEnabledChain.json | 38 +- .../JSON/Samples/FormPronouns-1.json | 114 +-- .../JSON/Samples/FormPronouns-2.json | 751 +++++++++++++++--- .../JSON/Samples/MVA3.0/Testing.json | 551 +++++++++++++ .../Samples/SampleWebViewNativeBridge.json | 33 + .../JSONCreator/JSON/Samples/Testing.json | 235 ------ .../JSON/Samples/Zenkey-editprofile.json | 168 ++++ .../Core/WebViewBridgeError.swift | 35 + .../Core/WebViewBridgeErrorModel.swift | 20 + .../Core/WebViewBridgeHandler.swift | 109 +++ .../Core/WebViewBridgeProtocol.swift | 34 + .../Core/WebViewBridgeResponseModel.swift | 18 + .../Core/WebviewBridgeModelProtocol.swift | 39 + ...ebViewBridgeTrialFraudDeviceCheckGet.swift | 73 ++ ...wBridgeTrialFraudDeviceCheckGetModel.swift | 16 + ...ebViewBridgeTrialFraudDeviceCheckSet.swift | 86 ++ ...wBridgeTrialFraudDeviceCheckSetModel.swift | 16 + .../WebViewBridgeTrialFraudUserGet.swift | 75 ++ .../WebViewBridgeTrialFraudUserGetModel.swift | 38 + .../WebViewBridgeTrialFraudUserSet.swift | 57 ++ .../WebViewBridgeTrialFraudUserSetModel.swift | 16 + 25 files changed, 2727 insertions(+), 453 deletions(-) create mode 100644 JSONCreator_iOS/JSONCreator/JSON/Samples/DropDownListHidden.json create mode 100644 JSONCreator_iOS/JSONCreator/JSON/Samples/MVA3.0/Testing.json create mode 100644 JSONCreator_iOS/JSONCreator/JSON/Samples/SampleWebViewNativeBridge.json delete mode 100644 JSONCreator_iOS/JSONCreator/JSON/Samples/Testing.json create mode 100644 JSONCreator_iOS/JSONCreator/JSON/Samples/Zenkey-editprofile.json create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeError.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeErrorModel.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeHandler.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeProtocol.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeResponseModel.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebviewBridgeModelProtocol.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckGet.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckGetModel.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckSet.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckSetModel.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserGet.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserGetModel.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserSet.swift create mode 100644 JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserSetModel.swift diff --git a/JSONCreator_iOS/JSONCreator.xcodeproj/project.pbxproj b/JSONCreator_iOS/JSONCreator.xcodeproj/project.pbxproj index 3b29429..d324af4 100644 --- a/JSONCreator_iOS/JSONCreator.xcodeproj/project.pbxproj +++ b/JSONCreator_iOS/JSONCreator.xcodeproj/project.pbxproj @@ -46,6 +46,20 @@ EA7E676C27582F2200ABF773 /* MVMCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = EA7E676927582F2200ABF773 /* MVMCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; EA7E676D27582F2200ABF773 /* MVMCoreUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA7E676A27582F2200ABF773 /* MVMCoreUI.framework */; }; EA7E676E27582F2200ABF773 /* MVMCoreUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = EA7E676A27582F2200ABF773 /* MVMCoreUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + EA85888F27C696AB00D44BAC /* WebViewBridgeProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85887C27C696AB00D44BAC /* WebViewBridgeProtocol.swift */; }; + EA85889027C696AB00D44BAC /* WebViewBridgeErrorModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85887D27C696AB00D44BAC /* WebViewBridgeErrorModel.swift */; }; + EA85889127C696AB00D44BAC /* WebViewBridgeResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85887E27C696AB00D44BAC /* WebViewBridgeResponseModel.swift */; }; + EA85889227C696AB00D44BAC /* WebviewBridgeModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85887F27C696AB00D44BAC /* WebviewBridgeModelProtocol.swift */; }; + EA85889427C696AB00D44BAC /* WebViewBridgeError.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85888127C696AB00D44BAC /* WebViewBridgeError.swift */; }; + EA85889527C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckGet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85888327C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckGet.swift */; }; + EA85889627C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckGetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85888427C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckGetModel.swift */; }; + EA85889727C696AB00D44BAC /* WebViewBridgeTrialFraudUserGet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85888527C696AB00D44BAC /* WebViewBridgeTrialFraudUserGet.swift */; }; + EA85889827C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85888627C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckSet.swift */; }; + EA85889927C696AB00D44BAC /* WebViewBridgeTrialFraudUserSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85888727C696AB00D44BAC /* WebViewBridgeTrialFraudUserSet.swift */; }; + EA85889A27C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckSetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85888827C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckSetModel.swift */; }; + EA85889C27C696AB00D44BAC /* WebViewBridgeTrialFraudUserSetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85888A27C696AB00D44BAC /* WebViewBridgeTrialFraudUserSetModel.swift */; }; + EA8588A027C696AB00D44BAC /* WebViewBridgeTrialFraudUserGetModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA85888E27C696AB00D44BAC /* WebViewBridgeTrialFraudUserGetModel.swift */; }; + EA8588A227C6A67500D44BAC /* WebViewBridgeHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA8588A127C6A67500D44BAC /* WebViewBridgeHandler.swift */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -91,6 +105,22 @@ D2FC4FAC25897ACB00061EA4 /* OrderTracker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OrderTracker.swift; sourceTree = ""; }; EA7E676927582F2200ABF773 /* MVMCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MVMCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EA7E676A27582F2200ABF773 /* MVMCoreUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MVMCoreUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EA85887C27C696AB00D44BAC /* WebViewBridgeProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeProtocol.swift; sourceTree = ""; }; + EA85887D27C696AB00D44BAC /* WebViewBridgeErrorModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeErrorModel.swift; sourceTree = ""; }; + EA85887E27C696AB00D44BAC /* WebViewBridgeResponseModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeResponseModel.swift; sourceTree = ""; }; + EA85887F27C696AB00D44BAC /* WebviewBridgeModelProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebviewBridgeModelProtocol.swift; sourceTree = ""; }; + EA85888127C696AB00D44BAC /* WebViewBridgeError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeError.swift; sourceTree = ""; }; + EA85888327C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckGet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeTrialFraudDeviceCheckGet.swift; sourceTree = ""; }; + EA85888427C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckGetModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeTrialFraudDeviceCheckGetModel.swift; sourceTree = ""; }; + EA85888527C696AB00D44BAC /* WebViewBridgeTrialFraudUserGet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeTrialFraudUserGet.swift; sourceTree = ""; }; + EA85888627C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeTrialFraudDeviceCheckSet.swift; sourceTree = ""; }; + EA85888727C696AB00D44BAC /* WebViewBridgeTrialFraudUserSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeTrialFraudUserSet.swift; sourceTree = ""; }; + EA85888827C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckSetModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeTrialFraudDeviceCheckSetModel.swift; sourceTree = ""; }; + EA85888A27C696AB00D44BAC /* WebViewBridgeTrialFraudUserSetModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeTrialFraudUserSetModel.swift; sourceTree = ""; }; + EA85888E27C696AB00D44BAC /* WebViewBridgeTrialFraudUserGetModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewBridgeTrialFraudUserGetModel.swift; sourceTree = ""; }; + EA8588A127C6A67500D44BAC /* WebViewBridgeHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewBridgeHandler.swift; sourceTree = ""; }; + EA8588BE27C827E000D44BAC /* Lottie.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Lottie.xcframework; path = ../SharedFrameworks/Lottie.xcframework; sourceTree = ""; }; + EA8588BF27C827E000D44BAC /* UnifiedSplashScreen.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = UnifiedSplashScreen.xcframework; path = ../SharedFrameworks/UnifiedSplashScreen.xcframework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -137,6 +167,7 @@ D2B1E3F122F4A68F0065F95C /* JSONCreator */ = { isa = PBXGroup; children = ( + EA5FFBED27B2EA2C008A1B82 /* NativeBridge */, D288D69B26CAE26900A5C365 /* MF */, D2B1E40922F4C9F00065F95C /* JSON */, D2B1E3F222F4A68F0065F95C /* AppDelegate.swift */, @@ -153,6 +184,8 @@ D2B1E42A22F9D0D90065F95C /* Frameworks */ = { isa = PBXGroup; children = ( + EA8588BE27C827E000D44BAC /* Lottie.xcframework */, + EA8588BF27C827E000D44BAC /* UnifiedSplashScreen.xcframework */, EA7E676927582F2200ABF773 /* MVMCore.framework */, EA7E676A27582F2200ABF773 /* MVMCoreUI.framework */, D2B1E51C22FA0DF50065F95C /* MVMCore.framework */, @@ -179,6 +212,43 @@ path = "Order Tracker"; sourceTree = ""; }; + EA5FFBED27B2EA2C008A1B82 /* NativeBridge */ = { + isa = PBXGroup; + children = ( + EA85887B27C696AB00D44BAC /* Core */, + EA85888227C696AB00D44BAC /* Trial */, + ); + path = NativeBridge; + sourceTree = ""; + }; + EA85887B27C696AB00D44BAC /* Core */ = { + isa = PBXGroup; + children = ( + EA85888127C696AB00D44BAC /* WebViewBridgeError.swift */, + EA85887D27C696AB00D44BAC /* WebViewBridgeErrorModel.swift */, + EA8588A127C6A67500D44BAC /* WebViewBridgeHandler.swift */, + EA85887F27C696AB00D44BAC /* WebviewBridgeModelProtocol.swift */, + EA85887C27C696AB00D44BAC /* WebViewBridgeProtocol.swift */, + EA85887E27C696AB00D44BAC /* WebViewBridgeResponseModel.swift */, + ); + path = Core; + sourceTree = ""; + }; + EA85888227C696AB00D44BAC /* Trial */ = { + isa = PBXGroup; + children = ( + EA85888327C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckGet.swift */, + EA85888427C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckGetModel.swift */, + EA85888627C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckSet.swift */, + EA85888827C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckSetModel.swift */, + EA85888527C696AB00D44BAC /* WebViewBridgeTrialFraudUserGet.swift */, + EA85888E27C696AB00D44BAC /* WebViewBridgeTrialFraudUserGetModel.swift */, + EA85888727C696AB00D44BAC /* WebViewBridgeTrialFraudUserSet.swift */, + EA85888A27C696AB00D44BAC /* WebViewBridgeTrialFraudUserSetModel.swift */, + ); + path = Trial; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -212,6 +282,7 @@ TargetAttributes = { D2B1E3EE22F4A68F0065F95C = { CreatedOnToolsVersion = 10.3; + LastSwiftMigration = 1320; }; D2B1E43722F9F84E0065F95C = { CreatedOnToolsVersion = 10.3; @@ -279,19 +350,33 @@ buildActionMask = 2147483647; files = ( D2B1E3F722F4A68F0065F95C /* DetailViewController.swift in Sources */, + EA85889827C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckSet.swift in Sources */, D27564CA25939E91003CA713 /* LinksModel.swift in Sources */, + EA85889727C696AB00D44BAC /* WebViewBridgeTrialFraudUserGet.swift in Sources */, D2B1E3F522F4A68F0065F95C /* MasterViewController.swift in Sources */, + EA8588A227C6A67500D44BAC /* WebViewBridgeHandler.swift in Sources */, D27564B62590FADB003CA713 /* ListDeviceRightVariableCaretModel.swift in Sources */, D27564B72590FADB003CA713 /* ListDeviceRightVariableCaret.swift in Sources */, + EA85889427C696AB00D44BAC /* WebViewBridgeError.swift in Sources */, + EA85889627C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckGetModel.swift in Sources */, + EA85889227C696AB00D44BAC /* WebviewBridgeModelProtocol.swift in Sources */, D2431DEB25E93A4F001C7AAC /* buttimag.swift in Sources */, D27564C825939E91003CA713 /* LinkCollectionViewCell.swift in Sources */, D2FC4FB025897ACB00061EA4 /* OrderTracker.swift in Sources */, D27564C925939E91003CA713 /* Links.swift in Sources */, + EA85889527C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckGet.swift in Sources */, D2FC4FAE25897ACB00061EA4 /* OrderTrackerModel.swift in Sources */, D21B3A27259B93ED001483DC /* SelfSizingCollectionView.swift in Sources */, + EA85889A27C696AB00D44BAC /* WebViewBridgeTrialFraudDeviceCheckSetModel.swift in Sources */, D2B1E3F322F4A68F0065F95C /* AppDelegate.swift in Sources */, + EA85889127C696AB00D44BAC /* WebViewBridgeResponseModel.swift in Sources */, + EA8588A027C696AB00D44BAC /* WebViewBridgeTrialFraudUserGetModel.swift in Sources */, + EA85889927C696AB00D44BAC /* WebViewBridgeTrialFraudUserSet.swift in Sources */, + EA85889027C696AB00D44BAC /* WebViewBridgeErrorModel.swift in Sources */, + EA85889C27C696AB00D44BAC /* WebViewBridgeTrialFraudUserSetModel.swift in Sources */, D29C557825BF1F340082E7D6 /* JSONCreatorActionHandler.swift in Sources */, D2FC4FAD25897ACB00061EA4 /* StepModel.swift in Sources */, + EA85888F27C696AB00D44BAC /* WebViewBridgeProtocol.swift in Sources */, D2FC4FAF25897ACB00061EA4 /* Step.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -438,6 +523,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = FCMA4QKS77; FRAMEWORK_SEARCH_PATHS = ( @@ -445,13 +531,14 @@ "$(PROJECT_DIR)/../SharedFrameworks", ); INFOPLIST_FILE = JSONCreator/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = com.vzw.JSONCreator; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_WORKSPACE = NO; @@ -462,6 +549,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = FCMA4QKS77; FRAMEWORK_SEARCH_PATHS = ( @@ -469,7 +557,7 @@ "$(PROJECT_DIR)/../SharedFrameworks", ); INFOPLIST_FILE = JSONCreator/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/JSONCreator_iOS/JSONCreator/AppDelegate.swift b/JSONCreator_iOS/JSONCreator/AppDelegate.swift index 2ee61fb..ce55d94 100644 --- a/JSONCreator_iOS/JSONCreator/AppDelegate.swift +++ b/JSONCreator_iOS/JSONCreator/AppDelegate.swift @@ -9,6 +9,19 @@ import UIKit import MVMCoreUI +extension Decodable { + static func map(JSONString:String) -> Self? { + do { + let decoder = JSONDecoder() + decoder.keyDecodingStrategy = .convertFromSnakeCase + return try decoder.decode(Self.self, from: Data(JSONString.utf8)) + } catch let error { + print(error) + return nil + } + } +} + @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate { @@ -23,13 +36,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele CoreUIObject.sharedInstance()?.defaultInitialSetup() CoreUIObject.sharedInstance()?.globalTopAlertDelegate = self - // MVMCoreCache.shared()?.addPage(toCache: [KeyPageType:"videotest","template":"stack","header":[KeyMoleculeName:"header","molecule":["moleculeName":"twoButtonView","primaryButton":["moleculeName":"button","title":"back","action":[KeyActionType:KeyActionTypeBack]],"secondaryButton":["moleculeName":"button","title":"open","action":[KeyActionType:KeyActionTypeOpen,KeyPageType:"planSelectionPageType"]]]],"stack":[KeyMoleculeName:"stack","molecules":[]]], pageType: "videotest") - // - // let path = Bundle.main.path(forResource: "Testing3", ofType: "json")! - // let string = try! String(contentsOfFile: path, encoding: .utf8) - // let dict: [AnyHashable: Any] = try! JSONSerialization.jsonObject(with: string.data(using: .utf8)!, options: .fragmentsAllowed) as! [AnyHashable: Any] - // let page: [AnyHashable: Any] = dict[KeyPage] as! [AnyHashable: Any] - // MVMCoreCache.shared()?.addPage(toCache: page, pageType: page[KeyPageType]! as! String) + return true } @@ -61,6 +68,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele } } self.register() + + let json = ["actionType" : "trialFraudDeviceCheckGet"] + self.testBridge(json: json) return true } @@ -127,9 +137,178 @@ extension AppDelegate: MVMCoreGlobalTopAlertDelegateProtocol { } } +extension Result{ + public func get() throws -> Success { + switch self { + case .success(let value): + return value + case .failure(let error): + throw error + } + } +} + extension AppDelegate { func register(){ + ModelRegistry.register(handler: WebViewBridgeTrialFraudDeviceCheckGet.self, for: WebViewBridgeTrialFraudDeviceCheckGetModel.self) + //ModelRegistry.register(handler: WebViewBridgeTrialFraudUserSet.self, for: WebViewBridgeTrialFraudUserSetModel.self) + //ModelRegistry.register(handler: WebViewBridgeTrialFraudUserGet.self, for: WebViewBridgeTrialFraudUserGetModel.self) ModelRegistry.register(handler: EmailVerifyField.self, for: EmailVerifyModel.self) + ModelRegistry.register(handler: PillLabel.self, for: PillLabelModel.self) + ModelRegistry.register(handler: SampleWebViewBridge.self, for: SampleWebViewBridgeModel.self) + } + + func testBridge(json: [String: Any]){ + do { + let bridgeModel = try ModelRegistry.getBridgeModelForJSON(json) + MVMCoreLoggingHandler.logDebugMessage(withDelegate: "Webview bridge JSON: \(String(describing: bridgeModel.toJSONString()))") + let bridgeType = try ModelRegistry.getHandler(bridgeModel) as! WebViewBridgeProtocol.Type + let bridge = try bridgeType.init(baseModel: bridgeModel, + requestId: UUID().uuidString, + viewController: nil) + + let anyHandler = bridge.eraseToAnyHandler() + MVMCoreDispatchUtility.performBlock(inBackground: { + print("Thread isMain: \(Thread.isMainThread)") + anyHandler.perform(then: { result in + print("Thread isMain: \(Thread.isMainThread)") + let value = try? result.get() + switch result{ + case .success(let value): + if let value = value { + print(value) + } else { + print("empty dictionary") + } + case .failure(_): + print("error") + } + }) + }) + + } catch { + print(error.localizedDescription) + } + } + + func testJSONValue(){ +// let json = """ +// { +// "name" : "Matt", +// "params": { +// "stringKey": "Blah", +// "doubleKey": 1.02, +// "intKey": 105, +// "boolKey": true, +// "arrayKey": ["val1","val2", "val3"], +// "objectKey": { "foo": "fooName" } +// } +// } +// """ +// +// struct Test: Decodable { +// var name: String +// var params: JSONValueDictionary +// } +// +// +// if let test = Test.map(JSONString: json) { +// +// func debug(key: String, value: Any?){ +// print("\(key): \(value!) type:\(type(of: value!))") +// } +// do { +// let stringKey: String = try test.params["stringKey"]!.value() +// let doubleKey: Double = try test.params["doubleKey"]!.value() +// let intKey: Int = try test.params["intKey"]!.value() +// let boolKey: Bool = try test.params["boolKey"]!.value() +// let arrayKey: [String] = try test.params["arrayKey"]!.value() +// let objectKey: [String: Any] = try test.params["objectKey"]!.value() +// +// print("Using Value") +// debug(key: "stringKey", value: stringKey) +// debug(key: "doubleKey", value: doubleKey) +// debug(key: "intKey", value: intKey) +// debug(key: "boolKey", value: boolKey) +// debug(key: "arrayKey", value: arrayKey) +// debug(key: "objectKey", value: objectKey) +// print("") +// +// print("Using baseValue") +// let bstringKey = test.params["stringKey"]?.base as? String +// let bdoubleKey = test.params["doubleKey"]?.base as? Double +// let bintKey = test.params["intKey"]?.base as? Int +// let bboolKey = test.params["boolKey"]?.base as? Bool +// let barrayKey = test.params["arrayKey"]?.base as? [String] +// let bobjectKey = test.params["objectKey"]?.base as? [String: Any] +// debug(key: "stringKey", value: bstringKey) +// debug(key: "doubleKey", value: bdoubleKey) +// debug(key: "intKey", value: bintKey) +// debug(key: "boolKey", value: bboolKey) +// debug(key: "arrayKey", value: barrayKey) +// debug(key: "objectKey", value: bobjectKey) +// print("") +// +// print("Using toMethod") +// let cstringKey = try test.params["stringKey"]?.toString() +// let cdoubleKey = try test.params["doubleKey"]?.toDouble() +// let cintKey = try test.params["intKey"]?.toInt() +// let cboolKey = try test.params["boolKey"]?.toBool() +// let carrayKey = try test.params["arrayKey"]?.toArray(of: String.self) +// let cobjectKey = try test.params["objectKey"]?.toObject(of: [String: Any].self) +// debug(key: "stringKey", value: cstringKey) +// debug(key: "doubleKey", value: cdoubleKey) +// debug(key: "intKey", value: cintKey) +// debug(key: "boolKey", value: cboolKey) +// debug(key: "arrayKey", value: carrayKey) +// debug(key: "objectKey", value: cobjectKey) +// print("") +// } catch { +// print(error) +// } +// } + } +} + +final public class SampleWebViewBridgeModel: MoleculeModelProtocol{ + public var backgroundColor: Color? + public static var identifier: String = "sampleWebViewBridge" + public var moleculeName: String = SampleWebViewBridgeModel.identifier +} + +import WebKit + +final public class SampleWebViewBridge: WebView{ + func getNonBridgeActions() -> [String: [String: Any]] { + let openPage: [String: Any] = [ + "actionType": "openPage", + "pageType": "feedsAuthenticatedWebview", + "extraParameters": [ + "browserUrl" : "www.verizon.com" + ] + ] + + let passMVAData: [String: Any] = [ + "actionType": "passMVAData", + "data": [ + "backIgnoresWebHistory": true + ] + ] + + let hideBackButton: [String: Any] = [ + "actionType": "updateNavigation", + "navigationBar":[ + "moleculeName": "navigationBar", + "alwaysShowBackButton": false, + "title":"Page title" + ] + ] + + return [ + "openPage": openPage, + "passMVAData": passMVAData, + "hideBackButton": hideBackButton + ] } } @@ -235,3 +414,129 @@ extension AppDelegate { bottomView.isHidden = isBottomViewHidden } } + +@objcMembers public class PillLabelModel: MoleculeModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public static var identifier: String = "pillLabel" + public var backgroundColor: Color? = Color(uiColor: .mvmRed) + public var text: String + public var accessibilityText: String? + public var textColor: Color = Color(uiColor: .mvmWhite) + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + + private enum CodingKeys: String, CodingKey { + case moleculeName + case backgroundColor + case text + case accessibilityText + case textColor + } + + //-------------------------------------------------- + // MARK: - codec + //-------------------------------------------------- + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + + if let backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) { + self.backgroundColor = backgroundColor + } + + text = try typeContainer.decode(String.self, forKey: .text) + accessibilityText = try typeContainer.decodeIfPresent(String.self, forKey: .accessibilityText) + + if let textColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor) { + self.textColor = textColor + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(moleculeName, forKey: .moleculeName) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) + try container.encode(text, forKey: .text) + try container.encodeIfPresent(accessibilityText, forKey: .accessibilityText) + try container.encode(textColor, forKey: .textColor) + } +} + +@objcMembers open class PillLabel: View { + //-------------------------------------------------- + // MARK: - Outlets + //-------------------------------------------------- + + public let label = Label(fontStyle: .BoldMicro) + + //-------------------------------------------------- + // MARK: - Lifecycle + //-------------------------------------------------- + + override open func setupView() { + super.setupView() + + label.textAlignment = .center + label.textColor = .mvmWhite + backgroundColor = .mvmRed + addSubview(label) + + NSLayoutConstraint.activate([ + label.topAnchor.constraint(equalTo: topAnchor, constant: 2), + label.leadingAnchor.constraint(equalTo: leadingAnchor, constant: Padding.Three), + trailingAnchor.constraint(equalTo: label.trailingAnchor, constant: Padding.Three), + bottomAnchor.constraint(equalTo: label.bottomAnchor, constant: 2) + ]) + } + + @objc override open func updateView(_ size: CGFloat) { + super.updateView(size) + label.updateView(size) + } + + open override func layoutSubviews() { + super.layoutSubviews() + layer.cornerRadius = bounds.height / 2 + } + + open override func reset() { + super.reset() + + label.text = "" + label.accessibilityLabel = "" + label.textColor = .white + backgroundColor = .mvmRed + } + + //-------------------------------------------------- + // MARK: - Atomic + //-------------------------------------------------- + + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { + + guard let model = model as? PillLabelModel else { return } + + label.text = model.text + + if let accessibilityText = model.accessibilityText { + label.accessibilityLabel = accessibilityText + } + + label.textColor = model.textColor.uiColor + } + + open override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { + return 20 + } +} + +extension PillLabel: MVMCoreUIViewConstrainingProtocol { + public func horizontalAlignment() -> UIStackView.Alignment { + return .leading + } +} diff --git a/JSONCreator_iOS/JSONCreator/JSON/Samples/DropDownListHidden.json b/JSONCreator_iOS/JSONCreator/JSON/Samples/DropDownListHidden.json new file mode 100644 index 0000000..059667e --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/JSON/Samples/DropDownListHidden.json @@ -0,0 +1,197 @@ +{ + "ResponseInfo" : { + "locale" : "EN", + "server" : "loghost-mf_postpayss01", + "userMessage" : "0", + "code" : "00000", + "appSessionExtended" : true, + "message" : "0", + "mdn" : "7165723410", + "buildNumber" : "61", + "type" : "Success", + "requestId" : "12321a81-a48b-4023-94d9-7bd42af6d65a", + "topAlertTime" : 0 + }, + "Page" : { + "pageStatNames" : [ + "\/mf\/retail\/appt\/flow", + "\/mf\/retail\/appt\/reasons" + ], + "template" : "list", + "footer" : { + "moleculeName" : "footer", + "molecule" : { + "moleculeName" : "twoButtonView", + "primaryButton" : { + "groupName" : "default", + "moleculeName" : "button", + "title" : "Continue", + "action" : { + "analyticsData" : { + "vzdl.page.linkName" : "Continue" + }, + "extraParameters" : { + "destPageType" : "rtlApptsStoreLocator", + "FromStoreDetails" : "N" + }, + "actionType" : "openPage", + "title" : "Confirm", + "presentationStyle" : "push", + "pageType" : "launchApp" + } + } + } + }, + "molecules" : [ + { + "dropDown" : { + "moleculeName" : "dropDown", + "action" : { + "actionType" : "noop" + }, + "placeholder" : "Select a reason for visit", + "title" : "What can we help you with?", + "fieldKey" : "reason", + "type" : "text", + "options" : [ + "Account Support", + "Shop", + "Device Setup\/Troubleshooting", + "Other" + ] + }, + "line" : { + "moleculeName" : "line", + "type" : "none" + }, + "moleculeName" : "dropDownListItem", + "molecules" : [ + [ + { + "line" : { + "moleculeName" : "line", + "type" : "none" + }, + "topPadding" : 0, + "moleculeName" : "listItem", + "molecule" : { + "title" : "Relating to", + "fieldKey" : "subReason", + "moleculeName" : "dropDown", + "options" : [ + "Autopay question or issue", + "Billing issue", + "Misleading promise or information inquiry", + "Disconnect line", + "Payment arrangements", + "Promised promotion or offer", + "Other" + ], + "type" : "text", + "action" : { + "actionType" : "noop" + } + } + } + ], + [ + + ], + [ + + ], + [ + + ] + ] + } + ], + "cache" : false, + "header" : { + "moleculeName" : "header", + "molecule" : { + "moleculeName" : "headlineBody", + "headline" : { + "moleculeName" : "label", + "text" : "Make an appointment to see a representative." + }, + "body" : { + "moleculeName" : "label", + "text" : "We currently have limited staffing. For your safety and the safety of our employees, we are only scheduling appointments to provide one-on-one support for account maintenance or device troubleshooting.", + "fontStyle" : "BoldBodySmall" + } + } + }, + "tab" : [ + { + "appContext" : "mobileFirstSS", + "title" : "Schedule", + "actionType" : "openPage", + "moleculeName" : "label", + "presentationStyle" : "root", + "pageType" : "rtlReasonAndSubReasons" + }, + { + "appContext" : "mobileFirstSS", + "title" : "My Appointments", + "actionType" : "openPage", + "moleculeName" : "label", + "presentationStyle" : "root", + "pageType" : "rtlViewAllScheduledAppts" + } + ], + "pageType" : "rtlReasonAndSubReasons", + "suppressPostLaunchRequests" : false, + "formRules" : [ + { + "groupName": "default", + "rules": [ + { + "type": "allRequired", + "ruleId": "allRequired", + "fields": [ + "reason", + "subReason" + ] + } + ], + "effects": [ + { + "type": "dynamicRuleFormFieldEffect", + "fieldKey": "subReason", + "activatedRuleIds": ["allRequired"], + "rules": [ + { + "type": "regex", + "regex": "^Account Support$", + "fields": [ + "reason" + ] + } + ] + }, + { + "type": "enableFormFieldEffect", + "fieldKey": "subReason", + "rules": [ + { + "type": "regex", + "regex": "^Account Support$", + "fields": [ + "reason" + ] + } + ] + } + ] + } + ], + "navigationBar" : { + "moleculeName" : "navigationBar", + "title" : "Make Appointment" + }, + "tabBarHidden" : true, + "isAtomicTabs" : true + } +} + diff --git a/JSONCreator_iOS/JSONCreator/JSON/Samples/FormContactInfo.json b/JSONCreator_iOS/JSONCreator/JSON/Samples/FormContactInfo.json index 56ee6c2..74f266c 100644 --- a/JSONCreator_iOS/JSONCreator/JSON/Samples/FormContactInfo.json +++ b/JSONCreator_iOS/JSONCreator/JSON/Samples/FormContactInfo.json @@ -22,15 +22,14 @@ { "moleculeName": "stackItem", "molecule": { - "moleculeName": "textField", + "moleculeName": "textView", "fieldKey": "firstName", "type": "text", "errorMessage": "Please enter a valid first name.", - "placeholder": "John A", - "titleLabel": { - "moleculeName": "label", - "text": "First Name" - } + "text": "John A", + "title": "First Name", + "enabled": false, + "readOnly": false } }, { @@ -100,43 +99,6 @@ } } } - }, - "formRules": [ - { - "groupName": "default", - "rules": [ - { - "type": "regex", - "fields": [ - "emailID" - ], - "regex": "^[a-zA-Z0-9](\\.?\\_?\\-?[a-zA-Z0-9]){0,}@[a-zA-Z0-9-_]+\\.([a-zA-Z0-9-_]{1,}\\.){0,}[a-zA-Z]{2,}$" - }, - { - "type": "regex", - "fields": [ - "zipcode" - ], - "regex": "^\\d{5}(?:[-\\s]\\d{4})?$" - }, - { - "regex": "^(\\d{3})[\\s.-]{0,1}(\\d{3})[\\s.-]{0,1}(\\d{4})$", - "type": "regex", - "fields": [ - "phoneNumber" - ] - }, - { - "type": "allRequired", - "ruleId": "requiredRule", - "fields": [ - "emailID", - "firstName", - "lastName" - ] - } - ] - } - ] + } } } diff --git a/JSONCreator_iOS/JSONCreator/JSON/Samples/FormEnabledChain.json b/JSONCreator_iOS/JSONCreator/JSON/Samples/FormEnabledChain.json index 5e3f8f8..e6aaef2 100644 --- a/JSONCreator_iOS/JSONCreator/JSON/Samples/FormEnabledChain.json +++ b/JSONCreator_iOS/JSONCreator/JSON/Samples/FormEnabledChain.json @@ -8,6 +8,28 @@ "stack": { "moleculeName": "stack", "molecules": [ + { + "moleculeName": "stackItem", + "molecule": { + "text": "", + "fieldKey": "password", + "moleculeName": "textField", + "type": "text", + "title": "Password", + "errorMessage": "Please enter a valid password" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "text": "", + "fieldKey": "passwordCompare", + "moleculeName": "textField", + "errorMessage": "Must match password", + "type": "text", + "title": "Retype Password" + } + }, { "moleculeName": "stackItem", "molecule": { @@ -15,7 +37,7 @@ "fieldKey": "preferredFirstName", "moleculeName": "textField", "type": "text", - "title": "Preferred First Name Optional", + "title": "Preferred First Name", "errorMessage": "Please enter a valid first name." } }, @@ -26,7 +48,8 @@ "fieldKey": "preferredLastName", "moleculeName": "textField", "type": "text", - "title": "Preferred Last Name Optional", + "required": false, + "title": "Preferred Last Name", "errorMessage": "Please enter a valid last name." } }, @@ -60,6 +83,7 @@ "moleculeName": "textField", "type": "email", "title": "Email", + "required": false, "errorMessage": "Please enter a valid email address." } } @@ -133,14 +157,16 @@ "ruleId": "lettersOnly", "type": "regex", "fields": [ - "preferredFirstName" + "preferredFirstName", + "password" ] }, { - "type": "allRequired", - "ruleId": "requiredRule", + "type": "equals", + "ruleId": "passwordsEqual", "fields": [ - "preferredFirstName" + "password", + "passwordCompare" ] } ], diff --git a/JSONCreator_iOS/JSONCreator/JSON/Samples/FormPronouns-1.json b/JSONCreator_iOS/JSONCreator/JSON/Samples/FormPronouns-1.json index 803efa0..80d61b1 100644 --- a/JSONCreator_iOS/JSONCreator/JSON/Samples/FormPronouns-1.json +++ b/JSONCreator_iOS/JSONCreator/JSON/Samples/FormPronouns-1.json @@ -61,24 +61,11 @@ "moleculeName": "textField", "fieldKey": "preferredFirstName", "type": "text", + "text": "", "errorMessage": "Please enter a valid first name.", - "titleLabel": { - "moleculeName": "label", - "text": "Preferred First Name Optional", - "attributes": [ - { - "type": "color", - "location": 21, - "length": 8, - "textColor": "#747676" - } - ] - }, - "feedbackLabel": { - "moleculeName": "label", - "text": "This will replace greeting name if you have one.", - "textColor": "#747676" - } + "title": "Preferred First Name", + "feedback": "This will replace greeting name if you have one.", + "required": false } }, { @@ -89,18 +76,9 @@ "type": "text", "text": "", "errorMessage": "Please enter a valid last name.", - "titleLabel": { - "moleculeName": "label", - "text": "Preferred Last Name Optional", - "attributes": [ - { - "type": "color", - "location": 20, - "length": 8, - "textColor": "#747676" - } - ] - } + "title": "Preferred Last Name", + "feedback": "If blank, no last name will display.", + "required": false } }, { @@ -116,19 +94,8 @@ "They, Them, Theirs", "None of these" ], - "titleLabel": { - "moleculeName": "label", - "text": "Pronouns Optional", - "attributes": [ - { - "type": "color", - "location": 9, - "length": 8, - "textColor": "#747676" - } - ] - } - , + "title": "Pronouns", + "required": false, "errorMessage": "Please select a pronoun" } }, @@ -140,6 +107,7 @@ "type": "text", "text": "", "title": "Greeting name", + "required": false, "errorMessage": "Please enter a valid greeting name." } }, @@ -225,6 +193,7 @@ "rules": [ { "type": "regex", + "ruleId": "emailRegex", "fields": [ "emailID" ], @@ -233,15 +202,30 @@ { "regex": "^(\\d{3})[\\s.-]{0,1}(\\d{3})[\\s.-]{0,1}(\\d{4})$", "type": "regex", + "ruleId": "alternateNoRegex", "fields": [ "alternateNo" ] }, { - "type": "allRequired", - "ruleId": "requiredRule", + "regex": "^[0-9a-zA-Z@\\.\\-\\’_?]{0,25}$", + "ruleId": "anyAlphaNumeric", + "errorMessage": { + "preferredFirstName": "Only use for First Name", + "preferredLastName": "Only use for Last Name", + "greetingName": "Only use for Greeting Name" + }, + "type": "regex", + "fields": [ + "preferredFirstName", + "preferredLastName", + "greetingName" + ] + }, + { + "type": "allRequired", + "ruleId": "allRequired", "fields": [ - "greetingName", "emailID", "alternateNo" ] @@ -251,6 +235,7 @@ { "type": "enableFormFieldEffect", "fieldKey": "preferredLastName", + "activatedRuleIds": ["anyAlphaNumeric"], "rules": [ { "type": "anyRequired", @@ -259,6 +244,45 @@ ] } ] + }, + { + "type": "clearFormFieldEffect", + "fieldKey": "preferredLastName", + "rules": [ + { + "type": "regex", + "regex": "^$", + "fields": [ + "preferredFirstName" + ] + } + ] + }, + { + "type": "clearFormFieldEffect", + "fieldKey": "greetingName", + "rules": [ + { + "type": "anyRequired", + "fields": [ + "preferredFirstName" + ] + } + ] + }, + { + "type": "enableFormFieldEffect", + "fieldKey": "greetingName", + "activatedRuleIds": ["anyAlphaNumeric"], + "rules": [ + { + "type": "regex", + "regex": "^$", + "fields": [ + "preferredFirstName" + ] + } + ] } ] } diff --git a/JSONCreator_iOS/JSONCreator/JSON/Samples/FormPronouns-2.json b/JSONCreator_iOS/JSONCreator/JSON/Samples/FormPronouns-2.json index 13ead0b..e31a1c5 100644 --- a/JSONCreator_iOS/JSONCreator/JSON/Samples/FormPronouns-2.json +++ b/JSONCreator_iOS/JSONCreator/JSON/Samples/FormPronouns-2.json @@ -1,88 +1,417 @@ { + "ResponseInfo": { + "locale": "EN", + "type": "Success", + "server": "Local", + "requestId": "32d5bbc6-965d-4493-9e96-d8855c3f9386", + "topAlertTime": 0, + "hideNotificationLogo": false, + "code": "00000", + "message": "0", + "userMessage": "0" + }, "Page": { "template": "stack", - "pageType": "moleculeStack", - "screenHeading": "Manage Profile", - "hideFabOverlay": true, - "suppressPostLaunchRequests": false, - "tabBarHidden": true, "analyticsData": { - "vzdl.events.flowinitiated": "1", - "vzdl.page.sourceChannel": "MVA", - "vzdl.target.engagement.intent": " ", - "vzdl.page.channel": " ", - "vzdl.page.displayChannel": "MVA", - "vzdl.page.id": "moleculeStack", - "vzdl.page.siteSection": " ", - "contentSquarePageName": "Manage Profile", - "vzdl.page.name": "moleculeStack" - }, - "chaticon": { - "moleculeName": "chatIcon", - "hideFabOverlay": true - }, - "pageStatNames": [ - "/mf/get/email/verify/indicator", - "/vision/customer/profile", - "/mf/cntrlr/mngpfl" - ], - "navigationBar": { - "moleculeName": "navigationBar", - "title": "Manage Profile" - }, - "header": { - "moleculeName": "headerH2Link", - "headlineBody": { - "moleculeName": "headlineBody", - "headline": { - "moleculeName": "label", - "text": "Tell us about yourself." - }, - "body": { - "moleculeName": "label", - "text": "We'll use your preferred name and pronouns online, in print, on the phone and in person to refer to you and your account." - } - }, - "link": { - "moleculeName": "caretLink", - "title": "Why are we asking?", - "action": { - "actionType": "openPage", - "pageType": "learnMorePronouns" - } - } + "pageName": "/mf/account/settings/basic info/manage profile" }, "stack": { "moleculeName": "stack", "molecules": [ { + "spacing": 30, + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "text": "Account information", + "fontStyle": "BoldBodyLarge" + } + }, + { + "spacing": 30, "moleculeName": "stackItem", "molecule": { - "enabled" : false, "moleculeName": "textField", - "fieldKey": "preferredFirstName", + "fieldKey": "preferredGreetingName", + "text": "Lebowski", "type": "text", - "errorMessage": "Please enter a valid first name.", - "titleLabel": { + "title": "Greeting name" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "emailID", + "errorMessage": "enter a valid email", + "text": "herman.munster@verizon.com", + "type": "text", + "title": "Email" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "alternateContactNumber", + "text": "8923749823", + "type": "text", + "title": "Alternate contact number", + "errorMessage": "Please enter valid contact number" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "line", + "type": "standard" + } + }, + { + "spacing": 30, + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "headlineBody", + "body": { "moleculeName": "label", - "text": "Preferred First Name Optional", - "fontStyle": "RegularMicro", - "textColor": "#000000", "attributes": [ { - "type": "color", - "location": 21, - "length": 8, + "topPadding": 30, + "length": 18, + "action": { + "actionType": "openPage", + "analyticsData": { + "vzdl.page.pageLinkName": "/mf/Manage Profile|Email Verify", + "vzdl.page.linkName": "Verify" + }, + "pageType": "verifyEmail" + }, + "location": 95, + "type": "action" + } + ], + "text": "We'll use these online, in print, on the phone and in person to refer to you and your account.\n\nWhy are we asking?" + }, + "headline": { + "moleculeName": "label", + "text": "Preferred names and pronouns", + "fontStyle": "BoldBodyLarge" + } + } + }, + { + "spacing": 30, + "moleculeName": "stackItem", + "molecule": { + "spacing": 2, + "moleculeName": "stack", + "molecules": [ + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "attributes": [ + { + "length": 9, + "location": 20, + "type": "color", + "textColor": "#747676" + } + ], + "text": "Preferred first name Optional" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "preferredFirstName", + "errorMessage": "There was an issue with this name.", + "text": "", + "type": "text" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "attributes": [ + { + "length": 10, + "location": 49, + "type": "color", + "textColor": "#000000" + }, + { + "length": 10, + "action": { + "actionType": "openPage", + "analyticsData": { + "vzdl.page.pageLinkName": "/mf/Manage Profile|Email Verify", + "vzdl.page.linkName": "Verify" + }, + "pageType": "verifyEmail" + }, + "location": 49, + "type": "action" + } + ], + "text": "This will replace greeting name if you have one. Contact us", + "fontStyle": "RegularBodySmall", "textColor": "#747676" } - ] - }, - "feedbackLabel": { - "moleculeName": "label", - "fontStyle": "RegularMicro", - "text": "This will replace greeting name if you have one.", - "textColor": "#747676" - } + } + ] + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "spacing": 2, + "moleculeName": "stack", + "molecules": [ + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "attributes": [ + { + "length": 9, + "location": 19, + "type": "color", + "textColor": "#747676" + } + ], + "text": "Preferred last name Optional" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "preferredLastName", + "errorMessage": "There was an issue with this name.", + "text": "", + "type": "text", + "errorTextColor": "#ED7000" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "style": "RegularBodySmall", + "text": "If blank, no last name will display", + "textColor": "#747676" + } + } + ] + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "spacing": 2, + "moleculeName": "stack", + "molecules": [ + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "attributes": [ + { + "length": 9, + "location": 8, + "type": "color", + "textColor": "#747676" + } + ], + "text": "Pronouns Optional" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "dropDown", + "fieldKey": "pronouns", + "options": [ + "", + "He, Him, His", + "She, Her, Hers", + "They, Them, Theirs", + "None of these" + ], + "selectedIndex": 0 + } + } + ] + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "line", + "type": "standard" + } + }, + { + "spacing": 30, + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "text": "Address", + "fontStyle": "BoldBodyLarge" + } + }, + { + "moleculeName": "stackItem", + "style": "none", + "molecule": { + "moleculeName": "stack", + "molecules": [ + { + "spacing": 16, + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "billingAddress", + "text": "10200 BOULDER LN APT 102", + "placeholder": "", + "title": "Billing address", + "errorMessage": "Please enter your shipping address." + } + } + ] + } + }, + { + "moleculeName": "stackItem", + "style": "none", + "molecule": { + "moleculeName": "stack", + "molecules": [ + { + "spacing": 16, + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "billingAddress2", + "text": "", + "placeholder": "", + "title": "Billing address 2(optional)", + "errorMessage": "Some is wrong with the Billing address" + } + } + ] + } + }, + { + "moleculeName": "stackItem", + "style": "none", + "molecule": { + "moleculeName": "stack", + "molecules": [ + { + "spacing": 16, + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "city", + "text": "AUSTIN", + "placeholder": "Enter text here", + "title": "City", + "errorMessage": "Please enter city" + } + } + ] + } + }, + { + "spacing": 16, + "moleculeName": "stackItem", + "molecule": { + "horizontalAlignment": "fill", + "moleculeName": "stack", + "molecules": [ + { + "horizontalAlignment": "fill", + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "dropDown", + "fieldKey": "state", + "options": [ + "AK", + "AL", + "AR", + "AZ", + "CA", + "CO", + "CT", + "DC", + "DE", + "FL", + "GA", + "HI", + "IA", + "ID", + "IL", + "IN", + "KS", + "KY", + "LA", + "MA", + "MD", + "ME", + "MI", + "MN", + "MO", + "MS", + "MT", + "NC", + "ND", + "NE", + "NH", + "NJ", + "NM", + "NV", + "NY", + "OH", + "OK", + "OR", + "PA", + "RI", + "SC", + "SD", + "TN", + "TX", + "UT", + "VA", + "VT", + "WA", + "WI", + "WV", + "WY" + ], + "title": "State", + "selectedIndex": 43 + }, + "percent": 50 + }, + { + "horizontalAlignment": "fill", + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "zipcode", + "text": "78726", + "placeholder": "Enter text here", + "title": "ZIP Code", + "errorMessage": "Please enter zipcode" + }, + "percent": 50 + } + ], + "axis": "horizontal" } } ] @@ -90,66 +419,55 @@ "footer": { "moleculeName": "footer", "molecule": { - "moleculeName": "twoButtonView", - "primaryButton": { - "moleculeName": "button", - "title": "Update", - "groupName": "default", - "action": { - "actionType": "openPage", - "pageType": "updateProfile", - "extraParameters": { - "from": "none" - }, - "presentationStyle": "push" - } - }, "secondaryButton": { "moleculeName": "button", - "title": "Cancel", "action": { "actionType": "back", - "presentationStyle": "push", - "pageType": "backButton" - } + "analyticsData": { + "vzwi.mvmapp.LinkName": "Basic Info" + }, + "pageType": "backButton", + "presentationStyle": "push" + }, + "title": "Cancel" + }, + "moleculeName": "twoButtonView", + "primaryButton": { + "groupName": "default", + "moleculeName": "button", + "action": { + "actionType": "openPage", + "analyticsData": { + "vzwi.mvmapp.LinkName": "Legal Disclosure" + }, + "pageType": "legalDisclosurePR", + "presentationStyle": "modal", + "fieldKey": "update", + "extraParameters": { + "from": "none" + } + }, + "title": "Update" } } }, + "navigationBar": { + "moleculeName": "navigationBar", + "title": "Manage Profile" + }, + "pageType": "moleculeStack", + "suppressPostLaunchRequests": false, + "tabBarHidden": true, + "hideFabOverlay": true, "formRules": [ { "groupName": "default", - "rules": [ - { - "type": "regex", - "fields": [ - "emailID" - ], - "regex": "^[a-zA-Z0-9](\\.?\\_?\\-?[a-zA-Z0-9]){0,}@[a-zA-Z0-9-_]+\\.([a-zA-Z0-9-_]{1,}\\.){0,}[a-zA-Z]{2,}$" - }, - { - "regex": "^(\\d{3})[\\s.-]{0,1}(\\d{3})[\\s.-]{0,1}(\\d{4})$", - "type": "regex", - "fields": [ - "alternateNo" - ] - }, - { - "type": "allRequired", - "ruleId": "requiredRule", - "fields": [ - "greetingName", - "emailID", - "alternateNo" - ] - } - ], "effects": [ { - "type": "enableFormFieldEffect", - "fieldKey": "preferredLastName", "activatedRuleIds": [ - "requiredRule" + "anyValueChanged", "textOnlyRegEx" ], + "fieldKey": "preferredLastName", "rules": [ { "type": "anyRequired", @@ -157,10 +475,215 @@ "preferredFirstName" ] } + ], + "type": "enableFormFieldEffect" + }, + { + "type": "dynamicRuleFormFieldEffect", + "fieldKey": "preferredGreetingName", + "activatedRuleIds": ["anyValueChanged"], + "rules": [ + { + "type": "anyValueChanged", + "fields": [ + "preferredGreetingName" + ] + } + ] + }, + { + "type": "dynamicRuleFormFieldEffect", + "fieldKey": "emailID", + "activatedRuleIds": ["anyValueChanged"], + "rules": [ + { + "type": "anyValueChanged", + "fields": [ + "emailID" + ] + } + ] + }, + { + "type": "dynamicRuleFormFieldEffect", + "fieldKey": "alternateContactNumber", + "activatedRuleIds": ["anyValueChanged"], + "rules": [ + { + "type": "anyValueChanged", + "fields": [ + "alternateContactNumber" + ] + } + ] + }, + { + "type": "dynamicRuleFormFieldEffect", + "fieldKey": "billingAddress", + "activatedRuleIds": ["anyValueChanged"], + "rules": [ + { + "type": "anyValueChanged", + "fields": [ + "billingAddress" + ] + } + ] + }, + { + "type": "dynamicRuleFormFieldEffect", + "fieldKey": "billingAddress2", + "activatedRuleIds": ["anyValueChanged"], + "rules": [ + { + "type": "anyValueChanged", + "fields": [ + "billingAddress2" + ] + } + ] + }, + { + "type": "dynamicRuleFormFieldEffect", + "fieldKey": "city", + "activatedRuleIds": ["anyValueChanged"], + "rules": [ + { + "type": "anyValueChanged", + "fields": [ + "city" + ] + } + ] + }, + { + "type": "dynamicRuleFormFieldEffect", + "fieldKey": "zipcode", + "activatedRuleIds": ["anyValueChanged"], + "rules": [ + { + "type": "anyValueChanged", + "fields": [ + "zipcode" + ] + } + ] + }, + { + "type": "dynamicRuleFormFieldEffect", + "fieldKey": "pronouns", + "activatedRuleIds": ["anyValueChanged"], + "rules": [ + { + "type": "anyValueChanged", + "fields": [ + "pronouns" + ] + } + ] + }, + { + "type": "dynamicRuleFormFieldEffect", + "fieldKey": "state", + "activatedRuleIds": ["anyValueChanged"], + "rules": [ + { + "type": "anyValueChanged", + "fields": [ + "state" + ] + } + ] + } + ], + "rules": [ + { + "regex": "^.{1,10}$", + "type": "regex", + "fields": [ + "preferredGreetingName" + ] + }, + { + "regex": "^$|^[a-zA-Z]{0,25}$", + "ruleId": "textOnlyRegEx", + "type": "regex", + "fields": [ + "preferredFirstName", + "preferredLastName" + ] + }, + { + "regex": "^[a-zA-Z0-9](\\.?\\_?\\-?[a-zA-Z0-9]){0,}@[a-zA-Z0-9-_]+\\.([a-zA-Z0-9-_]{1,}\\.){0,}[a-zA-Z]{2,}$", + "type": "regex", + "fields": [ + "emailID" + ] + }, + { + "regex": "^(\\d{3})[\\s.-]{0,1}(\\d{3})[\\s.-]{0,1}(\\d{4})$", + "type": "regex", + "fields": [ + "alternateContactNumber" + ] + }, + { + "regex": "^.{1,30}$", + "type": "regex", + "fields": [ + "billingAddress", + "city" + ] + }, + { + "regex": "^.{1,8}$", + "type": "regex", + "fields": [ + "zipcode" + ] + }, + { + "type": "allRequired", + "fields": [ + "preferredGreetingName", + "emailID", + "alternateContactNumber", + "billingAddress", + "city", + "state", + "zipcode" + ] + }, + { + "ruleId": "anyValueChanged", + "type": "anyValueChanged", + "fields": [ + "preferredGreetingName", + "emailID", + "alternateContactNumber", + "billingAddress", + "city", + "state", + "zipcode", + "pronouns", + "billingAddress2", + "preferredFirstName" ] } ] } - ] + ], + "screenHeading": "Manage Profile", + "header": { + "moleculeName": "header", + "molecule": { + "moleculeName": "headlineBody", + "headline": { + "moleculeName": "label", + "text": "Tell us a bit about yourself." + } + } + } } } + diff --git a/JSONCreator_iOS/JSONCreator/JSON/Samples/MVA3.0/Testing.json b/JSONCreator_iOS/JSONCreator/JSON/Samples/MVA3.0/Testing.json new file mode 100644 index 0000000..4e44c49 --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/JSON/Samples/MVA3.0/Testing.json @@ -0,0 +1,551 @@ +{ + "ResponseInfo": { + "locale": "EN", + "type": "Success", + "server": "loghost-mf_postpayss01", + "buildNumber": "48", + "requestId": "21ab5a2c-412a-4731-adc5-3c304adb51e4", + "mdn": "8123224668", + "appSessionExtended": true, + "code": "00000", + "message": "0", + "userMessage": "0", + "topAlertTime": 0 + }, + "SystemParams": { + "fidoMap": { + "fidoGuid": "d6058b95-65b8-40f9-b446-def20ff4b0e1", + "accessToken": "i4PeG76efWUEcfk3QpZVD5XO9VrFzlcHELDtMt8NgB3aRxkVgRGLtgOpgF6t2Mr4Mouc2yKz013msQmttwBXAfpKNFLFi0rcbJjF" + }, + "deviceToken": "lwkEcchuqRuzDNbVLvjnNTURlvbnshgjwzvRW3eg/ibl/EwET8LqUqbT5l8p1rq8" + }, + "Page": { + "suppressPostLaunchRequests": false, + "template": "stack", + "analyticsData": { + "vzdl.page.displayChannel": "MVA", + "vzdl.env.businessUnit": "wireless", + "vzdl.page.id": "moleculeStack", + "vzdl.page.channel": " ", + "vzdl.page.siteSection": " ", + "vzdl.events.flowinitiated": "1", + "contentSquarePageName": "Manage Profile", + "vzdl.page.sourceChannel": "MVA", + "vzdl.page.name": "moleculeStack", + "vzdl.target.engagement.intent": " " + }, + "stack": { + "moleculeName": "stack", + "molecules": [ + { + "moleculeName": "stackItem", + "molecule": { + "spacing": 2, + "moleculeName": "stack", + "molecules": [ + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "attributes": [ + { + "length": 9, + "style": "RegularBodySmall", + "location": 20, + "type": "font" + }, + { + "length": 9, + "location": 20, + "type": "color", + "textColor": "#747676" + } + ], + "text": "Preferred first name Optional", + "fontStyle": "BoldBodySmall" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "preferredFirstName", + "errorMessage": "Please enter a valid first name.", + "text": "", + "type": "text" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "text": "This will replace greeting name if you have one.", + "fontStyle": "RegularBodySmall", + "textColor": "#747676" + } + } + ] + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "spacing": 2, + "moleculeName": "stack", + "molecules": [ + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "attributes": [ + { + "length": 9, + "style": "RegularBodySmall", + "location": 19, + "type": "font" + }, + { + "length": 9, + "location": 19, + "type": "color", + "textColor": "#747676" + } + ], + "text": "Preferred last name Optional", + "fontStyle": "BoldBodySmall" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "preferredLastName", + "text": "", + "type": "text", + "errorTextColor": "#ED7000" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "style": "RegularBodySmall", + "text": "If blank, no last name will display", + "textColor": "#747676" + } + } + ] + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "spacing": 2, + "moleculeName": "stack", + "molecules": [ + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "attributes": [ + { + "length": 9, + "style": "RegularBodySmall", + "location": 8, + "type": "font" + }, + { + "length": 9, + "location": 8, + "type": "color", + "textColor": "#747676" + } + ], + "text": "Pronouns Optional", + "fontStyle": "BoldBodySmall" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "dropDown", + "fieldKey": "pronouns", + "options": [ + "-- Select --", + "He, Him, His", + "She, Her, Hers", + "They, Them, Theirs", + "None of these" + ], + "selectedIndex": 0 + } + } + ] + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "spacing": 2, + "moleculeName": "stack", + "molecules": [ + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "label", + "attributes": [ + { + "length": 9, + "style": "RegularBodySmall", + "location": 13, + "type": "font" + }, + { + "length": 9, + "location": 13, + "type": "color", + "textColor": "#747676" + } + ], + "text": "Greeting name Optional", + "fontStyle": "BoldBodySmall", + "fieldKey": "greetingName" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "greetingName", + "errorMessage": "Please enter a valid greeting name.", + "text": "", + "type": "text" + } + } + ] + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "emailVerifyField", + "bottomMolecule": { + "moleculeName": "label", + "attributes": [ + { + "length": 6, + "action": { + "actionType": "openPage", + "analyticsData": { + "vzdl.page.pageLinkName": "/mf/Manage Profile|Email Verify", + "vzdl.page.linkName": "Verify" + }, + "pageType": "verifyEmail" + }, + "location": 0, + "type": "action" + } + ], + "text": "Verify" + }, + "emailField": { + "moleculeName": "textField", + "fieldKey": "emailID", + "errorMessage": "Please enter a valid email address.", + "text": "HERMAN.MUNSTER@VERIZON.COM", + "type": "email", + "title": "Email" + }, + "email": "HERMAN.MUNSTER@VERIZON.COM" + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "textField", + "fieldKey": "alternateNo", + "errorMessage": "Please enter a valid phone number.", + "text": "999.999.9999", + "type": "phone", + "title": "Alternate contact number" + } + } + ] + }, + "footer": { + "moleculeName": "footer", + "molecule": { + "secondaryButton": { + "moleculeName": "button", + "action": { + "actionType": "back", + "pageType": "backButton", + "presentationStyle": "push" + }, + "title": "Cancel" + }, + "moleculeName": "twoButtonView", + "primaryButton": { + "groupName": "default", + "moleculeName": "button", + "action": { + "actionType": "openPage", + "pageType": "updateProfile", + "presentationStyle": "push", + "extraParameters": { + "from": "none" + } + }, + "title": "Save" + } + } + }, + "customUserAgent": "MY_VZW_APP;Android;11;Android SDK built for x86;MF_APP_VERSION:7.6;accept-language:EN", + "navigationBar": { + "moleculeName": "navigationBar", + "title": "Manage Profile" + }, + "pageType": "moleculeStack", + "oidcPunchOut": true, + "suppressPostLaunchRequests": false, + "tabBarHidden": true, + "chaticon": { + "hideFabOverlay": true, + "moleculeName": "chatIcon" + }, + "hideFabOverlay": true, + "headersForCookies": [ + { + "Set-Cookie": "IDToken=eyAidHlwIjogIkpXVCIsICJraWQiOiAiNTVHbXJ1bUh0UnhOYXQ5TWF4Y3hSVXA5aEpjPSIsICJhbGciOiAiUlMyNTYiIH0.eyAiYXRfaGFzaCI6ICJLeHRGMFlZVm54NzdGMTdVWWdYVWx3IiwgImZpZG9ndWlkIjogImQ2MDU4Yjk1LTY1YjgtNDBmOS1iNDQ2LWRlZjIwZmY0YjBlMSIsICJzdWIiOiAiNjc3ODA0YzAtMzM4MC00NjJlLThjMTQtMDIyMzg1NGMyYmRhIiwgInJvbGUiOiAiYWNjb3VudEhvbGRlciIsICJhdWRpdFRyYWNraW5nSWQiOiAiMDkyNzc3MTItZGEwMC00NTI1LTk0ODMtODI1MGVkZjI4MGM0LTMzNjYyOSIsICJpc3MiOiAiaHR0cDovL2FjY2Vzc21ncnFhMy52ZXJpem9ud2lyZWxlc3MuY29tOjgwL3Z6YXV0aC9vYXV0aDIiLCAidG9rZW5OYW1lIjogImlkX3Rva2VuIiwgInFpZCI6ICIzMyIsICJhY3IiOiAiYWFsLTIiLCAidWlkIjogIjgxMjMyMjQ2NjhyZWdUb29sIiwgImF6cCI6ICJNVk1BZ2VudCIsICJhdXRoX3RpbWUiOiAxNjQxNDQ3MTM3LCAiZXhwIjogMTY0MTQ0ODk0MywgImlhdCI6IDE2NDE0NDcxNDMsICJhY2NvdW50bnVtYmVyIjogIjAyODA3NTc3NDMwMDAwMSIsICJtdG4iOiAiODEyMzIyNDY2OCIsICJvcGVuaWQiOiAiIiwgImF1ZCI6ICJNVk1BZ2VudCIsICJjX2hhc2giOiAiQy10bUJDN0JoS0l4MVc5QWdIaUNMQSIsICJuYW1lIjogIkxlYm93c2tpMyIsICJyZWFsbSI6ICIvdnp3IiwgInRva2VuVHlwZSI6ICJKV1RUb2tlbiIsICJsb2IiOiAidnp3IiB9.PZNyVGCs45hFt4kpTWzPwTKTsZ_78lt8H4aj9fGZ3hAQPv95gNV_i9ansP_vFKxCRvD5AGMKIXYgDNUZkZFpnp7B_XgIQbqmcrgrY9Yqt1i8FH6vtih6c-PLZTjV8wntsXo8ExMV77LsTqRUKEVPi5RgnrS2Q2FZqhrzfVflg70awrWlI5gh7nYy2ZhpcQaLES2HPjhV1uOkza92p75RZBDGkr5Fp2DleC_dNW-hwgc7hhZOmWgVgPF2hxDR2wqqPUa149g53uC0I_IrwFL5ZIm8mxWypvrMRhUP-bly1SmoiSBKfMjjvFiLB4ng_jLHeDNlUvuhmoKMHiPrhemLNg;Domain=.vzw.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://vzw.com" + }, + { + "Set-Cookie": "soeSessionID=null;Domain=.vzw.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://vzw.com" + }, + { + "Set-Cookie": "amID=0Mt3x-xv90MvqVF0qrRlS-U_j3Y3mVAlOhgNTUF7wFeIkk9J7-5;Domain=.vzw.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://vzw.com" + }, + { + "Set-Cookie": "punchOutFlow=L2;Domain=.vzw.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://vzw.com" + }, + { + "Set-Cookie": "channelID=VZW;Domain=.vzw.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://vzw.com" + }, + { + "Set-Cookie": "ostype=Android;Domain=.vzw.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://vzw.com" + }, + { + "Set-Cookie": "IDToken=eyAidHlwIjogIkpXVCIsICJraWQiOiAiNTVHbXJ1bUh0UnhOYXQ5TWF4Y3hSVXA5aEpjPSIsICJhbGciOiAiUlMyNTYiIH0.eyAiYXRfaGFzaCI6ICJLeHRGMFlZVm54NzdGMTdVWWdYVWx3IiwgImZpZG9ndWlkIjogImQ2MDU4Yjk1LTY1YjgtNDBmOS1iNDQ2LWRlZjIwZmY0YjBlMSIsICJzdWIiOiAiNjc3ODA0YzAtMzM4MC00NjJlLThjMTQtMDIyMzg1NGMyYmRhIiwgInJvbGUiOiAiYWNjb3VudEhvbGRlciIsICJhdWRpdFRyYWNraW5nSWQiOiAiMDkyNzc3MTItZGEwMC00NTI1LTk0ODMtODI1MGVkZjI4MGM0LTMzNjYyOSIsICJpc3MiOiAiaHR0cDovL2FjY2Vzc21ncnFhMy52ZXJpem9ud2lyZWxlc3MuY29tOjgwL3Z6YXV0aC9vYXV0aDIiLCAidG9rZW5OYW1lIjogImlkX3Rva2VuIiwgInFpZCI6ICIzMyIsICJhY3IiOiAiYWFsLTIiLCAidWlkIjogIjgxMjMyMjQ2NjhyZWdUb29sIiwgImF6cCI6ICJNVk1BZ2VudCIsICJhdXRoX3RpbWUiOiAxNjQxNDQ3MTM3LCAiZXhwIjogMTY0MTQ0ODk0MywgImlhdCI6IDE2NDE0NDcxNDMsICJhY2NvdW50bnVtYmVyIjogIjAyODA3NTc3NDMwMDAwMSIsICJtdG4iOiAiODEyMzIyNDY2OCIsICJvcGVuaWQiOiAiIiwgImF1ZCI6ICJNVk1BZ2VudCIsICJjX2hhc2giOiAiQy10bUJDN0JoS0l4MVc5QWdIaUNMQSIsICJuYW1lIjogIkxlYm93c2tpMyIsICJyZWFsbSI6ICIvdnp3IiwgInRva2VuVHlwZSI6ICJKV1RUb2tlbiIsICJsb2IiOiAidnp3IiB9.PZNyVGCs45hFt4kpTWzPwTKTsZ_78lt8H4aj9fGZ3hAQPv95gNV_i9ansP_vFKxCRvD5AGMKIXYgDNUZkZFpnp7B_XgIQbqmcrgrY9Yqt1i8FH6vtih6c-PLZTjV8wntsXo8ExMV77LsTqRUKEVPi5RgnrS2Q2FZqhrzfVflg70awrWlI5gh7nYy2ZhpcQaLES2HPjhV1uOkza92p75RZBDGkr5Fp2DleC_dNW-hwgc7hhZOmWgVgPF2hxDR2wqqPUa149g53uC0I_IrwFL5ZIm8mxWypvrMRhUP-bly1SmoiSBKfMjjvFiLB4ng_jLHeDNlUvuhmoKMHiPrhemLNg;Domain=.verizon.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://verizon.com" + }, + { + "Set-Cookie": "soeSessionID=null;Domain=.verizon.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://verizon.com" + }, + { + "Set-Cookie": "amID=0Mt3x-xv90MvqVF0qrRlS-U_j3Y3mVAlOhgNTUF7wFeIkk9J7-5;Domain=.verizon.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://verizon.com" + }, + { + "Set-Cookie": "punchOutFlow=L2;Domain=.verizon.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://verizon.com" + }, + { + "Set-Cookie": "channelID=VZW;Domain=.verizon.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://verizon.com" + }, + { + "Set-Cookie": "ostype=Android;Domain=.verizon.com;Expiry=300000;Path=/ ;Secure; HttpOnly", + "URL": "https://verizon.com" + } + ], + "formRules": [ + { + "groupName": "default", + "effects": [ + { + "fieldKey": "preferredLastName", + "rules": [ + { + "type": "anyRequired", + "fields": [ + "preferredFirstName" + ] + } + ], + "type": "enableFormFieldEffect" + }, + { + "fieldKey": "greetingName", + "rules": [ + { + "type": "anyRequired", + "fields": [ + "preferredFirstName" + ] + } + ], + "type": "disableFormFieldEffect" + } + ], + "rules": [ + { + "regex": "^[a-zA-Z0-9](\\.?\\_?\\-?[a-zA-Z0-9]){0,}@[a-zA-Z0-9-_]+\\.([a-zA-Z0-9-_]{1,}\\.){0,}[a-zA-Z]{2,}$", + "type": "regex", + "fields": [ + "emailID" + ] + }, + { + "regex": "^(\\d{3})[\\s.-]{0,1}(\\d{3})[\\s.-]{0,1}(\\d{4})$", + "type": "regex", + "fields": [ + "alternateNo" + ] + }, + { + "regex": "^[0-9a-zA-Z@\\.\\-\\’_?]{0,25}$", + "type": "regex", + "fields": [ + "preferredFirstName", + "preferredLastName", + "greetingName" + ] + } + ] + } + ], + "doNotClearCookies": true, + "screenHeading": "Manage Profile", + "header": { + "moleculeName": "header", + "molecule": { + "moleculeName": "stack", + "molecules": [ + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "headlineBody", + "body": { + "moleculeName": "label", + "text": "We'll use your preferred name and pronouns online, in print, on the phone and in person to refer to you and your account." + }, + "headline": { + "moleculeName": "label", + "text": "Tell us about yourself." + } + } + }, + { + "moleculeName": "stackItem", + "molecule": { + "moleculeName": "link", + "action": { + "actionType": "openPage", + "pageType": "preferredNameWhyWeAreAsking" + }, + "title": "Why are we asking?" + } + } + ] + } + }, + "pageStatNames": [ + "/vision/customer/profile", + "/mf/get/email/verify/indicator", + "/mf/cntrlr/mngpfl" + ] + }, + "ModuleMap": { + "requestCookies": { + "ResponseInfo": { + "locale": "EN", + "type": "Success", + "appSessionExtended": true, + "code": "00000", + "message": "0", + "userMessage": "0", + "topAlertTime": 0 + }, + "cookies": [ + { + "name": "IDToken", + "value": "eyAidHlwIjogIkpXVCIsICJraWQiOiAiNTVHbXJ1bUh0UnhOYXQ5TWF4Y3hSVXA5aEpjPSIsICJhbGciOiAiUlMyNTYiIH0.eyAiYXRfaGFzaCI6ICJLeHRGMFlZVm54NzdGMTdVWWdYVWx3IiwgImZpZG9ndWlkIjogImQ2MDU4Yjk1LTY1YjgtNDBmOS1iNDQ2LWRlZjIwZmY0YjBlMSIsICJzdWIiOiAiNjc3ODA0YzAtMzM4MC00NjJlLThjMTQtMDIyMzg1NGMyYmRhIiwgInJvbGUiOiAiYWNjb3VudEhvbGRlciIsICJhdWRpdFRyYWNraW5nSWQiOiAiMDkyNzc3MTItZGEwMC00NTI1LTk0ODMtODI1MGVkZjI4MGM0LTMzNjYyOSIsICJpc3MiOiAiaHR0cDovL2FjY2Vzc21ncnFhMy52ZXJpem9ud2lyZWxlc3MuY29tOjgwL3Z6YXV0aC9vYXV0aDIiLCAidG9rZW5OYW1lIjogImlkX3Rva2VuIiwgInFpZCI6ICIzMyIsICJhY3IiOiAiYWFsLTIiLCAidWlkIjogIjgxMjMyMjQ2NjhyZWdUb29sIiwgImF6cCI6ICJNVk1BZ2VudCIsICJhdXRoX3RpbWUiOiAxNjQxNDQ3MTM3LCAiZXhwIjogMTY0MTQ0ODk0MywgImlhdCI6IDE2NDE0NDcxNDMsICJhY2NvdW50bnVtYmVyIjogIjAyODA3NTc3NDMwMDAwMSIsICJtdG4iOiAiODEyMzIyNDY2OCIsICJvcGVuaWQiOiAiIiwgImF1ZCI6ICJNVk1BZ2VudCIsICJjX2hhc2giOiAiQy10bUJDN0JoS0l4MVc5QWdIaUNMQSIsICJuYW1lIjogIkxlYm93c2tpMyIsICJyZWFsbSI6ICIvdnp3IiwgInRva2VuVHlwZSI6ICJKV1RUb2tlbiIsICJsb2IiOiAidnp3IiB9.PZNyVGCs45hFt4kpTWzPwTKTsZ_78lt8H4aj9fGZ3hAQPv95gNV_i9ansP_vFKxCRvD5AGMKIXYgDNUZkZFpnp7B_XgIQbqmcrgrY9Yqt1i8FH6vtih6c-PLZTjV8wntsXo8ExMV77LsTqRUKEVPi5RgnrS2Q2FZqhrzfVflg70awrWlI5gh7nYy2ZhpcQaLES2HPjhV1uOkza92p75RZBDGkr5Fp2DleC_dNW-hwgc7hhZOmWgVgPF2hxDR2wqqPUa149g53uC0I_IrwFL5ZIm8mxWypvrMRhUP-bly1SmoiSBKfMjjvFiLB4ng_jLHeDNlUvuhmoKMHiPrhemLNg", + "domain": ".vzw.com", + "expiry": 300000 + }, + { + "name": "soeSessionID", + "domain": ".vzw.com", + "expiry": 300000 + }, + { + "name": "amID", + "value": "0Mt3x-xv90MvqVF0qrRlS-U_j3Y3mVAlOhgNTUF7wFeIkk9J7-5", + "domain": ".vzw.com", + "expiry": 300000 + }, + { + "name": "punchOutFlow", + "value": "L2", + "domain": ".vzw.com", + "expiry": 300000 + }, + { + "name": "channelID", + "value": "VZW", + "domain": ".vzw.com", + "expiry": 300000 + }, + { + "name": "ostype", + "value": "Android", + "domain": ".vzw.com", + "expiry": 300000 + }, + { + "name": "IDToken", + "value": "eyAidHlwIjogIkpXVCIsICJraWQiOiAiNTVHbXJ1bUh0UnhOYXQ5TWF4Y3hSVXA5aEpjPSIsICJhbGciOiAiUlMyNTYiIH0.eyAiYXRfaGFzaCI6ICJLeHRGMFlZVm54NzdGMTdVWWdYVWx3IiwgImZpZG9ndWlkIjogImQ2MDU4Yjk1LTY1YjgtNDBmOS1iNDQ2LWRlZjIwZmY0YjBlMSIsICJzdWIiOiAiNjc3ODA0YzAtMzM4MC00NjJlLThjMTQtMDIyMzg1NGMyYmRhIiwgInJvbGUiOiAiYWNjb3VudEhvbGRlciIsICJhdWRpdFRyYWNraW5nSWQiOiAiMDkyNzc3MTItZGEwMC00NTI1LTk0ODMtODI1MGVkZjI4MGM0LTMzNjYyOSIsICJpc3MiOiAiaHR0cDovL2FjY2Vzc21ncnFhMy52ZXJpem9ud2lyZWxlc3MuY29tOjgwL3Z6YXV0aC9vYXV0aDIiLCAidG9rZW5OYW1lIjogImlkX3Rva2VuIiwgInFpZCI6ICIzMyIsICJhY3IiOiAiYWFsLTIiLCAidWlkIjogIjgxMjMyMjQ2NjhyZWdUb29sIiwgImF6cCI6ICJNVk1BZ2VudCIsICJhdXRoX3RpbWUiOiAxNjQxNDQ3MTM3LCAiZXhwIjogMTY0MTQ0ODk0MywgImlhdCI6IDE2NDE0NDcxNDMsICJhY2NvdW50bnVtYmVyIjogIjAyODA3NTc3NDMwMDAwMSIsICJtdG4iOiAiODEyMzIyNDY2OCIsICJvcGVuaWQiOiAiIiwgImF1ZCI6ICJNVk1BZ2VudCIsICJjX2hhc2giOiAiQy10bUJDN0JoS0l4MVc5QWdIaUNMQSIsICJuYW1lIjogIkxlYm93c2tpMyIsICJyZWFsbSI6ICIvdnp3IiwgInRva2VuVHlwZSI6ICJKV1RUb2tlbiIsICJsb2IiOiAidnp3IiB9.PZNyVGCs45hFt4kpTWzPwTKTsZ_78lt8H4aj9fGZ3hAQPv95gNV_i9ansP_vFKxCRvD5AGMKIXYgDNUZkZFpnp7B_XgIQbqmcrgrY9Yqt1i8FH6vtih6c-PLZTjV8wntsXo8ExMV77LsTqRUKEVPi5RgnrS2Q2FZqhrzfVflg70awrWlI5gh7nYy2ZhpcQaLES2HPjhV1uOkza92p75RZBDGkr5Fp2DleC_dNW-hwgc7hhZOmWgVgPF2hxDR2wqqPUa149g53uC0I_IrwFL5ZIm8mxWypvrMRhUP-bly1SmoiSBKfMjjvFiLB4ng_jLHeDNlUvuhmoKMHiPrhemLNg", + "domain": ".verizon.com", + "expiry": 300000 + }, + { + "name": "soeSessionID", + "domain": ".verizon.com", + "expiry": 300000 + }, + { + "name": "amID", + "value": "0Mt3x-xv90MvqVF0qrRlS-U_j3Y3mVAlOhgNTUF7wFeIkk9J7-5", + "domain": ".verizon.com", + "expiry": 300000 + }, + { + "name": "punchOutFlow", + "value": "L2", + "domain": ".verizon.com", + "expiry": 300000 + }, + { + "name": "channelID", + "value": "VZW", + "domain": ".verizon.com", + "expiry": 300000 + }, + { + "name": "ostype", + "value": "Android", + "domain": ".verizon.com", + "expiry": 300000 + } + ] + } + } +} + + diff --git a/JSONCreator_iOS/JSONCreator/JSON/Samples/SampleWebViewNativeBridge.json b/JSONCreator_iOS/JSONCreator/JSON/Samples/SampleWebViewNativeBridge.json new file mode 100644 index 0000000..edc72ca --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/JSON/Samples/SampleWebViewNativeBridge.json @@ -0,0 +1,33 @@ +{ + "ResponseInfo" : { + "type" : "Success", + "code" : "00000" + }, + "Page" : { + "molecules" : [{ + "moleculeName" : "listItem", + "molecule" : { + "moleculeName" : "sampleWebViewBridge" + } + } + ], + "footer" : {}, + "header" : { + "moleculeName" : "header", + "molecule" : { + "moleculeName" : "headlineBody", + "headline" : { + "moleculeName" : "label", + "text" : "Sample WebView Native Bridge" + }, + "body" : { + "moleculeName" : "label", + "text" : "Below are the available bridges" + } + } + }, + "template" : "list", + "pageType" : "" + } +} + diff --git a/JSONCreator_iOS/JSONCreator/JSON/Samples/Testing.json b/JSONCreator_iOS/JSONCreator/JSON/Samples/Testing.json deleted file mode 100644 index ca169b7..0000000 --- a/JSONCreator_iOS/JSONCreator/JSON/Samples/Testing.json +++ /dev/null @@ -1,235 +0,0 @@ -{ - "ResponseInfo": {}, - "Page": { - "pageType": "contactUs", - "screenHeading": "Select an international plan", - "template": "list", - "molecules": [{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "label", - "text": "afa\ndasfdsa\nadfadfda\nasadfsafa\nafsafsa\nafsadfas\nadffafaf" - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "label", - "text": "afa\ndasfdsa\nadfadfda\nasadfsafa\nafsafsa\nafsadfas\nadffafaf" - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "label", - "text": "afa\ndasfdsa\nadfadfda\nasadfsafa\nafsafsa\nafsadfas\nadffafaf" - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "label", - "text": "afa\ndasfdsa\nadfadfda\nasadfsafa\nafsafsa\nafsadfas\nadffafaf\ndafsdssfafs" - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "label", - "text": "afa\ndasfdsa\nadfadfda\nasadfsafa\nafsafsa\nafsadfas\nadffafaf\n\nadsfa\nadfs" - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "label", - "text": "afa\ndasfdsa\nadfadfda\nasadfsafa\nafsafsa\nafsadfas\nadffafafttttt" - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "bgVideoImageContainer", - "video": { - "moleculeName": "video", - "showControls": false, - "autoPlay": true, - "alwaysReset":true, - "video": "https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_adv_example_hevc/master.m3u8" - }, - "image": { - "moleculeName": "image", - "image": "https://mobile.vzw.com/hybridClient/is/image/VerizonWireless/mva-pib-activation" - }, - "molecule": { - "moleculeName": "footer", - "molecule": { - "moleculeName":"twoButtonView", - "primaryButton":{ - "moleculeName": "button", - "title":"6", - "fillColor": "white", - "textColor": "black", - "action": { - "actionType": "openPage", - "pageType": "rtlVisitUs" - } - }, - "secondaryButton":{ - "moleculeName": "button", - "title":"y", - "borderColor": "white", - "textColor": "white", - "action": { - "actionType": "back" - } - } - - } - } - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "label", - "text": "afa\ndasfdsa\nadfadfda\nasadfsafa\nafsafsa\nafsadfas\nadffafaf\n\nadsfa\nadfs" - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "label", - "text": "afa\ndasfdsa\nadfadfda\nasadfsafa\nafsafsa\nafsadfas\nadffafafttttt" - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "bgVideoImageContainer", - "video": { - "moleculeName": "video", - "showControls": false, - "autoPlay": true, - "alwaysReset":true, - "video": "https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_adv_example_hevc/master.m3u8" - }, - "image": { - "moleculeName": "image", - "image": "https://mobile.vzw.com/hybridClient/is/image/VerizonWireless/mva-pib-activation" - }, - "molecule": { - "moleculeName": "footer", - "molecule": { - "moleculeName":"twoButtonView", - "primaryButton":{ - "moleculeName": "button", - "title":"9", - "fillColor": "white", - "textColor": "black", - "action": { - "actionType": "openPage", - "pageType": "rtlVisitUs" - } - }, - "secondaryButton":{ - "moleculeName": "button", - "title":"y", - "borderColor": "white", - "textColor": "white", - "action": { - "actionType": "back" - } - } - - } - } - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "label", - "text": "afa\ndasfdsa\nadfadfda\nasadfsafa\nafsafsa\nafsadfas\nadffafaf\n\nadsfa\nadfs" - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "label", - "text": "afa\ndasfdsa\nadfadfda\nasadfsafa\nafsafsa\nafsadfas\nadffafafttttt" - } - },{ - "moleculeName":"listItem", - "molecule": { - "moleculeName": "bgVideoImageContainer", - "video": { - "moleculeName": "video", - "showControls": false, - "autoPlay": true, - "alwaysReset":true, - "video": "https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_adv_example_hevc/master.m3u8" - }, - "image": { - "moleculeName": "image", - "image": "https://mobile.vzw.com/hybridClient/is/image/VerizonWireless/mva-pib-activation" - }, - "molecule": { - "moleculeName": "footer", - "molecule": { - "moleculeName":"twoButtonView", - "primaryButton":{ - "moleculeName": "button", - "title":"12", - "fillColor": "white", - "textColor": "black", - "action": { - "actionType": "openPage", - "pageType": "rtlVisitUs" - } - }, - "secondaryButton":{ - "moleculeName": "button", - "title":"y", - "borderColor": "white", - "textColor": "white", - "action": { - "actionType": "back" - } - } - - } - } - } - }], - "middle": { - "moleculeName": "bgVideoImageContainer", - "verticalAlignment": "trailing", - "video": { - "moleculeName": "video", - "showControls": false, - "autoPlay": true, - "video": "https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_adv_example_hevc/master.m3u8" - }, - "image": { - "moleculeName": "image", - "image": "https://mobile.vzw.com/hybridClient/is/image/VerizonWireless/mva-pib-activation" - }, - "molecule": { - "moleculeName": "footer", - "molecule": { - "moleculeName":"twoButtonView", - "primaryButton":{ - "moleculeName": "button", - "title":"x", - "fillColor": "white", - "textColor": "black", - "action": { - "actionType": "openPage", - "pageType": "rtlVisitUs" - } - }, - "secondaryButton":{ - "moleculeName": "button", - "title":"y", - "borderColor": "white", - "textColor": "white", - "action": { - "actionType": "back" - } - } - - } - } - } - } -} diff --git a/JSONCreator_iOS/JSONCreator/JSON/Samples/Zenkey-editprofile.json b/JSONCreator_iOS/JSONCreator/JSON/Samples/Zenkey-editprofile.json new file mode 100644 index 0000000..ffc9f5e --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/JSON/Samples/Zenkey-editprofile.json @@ -0,0 +1,168 @@ +{ + "ResponseInfo" : { + "locale" : "EN", + "server" : "twswcvfszwo21.tdc.vzwcorp.com-srv01_nmobilefirst01", + "userMessage" : "0", + "code" : "00000", + "appSessionExtended" : true, + "message" : "0", + "mdn" : "9088003521", + "buildNumber" : "145", + "type" : "Success", + "requestId" : "c83f2f43-8a99-4ff5-9ef6-f2ab39c5f01f", + "topAlertTime" : 0 + }, + "Page" : { + "stack" : { + "moleculeName" : "stack", + "molecules" : [ + { + "moleculeName" : "stackItem", + "molecule" : { + "text" : "Jarrod", + "fieldKey" : "firstName", + "moleculeName" : "textField", + "type" : "text", + "title" : "First Name", + "errorMessage" : "Enter valid first name." + } + }, + { + "moleculeName" : "stackItem", + "molecule" : { + "text" : "Courtney", + "fieldKey" : "lastName", + "moleculeName" : "textField", + "type" : "text", + "title" : "Last Name", + "errorMessage" : "Enter valid last name." + } + }, + { + "moleculeName" : "stackItem", + "molecule" : { + "moleculeName" : "textField", + "locked" : true, + "errorMessage" : "Enter valid phone number.", + "title" : "Contact Phone Number", + "text" : "9088003521", + "fieldKey" : "phone", + "type" : "phone" + } + }, + { + "moleculeName" : "stackItem", + "molecule" : { + "text" : "jarrod.courtney@verizon.com", + "fieldKey" : "emailID", + "moleculeName" : "textField", + "type" : "text", + "title" : "Email", + "errorMessage" : "Enter valid email." + } + }, + { + "moleculeName" : "stackItem", + "molecule" : { + "text" : "75038", + "fieldKey" : "zipcode", + "moleculeName" : "textField", + "type" : "number", + "title" : "Zip Code", + "errorMessage" : "Enter valid zip code." + } + } + ] + }, + "template" : "stack", + "footer" : { + "moleculeName" : "footer", + "molecule" : { + "moleculeName" : "twoButtonView", + "primaryButton" : { + "groupName" : "default", + "moleculeName" : "button", + "title" : "Save", + "action" : { + "extraParameters" : { + "id" : "userInfoID" + }, + "actionType" : "openPage", + "presentationStyle" : "push", + "pageType" : "zenkeySaveProfile" + } + }, + "secondaryButton" : { + "moleculeName" : "button", + "action" : { + "title" : "Delete Profile", + "actionType" : "openPage", + "pageType" : "zenkeyDeleteProfile" + }, + "title" : "Delete Profile" + } + } + }, + "screenHeading" : "Personal Info", + "hideFabOverlay" : true, + "title" : "Personal Info", + "header" : { + "moleculeName" : "header", + "molecule" : { + "moleculeName" : "image", + "image" : "zenkey_logo", + "width" : 115, + "height" : 16 + }, + "horizontalAlignment" : "leading" + }, + "pageType" : "zenkeyEditProfile", + "suppressPostLaunchRequests" : false, + "formRules" : [ + { + "groupName" : "default", + "rules" : [ + { + "type" : "allRequired", + "fields" : [ + "emailID", + "firstName", + "lastName", + "zipcode", + "phone" + ] + }, + { + "regex" : "^([A-Za-z]+[ -])+[A-Za-z]{1,32}$|^[A-Za-z]{1,32}$", + "type" : "regex", + "fields" : [ + "lastName" + ] + }, + { + "regex" : "^([A-Za-z]+[ -])+[A-Za-z]{1,32}$|^[A-Za-z]{1,32}$", + "type" : "regex", + "fields" : [ + "firstName" + ] + }, + { + "regex" : "[A-Z0-9a-z._%+-]*[^. ]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}", + "type" : "regex", + "fields" : [ + "emailID" + ] + }, + { + "regex" : "^\\d{5}(?:[-\\s]\\d{4})?$", + "type" : "regex", + "fields" : [ + "zipcode" + ] + } + ] + } + ], + "tabBarHidden" : true + } +} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeError.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeError.swift new file mode 100644 index 0000000..96685e8 --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeError.swift @@ -0,0 +1,35 @@ +// +// WebViewBridgeError.swift +// MobileFirstFramework +// +// Created by Matt Bruce on 2/11/22. +// Copyright © 2022 Verizon Wireless. All rights reserved. +// + +import Foundation +import MVMCore + +//Reserved errors codes are 100-149 +public enum WebViewBridgeError: Error { + case coreError(error: MVMCoreErrorObject) + case other(code: Int, message: String) + + //hard coded + static var modelParse = Self.other(code: 100, message: "model_parse_error") + static var unknown = Self.other(code: 101, message: "unknown_error") + static var mismatchedModel = Self.other(code: 102, message: "bridge_models_do_not_match") + static var mismatchedViewController = Self.other(code: 103, message: "viewControllers_do_not_match") +} + +extension WebViewBridgeError { + public func toModel() -> WebViewBridgeErrorModel { + + switch self{ + case .other(let errorCode, let message): + return WebViewBridgeErrorModel(code: errorCode, message: message) + + case .coreError(let error): + return WebViewBridgeErrorModel(code: error.code, message: error.messageToLog ?? "no error message") + } + } +} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeErrorModel.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeErrorModel.swift new file mode 100644 index 0000000..f7102ea --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeErrorModel.swift @@ -0,0 +1,20 @@ +// +// WebViewBridgeErrorModel.swift +// MobileFirstFramework +// +// Created by Matt Bruce on 2/11/22. +// Copyright © 2022 Verizon Wireless. All rights reserved. +// + +import Foundation + +public struct WebViewBridgeErrorModel: Encodable { + var code: Int + var message: String + + public init(code: Int, message: String) { + self.code = code + self.message = message + } + +} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeHandler.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeHandler.swift new file mode 100644 index 0000000..8decaad --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeHandler.swift @@ -0,0 +1,109 @@ +// +// WebViewBridgeHandlerProtocol.swift +// JSONCreator +// +// Created by Matt Bruce on 2/23/22. +// Copyright © 2022 Verizon Wireless. All rights reserved. +// + +import Foundation +import MVMCore + +public typealias CoreViewControllerable = UIViewController & MVMCoreViewControllerProtocol + +open class WebViewBridgeHandler: ModelHandler, WebViewBridgeProtocol { + + public var requestId: String = "123" + public var viewController: ViewController? + + public required init(baseModel: ModelProtocol, requestId: String, viewController: CoreViewControllerable?) throws { + if let viewController = viewController { + guard let castedViewController = viewController as? ViewController else { + throw WebViewBridgeError.mismatchedViewController + } + self.viewController = castedViewController + } + self.requestId = requestId + try super.init(baseModel: baseModel, additionalData: nil, delegateObject: nil) + } + + public required init(baseModel: ModelProtocol, additionalData: [AnyHashable : Any]?, delegateObject: DelegateObject?) throws { + try super.init(baseModel: baseModel, additionalData: additionalData, delegateObject: delegateObject) + } + + //type erased object + public func eraseToAnyHandler() -> AnyHandler<[String : Any]?, Error> { + return AnyHandler(wrappedRequest: self) + } + + //type erasure method + public func perform(completionHandler:@escaping ([String: Any]?) -> ()) { + MVMCoreDispatchUtility.performBlock(inBackground: { + self.perform(then: { result in + switch result{ + case .success(let value): + completionHandler(value) + case .failure(_): + completionHandler(["error": "blah"]) + } + }) + }) + } +} + +extension WebViewBridgeHandler { + + /// Sends the JSON to the completionHandler + /// - Parameter json: json sent to the completionHandler + public func send(json: [String: Any]? = nil) { + MVMCoreDispatchUtility.performBlock(onMainThread: { + self.handler?(.success(json)) + }) + } + + + /// Takes the response and encodes to JSON + /// - Parameter response: response that you want to send + fileprivate func send(response: WebViewBridgeResponseModel){ + do{ + let json = try response.toJSONAny() + send(json: json) + } catch { + if let errorObject = MVMCoreErrorObject.createErrorObject(for: error, location: #function) { + MVMCoreLoggingHandler.addError(toLog: errorObject) + } + } + } + + /// Sends the Error JSON to the completionHandler + /// - Parameter error: typed WebViewBridgeError + public func sendError(for error: WebViewBridgeError) { + send(response: WebViewBridgeResponseModel(actionType: self.model.actionType, error: error.toModel(), data: nil)) + } + + /// Sends the Success JSON to the completionHandler + /// - Parameter object: Encodable Object to send + public func sendSuccess(for object: T) { + sendSuccess(for: object.toJSON()) + } + + /// Sends the Success JSON to the completionHandler + /// - Parameter json: JSON Dictionary to append t + public func sendSuccess(for json: JSONDictionary? = nil) { + var data: JSONValueDictionary? + + //convert the JSONDictionary to JSONValueDictionary + if let json = json { + do{ + data = try json.toJSONValue() + } catch { + if let errorObject = MVMCoreErrorObject.createErrorObject(for: error, location: #function) { + MVMCoreLoggingHandler.addError(toLog: errorObject) + } + } + } + + //send the response + send(response: WebViewBridgeResponseModel(actionType: self.model.actionType, error: nil, data: data)) + } +} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeProtocol.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeProtocol.swift new file mode 100644 index 0000000..50bacac --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeProtocol.swift @@ -0,0 +1,34 @@ +// +// MFWebBridge.swift +// MobileFirstFramework +// +// Created by Bansal, Tapan on 26/05/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation +import MVMCore + +public protocol WebViewBridgeProtocol: MVMCoreHandlerProtocol { + init(baseModel: ModelProtocol, + requestId: String, + viewController: CoreViewControllerable?) throws + + func perform(completionHandler:@escaping ([String: Any]?) -> ()) + + func eraseToAnyHandler() -> AnyHandler<[String: Any]?, Swift.Error> +} + +extension WebViewBridgeProtocol { + /// Handle encoding and errors + public func getJSON(with bridgeModel: WebviewBridgeModelProtocol?) -> JSONDictionary? { + guard let dataModel = bridgeModel, + let json = dataModel.toJSON() else { + // JSON parsing failed + if let errorObject = MVMCoreErrorObject(title: MVMCoreGetterUtility.hardcodedString(withKey: HardcodedErrorTitle), message: MVMCoreGetterUtility.hardcodedString(withKey: HardcodedErrorUnableToProcess), messageToLog: MVMCoreGetterUtility.hardcodedString(withKey: HardcodedErrorUnableToProcess), code: ErrorCode.parsingJSON.rawValue, domain: ErrorDomainNative, location: String(describing: bridgeModel?.actionType)) { + } + return nil + } + return json + } +} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeResponseModel.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeResponseModel.swift new file mode 100644 index 0000000..6a0c315 --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebViewBridgeResponseModel.swift @@ -0,0 +1,18 @@ +// +// WebViewBridgeResponseModel.swift +// MobileFirstFramework +// +// Created by Matt Bruce on 2/11/22. +// Copyright © 2022 Verizon Wireless. All rights reserved. +// + +import Foundation +import MVMCore + +/// Object that will be encoded and returned as JSON to the JSCallback +public struct WebViewBridgeResponseModel: Encodable { + //var requestId: String + var actionType: String + var error: WebViewBridgeErrorModel? + var data: JSONValueDictionary? +} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebviewBridgeModelProtocol.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebviewBridgeModelProtocol.swift new file mode 100644 index 0000000..8dd6bfe --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Core/WebviewBridgeModelProtocol.swift @@ -0,0 +1,39 @@ +// +// WebviewBridgeModelProtocol.swift +// MobileFirstFramework +// +// Created by Suresh, Kamlesh on 6/15/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import UIKit +import MVMCore + +public protocol WebviewBridgeModelProtocol: ModelProtocol { + var actionType: String { get } + var jsCallback: String? { get set } +} + +public extension WebviewBridgeModelProtocol { + + var actionType: String { Self.identifier } + + static var categoryCodingKey: String { "WebviewBridge" } + + static var categoryName: String { "\(WebviewBridgeModelProtocol.self)" } +} + +public extension ModelRegistry { + static func getBridgeModelForJSON(_ json: [String: Any]) throws -> WebviewBridgeModelProtocol { + guard let actionName = json.optionalStringForKey(KeyActionType) else { + throw ModelRegistry.Error.other(message: "actionType missing") + } + guard let type = ModelRegistry.getType(for: actionName, with: WebviewBridgeModelProtocol.self) else { + throw ModelRegistry.Error.decoderErrorModelNotMapped(identifer: actionName) + } + guard let model = try type.decode(jsonDict: json) as? WebviewBridgeModelProtocol else { + throw ModelRegistry.Error.decoderError + } + return model + } +} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckGet.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckGet.swift new file mode 100644 index 0000000..f006592 --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckGet.swift @@ -0,0 +1,73 @@ +// +// WebviewBridgeTrialFraudDeviceCheckGet.swift +// MobileFirstFramework +// +// Created by Matt Bruce on 2/1/22. +// Copyright © 2022 Verizon Wireless. All rights reserved. +// + +import Foundation +import DeviceCheck +import MVMCore + +extension WebViewBridgeError { + static var deviceCheckNotSupported = Self.other(code: 150, message: "devicecheck_not_supported") + static var deviceCheckGenerateToken = Self.other(code: 151, message: "devicecheck_generate_token") +} + +final class WebViewBridgeTrialFraudDeviceCheckGet: WebViewBridgeHandler { + + public override func perform() { + + guard DCDevice.current.isSupported else { + sendError(for: .deviceCheckNotSupported) + return + } + + //get the device token and check for an error + DCDevice.current.generateToken { (data, error) in + + guard let data = data, error == nil else { + self.sendError(for: .deviceCheckGenerateToken) + return + } + + //create the string version of the token + let deviceToken = data.base64EncodedString() + + //call the api to get a result + let params:JSONValueDictionary = [ + "deviceToken": JSONValue.init(stringLiteral: deviceToken) + ] + + //build/launch from Action + if let requestParameters = MVMCoreRequestParameters(pageType: "getTrialFraudDeviceCheck", extraParameters: params), + let loadHandler = MVMCoreLoadHandler.sharedGlobal() { + //execute the request + loadHandler.sendRequest(requestParameters, + locationForError: "WebViewBridgeTrialFraudDeviceCheckGet", + requestFinished: { (json, error) in + + //look for an error + if let error = error { + self.sendError(for: .coreError(error: error)) + + } //look for the data + else if let json = json as? JSONDictionary, + let page = json["Page"] as? JSONDictionary, + let data = page["data"] as? JSONDictionary, + let isSet = data["bit0"] as? Bool, + let lastUpdateTime = data["last_update_time"] as? String { + + //send the values we want + self.sendSuccess(for: ["isSet": isSet, "last_update_time": lastUpdateTime]) + + }//nothing set yet + else { + self.sendSuccess(for: ["isSet": false]) + } + }) + } + } + } +} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckGetModel.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckGetModel.swift new file mode 100644 index 0000000..536312c --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckGetModel.swift @@ -0,0 +1,16 @@ +// +// WebviewBridgeTrialFraudDeviceCheckGetModel.swift +// MobileFirstFramework +// +// Created by Matt Bruce on 2/1/22. +// Copyright © 2022 Verizon Wireless. All rights reserved. +// + +import Foundation +import MVMCoreUI + +class WebViewBridgeTrialFraudDeviceCheckGetModel: WebviewBridgeModelProtocol { + + static var identifier: String = "trialFraudDeviceCheckGet" + var jsCallback: String? +} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckSet.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckSet.swift new file mode 100644 index 0000000..a0d2249 --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckSet.swift @@ -0,0 +1,86 @@ +//// +//// WebviewBridgeTrialFraudDeviceCheckSet.swift +//// MobileFirstFramework +//// +//// Created by Matt Bruce on 2/1/22. +//// Copyright © 2022 Verizon Wireless. All rights reserved. +//// +// +// +//import Foundation +//import DeviceCheck +//import MVMCore +// +//final class WebViewBridgeTrialFraudDeviceCheckSet: WebViewBridgeHandlerProtocol { +// +// typealias Model = WebViewBridgeTrialFraudDeviceCheckSetModel +// typealias ViewController = CoreViewControllerable +// +// //properties +// public var bridgeModel: Model! +// public var completionHandler: (([String : Any]?) -> Void)! +// public weak var viewController: ViewController? +// +// func runBridgeAction() { +// +// guard DCDevice.current.isSupported else { +// sendError(for: .deviceCheckNotSupported) +// return +// } +// +// //get the device token and check for an error +// DCDevice.current.generateToken { (data, error) in +// +// guard let data = data, error == nil else { +// self.sendError(for: .deviceCheckGenerateToken) +// return +// } +// +// //create the string version of the token +// let deviceToken = data.base64EncodedString() +// +// //call the api to get a result +// let params:JSONValueDictionary = [ +// "deviceToken": JSONValue.init(stringLiteral: deviceToken), +// "bit0": JSONValue.init(booleanLiteral: self.bridgeModel.value) +// ] +// +// //build/launch from Action +// if let requestParameters = MVMCoreRequestParameters(pageType: "setTrialFraudDeviceCheck", extraParameters: params), +// let loadHandler = MVMCoreLoadHandler.sharedGlobal() { +// +// loadHandler.sendRequest(requestParameters, +// locationForError: "WebViewBridgeTrialFraudDeviceCheckSet", +// requestFinished: { (json, error) in +// +// //look for an error +// if let error = error { +// self.sendError(for: .coreError(error: error)) +// +// } //look for the data +// else if let json = json as? JSONDictionary, +// let page = json["Page"] as? JSONDictionary, +// let data = page["data"] as? JSONDictionary, +// let statusCode = data["statusCode"] as? Int { +// +// if let error = data["error"] as? String, statusCode != 200{ +// //send the error for non 200 response +// self.sendError(for: .other(code: statusCode, message: error)) +// } else if statusCode == 200 { +// //send the error for non 200 response +// self.sendSuccess() +// } else { +// //send the error for non 200 response +// self.sendError(for: .other(code: statusCode, message: "none")) +// } +// +// } +// else { +// //send the error for non 200 response +// self.sendError(for: .unknown) +// } +// }) +// } +// } +// } +//} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckSetModel.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckSetModel.swift new file mode 100644 index 0000000..ab3892f --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudDeviceCheckSetModel.swift @@ -0,0 +1,16 @@ +//// +//// WebviewBridgeTrialFraudDeviceCheckSetModel.swift +//// MobileFirstFramework +//// +//// Created by Matt Bruce on 2/1/22. +//// Copyright © 2022 Verizon Wireless. All rights reserved. +//// +// +//import Foundation +// +//class WebViewBridgeTrialFraudDeviceCheckSetModel: WebviewBridgeModelProtocol { +// +// static var identifier: String = "trialFraudDeviceCheckSet" +// var value: Bool +// var jsCallback: String? +//} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserGet.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserGet.swift new file mode 100644 index 0000000..31629ba --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserGet.swift @@ -0,0 +1,75 @@ +//// +//// WebviewBridgeTrialFraudUserGet.swift +//// MobileFirstFramework +//// +//// Created by Matt Bruce on 2/1/22. +//// Copyright © 2022 Verizon Wireless. All rights reserved. +//// +// +//import Foundation +//import MVMCore +// +//extension WebViewBridgeError { +// static var userCheckICloudNotAvailable = Self.other(code: 150, message: "usercheck_icloud_not_available") +// 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 { +// +// typealias Model = WebViewBridgeTrialFraudUserGetModel +// typealias ViewController = CoreViewControllerable +// +// //properties +// public var bridgeModel: Model! +// public var completionHandler: (([String : Any]?) -> Void)! +// public weak var viewController: ViewController? +// +// func runBridgeAction() { +// +// //current user state, default is iCloud not available +// //therefore if bridgeModel.isICloudAvaiable() == false +// //then this state is sent back in the "sendSuccess" and +// //this method will NEVER do a "sendError" unless the baseClass throws one +// var state: TrialFraudUserState = .notAvail +// +// //return dictionary +// var result: JSONDictionary = [:] +// +// //ensure that iCloud is available for current user +// if bridgeModel.isICloudAvaiable() { +// +// //keyValueStore hooked up to the user's iCloud account +// let keyValStore = NSUbiquitousKeyValueStore() +// +// //see if there is an existing object set for this user's iCloud account +// if let fraudUserData = keyValStore.data(forKey: TrialFraudUser.key) { +// +// //decode the data into a object +// guard let fraudUser: TrialFraudUser = try? fraudUserData.decode() else { +// sendError(for: .userCheckUserDecode) +// return +// } +// +// //current user state is "Set" since there is an existing value +// //and the user does have iCloud available +// state = .set +// //get the saved identifier out of the object within iCloud +// result["userIdentifier"] = fraudUser.identifier +// +// } else { +// +// //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 +// sendSuccess(for: result) +// } +//} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserGetModel.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserGetModel.swift new file mode 100644 index 0000000..ff4195f --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserGetModel.swift @@ -0,0 +1,38 @@ +//// +//// WebviewBridgeTrialFraudUserGetModel.swift +//// MobileFirstFramework +//// +//// Created by Matt Bruce on 2/1/22. +//// Copyright © 2022 Verizon Wireless. All rights reserved. +//// +// +//import Foundation +// +//struct TrialFraudUser: Codable { +// static var key: String { return "trialFraudUser" } +// let identifier: String +// let date: Date +//} +// +//enum TrialFraudUserState: String, Encodable { +// case notAvail = "Not Available" +// case notSet = "Not Set" +// case set = "Set" +//} +// +//protocol TrialFraudUserModelProtocol {} +// +//extension TrialFraudUserModelProtocol { +// func isICloudAvaiable() -> Bool { +// guard let _ = FileManager.default.ubiquityIdentityToken else { +// return false +// } +// return true +// } +//} +// +//class WebViewBridgeTrialFraudUserGetModel: WebviewBridgeModelProtocol, TrialFraudUserModelProtocol { +// +// static var identifier: String = "trialFraudUserCheckGet" +// var jsCallback: String? +//} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserSet.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserSet.swift new file mode 100644 index 0000000..fe71efe --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserSet.swift @@ -0,0 +1,57 @@ +//// +//// WebviewBridgeTrialFraudUserSet.swift +//// MobileFirstFramework +//// +//// Created by Matt Bruce on 2/1/22. +//// Copyright © 2022 Verizon Wireless. All rights reserved. +//// +// +//import Foundation +//import MVMCore +// +//final class WebViewBridgeTrialFraudUserSetHandler: NSObject, WebViewBridgeProtocol { +// private var handler = WebViewBridgeTrialFraudUserSet() +// public func performBridgeAction(with bridgeModel: WebviewBridgeModelProtocol?, viewController: UIViewController & MVMCoreViewControllerProtocol, completionHandler: @escaping ([String : Any]?) -> ()) { +// handler.performBridgeAction(with: bridgeModel, viewController: viewController, completionHandler: completionHandler) +// } +//} +// +//final class WebViewBridgeTrialFraudUserSet: WebViewBridgeHandlerProtocol { +// +// typealias Model = WebViewBridgeTrialFraudUserSetModel +// typealias ViewController = CoreViewControllerable +// +// //properties +// public var bridgeModel: Model! +// public var completionHandler: (([String : Any]?) -> Void)! +// public weak var viewController: ViewController? +// +// func runBridgeAction() { +// +// guard bridgeModel.isICloudAvaiable() else { +// sendError(for: .userCheckICloudNotAvailable) +// return +// } +// +// //see if there is an existing object set for this user's iCloud account +// guard let data = try? TrialFraudUser(identifier: bridgeModel.userIdentifier, date: Date()).encode() else { +// sendError(for: .userCheckUserEncode) +// return +// } +// +// //keyValueStore hooked up to the user's iCloud account +// let keyValStore = NSUbiquitousKeyValueStore() +// +// //set the data +// keyValStore.set(data, forKey: TrialFraudUser.key) +// +// //push the values +// guard keyValStore.synchronize() else { +// sendError(for: .userCheckUserSynchronization) +// return +// } +// +// sendSuccess(for: nil) +// +// } +//} diff --git a/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserSetModel.swift b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserSetModel.swift new file mode 100644 index 0000000..00d705c --- /dev/null +++ b/JSONCreator_iOS/JSONCreator/NativeBridge/Trial/WebViewBridgeTrialFraudUserSetModel.swift @@ -0,0 +1,16 @@ +//// +//// WebviewBridgeTrialFraudUserSetModel.swift +//// MobileFirstFramework +//// +//// Created by Matt Bruce on 2/1/22. +//// Copyright © 2022 Verizon Wireless. All rights reserved. +//// +// +//import Foundation +// +//class WebViewBridgeTrialFraudUserSetModel: WebviewBridgeModelProtocol, TrialFraudUserModelProtocol { +// +// static var identifier: String = "trialFraudUserCheckSet" +// var userIdentifier: String +// var jsCallback: String? +//}